diff options
author | 2013-03-10 22:39:15 -0700 | |
---|---|---|
committer | 2013-03-10 22:39:15 -0700 | |
commit | 8c92ac7a4b67d4ebb4dd177cf70aef73278d2baa (patch) | |
tree | 8f410ca690418cb89c2bbc84e74cffa67a504235 /src/core/imap | |
parent | 3288fbac4090ecf5ea490ba72e5c3c01a4233e21 (diff) |
now uses IndexSet for message uids and numbers
Diffstat (limited to 'src/core/imap')
-rw-r--r-- | src/core/imap/MCIMAPSession.cc | 80 | ||||
-rw-r--r-- | src/core/imap/MCIMAPSession.h | 26 |
2 files changed, 92 insertions, 14 deletions
diff --git a/src/core/imap/MCIMAPSession.cc b/src/core/imap/MCIMAPSession.cc index 0d0bf64e..2d76ff94 100644 --- a/src/core/imap/MCIMAPSession.cc +++ b/src/core/imap/MCIMAPSession.cc @@ -270,6 +270,23 @@ static clist * splitSet(struct mailimap_set * set, unsigned int splitCount) return result; } +static struct mailimap_set * setFromIndexSet(IndexSet * indexSet) +{ + struct mailimap_set * imap_set; + + imap_set = mailimap_set_new_empty(); + for(unsigned int i = 0 ; i < indexSet->rangesCount() ; i ++) { + uint64_t left = RangeLeftBound(indexSet->allRanges()[i]); + uint64_t right = RangeRightBound(indexSet->allRanges()[i]); + if (right == UINT64_MAX) { + right = 0; + } + mailimap_set_add_interval(imap_set, (uint32_t) left, (uint32_t) right); + } + + return imap_set; +} + void IMAPSession::init() { mHostname = NULL; @@ -1853,6 +1870,7 @@ IMAPSyncResult * IMAPSession::fetchMessages(String * folder, IMAPMessagesRequest return result; } +#if 0 Array * IMAPSession::fetchMessagesByUID(String * folder, IMAPMessagesRequestKind requestKind, uint32_t firstUID, uint32_t lastUID, IMAPProgressCallback * progressCallback, ErrorCode * pError) { @@ -1909,6 +1927,35 @@ Array * IMAPSession::fetchMessagesByNumber(String * folder, IMAPMessagesRequestK mailimap_set_free(imapset); return result; } +#endif + +Array * IMAPSession::fetchMessagesByUID(String * folder, IMAPMessagesRequestKind requestKind, + IndexSet * uids, IMAPProgressCallback * progressCallback, ErrorCode * pError) +{ + struct mailimap_set * imapset = setFromIndexSet(uids); + IMAPSyncResult * syncResult = fetchMessages(folder, requestKind, true, imapset, 0, NULL, 0, + progressCallback, pError); + if (syncResult == NULL) + return NULL; + Array * result = syncResult->modifiedOrAddedMessages(); + result->retain()->autorelease(); + mailimap_set_free(imapset); + return result; +} + +Array * IMAPSession::fetchMessagesByNumber(String * folder, IMAPMessagesRequestKind requestKind, + IndexSet * numbers, IMAPProgressCallback * progressCallback, ErrorCode * pError) +{ + struct mailimap_set * imapset = setFromIndexSet(numbers); + IMAPSyncResult * syncResult = fetchMessages(folder, requestKind, false, imapset, 0, NULL, 0, + progressCallback, pError); + if (syncResult == NULL) + return NULL; + Array * result = syncResult->modifiedOrAddedMessages(); + result->retain()->autorelease(); + mailimap_set_free(imapset); + return result; +} static int fetch_rfc822(mailimap * session, uint32_t msgid, char ** result) @@ -2227,8 +2274,12 @@ void IMAPSession::idle(String * folder, uint32_t lastKnownUID, ErrorCode * pErro if (lastKnownUID != 0) { Array * msgs; +#if 0 msgs = fetchMessagesByUID(folder, IMAPMessagesRequestKindUid, lastKnownUID, 0, NULL, pError); +#endif + msgs = fetchMessagesByUID(folder, IMAPMessagesRequestKindUid, IndexSet::indexSetWithRange(RangeMake(lastKnownUID, UINT64_MAX)), + NULL, pError); if (* pError != ErrorNone) return; if (msgs->count() > 0) { @@ -2677,10 +2728,11 @@ unsigned int IMAPSession::lastFolderMessageCount() return mFolderMsgCount; } -IMAPSyncResult * IMAPSession::syncMessagesByUIDForModSeq(String * folder, IMAPMessagesRequestKind requestKind, - uint32_t firstUID, uint32_t lastUID, - uint64_t modseq, - IMAPProgressCallback * progressCallback, ErrorCode * pError) +#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, @@ -2689,9 +2741,9 @@ IMAPSyncResult * IMAPSession::syncMessagesByUIDForModSeq(String * folder, IMAPMe return result; } -IMAPSyncResult * IMAPSession::syncMessagesByUIDForModSeq(String * folder, IMAPMessagesRequestKind requestKind, - Array * uids, uint64_t modseq, - IMAPProgressCallback * progressCallback, ErrorCode * pError) +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, @@ -2700,6 +2752,20 @@ IMAPSyncResult * IMAPSession::syncMessagesByUIDForModSeq(String * folder, IMAPMe mailimap_set_free(imapset); return result; } +#endif + +IMAPSyncResult * IMAPSession::syncMessagesByUID(String * folder, IMAPMessagesRequestKind requestKind, + IndexSet * uids, uint64_t modseq, + IMAPProgressCallback * progressCallback, ErrorCode * pError) +{ + MCAssert(uids->rangesCount() > 0); + struct mailimap_set * imapset = setFromIndexSet(uids); + IMAPSyncResult * result = fetchMessages(folder, requestKind, true, imapset, modseq, NULL, + (uint32_t) uids->allRanges()[0].location, + progressCallback, pError); + mailimap_set_free(imapset); + return result; +} IndexSet * IMAPSession::capability(ErrorCode * pError) { diff --git a/src/core/imap/MCIMAPSession.h b/src/core/imap/MCIMAPSession.h index 6239a2d7..2b4b8b91 100644 --- a/src/core/imap/MCIMAPSession.h +++ b/src/core/imap/MCIMAPSession.h @@ -80,6 +80,7 @@ namespace mailcore { 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, @@ -88,6 +89,12 @@ namespace mailcore { 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, + IndexSet * numbers, IMAPProgressCallback * progressCallback, ErrorCode * pError); + virtual Data * fetchMessageByUID(String * folder, uint32_t uid, IMAPProgressCallback * progressCallback, ErrorCode * pError); virtual Data * fetchMessageAttachmentByUID(String * folder, uint32_t uid, String * partID, @@ -96,13 +103,18 @@ namespace mailcore { ErrorCode * pError); /* When CONDSTORE or QRESYNC is available */ - virtual IMAPSyncResult * syncMessagesByUIDForModSeq(String * folder, IMAPMessagesRequestKind requestKind, - uint32_t firstUID, uint32_t lastUID, - uint64_t modseq, - IMAPProgressCallback * progressCallback, ErrorCode * pError); - virtual IMAPSyncResult * syncMessagesByUIDForModSeq(String * folder, IMAPMessagesRequestKind requestKind, - Array * uids, uint64_t modseq, - IMAPProgressCallback * progressCallback, ErrorCode * pError); +#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); |