aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar pfennema <paul@bryce.demon.nl>2013-12-04 22:27:53 +0100
committerGravatar pfennema <paul@bryce.demon.nl>2013-12-04 22:27:53 +0100
commite2e59990da11eba54050001fff58b466a58ce740 (patch)
treeab0dbcc156ca4e7602e9e9692c4a8d721e39fcbe
parentbaef8a77d30a9844eb63886624a1e04761d88a4a (diff)
Separate searches for to, cc and bcc fields.
Furthermore, search with uids now supported.
-rw-r--r--src/core/abstract/MCMessageConstants.h6
-rw-r--r--src/core/imap/MCIMAPSearchExpression.cc54
-rw-r--r--src/core/imap/MCIMAPSearchExpression.h8
-rwxr-xr-xsrc/core/imap/MCIMAPSession.cc20
-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, 152 insertions, 3 deletions
diff --git a/src/core/abstract/MCMessageConstants.h b/src/core/abstract/MCMessageConstants.h
index 92e04c6e..fb09f46b 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..436c7977 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,8 @@ 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);
}
@@ -32,6 +35,7 @@ IMAPSearchExpression::~IMAPSearchExpression()
{
MC_SAFE_RELEASE(mHeader);
MC_SAFE_RELEASE(mValue);
+ MC_SAFE_RELEASE(mUids);
MC_SAFE_RELEASE(mLeftExpression);
MC_SAFE_RELEASE(mRightExpression);
}
@@ -47,12 +51,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 +100,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 +155,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();
@@ -308,6 +357,11 @@ time_t IMAPSearchExpression::date()
return mDate;
}
+IndexSet * IMAPSearchExpression::uids()
+{
+ return mUids;
+}
+
IMAPSearchExpression * IMAPSearchExpression::leftExpression()
{
return mLeftExpression;
diff --git a/src/core/imap/MCIMAPSearchExpression.h b/src/core/imap/MCIMAPSearchExpression.h
index 2696366c..46f4f9d2 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();
@@ -61,6 +68,7 @@ namespace mailcore {
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..e5356023 100755
--- a/src/core/imap/MCIMAPSession.cc
+++ b/src/core/imap/MCIMAPSession.cc
@@ -2554,6 +2554,15 @@ IndexSet * IMAPSession::search(String * folder, IMAPSearchKind kind, String * se
case IMAPSearchKindFrom:
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;
@@ -2580,6 +2589,15 @@ static struct mailimap_search_key * searchKeyFromSearchExpression(IMAPSearchExpr
{
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 +2623,8 @@ 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..710ea9eb 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..735d6b07 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 "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..2c275054 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]));