diff options
Diffstat (limited to 'src/objc')
-rw-r--r-- | src/objc/abstract/MCOConstants.h | 3 | ||||
-rw-r--r-- | src/objc/imap/MCOIMAPCapabilityOperation.h | 2 | ||||
-rw-r--r-- | src/objc/imap/MCOIMAPMessage.h | 3 | ||||
-rw-r--r-- | src/objc/imap/MCOIMAPMessage.mm | 1 | ||||
-rw-r--r-- | src/objc/imap/MCOIMAPNamespace.mm | 2 | ||||
-rwxr-xr-x | src/objc/imap/MCOIMAPSession.h | 47 | ||||
-rwxr-xr-x | src/objc/imap/MCOIMAPSession.mm | 29 | ||||
-rw-r--r-- | src/objc/pop/MCOPOPSession.h | 6 | ||||
-rw-r--r-- | src/objc/pop/MCOPOPSession.mm | 1 | ||||
-rw-r--r-- | src/objc/smtp/MCOSMTPSession.h | 6 | ||||
-rw-r--r-- | src/objc/smtp/MCOSMTPSession.mm | 1 | ||||
-rw-r--r-- | src/objc/utils/MCOIndexSet.h | 9 | ||||
-rw-r--r-- | src/objc/utils/MCOIndexSet.mm | 15 | ||||
-rw-r--r-- | src/objc/utils/NSObject+MCO.mm | 7 | ||||
-rw-r--r-- | src/objc/utils/NSSet+MCO.h | 25 | ||||
-rw-r--r-- | src/objc/utils/NSSet+MCO.mm | 45 |
16 files changed, 196 insertions, 6 deletions
diff --git a/src/objc/abstract/MCOConstants.h b/src/objc/abstract/MCOConstants.h index 17af29eb..534d118d 100644 --- a/src/objc/abstract/MCOConstants.h +++ b/src/objc/abstract/MCOConstants.h @@ -72,6 +72,9 @@ typedef enum { MCOIMAPFolderFlagJunk = MCOIMAPFolderFlagSpam, /** \Flagged: When the folder contains all the flagged emails.*/ MCOIMAPFolderFlagFlagged = MCOIMAPFolderFlagStarred, + /** Mask to identify the folder */ + MCOIMAPFolderFlagFolderTypeMask = MCOIMAPFolderFlagInbox | MCOIMAPFolderFlagSentMail | MCOIMAPFolderFlagStarred | MCOIMAPFolderFlagAllMail | + MCOIMAPFolderFlagTrash| MCOIMAPFolderFlagDrafts | MCOIMAPFolderFlagSpam | MCOIMAPFolderFlagImportant | MCOIMAPFolderFlagArchive, } MCOIMAPFolderFlag; /** It's the flags of a message.*/ diff --git a/src/objc/imap/MCOIMAPCapabilityOperation.h b/src/objc/imap/MCOIMAPCapabilityOperation.h index 29b0d3be..4e531160 100644 --- a/src/objc/imap/MCOIMAPCapabilityOperation.h +++ b/src/objc/imap/MCOIMAPCapabilityOperation.h @@ -8,7 +8,7 @@ #ifndef __MAILCORE_MCOIMAPCAPABILITYOPERATION_H_ -#define __MAILCORE_MCOIMAPCAPBILITYOPERATION_H_ +#define __MAILCORE_MCOIMAPCAPABILITYOPERATION_H_ /** This class implements an operation to query for IMAP capabilities, diff --git a/src/objc/imap/MCOIMAPMessage.h b/src/objc/imap/MCOIMAPMessage.h index 7f28663e..bcee7eaf 100644 --- a/src/objc/imap/MCOIMAPMessage.h +++ b/src/objc/imap/MCOIMAPMessage.h @@ -43,6 +43,9 @@ /** The contents of the message flags when it was fetched from the server */ @property (nonatomic, assign) MCOMessageFlag originalFlags; +/** Flag keywords of the message, mostly custom flags */ +@property (nonatomic, copy) NSArray * /* NSString */ customFlags; + /** It's the last modification sequence value of the message synced from the server. See RFC4551 */ @property (nonatomic, assign) uint64_t modSeqValue; diff --git a/src/objc/imap/MCOIMAPMessage.mm b/src/objc/imap/MCOIMAPMessage.mm index 8667b542..f663d8bd 100644 --- a/src/objc/imap/MCOIMAPMessage.mm +++ b/src/objc/imap/MCOIMAPMessage.mm @@ -45,6 +45,7 @@ MCO_OBJC_SYNTHESIZE_SCALAR(uint32_t, uint32_t, setUid, uid) MCO_OBJC_SYNTHESIZE_SCALAR(uint32_t, uint32_t, setSize, size) MCO_OBJC_SYNTHESIZE_SCALAR(MCOMessageFlag, mailcore::MessageFlag, setFlags, flags) MCO_OBJC_SYNTHESIZE_SCALAR(MCOMessageFlag, mailcore::MessageFlag, setOriginalFlags, originalFlags) +MCO_OBJC_SYNTHESIZE_ARRAY(setCustomFlags, customFlags) MCO_OBJC_SYNTHESIZE_SCALAR(uint64_t, uint64_t, setModSeqValue, modSeqValue) MCO_OBJC_SYNTHESIZE(AbstractPart, setMainPart, mainPart) MCO_OBJC_SYNTHESIZE_ARRAY(setGmailLabels, gmailLabels) diff --git a/src/objc/imap/MCOIMAPNamespace.mm b/src/objc/imap/MCOIMAPNamespace.mm index 4615fc80..e6181d87 100644 --- a/src/objc/imap/MCOIMAPNamespace.mm +++ b/src/objc/imap/MCOIMAPNamespace.mm @@ -89,7 +89,7 @@ - (NSArray *) prefixes { - return MCO_OBJC_BRIDGE_GET(mainPrefix); + return MCO_OBJC_BRIDGE_GET(prefixes); } - (NSString *) pathForComponents:(NSArray *)components diff --git a/src/objc/imap/MCOIMAPSession.h b/src/objc/imap/MCOIMAPSession.h index 867cfb6d..b013c9c0 100755 --- a/src/objc/imap/MCOIMAPSession.h +++ b/src/objc/imap/MCOIMAPSession.h @@ -89,6 +89,9 @@ /** The identity of the IMAP server. */ @property (nonatomic, strong, readonly) MCOIMAPIdentity * serverIdentity; +/** Display name of the Gmail user. It will be nil if it's not a Gmail server. */ +@property (nonatomic, copy, readonly) NSString * gmailUserDisplayName; + /** When set to YES, the session is allowed open to open several connections to the same folder. @warning Some older IMAP servers don't like this @@ -110,6 +113,12 @@ */ @property (nonatomic, copy) MCOConnectionLogger connectionLogger; +/** This property provides some hints to MCOIMAPSession about where it's called from. + It will make MCOIMAPSession safe. It will also set all the callbacks of operations to run on this given queue. + Defaults to the main queue. + This property should be used only if there's performance issue using MCOIMAPSession in the main thread. */ +@property (nonatomic, assign) dispatch_queue_t dispatchQueue; + /** The value will be YES when asynchronous operations are running, else it will return NO. */ @@ -263,13 +272,28 @@ flags:(MCOMessageFlag)flags; /** + Returns an operation to add a message with custom flags to a folder. + + MCOIMAPOperation * op = [session appendMessageOperationWithFolder:@"Sent Mail" messageData:rfc822Data flags:MCOMessageFlagNone customFlags:@[@"$CNS-Greeting-On"]]; + [op start:^(NSError * error, uint32_t createdUID) { + if (error == nil) { + NSLog(@"created message with UID %lu", (unsigned long) createdUID); + } + }]; + */ +- (MCOIMAPAppendMessageOperation *)appendMessageOperationWithFolder:(NSString *)folder + messageData:(NSData *)messageData + flags:(MCOMessageFlag)flags + customFlags:(NSArray *)customFlags; + +/** Returns an operation to copy messages to a folder. MCOIMAPCopyMessagesOperation * op = [session copyMessagesOperationWithFolder:@"INBOX" uids:[MCIndexSet indexSetWithIndex:456] destFolder:@"Cocoa"]; - [op start:^(NSError * error, MCOIndexSet * destUids) { - NSLog(@"copied to folder with UID %@", destUids); + [op start:^(NSError * error, NSDictionary * uidMapping) { + NSLog(@"copied to folder with UID mapping %@", uidMapping); }]; */ - (MCOIMAPCopyMessagesOperation *)copyMessagesOperationWithFolder:(NSString *)folder @@ -294,6 +318,25 @@ kind:(MCOIMAPStoreFlagsRequestKind)kind flags:(MCOMessageFlag)flags; /** + Returns an operation to change flags and custom flags of messages. + + For example: Adds the seen flag and $CNS-Greeting-On flag to the message with UID 456. + + MCOIMAPOperation * op = [session storeFlagsOperationWithFolder:@"INBOX" + uids:[MCOIndexSet indexSetWithIndex:456] + kind:MCOIMAPStoreFlagsRequestKindAdd + flags:MCOMessageFlagSeen + customFlags:@["$CNS-Greeting-On"]]; + [op start:^(NSError * error) { + ... + }]; + */ +- (MCOIMAPOperation *) storeFlagsOperationWithFolder:(NSString *)folder + uids:(MCOIndexSet *)uids + kind:(MCOIMAPStoreFlagsRequestKind)kind + flags:(MCOMessageFlag)flags + customFlags:(NSArray *)customFlags; +/** Returns an operation to change labels of messages. Intended for Gmail For example: Adds the label "Home" flag to the message with UID 456. diff --git a/src/objc/imap/MCOIMAPSession.mm b/src/objc/imap/MCOIMAPSession.mm index a53456ae..0b0c638a 100755 --- a/src/objc/imap/MCOIMAPSession.mm +++ b/src/objc/imap/MCOIMAPSession.mm @@ -105,6 +105,7 @@ MCO_OBJC_SYNTHESIZE_BOOL(setCheckCertificateEnabled, isCheckCertificateEnabled) MCO_OBJC_SYNTHESIZE_BOOL(setVoIPEnabled, isVoIPEnabled) MCO_OBJC_SYNTHESIZE_SCALAR(BOOL, BOOL, setAllowsFolderConcurrentAccessEnabled, allowsFolderConcurrentAccessEnabled) MCO_OBJC_SYNTHESIZE_SCALAR(unsigned int, unsigned int, setMaximumConnections, maximumConnections) +MCO_OBJC_SYNTHESIZE_SCALAR(dispatch_queue_t, dispatch_queue_t, setDispatchQueue, dispatchQueue); - (void) setDefaultNamespace:(MCOIMAPNamespace *)defaultNamespace { @@ -126,6 +127,11 @@ MCO_OBJC_SYNTHESIZE_SCALAR(unsigned int, unsigned int, setMaximumConnections, ma return MCO_OBJC_BRIDGE_GET(serverIdentity); } +- (NSString *) gmailUserDisplayName +{ + return MCO_TO_OBJC(_session->gmailUserDisplayName()); +} + - (void) setConnectionLogger:(MCOConnectionLogger)connectionLogger { [_connectionLogger release]; @@ -238,9 +244,18 @@ MCO_OBJC_SYNTHESIZE_SCALAR(unsigned int, unsigned int, setMaximumConnections, ma messageData:(NSData *)messageData flags:(MCOMessageFlag)flags { + return [self appendMessageOperationWithFolder:folder messageData:messageData flags:flags customFlags:NULL]; +} + +- (MCOIMAPAppendMessageOperation *)appendMessageOperationWithFolder:(NSString *)folder + messageData:(NSData *)messageData + flags:(MCOMessageFlag)flags + customFlags:(NSArray *)customFlags +{ IMAPAppendMessageOperation * coreOp = MCO_NATIVE_INSTANCE->appendMessageOperation([folder mco_mcString], [messageData mco_mcData], - (MessageFlag) flags); + (MessageFlag) flags, + MCO_FROM_OBJC(Array, customFlags)); return MCO_TO_OBJC_OP(coreOp); } @@ -334,10 +349,20 @@ MCO_OBJC_SYNTHESIZE_SCALAR(unsigned int, unsigned int, setMaximumConnections, ma kind:(MCOIMAPStoreFlagsRequestKind)kind flags:(MCOMessageFlag)flags { + return [self storeFlagsOperationWithFolder:folder uids:uids kind:kind flags:flags customFlags:NULL]; +} + +- (MCOIMAPOperation *) storeFlagsOperationWithFolder:(NSString *)folder + uids:(MCOIndexSet *)uids + kind:(MCOIMAPStoreFlagsRequestKind)kind + flags:(MCOMessageFlag)flags + customFlags:(NSArray *)customFlags +{ IMAPOperation * coreOp = MCO_NATIVE_INSTANCE->storeFlagsOperation([folder mco_mcString], MCO_FROM_OBJC(IndexSet, uids), (IMAPStoreFlagsRequestKind) kind, - (MessageFlag) flags); + (MessageFlag) flags, + MCO_FROM_OBJC(Array, customFlags)); return OPAQUE_OPERATION(coreOp); } diff --git a/src/objc/pop/MCOPOPSession.h b/src/objc/pop/MCOPOPSession.h index aa381a62..6941aa13 100644 --- a/src/objc/pop/MCOPOPSession.h +++ b/src/objc/pop/MCOPOPSession.h @@ -62,6 +62,12 @@ See MCOConnectionType for more information.*/ */ @property (nonatomic, copy) MCOConnectionLogger connectionLogger; +/** This property provides some hints to MCOPOPSession about where it's called from. + It will make MCOPOPSession safe. It will also set all the callbacks of operations to run on this given queue. + Defaults to the main queue. + This property should be used only if there's performance issue using MCOPOPSession in the main thread. */ +@property (nonatomic, assign) dispatch_queue_t dispatchQueue; + /** @name Operations */ /** diff --git a/src/objc/pop/MCOPOPSession.mm b/src/objc/pop/MCOPOPSession.mm index 1037f951..893995a5 100644 --- a/src/objc/pop/MCOPOPSession.mm +++ b/src/objc/pop/MCOPOPSession.mm @@ -82,6 +82,7 @@ MCO_OBJC_SYNTHESIZE_SCALAR(MCOAuthType, mailcore::AuthType, setAuthType, authTyp MCO_OBJC_SYNTHESIZE_SCALAR(MCOConnectionType, mailcore::ConnectionType, setConnectionType, connectionType) MCO_OBJC_SYNTHESIZE_SCALAR(NSTimeInterval, time_t, setTimeout, timeout) MCO_OBJC_SYNTHESIZE_BOOL(setCheckCertificateEnabled, isCheckCertificateEnabled) +MCO_OBJC_SYNTHESIZE_SCALAR(dispatch_queue_t, dispatch_queue_t, setDispatchQueue, dispatchQueue); - (void) setConnectionLogger:(MCOConnectionLogger)connectionLogger { diff --git a/src/objc/smtp/MCOSMTPSession.h b/src/objc/smtp/MCOSMTPSession.h index 90351551..09116508 100644 --- a/src/objc/smtp/MCOSMTPSession.h +++ b/src/objc/smtp/MCOSMTPSession.h @@ -76,6 +76,12 @@ */ @property (nonatomic, copy) MCOConnectionLogger connectionLogger; +/** This property provides some hints to MCOSMTPSession about where it's called from. + It will make MCOSMTPSession safe. It will also set all the callbacks of operations to run on this given queue. + Defaults to the main queue. + This property should be used only if there's performance issue using MCOSMTPSession in the main thread. */ +@property (nonatomic, assign) dispatch_queue_t dispatchQueue; + /** @name Operations */ /** diff --git a/src/objc/smtp/MCOSMTPSession.mm b/src/objc/smtp/MCOSMTPSession.mm index 29211118..b6ae6a4f 100644 --- a/src/objc/smtp/MCOSMTPSession.mm +++ b/src/objc/smtp/MCOSMTPSession.mm @@ -81,6 +81,7 @@ MCO_OBJC_SYNTHESIZE_SCALAR(MCOConnectionType, mailcore::ConnectionType, setConne MCO_OBJC_SYNTHESIZE_SCALAR(NSTimeInterval, time_t, setTimeout, timeout) MCO_OBJC_SYNTHESIZE_BOOL(setCheckCertificateEnabled, isCheckCertificateEnabled) MCO_OBJC_SYNTHESIZE_BOOL(setUseHeloIPEnabled, useHeloIPEnabled) +MCO_OBJC_SYNTHESIZE_SCALAR(dispatch_queue_t, dispatch_queue_t, setDispatchQueue, dispatchQueue); - (void) setConnectionLogger:(MCOConnectionLogger)connectionLogger { diff --git a/src/objc/utils/MCOIndexSet.h b/src/objc/utils/MCOIndexSet.h index 2bb2684e..38ec3834 100644 --- a/src/objc/utils/MCOIndexSet.h +++ b/src/objc/utils/MCOIndexSet.h @@ -48,6 +48,15 @@ /** Removes all integers that are not in the given range.*/ - (void) intersectsRange:(MCORange)range; +/** Adds all indexes from an other index set to the index set.*/ +- (void) addIndexSet:(MCOIndexSet *)indexSet; + +/** Remove all indexes from an other index set from the index set.*/ +- (void) removeIndexSet:(MCOIndexSet *)indexSet; + +/** Removes all integers that are not in the given index set.*/ +- (void) intersectsIndexSet:(MCOIndexSet *)indexSet; + /** Returns all the ranges of ths index set.*/ - (MCORange *) allRanges; diff --git a/src/objc/utils/MCOIndexSet.mm b/src/objc/utils/MCOIndexSet.mm index 9d75900f..b944b38b 100644 --- a/src/objc/utils/MCOIndexSet.mm +++ b/src/objc/utils/MCOIndexSet.mm @@ -127,6 +127,21 @@ MCO_SYNTHESIZE_NSCODING _indexSet->intersectsRange(MCORangeToMCRange(range)); } +- (void) addIndexSet:(MCOIndexSet *)indexSet +{ + _indexSet->addIndexSet(indexSet->_indexSet); +} + +- (void) removeIndexSet:(MCOIndexSet *)indexSet +{ + _indexSet->removeIndexSet(indexSet->_indexSet); +} + +- (void) intersectsIndexSet:(MCOIndexSet *)indexSet +{ + _indexSet->intersectsIndexSet(indexSet->_indexSet); +} + - (MCORange *) allRanges { return (MCORange *) _indexSet->allRanges(); diff --git a/src/objc/utils/NSObject+MCO.mm b/src/objc/utils/NSObject+MCO.mm index 9c6f4fa7..4887080f 100644 --- a/src/objc/utils/NSObject+MCO.mm +++ b/src/objc/utils/NSObject+MCO.mm @@ -15,6 +15,7 @@ #import "NSDictionary+MCO.h" #import "NSArray+MCO.h" #import "NSValue+MCO.h" +#import "NSSet+MCO.h" #include "MCBaseTypes.h" #include "MCUtils.h" @@ -95,6 +96,9 @@ static Class classWithTypeInfo(const std::type_info * info) else if (objectType == typeid(mailcore::Array).hash_code()) { return [NSArray mco_arrayWithMCArray:(mailcore::Array *) object]; } + else if (objectType == typeid(mailcore::Set).hash_code()) { + return [NSSet mco_setWithMCSet:(mailcore::Set *) object]; + } else { Class aClass = classWithTypeInfo(&typeid(* object)); MCAssert(aClass != nil); @@ -124,6 +128,9 @@ static Class classWithTypeInfo(const std::type_info * info) else if ([self isKindOfClass:[NSDictionary class]]) { return [(NSDictionary *) self mco_mcHashMap]; } + else if ([self isKindOfClass:[NSSet class]]) { + return [(NSSet *) self mco_mcSet]; + } else { MCAssert(0); return nil; diff --git a/src/objc/utils/NSSet+MCO.h b/src/objc/utils/NSSet+MCO.h new file mode 100644 index 00000000..17bd1bf4 --- /dev/null +++ b/src/objc/utils/NSSet+MCO.h @@ -0,0 +1,25 @@ +// +// NSSet+MCO.h +// mailcore2 +// +// Created by Hoa V. DINH on 1/29/14. +// Copyright (c) 2014 MailCore. All rights reserved. +// + +#import <Foundation/Foundation.h> + +#ifdef __cplusplus +namespace mailcore { + class Set; +} +#endif + +@interface NSSet (MCO) + +#ifdef __cplusplus ++ (NSSet *) mco_setWithMCSet:(mailcore::Set *)cppSet; + +- (mailcore::Set *) mco_mcSet; +#endif + +@end diff --git a/src/objc/utils/NSSet+MCO.mm b/src/objc/utils/NSSet+MCO.mm new file mode 100644 index 00000000..690cfe77 --- /dev/null +++ b/src/objc/utils/NSSet+MCO.mm @@ -0,0 +1,45 @@ +// +// NSSet+MCO.m +// mailcore2 +// +// Created by Hoa V. DINH on 1/29/14. +// Copyright (c) 2014 MailCore. All rights reserved. +// + +#import "NSSet+MCO.h" + +#include "MCSet.h" +#include "MCArray.h" +#import "NSObject+MCO.h" + +@implementation NSSet (MCO) + ++ (id) mco_objectWithMCObject:(mailcore::Object *)object +{ + return [self mco_setWithMCSet:(mailcore::Set *) object]; +} + ++ (NSSet *) mco_setWithMCSet:(mailcore::Set *)cppSet +{ + if (cppSet == NULL) + return nil; + + NSMutableSet * result = [NSMutableSet set]; + mailcore::Array * array = cppSet->allObjects(); + for(unsigned int i = 0 ; i < array->count() ; i ++) { + [result addObject:[NSObject mco_objectWithMCObject:array->objectAtIndex(i)]]; + } + return result; +} + +- (mailcore::Set *) mco_mcSet +{ + mailcore::Set * result = mailcore::Set::set(); + NSArray * array = [self allObjects]; + for(unsigned int i = 0 ; i < [array count] ; i ++) { + result->addObject([[array objectAtIndex:i] mco_mcObject]); + } + return result; +} + +@end |