aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/async/imap
diff options
context:
space:
mode:
Diffstat (limited to 'src/async/imap')
-rw-r--r--src/async/imap/MCIMAPAppendMessageOperation.cc14
-rw-r--r--src/async/imap/MCIMAPAppendMessageOperation.h4
-rwxr-xr-xsrc/async/imap/MCIMAPAsyncConnection.cc35
-rwxr-xr-xsrc/async/imap/MCIMAPAsyncConnection.h10
-rwxr-xr-xsrc/async/imap/MCIMAPAsyncSession.cc34
-rwxr-xr-xsrc/async/imap/MCIMAPAsyncSession.h14
-rw-r--r--src/async/imap/MCIMAPMultiDisconnectOperation.cc5
-rw-r--r--src/async/imap/MCIMAPOperation.cc13
-rw-r--r--src/async/imap/MCIMAPStoreFlagsOperation.cc14
-rw-r--r--src/async/imap/MCIMAPStoreFlagsOperation.h5
10 files changed, 130 insertions, 18 deletions
diff --git a/src/async/imap/MCIMAPAppendMessageOperation.cc b/src/async/imap/MCIMAPAppendMessageOperation.cc
index 0a205a2d..06a42b2d 100644
--- a/src/async/imap/MCIMAPAppendMessageOperation.cc
+++ b/src/async/imap/MCIMAPAppendMessageOperation.cc
@@ -17,12 +17,14 @@ IMAPAppendMessageOperation::IMAPAppendMessageOperation()
{
mMessageData = NULL;
mFlags = MessageFlagNone;
+ mCustomFlags = NULL;
mCreatedUID = 0;
}
IMAPAppendMessageOperation::~IMAPAppendMessageOperation()
{
MC_SAFE_RELEASE(mMessageData);
+ MC_SAFE_RELEASE(mCustomFlags);
}
void IMAPAppendMessageOperation::setMessageData(Data * messageData)
@@ -45,6 +47,16 @@ MessageFlag IMAPAppendMessageOperation::flags()
return mFlags;
}
+void IMAPAppendMessageOperation::setCustomFlags(Array * customFlags)
+{
+ MC_SAFE_REPLACE_COPY(Array, mCustomFlags, customFlags);
+}
+
+Array * IMAPAppendMessageOperation::customFlags()
+{
+ return customFlags();
+}
+
uint32_t IMAPAppendMessageOperation::createdUID()
{
return mCreatedUID;
@@ -53,7 +65,7 @@ uint32_t IMAPAppendMessageOperation::createdUID()
void IMAPAppendMessageOperation::main()
{
ErrorCode error;
- session()->session()->appendMessage(folder(), mMessageData, mFlags, this, &mCreatedUID, &error);
+ session()->session()->appendMessageWithCustomFlags(folder(), mMessageData, mFlags, mCustomFlags, this, &mCreatedUID, &error);
setError(error);
}
diff --git a/src/async/imap/MCIMAPAppendMessageOperation.h b/src/async/imap/MCIMAPAppendMessageOperation.h
index 4f210ac8..de6960de 100644
--- a/src/async/imap/MCIMAPAppendMessageOperation.h
+++ b/src/async/imap/MCIMAPAppendMessageOperation.h
@@ -28,6 +28,9 @@ namespace mailcore {
virtual void setFlags(MessageFlag flags);
virtual MessageFlag flags();
+ virtual void setCustomFlags(Array * customFlags);
+ virtual Array * customFlags();
+
virtual uint32_t createdUID();
public: // subclass behavior
@@ -36,6 +39,7 @@ namespace mailcore {
private:
Data * mMessageData;
MessageFlag mFlags;
+ Array * mCustomFlags;
uint32_t mCreatedUID;
};
diff --git a/src/async/imap/MCIMAPAsyncConnection.cc b/src/async/imap/MCIMAPAsyncConnection.cc
index 8403b3ed..738da0d1 100755
--- a/src/async/imap/MCIMAPAsyncConnection.cc
+++ b/src/async/imap/MCIMAPAsyncConnection.cc
@@ -105,6 +105,7 @@ IMAPAsyncConnection::IMAPAsyncConnection()
mInternalLogger = new IMAPConnectionLogger(this);
mAutomaticConfigurationEnabled = true;
mQueueRunning = false;
+ mScheduledAutomaticDisconnect = false;
}
IMAPAsyncConnection::~IMAPAsyncConnection()
@@ -326,13 +327,14 @@ IMAPOperation * IMAPAsyncConnection::unsubscribeFolderOperation(String * folder)
return op;
}
-IMAPAppendMessageOperation * IMAPAsyncConnection::appendMessageOperation(String * folder, Data * messageData, MessageFlag flags)
+IMAPAppendMessageOperation * IMAPAsyncConnection::appendMessageOperation(String * folder, Data * messageData, MessageFlag flags, Array * customFlags)
{
IMAPAppendMessageOperation * op = new IMAPAppendMessageOperation();
op->setSession(this);
op->setFolder(folder);
op->setMessageData(messageData);
op->setFlags(flags);
+ op->setCustomFlags(customFlags);
op->autorelease();
return op;
}
@@ -419,7 +421,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);
@@ -427,6 +429,7 @@ IMAPOperation * IMAPAsyncConnection::storeFlagsOperation(String * folder, IndexS
op->setUids(uids);
op->setKind(kind);
op->setFlags(flags);
+ op->setCustomFlags(customFlags);
op->autorelease();
return op;
}
@@ -562,14 +565,28 @@ void IMAPAsyncConnection::tryAutomaticDisconnect()
return;
}
- cancelDelayedPerformMethod((Object::Method) &IMAPAsyncConnection::tryAutomaticDisconnectAfterDelay, NULL);
+ bool scheduledAutomaticDisconnect = mScheduledAutomaticDisconnect;
+ if (scheduledAutomaticDisconnect) {
+ cancelDelayedPerformMethod((Object::Method) &IMAPAsyncConnection::tryAutomaticDisconnectAfterDelay, NULL);
+ }
+
+ mOwner->retain();
+ mScheduledAutomaticDisconnect = true;
performMethodAfterDelay((Object::Method) &IMAPAsyncConnection::tryAutomaticDisconnectAfterDelay, NULL, 30);
+
+ if (scheduledAutomaticDisconnect) {
+ mOwner->release();
+ }
}
void IMAPAsyncConnection::tryAutomaticDisconnectAfterDelay(void * context)
{
+ mScheduledAutomaticDisconnect = false;
+
IMAPOperation * op = disconnectOperation();
op->start();
+
+ mOwner->release();
}
void IMAPAsyncConnection::queueStartRunning()
@@ -697,3 +714,15 @@ void IMAPAsyncConnection::setQueueRunning(bool running)
{
mQueueRunning = running;
}
+
+#if __APPLE__
+void IMAPAsyncConnection::setDispatchQueue(dispatch_queue_t dispatchQueue)
+{
+ mQueue->setDispatchQueue(dispatchQueue);
+}
+
+dispatch_queue_t IMAPAsyncConnection::dispatchQueue()
+{
+ return mQueue->dispatchQueue();
+}
+#endif
diff --git a/src/async/imap/MCIMAPAsyncConnection.h b/src/async/imap/MCIMAPAsyncConnection.h
index ef6893c8..0a117bea 100755
--- a/src/async/imap/MCIMAPAsyncConnection.h
+++ b/src/async/imap/MCIMAPAsyncConnection.h
@@ -81,6 +81,11 @@ namespace mailcore {
virtual void setConnectionLogger(ConnectionLogger * logger);
virtual ConnectionLogger * connectionLogger();
+#ifdef __APPLE__
+ virtual void setDispatchQueue(dispatch_queue_t dispatchQueue);
+ virtual dispatch_queue_t dispatchQueue();
+#endif
+
virtual IMAPFolderInfoOperation * folderInfoOperation(String * folder);
virtual IMAPFolderStatusOperation * folderStatusOperation(String * folder);
@@ -94,7 +99,7 @@ namespace mailcore {
virtual IMAPOperation * subscribeFolderOperation(String * folder);
virtual IMAPOperation * unsubscribeFolderOperation(String * folder);
- virtual IMAPAppendMessageOperation * appendMessageOperation(String * folder, Data * messageData, MessageFlag flags);
+ virtual IMAPAppendMessageOperation * appendMessageOperation(String * folder, Data * messageData, MessageFlag flags, Array * customFlags);
virtual IMAPCopyMessagesOperation * copyMessagesOperation(String * folder, IndexSet * uids, String * destFolder);
@@ -111,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);
@@ -151,6 +156,7 @@ namespace mailcore {
pthread_mutex_t mConnectionLoggerLock;
bool mAutomaticConfigurationEnabled;
bool mQueueRunning;
+ bool mScheduledAutomaticDisconnect;
virtual void tryAutomaticDisconnectAfterDelay(void * context);
virtual IMAPMessageRenderingOperation * renderingOperation(IMAPMessage * message,
diff --git a/src/async/imap/MCIMAPAsyncSession.cc b/src/async/imap/MCIMAPAsyncSession.cc
index 573e7e42..44f753c9 100755
--- a/src/async/imap/MCIMAPAsyncSession.cc
+++ b/src/async/imap/MCIMAPAsyncSession.cc
@@ -42,10 +42,15 @@ IMAPAsyncSession::IMAPAsyncSession()
mServerIdentity = new IMAPIdentity();
mClientIdentity = new IMAPIdentity();
mOperationQueueCallback = NULL;
+#if __APPLE__
+ mDispatchQueue = dispatch_get_main_queue();
+#endif
+ mGmailUserDisplayName = NULL;
}
IMAPAsyncSession::~IMAPAsyncSession()
{
+ MC_SAFE_RELEASE(mGmailUserDisplayName);
MC_SAFE_RELEASE(mServerIdentity);
MC_SAFE_RELEASE(mClientIdentity);
MC_SAFE_RELEASE(mSessions);
@@ -196,6 +201,11 @@ IMAPIdentity * IMAPAsyncSession::clientIdentity()
return mClientIdentity;
}
+String * IMAPAsyncSession::gmailUserDisplayName()
+{
+ return mGmailUserDisplayName;
+}
+
IMAPAsyncConnection * IMAPAsyncSession::session()
{
IMAPAsyncConnection * session = new IMAPAsyncConnection();
@@ -215,6 +225,7 @@ IMAPAsyncConnection * IMAPAsyncSession::session()
session->setVoIPEnabled(mVoIPEnabled);
session->setDefaultNamespace(mDefaultNamespace);
session->setClientIdentity(mClientIdentity);
+ session->setDispatchQueue(mDispatchQueue);
#if 0 // should be implemented properly
if (mAutomaticConfigurationDone) {
session->setAutomaticConfigurationEnabled(false);
@@ -355,10 +366,10 @@ IMAPOperation * IMAPAsyncSession::unsubscribeFolderOperation(String * folder)
return session->unsubscribeFolderOperation(folder);
}
-IMAPAppendMessageOperation * IMAPAsyncSession::appendMessageOperation(String * folder, Data * messageData, MessageFlag flags)
+IMAPAppendMessageOperation * IMAPAsyncSession::appendMessageOperation(String * folder, Data * messageData, MessageFlag flags, Array * customFlags)
{
IMAPAsyncConnection * session = sessionForFolder(folder);
- return session->appendMessageOperation(folder, messageData, flags);
+ return session->appendMessageOperation(folder, messageData, flags, customFlags);
}
IMAPCopyMessagesOperation * IMAPAsyncSession::copyMessagesOperation(String * folder, IndexSet * uids, String * destFolder)
@@ -407,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)
@@ -536,6 +547,7 @@ IMAPMessageRenderingOperation * IMAPAsyncSession::plainTextBodyRenderingOperatio
void IMAPAsyncSession::automaticConfigurationDone(IMAPSession * session)
{
MC_SAFE_REPLACE_COPY(IMAPIdentity, mServerIdentity, session->serverIdentity());
+ MC_SAFE_REPLACE_COPY(String, mGmailUserDisplayName, session->gmailUserDisplayName());
setDefaultNamespace(session->defaultNamespace());
mAutomaticConfigurationDone = true;
}
@@ -577,4 +589,16 @@ void IMAPAsyncSession::operationRunningStateChanged()
mOperationQueueCallback->queueStoppedRunning();
}
}
-} \ No newline at end of file
+}
+
+#if __APPLE__
+void IMAPAsyncSession::setDispatchQueue(dispatch_queue_t dispatchQueue)
+{
+ mDispatchQueue = dispatchQueue;
+}
+
+dispatch_queue_t IMAPAsyncSession::dispatchQueue()
+{
+ return mDispatchQueue;
+}
+#endif
diff --git a/src/async/imap/MCIMAPAsyncSession.h b/src/async/imap/MCIMAPAsyncSession.h
index 6870d739..0d172bb6 100755
--- a/src/async/imap/MCIMAPAsyncSession.h
+++ b/src/async/imap/MCIMAPAsyncSession.h
@@ -89,12 +89,18 @@ namespace mailcore {
virtual void setConnectionLogger(ConnectionLogger * logger);
virtual ConnectionLogger * connectionLogger();
+#ifdef __APPLE__
+ virtual void setDispatchQueue(dispatch_queue_t dispatchQueue);
+ virtual dispatch_queue_t dispatchQueue();
+#endif
+
virtual void setOperationQueueCallback(OperationQueueCallback * callback);
virtual OperationQueueCallback * operationQueueCallback();
virtual bool isOperationQueueRunning();
virtual IMAPIdentity * serverIdentity();
virtual IMAPIdentity * clientIdentity();
+ virtual String * gmailUserDisplayName();
virtual IMAPFolderInfoOperation * folderInfoOperation(String * folder);
virtual IMAPFolderStatusOperation * folderStatusOperation(String * folder);
@@ -109,7 +115,7 @@ namespace mailcore {
virtual IMAPOperation * subscribeFolderOperation(String * folder);
virtual IMAPOperation * unsubscribeFolderOperation(String * folder);
- virtual IMAPAppendMessageOperation * appendMessageOperation(String * folder, Data * messageData, MessageFlag flags);
+ virtual IMAPAppendMessageOperation * appendMessageOperation(String * folder, Data * messageData, MessageFlag flags, Array * customFlags = NULL);
virtual IMAPCopyMessagesOperation * copyMessagesOperation(String * folder, IndexSet * uids, String * destFolder);
@@ -126,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 = NULL);
virtual IMAPOperation * storeLabelsOperation(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, Array * labels);
virtual IMAPSearchOperation * searchOperation(String * folder, IMAPSearchKind kind, String * searchString);
@@ -178,6 +184,10 @@ namespace mailcore {
IMAPIdentity * mClientIdentity;
bool mQueueRunning;
OperationQueueCallback * mOperationQueueCallback;
+#if __APPLE__
+ dispatch_queue_t mDispatchQueue;
+#endif
+ String * mGmailUserDisplayName;
virtual IMAPAsyncConnection * sessionForFolder(String * folder, bool urgent = false);
virtual IMAPAsyncConnection * session();
diff --git a/src/async/imap/MCIMAPMultiDisconnectOperation.cc b/src/async/imap/MCIMAPMultiDisconnectOperation.cc
index 9b9d1a28..e58bfd92 100644
--- a/src/async/imap/MCIMAPMultiDisconnectOperation.cc
+++ b/src/async/imap/MCIMAPMultiDisconnectOperation.cc
@@ -28,6 +28,11 @@ void IMAPMultiDisconnectOperation::addOperation(IMAPOperation * op)
void IMAPMultiDisconnectOperation::start()
{
+ if (_operations->count() == 0) {
+ callback()->operationFinished(this);
+ return;
+ }
+
mc_foreacharray(IMAPOperation, op, _operations) {
op->setCallback(this);
op->start();
diff --git a/src/async/imap/MCIMAPOperation.cc b/src/async/imap/MCIMAPOperation.cc
index da3ae6dd..e4b3529b 100644
--- a/src/async/imap/MCIMAPOperation.cc
+++ b/src/async/imap/MCIMAPOperation.cc
@@ -9,9 +9,6 @@
#include "MCIMAPOperation.h"
#include <stdlib.h>
-#if __APPLE__
-#include <dispatch/dispatch.h>
-#endif
#include "MCIMAPAsyncSession.h"
#include "MCIMAPSession.h"
@@ -37,6 +34,16 @@ IMAPOperation::~IMAPOperation()
void IMAPOperation::setSession(IMAPAsyncConnection * session)
{
MC_SAFE_REPLACE_RETAIN(IMAPAsyncConnection, mSession, session);
+#if __APPLE__
+ dispatch_queue_t queue;
+ if (session != NULL) {
+ queue = session->dispatchQueue();
+ }
+ else {
+ queue = dispatch_get_main_queue();
+ }
+ setCallbackDispatchQueue(queue);
+#endif
}
IMAPAsyncConnection * IMAPOperation::session()
diff --git a/src/async/imap/MCIMAPStoreFlagsOperation.cc b/src/async/imap/MCIMAPStoreFlagsOperation.cc
index e0464c8c..df68529a 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()->storeFlagsAndCustomFlags(folder(), mUids, mKind, mFlags, mCustomFlags, &error);
setError(error);
}
diff --git a/src/async/imap/MCIMAPStoreFlagsOperation.h b/src/async/imap/MCIMAPStoreFlagsOperation.h
index 0048283c..c1b17db5 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,7 +40,7 @@ namespace mailcore {
IndexSet * mUids;
IMAPStoreFlagsRequestKind mKind;
MessageFlag mFlags;
-
+ Array * mCustomFlags;
};
}