aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Bob Van Osten <bob@relateiq.com>2013-11-14 00:13:07 -0800
committerGravatar Bob Van Osten <bob@relateiq.com>2013-11-14 00:13:07 -0800
commit1acd00a3980410c989ee92b04aca23c9c70f0ced (patch)
tree5ef5b7fe17423f0be0c80c47ab98e3e66061ea15
parentdf1a6bc64fcac26f46bfdd19947786a42c95540b (diff)
Support searching by a gmail thread id
-rw-r--r--src/core/abstract/MCMessageConstants.h1
-rw-r--r--src/core/imap/MCIMAPSearchExpression.cc18
-rw-r--r--src/core/imap/MCIMAPSearchExpression.h3
-rwxr-xr-xsrc/core/imap/MCIMAPSession.cc4
-rw-r--r--src/objc/abstract/MCOConstants.h2
-rw-r--r--src/objc/imap/MCOIMAPSearchExpression.h11
-rw-r--r--src/objc/imap/MCOIMAPSearchExpression.mm5
7 files changed, 44 insertions, 0 deletions
diff --git a/src/core/abstract/MCMessageConstants.h b/src/core/abstract/MCMessageConstants.h
index c8e64ff4..4ad14b89 100644
--- a/src/core/abstract/MCMessageConstants.h
+++ b/src/core/abstract/MCMessageConstants.h
@@ -168,6 +168,7 @@ namespace mailcore {
IMAPSearchKindSubject,
IMAPSearchKindContent,
IMAPSearchKindHeader,
+ IMAPSearchKindGmailThreadId,
IMAPSearchKindOr,
IMAPSearchKindAnd,
};
diff --git a/src/core/imap/MCIMAPSearchExpression.cc b/src/core/imap/MCIMAPSearchExpression.cc
index 2157fdd2..8866486e 100644
--- a/src/core/imap/MCIMAPSearchExpression.cc
+++ b/src/core/imap/MCIMAPSearchExpression.cc
@@ -7,6 +7,7 @@ void IMAPSearchExpression::init()
mKind = IMAPSearchKindNone;
mHeader = NULL;
mValue = NULL;
+ mLongNumber = NULL;
mLeftExpression = NULL;
mRightExpression = NULL;
}
@@ -20,6 +21,7 @@ IMAPSearchExpression::IMAPSearchExpression(IMAPSearchExpression * other)
{
init();
mKind = other->mKind;
+ mLongNumber = other->mLongNumber;
MC_SAFE_REPLACE_COPY(String, mHeader, other->mHeader);
MC_SAFE_REPLACE_COPY(String, mValue, other->mValue);
MC_SAFE_REPLACE_COPY(IMAPSearchExpression, mLeftExpression, other->mLeftExpression);
@@ -57,6 +59,9 @@ String * IMAPSearchExpression::description()
case IMAPSearchKindHeader:
return String::stringWithUTF8Format("<%s:%p Header %s %s>", MCUTF8(className()), this,
MCUTF8(mHeader->description()), MCUTF8(mValue->description()));
+ case IMAPSearchKindGmailThreadId:
+ return String::stringWithUTF8Format("<%s:%p X-GM-THRID %llu>", MCUTF8(className()), this,
+ mLongNumber);
case IMAPSearchKindOr:
return String::stringWithUTF8Format("<%s:%p Or %s %s>", MCUTF8(className()), this,
MCUTF8(mLeftExpression->description()), MCUTF8(mRightExpression->description()));
@@ -119,6 +124,14 @@ IMAPSearchExpression * IMAPSearchExpression::searchHeader(String * header, Strin
return (IMAPSearchExpression *) expr->autorelease();
}
+IMAPSearchExpression * IMAPSearchExpression::searchGmailThreadId(uint64_t number)
+{
+ IMAPSearchExpression * expr = new IMAPSearchExpression();
+ expr->mKind = IMAPSearchKindGmailThreadId;
+ expr->mLongNumber = number;
+ return (IMAPSearchExpression *) expr->autorelease();
+}
+
IMAPSearchExpression * IMAPSearchExpression::searchAnd(IMAPSearchExpression * left, IMAPSearchExpression * right)
{
IMAPSearchExpression * expr = new IMAPSearchExpression();
@@ -152,6 +165,11 @@ String * IMAPSearchExpression::value()
return mValue;
}
+uint64_t IMAPSearchExpression::longNumber()
+{
+ return mLongNumber;
+}
+
IMAPSearchExpression * IMAPSearchExpression::leftExpression()
{
return mLeftExpression;
diff --git a/src/core/imap/MCIMAPSearchExpression.h b/src/core/imap/MCIMAPSearchExpression.h
index dcc46666..75fd16d3 100644
--- a/src/core/imap/MCIMAPSearchExpression.h
+++ b/src/core/imap/MCIMAPSearchExpression.h
@@ -17,6 +17,7 @@ namespace mailcore {
virtual IMAPSearchKind kind();
virtual String * header();
virtual String * value();
+ virtual uint64_t longNumber();
virtual IMAPSearchExpression * leftExpression();
virtual IMAPSearchExpression * rightExpression();
@@ -26,6 +27,7 @@ namespace mailcore {
static IMAPSearchExpression * searchSubject(String * value);
static IMAPSearchExpression * searchContent(String * value);
static IMAPSearchExpression * searchHeader(String * header, String * value);
+ static IMAPSearchExpression * searchGmailThreadId(uint64_t number);
static IMAPSearchExpression * searchAnd(IMAPSearchExpression * left, IMAPSearchExpression * right);
static IMAPSearchExpression * searchOr(IMAPSearchExpression * left, IMAPSearchExpression * right);
@@ -38,6 +40,7 @@ namespace mailcore {
IMAPSearchKind mKind;
String * mHeader;
String * mValue;
+ uint64_t mLongNumber;
IMAPSearchExpression * mLeftExpression;
IMAPSearchExpression * mRightExpression;
void init();
diff --git a/src/core/imap/MCIMAPSession.cc b/src/core/imap/MCIMAPSession.cc
index 6c553e65..c3a13cd1 100755
--- a/src/core/imap/MCIMAPSession.cc
+++ b/src/core/imap/MCIMAPSession.cc
@@ -2594,6 +2594,10 @@ static struct mailimap_search_key * searchKeyFromSearchExpression(IMAPSearchExpr
{
return mailimap_search_key_new_header(strdup(expression->header()->UTF8Characters()), strdup(expression->value()->UTF8Characters()));
}
+ case IMAPSearchKindGmailThreadId:
+ {
+ return mailimap_search_key_xgmthrid(expression->longNumber());
+ }
case IMAPSearchKindOr:
{
return mailimap_search_key_new_or(searchKeyFromSearchExpression(expression->leftExpression()), searchKeyFromSearchExpression(expression->rightExpression()));
diff --git a/src/objc/abstract/MCOConstants.h b/src/objc/abstract/MCOConstants.h
index 7a53ce1e..794d7dee 100644
--- a/src/objc/abstract/MCOConstants.h
+++ b/src/objc/abstract/MCOConstants.h
@@ -170,6 +170,8 @@ typedef enum {
MCOIMAPSearchKindContent,
/** Match headers of the message.*/
MCOIMAPSearchKindHeader,
+ /** Match X-GM-THRID.*/
+ MCOIMAPSearchGmailThreadId,
/** Or expresssion.*/
MCOIMAPSearchKindOr,
/** And expression.*/
diff --git a/src/objc/imap/MCOIMAPSearchExpression.h b/src/objc/imap/MCOIMAPSearchExpression.h
index 0983f685..2f4515dc 100644
--- a/src/objc/imap/MCOIMAPSearchExpression.h
+++ b/src/objc/imap/MCOIMAPSearchExpression.h
@@ -15,6 +15,8 @@
#import <Foundation/Foundation.h>
#import <MailCore/MCOConstants.h>
+@class MCOIndexSet;
+
@interface MCOIMAPSearchExpression : NSObject
/**
@@ -72,6 +74,15 @@
+ (MCOIMAPSearchExpression *) searchHeader:(NSString *)header value:(NSString *)value;
/**
+ Creates a search expression that matches emails with the given gmail thread id
+
+ Example:
+
+ MCOIMAPSearchExpression * expr = [MCOIMAPSearchExpression searchGmailThredId:aThreadId]
+ */
++ (MCOIMAPSearchExpression *) searchGmailThreadId:(uint64_t)number;
+
+/**
Creates a search expression that's a disjunction of two search expressions.
Example:
diff --git a/src/objc/imap/MCOIMAPSearchExpression.mm b/src/objc/imap/MCOIMAPSearchExpression.mm
index b565acba..e3effc6a 100644
--- a/src/objc/imap/MCOIMAPSearchExpression.mm
+++ b/src/objc/imap/MCOIMAPSearchExpression.mm
@@ -87,6 +87,11 @@
return MCO_TO_OBJC(mailcore::IMAPSearchExpression::searchHeader([header mco_mcString], [value mco_mcString]));
}
++ (MCOIMAPSearchExpression *) searchGmailThreadId:(uint64_t)number
+{
+ return MCO_TO_OBJC(mailcore::IMAPSearchExpression::searchGmailThreadId(number));
+}
+
+ (MCOIMAPSearchExpression *) searchAnd:(MCOIMAPSearchExpression *)expression other:(MCOIMAPSearchExpression *)other
{
mailcore::IMAPSearchExpression * result = mailcore::IMAPSearchExpression::searchAnd(expression->_nativeExpr, other->_nativeExpr);