diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/abstract/MCMessageConstants.h | 6 | ||||
-rw-r--r-- | src/core/imap/MCIMAPSearchExpression.cc | 73 | ||||
-rw-r--r-- | src/core/imap/MCIMAPSearchExpression.h | 9 | ||||
-rwxr-xr-x | src/core/imap/MCIMAPSession.cc | 70 |
4 files changed, 133 insertions, 25 deletions
diff --git a/src/core/abstract/MCMessageConstants.h b/src/core/abstract/MCMessageConstants.h index 92e04c6e..a8f0a056 100644 --- a/src/core/abstract/MCMessageConstants.h +++ b/src/core/abstract/MCMessageConstants.h @@ -165,9 +165,13 @@ namespace mailcore { IMAPSearchKindAll, IMAPSearchKindNone, IMAPSearchKindFrom, - IMAPSearchKindRecipient, + IMAPSearchKindTo, + IMAPSearchKindCc, + IMAPSearchKindBcc, + IMAPSearchKindRecipient, // Recipient is the combination of To, Cc and Bcc IMAPSearchKindSubject, IMAPSearchKindContent, + IMAPSearchKindUIDs, IMAPSearchKindHeader, IMAPSearchKindRead, IMAPSearchKindUnread, diff --git a/src/core/imap/MCIMAPSearchExpression.cc b/src/core/imap/MCIMAPSearchExpression.cc index f7ac2a0f..e05ea1e4 100644 --- a/src/core/imap/MCIMAPSearchExpression.cc +++ b/src/core/imap/MCIMAPSearchExpression.cc @@ -8,6 +8,7 @@ void IMAPSearchExpression::init() mHeader = NULL; mValue = NULL; mLongNumber = 0; + mUids = NULL; mLeftExpression = NULL; mRightExpression = NULL; } @@ -24,6 +25,7 @@ IMAPSearchExpression::IMAPSearchExpression(IMAPSearchExpression * other) mLongNumber = other->mLongNumber; MC_SAFE_REPLACE_COPY(String, mHeader, other->mHeader); MC_SAFE_REPLACE_COPY(String, mValue, other->mValue); + MC_SAFE_REPLACE_COPY(IndexSet, mUids, other->mUids); MC_SAFE_REPLACE_COPY(IMAPSearchExpression, mLeftExpression, other->mLeftExpression); MC_SAFE_REPLACE_COPY(IMAPSearchExpression, mRightExpression, other->mRightExpression); } @@ -31,9 +33,10 @@ IMAPSearchExpression::IMAPSearchExpression(IMAPSearchExpression * other) IMAPSearchExpression::~IMAPSearchExpression() { MC_SAFE_RELEASE(mHeader); - MC_SAFE_RELEASE(mValue); - MC_SAFE_RELEASE(mLeftExpression); - MC_SAFE_RELEASE(mRightExpression); + MC_SAFE_RELEASE(mValue); + MC_SAFE_RELEASE(mUids); + MC_SAFE_RELEASE(mLeftExpression); + MC_SAFE_RELEASE(mRightExpression); } String * IMAPSearchExpression::description() @@ -47,12 +50,24 @@ String * IMAPSearchExpression::description() case IMAPSearchKindFrom: return String::stringWithUTF8Format("<%s:%p From %s>", MCUTF8(className()), this, MCUTF8(mValue->description())); + case IMAPSearchKindTo: + return String::stringWithUTF8Format("<%s:%p To %s>", MCUTF8(className()), this, + MCUTF8(mValue->description())); + case IMAPSearchKindCc: + return String::stringWithUTF8Format("<%s:%p Cc %s>", MCUTF8(className()), this, + MCUTF8(mValue->description())); + case IMAPSearchKindBcc: + return String::stringWithUTF8Format("<%s:%p Bcc %s>", MCUTF8(className()), this, + MCUTF8(mValue->description())); case IMAPSearchKindRecipient: return String::stringWithUTF8Format("<%s:%p Recipient %s>", MCUTF8(className()), this, MCUTF8(mValue->description())); case IMAPSearchKindSubject: return String::stringWithUTF8Format("<%s:%p Subject %s>", MCUTF8(className()), this, MCUTF8(mValue->description())); + case IMAPSearchKindUIDs: + return String::stringWithUTF8Format("<%s:%p UIDs %s>", MCUTF8(className()), this, + MCUTF8(mUids->description())); case IMAPSearchKindContent: return String::stringWithUTF8Format("<%s:%p Content %s>", MCUTF8(className()), this, MCUTF8(mValue->description())); @@ -84,6 +99,30 @@ IMAPSearchExpression * IMAPSearchExpression::searchFrom(String * value) return (IMAPSearchExpression *) expr->autorelease(); } +IMAPSearchExpression * IMAPSearchExpression::searchTo(String * value) +{ + IMAPSearchExpression * expr = new IMAPSearchExpression(); + expr->mKind = IMAPSearchKindTo; + MC_SAFE_REPLACE_COPY(String, expr->mValue, value); + return (IMAPSearchExpression *) expr->autorelease(); +} + +IMAPSearchExpression * IMAPSearchExpression::searchCc(String * value) +{ + IMAPSearchExpression * expr = new IMAPSearchExpression(); + expr->mKind = IMAPSearchKindCc; + MC_SAFE_REPLACE_COPY(String, expr->mValue, value); + return (IMAPSearchExpression *) expr->autorelease(); +} + +IMAPSearchExpression * IMAPSearchExpression::searchBcc(String * value) +{ + IMAPSearchExpression * expr = new IMAPSearchExpression(); + expr->mKind = IMAPSearchKindBcc; + MC_SAFE_REPLACE_COPY(String, expr->mValue, value); + return (IMAPSearchExpression *) expr->autorelease(); +} + IMAPSearchExpression * IMAPSearchExpression::searchRecipient(String * value) { IMAPSearchExpression * expr = new IMAPSearchExpression(); @@ -115,6 +154,15 @@ IMAPSearchExpression * IMAPSearchExpression::searchContent(String * value) return (IMAPSearchExpression *) expr->autorelease(); } +IMAPSearchExpression * IMAPSearchExpression::searchUIDs(IndexSet * uids) +{ + IMAPSearchExpression * expr = new IMAPSearchExpression(); + expr->mKind = IMAPSearchKindUIDs; + MC_SAFE_REPLACE_COPY(IndexSet, expr->mUids, uids); + return (IMAPSearchExpression *) expr->autorelease(); +} + + IMAPSearchExpression * IMAPSearchExpression::searchHeader(String * header, String * value) { IMAPSearchExpression * expr = new IMAPSearchExpression(); @@ -198,7 +246,7 @@ IMAPSearchExpression * IMAPSearchExpression::searchBeforeDate(time_t date) { IMAPSearchExpression * expr = new IMAPSearchExpression(); expr->mKind = IMAPSearchKindBeforeDate; - expr->mDate = date; + expr->mLongNumber = (uint64_t) date; return (IMAPSearchExpression *) expr->autorelease(); } @@ -206,7 +254,7 @@ IMAPSearchExpression * IMAPSearchExpression::searchOnDate(time_t date) { IMAPSearchExpression * expr = new IMAPSearchExpression(); expr->mKind = IMAPSearchKindOnDate; - expr->mDate = date; + expr->mLongNumber = (uint64_t) date; return (IMAPSearchExpression *) expr->autorelease(); } @@ -214,7 +262,7 @@ IMAPSearchExpression * IMAPSearchExpression::searchSinceDate(time_t date) { IMAPSearchExpression * expr = new IMAPSearchExpression(); expr->mKind = IMAPSearchKindSinceDate; - expr->mDate = date; + expr->mLongNumber = (uint64_t) date; return (IMAPSearchExpression *) expr->autorelease(); } @@ -222,14 +270,14 @@ IMAPSearchExpression * IMAPSearchExpression::searchBeforeReceivedDate(time_t dat { IMAPSearchExpression * expr = new IMAPSearchExpression(); expr->mKind = IMAPSearchKindBeforeReceivedDate; - expr->mDate = date; + expr->mLongNumber = (uint64_t) date; return (IMAPSearchExpression *) expr->autorelease(); } IMAPSearchExpression * IMAPSearchExpression::searchOnReceivedDate(time_t date) { IMAPSearchExpression * expr = new IMAPSearchExpression(); expr->mKind = IMAPSearchKindOnReceivedDate; - expr->mDate = date; + expr->mLongNumber = (uint64_t) date; return (IMAPSearchExpression *) expr->autorelease(); } @@ -237,7 +285,7 @@ IMAPSearchExpression * IMAPSearchExpression::searchSinceReceivedDate(time_t date { IMAPSearchExpression * expr = new IMAPSearchExpression(); expr->mKind = IMAPSearchKindSinceReceivedDate; - expr->mDate = date; + expr->mLongNumber = (uint64_t) date; return (IMAPSearchExpression *) expr->autorelease(); } @@ -305,7 +353,12 @@ uint64_t IMAPSearchExpression::longNumber() time_t IMAPSearchExpression::date() { - return mDate; + return (time_t) mLongNumber; +} + +IndexSet * IMAPSearchExpression::uids() +{ + return mUids; } IMAPSearchExpression * IMAPSearchExpression::leftExpression() diff --git a/src/core/imap/MCIMAPSearchExpression.h b/src/core/imap/MCIMAPSearchExpression.h index 2696366c..ed1c4b36 100644 --- a/src/core/imap/MCIMAPSearchExpression.h +++ b/src/core/imap/MCIMAPSearchExpression.h @@ -19,15 +19,22 @@ namespace mailcore { virtual String * value(); virtual uint64_t longNumber(); virtual time_t date(); + virtual IndexSet * uids(); + + virtual IMAPSearchExpression * leftExpression(); virtual IMAPSearchExpression * rightExpression(); static IMAPSearchExpression * searchAll(); static IMAPSearchExpression * searchFrom(String * value); + static IMAPSearchExpression * searchTo(String *value); + static IMAPSearchExpression * searchCc(String *value); + static IMAPSearchExpression * searchBcc(String *value); static IMAPSearchExpression * searchRecipient(String * value); static IMAPSearchExpression * searchSubject(String * value); static IMAPSearchExpression * searchContent(String * value); static IMAPSearchExpression * searchHeader(String * header, String * value); + static IMAPSearchExpression * searchUIDs(IndexSet * uids); static IMAPSearchExpression * searchRead(); static IMAPSearchExpression * searchUnread(); static IMAPSearchExpression * searchFlagged(); @@ -60,7 +67,7 @@ namespace mailcore { String * mHeader; String * mValue; uint64_t mLongNumber; - time_t mDate; + IndexSet * mUids; IMAPSearchExpression * mLeftExpression; IMAPSearchExpression * mRightExpression; void init(); diff --git a/src/core/imap/MCIMAPSession.cc b/src/core/imap/MCIMAPSession.cc index 76dbc604..205d53eb 100755 --- a/src/core/imap/MCIMAPSession.cc +++ b/src/core/imap/MCIMAPSession.cc @@ -2549,23 +2549,50 @@ IndexSet * IMAPSession::search(String * folder, IMAPSearchKind kind, String * se expr = NULL; switch (kind) { case IMAPSearchKindAll: - expr = IMAPSearchExpression::searchAll(); - break; + { + expr = IMAPSearchExpression::searchAll(); + break; + } case IMAPSearchKindFrom: - expr = IMAPSearchExpression::searchFrom(searchString); - break; + { + expr = IMAPSearchExpression::searchFrom(searchString); + break; + } + case IMAPSearchKindTo: + { + expr = IMAPSearchExpression::searchTo(searchString); + break; + } + case IMAPSearchKindCc: + { + expr = IMAPSearchExpression::searchCc(searchString); + break; + } + case IMAPSearchKindBcc: + { + expr = IMAPSearchExpression::searchBcc(searchString); + break; + } case IMAPSearchKindRecipient: - expr = IMAPSearchExpression::searchRecipient(searchString); - break; + { + expr = IMAPSearchExpression::searchRecipient(searchString); + break; + } case IMAPSearchKindSubject: - expr = IMAPSearchExpression::searchSubject(searchString); - break; + { + expr = IMAPSearchExpression::searchSubject(searchString); + break; + } case IMAPSearchKindContent: - expr = IMAPSearchExpression::searchContent(searchString); - break; + { + expr = IMAPSearchExpression::searchContent(searchString); + break; + } default: - MCAssert(0); - break; + { + MCAssert(0); + break; + } } return search(folder, expr, pError); } @@ -2573,13 +2600,26 @@ IndexSet * IMAPSession::search(String * folder, IMAPSearchKind kind, String * se static struct mailimap_search_key * searchKeyFromSearchExpression(IMAPSearchExpression * expression) { switch (expression->kind()) { - case IMAPSearchKindAll: { + case IMAPSearchKindAll: + { return mailimap_search_key_new_all(); } case IMAPSearchKindFrom: { return mailimap_search_key_new_from(strdup(expression->value()->UTF8Characters())); } + case IMAPSearchKindTo: + { + return mailimap_search_key_new_to(strdup(expression->value()->UTF8Characters())); + } + case IMAPSearchKindCc: + { + return mailimap_search_key_new_cc(strdup(expression->value()->UTF8Characters())); + } + case IMAPSearchKindBcc: + { + return mailimap_search_key_new_bcc(strdup(expression->value()->UTF8Characters())); + } case IMAPSearchKindRecipient: { struct mailimap_search_key * to_search; @@ -2605,6 +2645,10 @@ static struct mailimap_search_key * searchKeyFromSearchExpression(IMAPSearchExpr { return mailimap_search_key_new_text(strdup(expression->value()->UTF8Characters())); } + case IMAPSearchKindUIDs: + { + return mailimap_search_key_new_uid(setFromIndexSet(expression->uids())); + } case IMAPSearchKindHeader: { return mailimap_search_key_new_header(strdup(expression->header()->UTF8Characters()), strdup(expression->value()->UTF8Characters())); |