aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/imap
diff options
context:
space:
mode:
authorGravatar DINH Viet Hoa <dinh.viet.hoa@gmail.com>2013-03-10 22:39:15 -0700
committerGravatar DINH Viet Hoa <dinh.viet.hoa@gmail.com>2013-03-10 22:39:15 -0700
commit8c92ac7a4b67d4ebb4dd177cf70aef73278d2baa (patch)
tree8f410ca690418cb89c2bbc84e74cffa67a504235 /src/core/imap
parent3288fbac4090ecf5ea490ba72e5c3c01a4233e21 (diff)
now uses IndexSet for message uids and numbers
Diffstat (limited to 'src/core/imap')
-rw-r--r--src/core/imap/MCIMAPSession.cc80
-rw-r--r--src/core/imap/MCIMAPSession.h26
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);