aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/objc
diff options
context:
space:
mode:
Diffstat (limited to 'src/objc')
-rw-r--r--src/objc/abstract/MCOConstants.h3
-rw-r--r--src/objc/imap/MCOIMAPCapabilityOperation.h2
-rw-r--r--src/objc/imap/MCOIMAPMessage.h3
-rw-r--r--src/objc/imap/MCOIMAPMessage.mm1
-rw-r--r--src/objc/imap/MCOIMAPNamespace.mm2
-rwxr-xr-xsrc/objc/imap/MCOIMAPSession.h47
-rwxr-xr-xsrc/objc/imap/MCOIMAPSession.mm29
-rw-r--r--src/objc/pop/MCOPOPSession.h6
-rw-r--r--src/objc/pop/MCOPOPSession.mm1
-rw-r--r--src/objc/smtp/MCOSMTPSession.h6
-rw-r--r--src/objc/smtp/MCOSMTPSession.mm1
-rw-r--r--src/objc/utils/MCOIndexSet.h9
-rw-r--r--src/objc/utils/MCOIndexSet.mm15
-rw-r--r--src/objc/utils/NSObject+MCO.mm7
-rw-r--r--src/objc/utils/NSSet+MCO.h25
-rw-r--r--src/objc/utils/NSSet+MCO.mm45
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