diff options
Diffstat (limited to 'src')
-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 | ||||
-rw-r--r-- | src/objc/abstract/MCOConstants.h | 8 | ||||
-rw-r--r-- | src/objc/imap/MCOIMAPSearchExpression.h | 41 | ||||
-rw-r--r-- | src/objc/imap/MCOIMAPSearchExpression.mm | 18 |
7 files changed, 198 insertions, 27 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())); diff --git a/src/objc/abstract/MCOConstants.h b/src/objc/abstract/MCOConstants.h index ac71dd6b..17af29eb 100644 --- a/src/objc/abstract/MCOConstants.h +++ b/src/objc/abstract/MCOConstants.h @@ -165,12 +165,20 @@ typedef enum { MCOIMAPSearchKindNone, /** Match sender.*/ MCOIMAPSearchKindFrom, + /** Match to */ + MCOIMAPSearchKindTo, + /** Match CC: */ + MCOIMAPSearchKindCc, + /** Match BCC: */ + MCOIMAPSearchKindBcc, /** Match recipient.*/ MCOIMAPSearchKindRecipient, /** Match subject.*/ MCOIMAPSearchKindSubject, /** Match content of the message.*/ MCOIMAPSearchKindContent, + /** Match uids */ + MCOIMAPSearchKindUids, /** Match headers of the message.*/ MCOIMAPSearchKindHeader, /** Match X-GM-THRID.*/ diff --git a/src/objc/imap/MCOIMAPSearchExpression.h b/src/objc/imap/MCOIMAPSearchExpression.h index ea9b6812..a52936de 100644 --- a/src/objc/imap/MCOIMAPSearchExpression.h +++ b/src/objc/imap/MCOIMAPSearchExpression.h @@ -14,6 +14,7 @@ #import <Foundation/Foundation.h> #import <MailCore/MCOConstants.h> +#import <MailCore/MCOIndexSet.h> @interface MCOIMAPSearchExpression : NSObject @@ -37,12 +38,39 @@ /** Creates a search expression that matches any recipient of an email. + + Example: + + MCOIMAPSearchExpression * expr = [MCOIMAPSearchExpression searchRecipient:@"ngan@etpan.org"] + **/ ++ (MCOIMAPSearchExpression *) searchRecipient:(NSString *)value; + +/** + Creates a search expression that matches on the receiver (to) of an email. Useful to check whether the mail is directly addressed to the receiver. Example: - MCOIMAPSearchExpression * expr = [MCOIMAPSearchExpression searchRecipient:@"ngan@etpan.org"] + MCOIMAPSearchExpression * expr = [MCOIMAPSearchExpression searchTo:@"ngan@etpan.org"] **/ -+ (MCOIMAPSearchExpression *) searchRecipient:(NSString *)value; ++ (MCOIMAPSearchExpression *) searchTo:(NSString *)value; + +/** + Creates a search expression that matches on the cc of an email. Useful to check whether the mail is addressed to the receiver as cc. + + Example: + + MCOIMAPSearchExpression * expr = [MCOIMAPSearchExpression searchCc:@"ngan@etpan.org"] + **/ ++ (MCOIMAPSearchExpression *) searchCc:(NSString *)value; + +/** + Creates a search expression that matches on the bcc field of an email. Useful to check whether the mail is addressed to the receiver as bcc. + + Example: + + MCOIMAPSearchExpression * expr = [MCOIMAPSearchExpression searchBcc:@"ngan@etpan.org"] + **/ ++ (MCOIMAPSearchExpression *) searchBcc:(NSString *)value; /* Creates a search expression that matches the subject of an email. @@ -63,6 +91,15 @@ + (MCOIMAPSearchExpression *) searchContent:(NSString *)value; /** + Creates a search expression that matches the uids specified. + + Example: + + MCOIMAPSearchExpression * expr = [MCOIMAPSearchExpression searchUids:uids] + **/ ++ (MCOIMAPSearchExpression *) searchUIDs:(MCOIndexSet *) uids; + +/** Creates a search expression that matches the content of a specific header. Example: diff --git a/src/objc/imap/MCOIMAPSearchExpression.mm b/src/objc/imap/MCOIMAPSearchExpression.mm index 252e73b3..0e79237a 100644 --- a/src/objc/imap/MCOIMAPSearchExpression.mm +++ b/src/objc/imap/MCOIMAPSearchExpression.mm @@ -67,6 +67,20 @@ return MCO_TO_OBJC(mailcore::IMAPSearchExpression::searchFrom([value mco_mcString])); } ++ (MCOIMAPSearchExpression *) searchTo:(NSString *)value +{ + return MCO_TO_OBJC(mailcore::IMAPSearchExpression::searchTo([value mco_mcString])); +} + ++ (MCOIMAPSearchExpression *) searchCc:(NSString *)value +{ + return MCO_TO_OBJC(mailcore::IMAPSearchExpression::searchCc([value mco_mcString])); +} + ++ (MCOIMAPSearchExpression *) searchBcc:(NSString *)value +{ + return MCO_TO_OBJC(mailcore::IMAPSearchExpression::searchBcc([value mco_mcString])); +} + (MCOIMAPSearchExpression *) searchRecipient:(NSString *)value { return MCO_TO_OBJC(mailcore::IMAPSearchExpression::searchRecipient([value mco_mcString])); @@ -82,6 +96,10 @@ return MCO_TO_OBJC(mailcore::IMAPSearchExpression::searchContent([value mco_mcString])); } ++ (MCOIMAPSearchExpression *) searchUIDs:(MCOIndexSet *) uids +{ + return MCO_TO_OBJC(mailcore::IMAPSearchExpression::searchUIDs(MCO_FROM_OBJC(mailcore::IndexSet, uids))); +} + (MCOIMAPSearchExpression *) searchHeader:(NSString *)header value:(NSString *)value { return MCO_TO_OBJC(mailcore::IMAPSearchExpression::searchHeader([header mco_mcString], [value mco_mcString])); |