aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Michal Kalis <michal.kalis@cleverlance.com>2014-01-23 15:52:57 +0100
committerGravatar Michal Kalis <michal.kalis@cleverlance.com>2014-01-23 15:52:57 +0100
commit720d3826943981c88706f09b96df495662ffc3ef (patch)
treec61211f941aa53b0d1fb6f30f3ba07fa9f69e5b3
parent4b4d98fbf824985c7dae63794989e916502862a1 (diff)
parent686187b5d35e912d47a1fee710782396ff626bdc (diff)
Merge branch 'feature/custom-flags' into develop
-rwxr-xr-xsrc/async/imap/MCIMAPAsyncConnection.cc3
-rwxr-xr-xsrc/async/imap/MCIMAPAsyncConnection.h2
-rwxr-xr-xsrc/async/imap/MCIMAPAsyncSession.cc4
-rwxr-xr-xsrc/async/imap/MCIMAPAsyncSession.h2
-rw-r--r--src/async/imap/MCIMAPStoreFlagsOperation.cc14
-rw-r--r--src/async/imap/MCIMAPStoreFlagsOperation.h4
-rw-r--r--src/core/imap/MCIMAPMessage.cc18
-rw-r--r--src/core/imap/MCIMAPMessage.h4
-rwxr-xr-xsrc/core/imap/MCIMAPSession.cc62
-rwxr-xr-xsrc/core/imap/MCIMAPSession.h2
-rw-r--r--src/objc/imap/MCOIMAPMessage.h3
-rw-r--r--src/objc/imap/MCOIMAPMessage.mm1
-rwxr-xr-xsrc/objc/imap/MCOIMAPSession.h6
-rwxr-xr-xsrc/objc/imap/MCOIMAPSession.mm4
14 files changed, 97 insertions, 32 deletions
diff --git a/src/async/imap/MCIMAPAsyncConnection.cc b/src/async/imap/MCIMAPAsyncConnection.cc
index 5e3dc21b..aa94e3ee 100755
--- a/src/async/imap/MCIMAPAsyncConnection.cc
+++ b/src/async/imap/MCIMAPAsyncConnection.cc
@@ -420,7 +420,7 @@ IMAPFetchContentOperation * IMAPAsyncConnection::fetchMessageAttachmentByUIDOper
return op;
}
-IMAPOperation * IMAPAsyncConnection::storeFlagsOperation(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, MessageFlag flags)
+IMAPOperation * IMAPAsyncConnection::storeFlagsOperation(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, MessageFlag flags, Array * customFlags)
{
IMAPStoreFlagsOperation * op = new IMAPStoreFlagsOperation();
op->setSession(this);
@@ -428,6 +428,7 @@ IMAPOperation * IMAPAsyncConnection::storeFlagsOperation(String * folder, IndexS
op->setUids(uids);
op->setKind(kind);
op->setFlags(flags);
+ op->setCustomFlags(customFlags);
op->autorelease();
return op;
}
diff --git a/src/async/imap/MCIMAPAsyncConnection.h b/src/async/imap/MCIMAPAsyncConnection.h
index 1f4014da..e380c5e1 100755
--- a/src/async/imap/MCIMAPAsyncConnection.h
+++ b/src/async/imap/MCIMAPAsyncConnection.h
@@ -116,7 +116,7 @@ namespace mailcore {
virtual IMAPFetchContentOperation * fetchMessageAttachmentByUIDOperation(String * folder, uint32_t uid, String * partID,
Encoding encoding);
- virtual IMAPOperation * storeFlagsOperation(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, MessageFlag flags);
+ virtual IMAPOperation * storeFlagsOperation(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, MessageFlag flags, Array * customFlags);
virtual IMAPOperation * storeLabelsOperation(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, Array * labels);
virtual IMAPSearchOperation * searchOperation(String * folder, IMAPSearchKind kind, String * searchString);
diff --git a/src/async/imap/MCIMAPAsyncSession.cc b/src/async/imap/MCIMAPAsyncSession.cc
index 8c3678e1..d6556309 100755
--- a/src/async/imap/MCIMAPAsyncSession.cc
+++ b/src/async/imap/MCIMAPAsyncSession.cc
@@ -418,10 +418,10 @@ IMAPFetchContentOperation * IMAPAsyncSession::fetchMessageAttachmentByUIDOperati
return session->fetchMessageAttachmentByUIDOperation(folder, uid, partID, encoding);
}
-IMAPOperation * IMAPAsyncSession::storeFlagsOperation(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, MessageFlag flags)
+IMAPOperation * IMAPAsyncSession::storeFlagsOperation(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, MessageFlag flags, Array * customFlags)
{
IMAPAsyncConnection * session = sessionForFolder(folder);
- return session->storeFlagsOperation(folder, uids, kind, flags);
+ return session->storeFlagsOperation(folder, uids, kind, flags, customFlags);
}
IMAPOperation * IMAPAsyncSession::storeLabelsOperation(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, Array * labels)
diff --git a/src/async/imap/MCIMAPAsyncSession.h b/src/async/imap/MCIMAPAsyncSession.h
index 24fb6f91..38d14e0f 100755
--- a/src/async/imap/MCIMAPAsyncSession.h
+++ b/src/async/imap/MCIMAPAsyncSession.h
@@ -132,7 +132,7 @@ namespace mailcore {
virtual IMAPFetchContentOperation * fetchMessageAttachmentByUIDOperation(String * folder, uint32_t uid, String * partID,
Encoding encoding, bool urgent = false);
- virtual IMAPOperation * storeFlagsOperation(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, MessageFlag flags);
+ virtual IMAPOperation * storeFlagsOperation(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, MessageFlag flags, Array * customFlags);
virtual IMAPOperation * storeLabelsOperation(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, Array * labels);
virtual IMAPSearchOperation * searchOperation(String * folder, IMAPSearchKind kind, String * searchString);
diff --git a/src/async/imap/MCIMAPStoreFlagsOperation.cc b/src/async/imap/MCIMAPStoreFlagsOperation.cc
index e0464c8c..e2e2bfe9 100644
--- a/src/async/imap/MCIMAPStoreFlagsOperation.cc
+++ b/src/async/imap/MCIMAPStoreFlagsOperation.cc
@@ -18,11 +18,13 @@ IMAPStoreFlagsOperation::IMAPStoreFlagsOperation()
mUids = NULL;
mKind = IMAPStoreFlagsRequestKindAdd;
mFlags = MessageFlagNone;
+ mCustomFlags = NULL;
}
IMAPStoreFlagsOperation::~IMAPStoreFlagsOperation()
{
MC_SAFE_RELEASE(mUids);
+ MC_SAFE_RELEASE(mCustomFlags);
}
void IMAPStoreFlagsOperation::setUids(IndexSet * uids)
@@ -55,9 +57,19 @@ MessageFlag IMAPStoreFlagsOperation::flags()
return mFlags;
}
+void IMAPStoreFlagsOperation::setCustomFlags(Array * customFlags)
+{
+ MC_SAFE_REPLACE_RETAIN(Array, mCustomFlags, customFlags);
+}
+
+Array * IMAPStoreFlagsOperation::customFlags()
+{
+ return mCustomFlags;
+}
+
void IMAPStoreFlagsOperation::main()
{
ErrorCode error;
- session()->session()->storeFlags(folder(), mUids, mKind, mFlags, &error);
+ session()->session()->storeFlags(folder(), mUids, mKind, mFlags, mCustomFlags, &error);
setError(error);
}
diff --git a/src/async/imap/MCIMAPStoreFlagsOperation.h b/src/async/imap/MCIMAPStoreFlagsOperation.h
index 0048283c..d908baf5 100644
--- a/src/async/imap/MCIMAPStoreFlagsOperation.h
+++ b/src/async/imap/MCIMAPStoreFlagsOperation.h
@@ -30,6 +30,9 @@ namespace mailcore {
virtual void setFlags(MessageFlag flags);
virtual MessageFlag flags();
+ virtual void setCustomFlags(Array * customFlags);
+ virtual Array * customFlags();
+
public: // subclass behavior
virtual void main();
@@ -37,6 +40,7 @@ namespace mailcore {
IndexSet * mUids;
IMAPStoreFlagsRequestKind mKind;
MessageFlag mFlags;
+ Array * mCustomFlags;
};
diff --git a/src/core/imap/MCIMAPMessage.cc b/src/core/imap/MCIMAPMessage.cc
index 59d67654..150ddc3e 100644
--- a/src/core/imap/MCIMAPMessage.cc
+++ b/src/core/imap/MCIMAPMessage.cc
@@ -17,6 +17,7 @@ void IMAPMessage::init()
mUid = 0;
mFlags = MessageFlagNone;
mOriginalFlags = MessageFlagNone;
+ mCustomFlags = NULL;
mMainPart = NULL;
mGmailLabels = NULL;
mModSeqValue = 0;
@@ -35,6 +36,7 @@ IMAPMessage::IMAPMessage(IMAPMessage * other) : AbstractMessage(other)
setUid(other->uid());
setFlags(other->flags());
setOriginalFlags(other->originalFlags());
+ setCustomFlags(other->customFlags());
setMainPart((AbstractPart *) other->mainPart()->copy()->autorelease());
setGmailLabels(other->gmailLabels());
setGmailThreadID(other->gmailThreadID());
@@ -45,6 +47,7 @@ IMAPMessage::~IMAPMessage()
{
MC_SAFE_RELEASE(mMainPart);
MC_SAFE_RELEASE(mGmailLabels);
+ MC_SAFE_RELEASE(mCustomFlags);
}
Object * IMAPMessage::copy()
@@ -105,6 +108,16 @@ MessageFlag IMAPMessage::originalFlags()
return mOriginalFlags;
}
+void IMAPMessage::setCustomFlags(Array * customFlags)
+{
+ MC_SAFE_REPLACE_COPY(Array, mCustomFlags, customFlags);
+}
+
+Array * IMAPMessage::customFlags()
+{
+ return mCustomFlags;
+}
+
void IMAPMessage::setModSeqValue(uint64_t uid)
{
mModSeqValue = uid;
@@ -226,6 +239,7 @@ HashMap * IMAPMessage::serializable()
result->setObjectForKey(MCSTR("size"), String::stringWithUTF8Format("%lu", (long unsigned) uid()));
result->setObjectForKey(MCSTR("flags"), String::stringWithUTF8Format("%u", (unsigned) flags()));
result->setObjectForKey(MCSTR("originalFlags"), String::stringWithUTF8Format("%u", (unsigned) originalFlags()));
+ result->setObjectForKey(MCSTR("customFlags"), customFlags());
result->setObjectForKey(MCSTR("mainPart"), mMainPart->serializable());
if (gmailLabels() != NULL) {
result->setObjectForKey(MCSTR("gmailLabels"), gmailLabels());
@@ -262,6 +276,10 @@ void IMAPMessage::importSerializable(HashMap * serializable)
if (originalFlags != NULL) {
setFlags((MessageFlag) originalFlags->unsignedIntValue());
}
+ String * customFlags = (String *) serializable->objectForKey(MCSTR("customFlags"));
+ if (customFlags != NULL) {
+ setCustomFlags((Array *) serializable->objectForKey(MCSTR("customFlags")));
+ }
setMainPart((AbstractPart *) Object::objectWithSerializable((HashMap *) serializable->objectForKey(MCSTR("mainPart"))));
setGmailLabels((Array *) serializable->objectForKey(MCSTR("gmailLabels")));
String * gmailMessageID = (String *) serializable->objectForKey(MCSTR("gmailMessageID"));
diff --git a/src/core/imap/MCIMAPMessage.h b/src/core/imap/MCIMAPMessage.h
index ebcad889..e072d131 100644
--- a/src/core/imap/MCIMAPMessage.h
+++ b/src/core/imap/MCIMAPMessage.h
@@ -32,6 +32,9 @@ namespace mailcore {
virtual void setOriginalFlags(MessageFlag flags);
virtual MessageFlag originalFlags();
+ virtual void setCustomFlags(Array * customFlags);
+ virtual Array * customFlags();
+
virtual uint64_t modSeqValue();
virtual void setModSeqValue(uint64_t uid);
@@ -70,6 +73,7 @@ namespace mailcore {
MessageFlag mFlags;
MessageFlag mOriginalFlags;
+ Array * /* String */ mCustomFlags;
AbstractPart * mMainPart;
Array * /* String */ mGmailLabels;
uint64_t mGmailMessageID;
diff --git a/src/core/imap/MCIMAPSession.cc b/src/core/imap/MCIMAPSession.cc
index 50ab4f70..54e8aea0 100755
--- a/src/core/imap/MCIMAPSession.cc
+++ b/src/core/imap/MCIMAPSession.cc
@@ -156,6 +156,36 @@ static MessageFlag flags_from_lep_att_dynamic(struct mailimap_msg_att_dynamic *
return flags;
}
+static Array * custom_flags_from_lep_att_dynamic(struct mailimap_msg_att_dynamic * att_dynamic)
+{
+ Array * result;
+ clistiter * iter;
+
+ if (att_dynamic->att_list == NULL)
+ return NULL;
+
+ result = Array::array();
+ for(iter = clist_begin(att_dynamic->att_list) ;iter != NULL ; iter = clist_next(iter)) {
+ struct mailimap_flag_fetch * flag_fetch;
+ struct mailimap_flag * flag;
+
+ flag_fetch = (struct mailimap_flag_fetch *) clist_content(iter);
+ if (flag_fetch->fl_type != MAILIMAP_FLAG_FETCH_OTHER) {
+ continue;
+ }
+
+ flag = flag_fetch->fl_flag;
+ if (flag->fl_type == MAILIMAP_FLAG_KEYWORD) {
+ String * customFlag;
+
+ customFlag = String::stringWithUTF8Characters(flag->fl_data.fl_keyword);
+ result->addObject(customFlag);
+ }
+ }
+
+ return result;
+}
+
#pragma mark set conversion
static Array * arrayFromSet(struct mailimap_set * imap_set)
@@ -1898,6 +1928,10 @@ static void msg_att_handler(struct mailimap_msg_att * msg_att, void * context)
msg->setFlags(flags);
msg->setOriginalFlags(flags);
hasFlags = true;
+
+ Array * customFlags;
+ customFlags = custom_flags_from_lep_att_dynamic(att_item->att_data.att_dyn);
+ msg->setCustomFlags(customFlags);
}
else if (att_item->att_type == MAILIMAP_MSG_ATT_ITEM_STATIC) {
struct mailimap_msg_att_static * att_static;
@@ -3185,7 +3219,7 @@ HashMap * IMAPSession::fetchNamespace(ErrorCode * pError)
return result;
}
-void IMAPSession::storeFlags(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, MessageFlag flags, ErrorCode * pError)
+void IMAPSession::storeFlags(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, MessageFlag flags, Array * customFlags, ErrorCode * pError)
{
struct mailimap_set * imap_set;
struct mailimap_store_att_flags * store_att_flags;
@@ -3235,28 +3269,12 @@ void IMAPSession::storeFlags(String * folder, IndexSet * uids, IMAPStoreFlagsReq
f = mailimap_flag_new_draft();
mailimap_flag_list_add(flag_list, f);
}
- if ((flags & MessageFlagMDNSent) != 0) {
- struct mailimap_flag * f;
-
- f = mailimap_flag_new_flag_keyword(strdup("$MDNSent"));
- mailimap_flag_list_add(flag_list, f);
- }
- if ((flags & MessageFlagForwarded) != 0) {
- struct mailimap_flag * f;
-
- f = mailimap_flag_new_flag_keyword(strdup("$Forwarded"));
- mailimap_flag_list_add(flag_list, f);
- }
- if ((flags & MessageFlagSubmitPending) != 0) {
- struct mailimap_flag * f;
-
- f = mailimap_flag_new_flag_keyword(strdup("$SubmitPending"));
- mailimap_flag_list_add(flag_list, f);
- }
- if ((flags & MessageFlagSubmitted) != 0) {
+
+ for (unsigned int i = 0 ; i < customFlags->count() ; i ++) {
struct mailimap_flag * f;
-
- f = mailimap_flag_new_flag_keyword(strdup("$Submitted"));
+ String * customFlag = (String *) customFlags->objectAtIndex(i);
+
+ f = mailimap_flag_new_flag_keyword(strdup(customFlag->UTF8Characters()));
mailimap_flag_list_add(flag_list, f);
}
diff --git a/src/core/imap/MCIMAPSession.h b/src/core/imap/MCIMAPSession.h
index f185483f..7a7c2ef0 100755
--- a/src/core/imap/MCIMAPSession.h
+++ b/src/core/imap/MCIMAPSession.h
@@ -121,7 +121,7 @@ namespace mailcore {
IMAPProgressCallback * progressCallback,
Array * extraHeaders, ErrorCode * pError);
- virtual void storeFlags(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, MessageFlag flags, ErrorCode * pError);
+ virtual void storeFlags(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, MessageFlag flags, Array * customFlags, ErrorCode * pError);
virtual void storeLabels(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, Array * labels, ErrorCode * pError);
virtual IndexSet * search(String * folder, IMAPSearchKind kind, String * searchString, ErrorCode * pError);
diff --git a/src/objc/imap/MCOIMAPMessage.h b/src/objc/imap/MCOIMAPMessage.h
index 7f28663e..80583d60 100644
--- a/src/objc/imap/MCOIMAPMessage.h
+++ b/src/objc/imap/MCOIMAPMessage.h
@@ -43,6 +43,9 @@
/** The contents of the message flags when it was fetched from the server */
@property (nonatomic, assign) MCOMessageFlag originalFlags;
+/** Flag keywords of the message, mostly custom flags */
+@property (nonatomic, assign) NSArray * /* NSString */ customFlags;
+
/** It's the last modification sequence value of the message synced from the server. See RFC4551 */
@property (nonatomic, assign) uint64_t modSeqValue;
diff --git a/src/objc/imap/MCOIMAPMessage.mm b/src/objc/imap/MCOIMAPMessage.mm
index 8667b542..f663d8bd 100644
--- a/src/objc/imap/MCOIMAPMessage.mm
+++ b/src/objc/imap/MCOIMAPMessage.mm
@@ -45,6 +45,7 @@ MCO_OBJC_SYNTHESIZE_SCALAR(uint32_t, uint32_t, setUid, uid)
MCO_OBJC_SYNTHESIZE_SCALAR(uint32_t, uint32_t, setSize, size)
MCO_OBJC_SYNTHESIZE_SCALAR(MCOMessageFlag, mailcore::MessageFlag, setFlags, flags)
MCO_OBJC_SYNTHESIZE_SCALAR(MCOMessageFlag, mailcore::MessageFlag, setOriginalFlags, originalFlags)
+MCO_OBJC_SYNTHESIZE_ARRAY(setCustomFlags, customFlags)
MCO_OBJC_SYNTHESIZE_SCALAR(uint64_t, uint64_t, setModSeqValue, modSeqValue)
MCO_OBJC_SYNTHESIZE(AbstractPart, setMainPart, mainPart)
MCO_OBJC_SYNTHESIZE_ARRAY(setGmailLabels, gmailLabels)
diff --git a/src/objc/imap/MCOIMAPSession.h b/src/objc/imap/MCOIMAPSession.h
index 8ddfa8cd..5e27fba8 100755
--- a/src/objc/imap/MCOIMAPSession.h
+++ b/src/objc/imap/MCOIMAPSession.h
@@ -293,7 +293,8 @@
MCOIMAPOperation * op = [session storeFlagsOperationWithFolder:@"INBOX"
uids:[MCOIndexSet indexSetWithIndex:456]
kind:MCOIMAPStoreFlagsRequestKindAdd
- flags:MCOMessageFlagSeen];
+ flags:MCOMessageFlagSeen]
+ customFlags:@["$Forwarded"];
[op start:^(NSError * error) {
...
}];
@@ -301,7 +302,8 @@
- (MCOIMAPOperation *) storeFlagsOperationWithFolder:(NSString *)folder
uids:(MCOIndexSet *)uids
kind:(MCOIMAPStoreFlagsRequestKind)kind
- flags:(MCOMessageFlag)flags;
+ flags:(MCOMessageFlag)flags
+ customFlags:(NSArray *)customFlags;
/**
Returns an operation to change labels of messages. Intended for Gmail
diff --git a/src/objc/imap/MCOIMAPSession.mm b/src/objc/imap/MCOIMAPSession.mm
index 762e594a..94f86139 100755
--- a/src/objc/imap/MCOIMAPSession.mm
+++ b/src/objc/imap/MCOIMAPSession.mm
@@ -339,11 +339,13 @@ MCO_OBJC_SYNTHESIZE_SCALAR(dispatch_queue_t, dispatch_queue_t, setDispatchQueue,
uids:(MCOIndexSet *)uids
kind:(MCOIMAPStoreFlagsRequestKind)kind
flags:(MCOMessageFlag)flags
+ customFlags:(NSArray *)customFlags
{
IMAPOperation * coreOp = MCO_NATIVE_INSTANCE->storeFlagsOperation([folder mco_mcString],
MCO_FROM_OBJC(IndexSet, uids),
(IMAPStoreFlagsRequestKind) kind,
- (MessageFlag) flags);
+ (MessageFlag) flags,
+ MCO_FROM_OBJC(Array, customFlags));
return OPAQUE_OPERATION(coreOp);
}