diff options
author | 2014-01-23 15:52:57 +0100 | |
---|---|---|
committer | 2014-01-23 15:52:57 +0100 | |
commit | 720d3826943981c88706f09b96df495662ffc3ef (patch) | |
tree | c61211f941aa53b0d1fb6f30f3ba07fa9f69e5b3 | |
parent | 4b4d98fbf824985c7dae63794989e916502862a1 (diff) | |
parent | 686187b5d35e912d47a1fee710782396ff626bdc (diff) |
Merge branch 'feature/custom-flags' into develop
-rwxr-xr-x | src/async/imap/MCIMAPAsyncConnection.cc | 3 | ||||
-rwxr-xr-x | src/async/imap/MCIMAPAsyncConnection.h | 2 | ||||
-rwxr-xr-x | src/async/imap/MCIMAPAsyncSession.cc | 4 | ||||
-rwxr-xr-x | src/async/imap/MCIMAPAsyncSession.h | 2 | ||||
-rw-r--r-- | src/async/imap/MCIMAPStoreFlagsOperation.cc | 14 | ||||
-rw-r--r-- | src/async/imap/MCIMAPStoreFlagsOperation.h | 4 | ||||
-rw-r--r-- | src/core/imap/MCIMAPMessage.cc | 18 | ||||
-rw-r--r-- | src/core/imap/MCIMAPMessage.h | 4 | ||||
-rwxr-xr-x | src/core/imap/MCIMAPSession.cc | 62 | ||||
-rwxr-xr-x | src/core/imap/MCIMAPSession.h | 2 | ||||
-rw-r--r-- | src/objc/imap/MCOIMAPMessage.h | 3 | ||||
-rw-r--r-- | src/objc/imap/MCOIMAPMessage.mm | 1 | ||||
-rwxr-xr-x | src/objc/imap/MCOIMAPSession.h | 6 | ||||
-rwxr-xr-x | src/objc/imap/MCOIMAPSession.mm | 4 |
14 files changed, 97 insertions, 32 deletions
diff --git a/src/async/imap/MCIMAPAsyncConnection.cc b/src/async/imap/MCIMAPAsyncConnection.cc index 5e3dc21b..aa94e3ee 100755 --- a/src/async/imap/MCIMAPAsyncConnection.cc +++ b/src/async/imap/MCIMAPAsyncConnection.cc @@ -420,7 +420,7 @@ IMAPFetchContentOperation * IMAPAsyncConnection::fetchMessageAttachmentByUIDOper return op; } -IMAPOperation * IMAPAsyncConnection::storeFlagsOperation(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, MessageFlag flags) +IMAPOperation * IMAPAsyncConnection::storeFlagsOperation(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, MessageFlag flags, Array * customFlags) { IMAPStoreFlagsOperation * op = new IMAPStoreFlagsOperation(); op->setSession(this); @@ -428,6 +428,7 @@ IMAPOperation * IMAPAsyncConnection::storeFlagsOperation(String * folder, IndexS op->setUids(uids); op->setKind(kind); op->setFlags(flags); + op->setCustomFlags(customFlags); op->autorelease(); return op; } diff --git a/src/async/imap/MCIMAPAsyncConnection.h b/src/async/imap/MCIMAPAsyncConnection.h index 1f4014da..e380c5e1 100755 --- a/src/async/imap/MCIMAPAsyncConnection.h +++ b/src/async/imap/MCIMAPAsyncConnection.h @@ -116,7 +116,7 @@ namespace mailcore { virtual IMAPFetchContentOperation * fetchMessageAttachmentByUIDOperation(String * folder, uint32_t uid, String * partID, Encoding encoding); - virtual IMAPOperation * storeFlagsOperation(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, MessageFlag flags); + virtual IMAPOperation * storeFlagsOperation(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, MessageFlag flags, Array * customFlags); virtual IMAPOperation * storeLabelsOperation(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, Array * labels); virtual IMAPSearchOperation * searchOperation(String * folder, IMAPSearchKind kind, String * searchString); diff --git a/src/async/imap/MCIMAPAsyncSession.cc b/src/async/imap/MCIMAPAsyncSession.cc index 8c3678e1..d6556309 100755 --- a/src/async/imap/MCIMAPAsyncSession.cc +++ b/src/async/imap/MCIMAPAsyncSession.cc @@ -418,10 +418,10 @@ IMAPFetchContentOperation * IMAPAsyncSession::fetchMessageAttachmentByUIDOperati return session->fetchMessageAttachmentByUIDOperation(folder, uid, partID, encoding); } -IMAPOperation * IMAPAsyncSession::storeFlagsOperation(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, MessageFlag flags) +IMAPOperation * IMAPAsyncSession::storeFlagsOperation(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, MessageFlag flags, Array * customFlags) { IMAPAsyncConnection * session = sessionForFolder(folder); - return session->storeFlagsOperation(folder, uids, kind, flags); + return session->storeFlagsOperation(folder, uids, kind, flags, customFlags); } IMAPOperation * IMAPAsyncSession::storeLabelsOperation(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, Array * labels) diff --git a/src/async/imap/MCIMAPAsyncSession.h b/src/async/imap/MCIMAPAsyncSession.h index 24fb6f91..38d14e0f 100755 --- a/src/async/imap/MCIMAPAsyncSession.h +++ b/src/async/imap/MCIMAPAsyncSession.h @@ -132,7 +132,7 @@ namespace mailcore { virtual IMAPFetchContentOperation * fetchMessageAttachmentByUIDOperation(String * folder, uint32_t uid, String * partID, Encoding encoding, bool urgent = false); - virtual IMAPOperation * storeFlagsOperation(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, MessageFlag flags); + virtual IMAPOperation * storeFlagsOperation(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, MessageFlag flags, Array * customFlags); virtual IMAPOperation * storeLabelsOperation(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, Array * labels); virtual IMAPSearchOperation * searchOperation(String * folder, IMAPSearchKind kind, String * searchString); diff --git a/src/async/imap/MCIMAPStoreFlagsOperation.cc b/src/async/imap/MCIMAPStoreFlagsOperation.cc index e0464c8c..e2e2bfe9 100644 --- a/src/async/imap/MCIMAPStoreFlagsOperation.cc +++ b/src/async/imap/MCIMAPStoreFlagsOperation.cc @@ -18,11 +18,13 @@ IMAPStoreFlagsOperation::IMAPStoreFlagsOperation() mUids = NULL; mKind = IMAPStoreFlagsRequestKindAdd; mFlags = MessageFlagNone; + mCustomFlags = NULL; } IMAPStoreFlagsOperation::~IMAPStoreFlagsOperation() { MC_SAFE_RELEASE(mUids); + MC_SAFE_RELEASE(mCustomFlags); } void IMAPStoreFlagsOperation::setUids(IndexSet * uids) @@ -55,9 +57,19 @@ MessageFlag IMAPStoreFlagsOperation::flags() return mFlags; } +void IMAPStoreFlagsOperation::setCustomFlags(Array * customFlags) +{ + MC_SAFE_REPLACE_RETAIN(Array, mCustomFlags, customFlags); +} + +Array * IMAPStoreFlagsOperation::customFlags() +{ + return mCustomFlags; +} + void IMAPStoreFlagsOperation::main() { ErrorCode error; - session()->session()->storeFlags(folder(), mUids, mKind, mFlags, &error); + session()->session()->storeFlags(folder(), mUids, mKind, mFlags, mCustomFlags, &error); setError(error); } diff --git a/src/async/imap/MCIMAPStoreFlagsOperation.h b/src/async/imap/MCIMAPStoreFlagsOperation.h index 0048283c..d908baf5 100644 --- a/src/async/imap/MCIMAPStoreFlagsOperation.h +++ b/src/async/imap/MCIMAPStoreFlagsOperation.h @@ -30,6 +30,9 @@ namespace mailcore { virtual void setFlags(MessageFlag flags); virtual MessageFlag flags(); + virtual void setCustomFlags(Array * customFlags); + virtual Array * customFlags(); + public: // subclass behavior virtual void main(); @@ -37,6 +40,7 @@ namespace mailcore { IndexSet * mUids; IMAPStoreFlagsRequestKind mKind; MessageFlag mFlags; + Array * mCustomFlags; }; diff --git a/src/core/imap/MCIMAPMessage.cc b/src/core/imap/MCIMAPMessage.cc index 59d67654..150ddc3e 100644 --- a/src/core/imap/MCIMAPMessage.cc +++ b/src/core/imap/MCIMAPMessage.cc @@ -17,6 +17,7 @@ void IMAPMessage::init() mUid = 0; mFlags = MessageFlagNone; mOriginalFlags = MessageFlagNone; + mCustomFlags = NULL; mMainPart = NULL; mGmailLabels = NULL; mModSeqValue = 0; @@ -35,6 +36,7 @@ IMAPMessage::IMAPMessage(IMAPMessage * other) : AbstractMessage(other) setUid(other->uid()); setFlags(other->flags()); setOriginalFlags(other->originalFlags()); + setCustomFlags(other->customFlags()); setMainPart((AbstractPart *) other->mainPart()->copy()->autorelease()); setGmailLabels(other->gmailLabels()); setGmailThreadID(other->gmailThreadID()); @@ -45,6 +47,7 @@ IMAPMessage::~IMAPMessage() { MC_SAFE_RELEASE(mMainPart); MC_SAFE_RELEASE(mGmailLabels); + MC_SAFE_RELEASE(mCustomFlags); } Object * IMAPMessage::copy() @@ -105,6 +108,16 @@ MessageFlag IMAPMessage::originalFlags() return mOriginalFlags; } +void IMAPMessage::setCustomFlags(Array * customFlags) +{ + MC_SAFE_REPLACE_COPY(Array, mCustomFlags, customFlags); +} + +Array * IMAPMessage::customFlags() +{ + return mCustomFlags; +} + void IMAPMessage::setModSeqValue(uint64_t uid) { mModSeqValue = uid; @@ -226,6 +239,7 @@ HashMap * IMAPMessage::serializable() result->setObjectForKey(MCSTR("size"), String::stringWithUTF8Format("%lu", (long unsigned) uid())); result->setObjectForKey(MCSTR("flags"), String::stringWithUTF8Format("%u", (unsigned) flags())); result->setObjectForKey(MCSTR("originalFlags"), String::stringWithUTF8Format("%u", (unsigned) originalFlags())); + result->setObjectForKey(MCSTR("customFlags"), customFlags()); result->setObjectForKey(MCSTR("mainPart"), mMainPart->serializable()); if (gmailLabels() != NULL) { result->setObjectForKey(MCSTR("gmailLabels"), gmailLabels()); @@ -262,6 +276,10 @@ void IMAPMessage::importSerializable(HashMap * serializable) if (originalFlags != NULL) { setFlags((MessageFlag) originalFlags->unsignedIntValue()); } + String * customFlags = (String *) serializable->objectForKey(MCSTR("customFlags")); + if (customFlags != NULL) { + setCustomFlags((Array *) serializable->objectForKey(MCSTR("customFlags"))); + } setMainPart((AbstractPart *) Object::objectWithSerializable((HashMap *) serializable->objectForKey(MCSTR("mainPart")))); setGmailLabels((Array *) serializable->objectForKey(MCSTR("gmailLabels"))); String * gmailMessageID = (String *) serializable->objectForKey(MCSTR("gmailMessageID")); diff --git a/src/core/imap/MCIMAPMessage.h b/src/core/imap/MCIMAPMessage.h index ebcad889..e072d131 100644 --- a/src/core/imap/MCIMAPMessage.h +++ b/src/core/imap/MCIMAPMessage.h @@ -32,6 +32,9 @@ namespace mailcore { virtual void setOriginalFlags(MessageFlag flags); virtual MessageFlag originalFlags(); + virtual void setCustomFlags(Array * customFlags); + virtual Array * customFlags(); + virtual uint64_t modSeqValue(); virtual void setModSeqValue(uint64_t uid); @@ -70,6 +73,7 @@ namespace mailcore { MessageFlag mFlags; MessageFlag mOriginalFlags; + Array * /* String */ mCustomFlags; AbstractPart * mMainPart; Array * /* String */ mGmailLabels; uint64_t mGmailMessageID; diff --git a/src/core/imap/MCIMAPSession.cc b/src/core/imap/MCIMAPSession.cc index 50ab4f70..54e8aea0 100755 --- a/src/core/imap/MCIMAPSession.cc +++ b/src/core/imap/MCIMAPSession.cc @@ -156,6 +156,36 @@ static MessageFlag flags_from_lep_att_dynamic(struct mailimap_msg_att_dynamic * return flags; } +static Array * custom_flags_from_lep_att_dynamic(struct mailimap_msg_att_dynamic * att_dynamic) +{ + Array * result; + clistiter * iter; + + if (att_dynamic->att_list == NULL) + return NULL; + + result = Array::array(); + for(iter = clist_begin(att_dynamic->att_list) ;iter != NULL ; iter = clist_next(iter)) { + struct mailimap_flag_fetch * flag_fetch; + struct mailimap_flag * flag; + + flag_fetch = (struct mailimap_flag_fetch *) clist_content(iter); + if (flag_fetch->fl_type != MAILIMAP_FLAG_FETCH_OTHER) { + continue; + } + + flag = flag_fetch->fl_flag; + if (flag->fl_type == MAILIMAP_FLAG_KEYWORD) { + String * customFlag; + + customFlag = String::stringWithUTF8Characters(flag->fl_data.fl_keyword); + result->addObject(customFlag); + } + } + + return result; +} + #pragma mark set conversion static Array * arrayFromSet(struct mailimap_set * imap_set) @@ -1898,6 +1928,10 @@ static void msg_att_handler(struct mailimap_msg_att * msg_att, void * context) msg->setFlags(flags); msg->setOriginalFlags(flags); hasFlags = true; + + Array * customFlags; + customFlags = custom_flags_from_lep_att_dynamic(att_item->att_data.att_dyn); + msg->setCustomFlags(customFlags); } else if (att_item->att_type == MAILIMAP_MSG_ATT_ITEM_STATIC) { struct mailimap_msg_att_static * att_static; @@ -3185,7 +3219,7 @@ HashMap * IMAPSession::fetchNamespace(ErrorCode * pError) return result; } -void IMAPSession::storeFlags(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, MessageFlag flags, ErrorCode * pError) +void IMAPSession::storeFlags(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, MessageFlag flags, Array * customFlags, ErrorCode * pError) { struct mailimap_set * imap_set; struct mailimap_store_att_flags * store_att_flags; @@ -3235,28 +3269,12 @@ void IMAPSession::storeFlags(String * folder, IndexSet * uids, IMAPStoreFlagsReq f = mailimap_flag_new_draft(); mailimap_flag_list_add(flag_list, f); } - if ((flags & MessageFlagMDNSent) != 0) { - struct mailimap_flag * f; - - f = mailimap_flag_new_flag_keyword(strdup("$MDNSent")); - mailimap_flag_list_add(flag_list, f); - } - if ((flags & MessageFlagForwarded) != 0) { - struct mailimap_flag * f; - - f = mailimap_flag_new_flag_keyword(strdup("$Forwarded")); - mailimap_flag_list_add(flag_list, f); - } - if ((flags & MessageFlagSubmitPending) != 0) { - struct mailimap_flag * f; - - f = mailimap_flag_new_flag_keyword(strdup("$SubmitPending")); - mailimap_flag_list_add(flag_list, f); - } - if ((flags & MessageFlagSubmitted) != 0) { + + for (unsigned int i = 0 ; i < customFlags->count() ; i ++) { struct mailimap_flag * f; - - f = mailimap_flag_new_flag_keyword(strdup("$Submitted")); + String * customFlag = (String *) customFlags->objectAtIndex(i); + + f = mailimap_flag_new_flag_keyword(strdup(customFlag->UTF8Characters())); mailimap_flag_list_add(flag_list, f); } diff --git a/src/core/imap/MCIMAPSession.h b/src/core/imap/MCIMAPSession.h index f185483f..7a7c2ef0 100755 --- a/src/core/imap/MCIMAPSession.h +++ b/src/core/imap/MCIMAPSession.h @@ -121,7 +121,7 @@ namespace mailcore { IMAPProgressCallback * progressCallback, Array * extraHeaders, ErrorCode * pError); - virtual void storeFlags(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, MessageFlag flags, ErrorCode * pError); + virtual void storeFlags(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, MessageFlag flags, Array * customFlags, ErrorCode * pError); virtual void storeLabels(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, Array * labels, ErrorCode * pError); virtual IndexSet * search(String * folder, IMAPSearchKind kind, String * searchString, ErrorCode * pError); diff --git a/src/objc/imap/MCOIMAPMessage.h b/src/objc/imap/MCOIMAPMessage.h index 7f28663e..80583d60 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, assign) 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/MCOIMAPSession.h b/src/objc/imap/MCOIMAPSession.h index 8ddfa8cd..5e27fba8 100755 --- a/src/objc/imap/MCOIMAPSession.h +++ b/src/objc/imap/MCOIMAPSession.h @@ -293,7 +293,8 @@ MCOIMAPOperation * op = [session storeFlagsOperationWithFolder:@"INBOX" uids:[MCOIndexSet indexSetWithIndex:456] kind:MCOIMAPStoreFlagsRequestKindAdd - flags:MCOMessageFlagSeen]; + flags:MCOMessageFlagSeen] + customFlags:@["$Forwarded"]; [op start:^(NSError * error) { ... }]; @@ -301,7 +302,8 @@ - (MCOIMAPOperation *) storeFlagsOperationWithFolder:(NSString *)folder uids:(MCOIndexSet *)uids kind:(MCOIMAPStoreFlagsRequestKind)kind - flags:(MCOMessageFlag)flags; + flags:(MCOMessageFlag)flags + customFlags:(NSArray *)customFlags; /** Returns an operation to change labels of messages. Intended for Gmail diff --git a/src/objc/imap/MCOIMAPSession.mm b/src/objc/imap/MCOIMAPSession.mm index 762e594a..94f86139 100755 --- a/src/objc/imap/MCOIMAPSession.mm +++ b/src/objc/imap/MCOIMAPSession.mm @@ -339,11 +339,13 @@ MCO_OBJC_SYNTHESIZE_SCALAR(dispatch_queue_t, dispatch_queue_t, setDispatchQueue, 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); } |