From 1640f3525f830df5382edb96f6e6f6a71993787c Mon Sep 17 00:00:00 2001 From: "Hoa V. DINH" Date: Tue, 26 Mar 2013 00:58:03 -0700 Subject: IMAP ObjC async operations implemented --- src/core/imap/MCIMAPSession.cc | 75 ++++++++++++++++---------------------- src/core/imap/MCIMAPSession.h | 31 +++------------- src/core/imap/MCIMAPSyncResult.cpp | 6 +-- src/core/imap/MCIMAPSyncResult.h | 6 +-- 4 files changed, 44 insertions(+), 74 deletions(-) (limited to 'src/core') diff --git a/src/core/imap/MCIMAPSession.cc b/src/core/imap/MCIMAPSession.cc index 6a8ddaf5..7b9d2f7e 100644 --- a/src/core/imap/MCIMAPSession.cc +++ b/src/core/imap/MCIMAPSession.cc @@ -287,6 +287,21 @@ static struct mailimap_set * setFromIndexSet(IndexSet * indexSet) return imap_set; } +static IndexSet * indexSetFromSet(struct mailimap_set * imap_set) +{ + IndexSet * indexSet = IndexSet::indexSet(); + for(clistiter * cur = clist_begin(imap_set->set_list) ; cur != NULL ; cur = clist_next(cur)) { + struct mailimap_set_item * item = (struct mailimap_set_item *) clist_content(cur); + if (item->set_last == 0) { + indexSet->addRange(RangeMake(item->set_first, UINT64_MAX)); + } + else { + indexSet->addRange(RangeMake(item->set_first, item->set_last - item->set_first)); + } + } + return indexSet; +} + void IMAPSession::init() { mHostname = NULL; @@ -1197,8 +1212,8 @@ void IMAPSession::appendMessage(String * folder, Data * messageData, MessageFlag * pError = ErrorNone; } -void IMAPSession::copyMessages(String * folder, Array * uidSet, String * destFolder, - Array ** pDestUIDs, ErrorCode * pError) +void IMAPSession::copyMessages(String * folder, IndexSet * uidSet, String * destFolder, + IndexSet ** pDestUIDs, ErrorCode * pError) { int r; struct mailimap_set * set; @@ -1206,19 +1221,19 @@ void IMAPSession::copyMessages(String * folder, Array * uidSet, String * destFol struct mailimap_set * dest_uid; uint32_t uidvalidity; clist * setList; - Array * uidSetResult; + IndexSet * uidSetResult; selectIfNeeded(folder, pError); if (* pError != ErrorNone) return; - set = setFromArray(uidSet); + set = setFromIndexSet(uidSet); if (clist_count(set->set_list) == 0) { return; } setList = splitSet(set, 10); - uidSetResult = new Array(); + uidSetResult = IndexSet::indexSet(); for(clistiter * iter = clist_begin(setList) ; iter != NULL ; iter = clist_next(iter)) { struct mailimap_set * current_set; @@ -1245,11 +1260,11 @@ void IMAPSession::copyMessages(String * folder, Array * uidSet, String * destFol } if (dest_uid != NULL) { - uidSetResult->addObjectsFromArray(arrayFromSet(dest_uid)); + uidSetResult = indexSetFromSet(dest_uid); mailimap_set_free(dest_uid); } } - * pDestUIDs = (Array *) uidSetResult->autorelease(); + * pDestUIDs = (IndexSet *) uidSetResult->autorelease(); * pError = ErrorNone; release: @@ -1642,7 +1657,7 @@ IMAPSyncResult * IMAPSession::fetchMessages(String * folder, IMAPMessagesRequest bool needsFlags; bool needsGmailLabels; Array * messages; - Array * vanishedMessages; + IndexSet * vanishedMessages; selectIfNeeded(folder, pError); if (* pError != ErrorNone) @@ -1807,7 +1822,7 @@ IMAPSyncResult * IMAPSession::fetchMessages(String * folder, IMAPMessagesRequest vanishedMessages = NULL; if (vanished != NULL) { - vanishedMessages = arrayFromSet(vanished->qr_known_uids); + vanishedMessages = indexSetFromSet(vanished->qr_known_uids); } mBodyProgressEnabled = true; @@ -2079,7 +2094,7 @@ Data * IMAPSession::fetchMessageAttachmentByUID(String * folder, uint32_t uid, S return data; } -Array * IMAPSession::search(String * folder, IMAPSearchKind kind, String * searchString, ErrorCode * pError) +IndexSet * IMAPSession::search(String * folder, IMAPSearchKind kind, String * searchString, ErrorCode * pError) { IMAPSearchExpression * expr; @@ -2158,7 +2173,7 @@ static struct mailimap_search_key * searchKeyFromSearchExpression(IMAPSearchExpr } } -Array * IMAPSession::search(String * folder, IMAPSearchExpression * expression, ErrorCode * pError) +IndexSet * IMAPSession::search(String * folder, IMAPSearchExpression * expression, ErrorCode * pError) { struct mailimap_search_key * key; @@ -2185,10 +2200,10 @@ Array * IMAPSession::search(String * folder, IMAPSearchExpression * expression, return NULL; } - Array * result = Array::array(); + IndexSet * result = IndexSet::indexSet(); for(clistiter * cur = clist_begin(result_list) ; cur != NULL ; cur = clist_next(cur)) { uint32_t * uid = (uint32_t *) clist_content(cur); - result->addObject(Value::valueWithUnsignedLongValue(* uid)); + result->addIndex(* uid); } mailimap_search_result_free(result_list); * pError = ErrorNone; @@ -2455,7 +2470,7 @@ HashMap * IMAPSession::fetchNamespace(ErrorCode * pError) return result; } -void IMAPSession::storeFlags(String * folder, Array * uids, IMAPStoreFlagsRequestKind kind, MessageFlag flags, ErrorCode * pError) +void IMAPSession::storeFlags(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, MessageFlag flags, ErrorCode * pError) { struct mailimap_set * imap_set; struct mailimap_store_att_flags * store_att_flags; @@ -2467,7 +2482,7 @@ void IMAPSession::storeFlags(String * folder, Array * uids, IMAPStoreFlagsReques if (* pError != ErrorNone) return; - imap_set = setFromArray(uids); + imap_set = setFromIndexSet(uids); if (clist_count(imap_set->set_list) == 0) { return; } @@ -2576,7 +2591,7 @@ void IMAPSession::storeFlags(String * folder, Array * uids, IMAPStoreFlagsReques * pError = ErrorNone; } -void IMAPSession::storeLabels(String * folder, Array * uids, IMAPStoreFlagsRequestKind kind, Array * labels, ErrorCode * pError) +void IMAPSession::storeLabels(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, Array * labels, ErrorCode * pError) { struct mailimap_set * imap_set; struct mailimap_msg_att_xgmlabels * xgmlabels; @@ -2587,7 +2602,7 @@ void IMAPSession::storeLabels(String * folder, Array * uids, IMAPStoreFlagsReque if (* pError != ErrorNone) return; - imap_set = setFromArray(uids); + imap_set = setFromIndexSet(uids); if (clist_count(imap_set->set_list) == 0) { return; } @@ -2665,32 +2680,6 @@ unsigned int IMAPSession::lastFolderMessageCount() return mFolderMsgCount; } -#if 0 -IMAPSyncResult * IMAPSession::syncMessagesByUID(String * folder, IMAPMessagesRequestKind requestKind, - uint32_t firstUID, uint32_t lastUID, - uint64_t modseq, - IMAPProgressCallback * progressCallback, ErrorCode * pError) -{ - struct mailimap_set * imapset = mailimap_set_new_interval(firstUID, lastUID); - IMAPSyncResult * result = fetchMessages(folder, requestKind, true, imapset, modseq, NULL, firstUID, - progressCallback, pError); - mailimap_set_free(imapset); - return result; -} - -IMAPSyncResult * IMAPSession::syncMessagesByUID(String * folder, IMAPMessagesRequestKind requestKind, - Array * uids, uint64_t modseq, - IMAPProgressCallback * progressCallback, ErrorCode * pError) -{ - struct mailimap_set * imapset = setFromArray(uids); - IMAPSyncResult * result = fetchMessages(folder, requestKind, true, imapset, modseq, NULL, - (uint32_t) ((Value *) uids->objectAtIndex(0))->unsignedLongValue(), - progressCallback, pError); - mailimap_set_free(imapset); - return result; -} -#endif - IMAPSyncResult * IMAPSession::syncMessagesByUID(String * folder, IMAPMessagesRequestKind requestKind, IndexSet * uids, uint64_t modseq, IMAPProgressCallback * progressCallback, ErrorCode * pError) diff --git a/src/core/imap/MCIMAPSession.h b/src/core/imap/MCIMAPSession.h index 2b4b8b91..bd31527e 100644 --- a/src/core/imap/MCIMAPSession.h +++ b/src/core/imap/MCIMAPSession.h @@ -75,21 +75,11 @@ namespace mailcore { virtual void appendMessage(String * folder, Data * messageData, MessageFlag flags, IMAPProgressCallback * progressCallback, uint32_t * createdUID, ErrorCode * pError); - virtual void copyMessages(String * folder, Array * uidSet, String * destFolder, - Array ** pDestUIDs, ErrorCode * pError); + virtual void copyMessages(String * folder, IndexSet * uidSet, String * destFolder, + IndexSet ** pDestUIDs, ErrorCode * pError); virtual void expunge(String * folder, ErrorCode * pError); -#if 0 - virtual Array * /* IMAPMessage */ fetchMessagesByUID(String * folder, IMAPMessagesRequestKind requestKind, - uint32_t firstUID, uint32_t lastUID, IMAPProgressCallback * progressCallback, ErrorCode * pError); - virtual Array * /* IMAPMessage */ fetchMessagesByNumber(String * folder, IMAPMessagesRequestKind requestKind, - uint32_t firstNumber, uint32_t lastNumber, IMAPProgressCallback * progressCallback, ErrorCode * pError); - virtual Array * /* IMAPMessage */ fetchMessagesByUID(String * folder, IMAPMessagesRequestKind requestKind, - Array * /* Value */ uids, IMAPProgressCallback * progressCallback, ErrorCode * pError); - virtual Array * /* IMAPMessage */ fetchMessagesByNumber(String * folder, IMAPMessagesRequestKind requestKind, - Array * /* Value */ numbers, IMAPProgressCallback * progressCallback, ErrorCode * pError); -#endif virtual Array * /* IMAPMessage */ fetchMessagesByUID(String * folder, IMAPMessagesRequestKind requestKind, IndexSet * uids, IMAPProgressCallback * progressCallback, ErrorCode * pError); virtual Array * /* IMAPMessage */ fetchMessagesByNumber(String * folder, IMAPMessagesRequestKind requestKind, @@ -103,24 +93,15 @@ namespace mailcore { ErrorCode * pError); /* When CONDSTORE or QRESYNC is available */ -#if 0 - virtual IMAPSyncResult * syncMessagesByUID(String * folder, IMAPMessagesRequestKind requestKind, - uint32_t firstUID, uint32_t lastUID, - uint64_t modseq, - IMAPProgressCallback * progressCallback, ErrorCode * pError); - virtual IMAPSyncResult * syncMessagesByUID(String * folder, IMAPMessagesRequestKind requestKind, - Array * uids, uint64_t modseq, - IMAPProgressCallback * progressCallback, ErrorCode * pError); -#endif virtual IMAPSyncResult * syncMessagesByUID(String * folder, IMAPMessagesRequestKind requestKind, IndexSet * uids, uint64_t modseq, IMAPProgressCallback * progressCallback, ErrorCode * pError); - virtual void storeFlags(String * folder, Array * uids, IMAPStoreFlagsRequestKind kind, MessageFlag flags, ErrorCode * pError); - virtual void storeLabels(String * folder, Array * uids, IMAPStoreFlagsRequestKind kind, Array * labels, ErrorCode * pError); + virtual void storeFlags(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, MessageFlag flags, ErrorCode * pError); + virtual void storeLabels(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, Array * labels, ErrorCode * pError); - virtual Array * search(String * folder, IMAPSearchKind kind, String * searchString, ErrorCode * pError); - virtual Array * search(String * folder, IMAPSearchExpression * expression, ErrorCode * pError); + virtual IndexSet * search(String * folder, IMAPSearchKind kind, String * searchString, ErrorCode * pError); + virtual IndexSet * search(String * folder, IMAPSearchExpression * expression, ErrorCode * pError); virtual void setupIdle(); virtual void idle(String * folder, uint32_t lastKnownUID, ErrorCode * pError); diff --git a/src/core/imap/MCIMAPSyncResult.cpp b/src/core/imap/MCIMAPSyncResult.cpp index e2d3ee9c..d84f4344 100644 --- a/src/core/imap/MCIMAPSyncResult.cpp +++ b/src/core/imap/MCIMAPSyncResult.cpp @@ -34,12 +34,12 @@ Array * /* IMAPMessage */ IMAPSyncResult::modifiedOrAddedMessages() return mModifiedOrAddedMessages; } -void IMAPSyncResult::setVanishedMessages(Array * /* IMAPMessage */ messages) +void IMAPSyncResult::setVanishedMessages(IndexSet * messages) { - MC_SAFE_REPLACE_RETAIN(Array, mVanishedMessages, messages); + MC_SAFE_REPLACE_RETAIN(IndexSet, mVanishedMessages, messages); } -Array * /* Value */ IMAPSyncResult::vanishedMessages() +IndexSet * IMAPSyncResult::vanishedMessages() { return mVanishedMessages; } diff --git a/src/core/imap/MCIMAPSyncResult.h b/src/core/imap/MCIMAPSyncResult.h index 009bc65e..3505a441 100644 --- a/src/core/imap/MCIMAPSyncResult.h +++ b/src/core/imap/MCIMAPSyncResult.h @@ -23,12 +23,12 @@ namespace mailcore { virtual void setModifiedOrAddedMessages(Array * /* IMAPMessage */ messages); virtual Array * /* IMAPMessage */ modifiedOrAddedMessages(); - virtual void setVanishedMessages(Array * /* IMAPMessage */ messages); - virtual Array * /* Value */ vanishedMessages(); + virtual void setVanishedMessages(IndexSet * vanishedMessages); + virtual IndexSet * vanishedMessages(); private: Array * /* IMAPMessage */ mModifiedOrAddedMessages; - Array * /* Value */ mVanishedMessages; + IndexSet * mVanishedMessages; }; } -- cgit v1.2.3