aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core
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 /src/core
parentbaef8a77d30a9844eb63886624a1e04761d88a4a (diff)
parent5d76e5f9a175e611ea7ef922619012381decf7fc (diff)
Merge pull request #487 from pfennema/master
Separate searches for to, cc and bcc fields and uids
Diffstat (limited to 'src/core')
-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
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()));