diff options
Diffstat (limited to 'src/async/imap')
-rw-r--r-- | src/async/imap/MCIMAPAppendMessageOperation.cc | 14 | ||||
-rw-r--r-- | src/async/imap/MCIMAPAppendMessageOperation.h | 4 | ||||
-rwxr-xr-x | src/async/imap/MCIMAPAsyncConnection.cc | 35 | ||||
-rwxr-xr-x | src/async/imap/MCIMAPAsyncConnection.h | 10 | ||||
-rwxr-xr-x | src/async/imap/MCIMAPAsyncSession.cc | 34 | ||||
-rwxr-xr-x | src/async/imap/MCIMAPAsyncSession.h | 14 | ||||
-rw-r--r-- | src/async/imap/MCIMAPMultiDisconnectOperation.cc | 5 | ||||
-rw-r--r-- | src/async/imap/MCIMAPOperation.cc | 13 | ||||
-rw-r--r-- | src/async/imap/MCIMAPStoreFlagsOperation.cc | 14 | ||||
-rw-r--r-- | src/async/imap/MCIMAPStoreFlagsOperation.h | 5 |
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; }; } |