From 1acd00a3980410c989ee92b04aca23c9c70f0ced Mon Sep 17 00:00:00 2001 From: Bob Van Osten Date: Thu, 14 Nov 2013 00:13:07 -0800 Subject: Support searching by a gmail thread id --- src/core/abstract/MCMessageConstants.h | 1 + src/core/imap/MCIMAPSearchExpression.cc | 18 ++++++++++++++++++ src/core/imap/MCIMAPSearchExpression.h | 3 +++ src/core/imap/MCIMAPSession.cc | 4 ++++ src/objc/abstract/MCOConstants.h | 2 ++ src/objc/imap/MCOIMAPSearchExpression.h | 11 +++++++++++ src/objc/imap/MCOIMAPSearchExpression.mm | 5 +++++ 7 files changed, 44 insertions(+) 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 #import +@class MCOIndexSet; + @interface MCOIMAPSearchExpression : NSObject /** @@ -71,6 +73,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. 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); -- cgit v1.2.3