aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Hoà V. DINH <dinh.viet.hoa@gmail.com>2013-12-08 08:47:50 -0800
committerGravatar Hoà V. DINH <dinh.viet.hoa@gmail.com>2013-12-08 08:47:50 -0800
commitb485ed26daecba8d1b28927cdb687b0e9a6ec557 (patch)
tree55a1a23f665774abb3af8f4e4acde381bb8c5a13
parentbaef8a77d30a9844eb63886624a1e04761d88a4a (diff)
parent5d76e5f9a175e611ea7ef922619012381decf7fc (diff)
Merge pull request #487 from pfennema/master
Separate searches for to, cc and bcc fields and uids
-rw-r--r--src/core/abstract/MCMessageConstants.h6
-rw-r--r--src/core/imap/MCIMAPSearchExpression.cc73
-rw-r--r--src/core/imap/MCIMAPSearchExpression.h9
-rwxr-xr-xsrc/core/imap/MCIMAPSession.cc70
-rw-r--r--src/objc/abstract/MCOConstants.h8
-rw-r--r--src/objc/imap/MCOIMAPSearchExpression.h41
-rw-r--r--src/objc/imap/MCOIMAPSearchExpression.mm18
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]));