diff options
-rw-r--r-- | build-mac/mailcore2.xcodeproj/project.pbxproj | 10 | ||||
-rw-r--r-- | src/async/smtp/MCSMTPAsyncSession.cc | 60 | ||||
-rw-r--r-- | src/async/smtp/MCSMTPAsyncSession.h | 12 | ||||
-rw-r--r-- | src/async/smtp/MCSMTPDisconnectOperation.cc | 29 | ||||
-rw-r--r-- | src/async/smtp/MCSMTPDisconnectOperation.h | 32 | ||||
-rw-r--r-- | src/async/smtp/MCSMTPOperation.cc | 1 | ||||
-rw-r--r-- | src/async/smtp/MCSMTPSendWithDataOperation.cc | 2 | ||||
-rw-r--r-- | src/core/basetypes/MCMainThread.h | 11 | ||||
-rw-r--r-- | src/core/basetypes/MCMainThread.mm | 9 | ||||
-rw-r--r-- | src/core/basetypes/MCObject.cc | 71 | ||||
-rw-r--r-- | src/core/basetypes/MCObject.h | 1 | ||||
-rw-r--r-- | src/core/basetypes/MCOperationQueue.cc | 20 | ||||
-rw-r--r-- | src/core/basetypes/MCOperationQueue.h | 65 | ||||
-rw-r--r-- | src/core/basetypes/MCOperationQueueCallback.h | 22 | ||||
-rw-r--r-- | src/core/smtp/MCSMTPSession.cc | 4 | ||||
-rw-r--r-- | src/core/smtp/MCSMTPSession.h | 3 |
16 files changed, 286 insertions, 66 deletions
diff --git a/build-mac/mailcore2.xcodeproj/project.pbxproj b/build-mac/mailcore2.xcodeproj/project.pbxproj index 37a955c6..54e21f12 100644 --- a/build-mac/mailcore2.xcodeproj/project.pbxproj +++ b/build-mac/mailcore2.xcodeproj/project.pbxproj @@ -29,6 +29,8 @@ C07AD5D7FD82F8ACAB576231 /* NSError+MCO.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C07AD44B013BB42A240B4F04 /* NSError+MCO.h */; }; C07AD99B2E2054C684DB8FF6 /* NSError+MCO.mm in Sources */ = {isa = PBXBuildFile; fileRef = C07ADFE43E22B38EFF23ADB5 /* NSError+MCO.mm */; }; C07ADC28B83E7959BF114D46 /* MCOIMAPSession.mm in Sources */ = {isa = PBXBuildFile; fileRef = C07AD057D3C8FBDC7AC95733 /* MCOIMAPSession.mm */; }; + C608167517759967001F1018 /* MCSMTPDisconnectOperation.cc in Sources */ = {isa = PBXBuildFile; fileRef = C608167317759967001F1018 /* MCSMTPDisconnectOperation.cc */; }; + C608167617759968001F1018 /* MCSMTPDisconnectOperation.cc in Sources */ = {isa = PBXBuildFile; fileRef = C608167317759967001F1018 /* MCSMTPDisconnectOperation.cc */; }; C623C58616FD6A50001BBEFC /* MCOConstants.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C64BB26D16FD63F6000DB34C /* MCOConstants.h */; }; C623C58716FD6A61001BBEFC /* MCOOperation.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C64BB25716FD3BC2000DB34C /* MCOOperation.h */; }; C623C58816FD6DF6001BBEFC /* NSValue+MCO.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C64BB25016FC2846000DB34C /* NSValue+MCO.h */; }; @@ -1072,6 +1074,9 @@ C07AD057D3C8FBDC7AC95733 /* MCOIMAPSession.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MCOIMAPSession.mm; sourceTree = "<group>"; }; C07AD44B013BB42A240B4F04 /* NSError+MCO.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSError+MCO.h"; sourceTree = "<group>"; }; C07ADFE43E22B38EFF23ADB5 /* NSError+MCO.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "NSError+MCO.mm"; sourceTree = "<group>"; }; + C608167317759967001F1018 /* MCSMTPDisconnectOperation.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MCSMTPDisconnectOperation.cc; sourceTree = "<group>"; }; + C608167417759967001F1018 /* MCSMTPDisconnectOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCSMTPDisconnectOperation.h; sourceTree = "<group>"; }; + C6081678177625AD001F1018 /* MCOperationQueueCallback.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MCOperationQueueCallback.h; sourceTree = "<group>"; }; C623C58A16FD8C22001BBEFC /* MCOAbstractMessage+Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MCOAbstractMessage+Private.h"; sourceTree = "<group>"; }; C623C58B16FE52C0001BBEFC /* MCOHTMLRendererDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MCOHTMLRendererDelegate.h; sourceTree = "<group>"; }; C623C58D16FE6B45001BBEFC /* MCOIMAPOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCOIMAPOperation.h; sourceTree = "<group>"; }; @@ -1704,6 +1709,8 @@ C64EA690169E847800778456 /* MCSMTPAsyncSession.h */, C64EA79C169F29A700778456 /* MCSMTPSendWithDataOperation.cc */, C64EA79D169F29A700778456 /* MCSMTPSendWithDataOperation.h */, + C608167317759967001F1018 /* MCSMTPDisconnectOperation.cc */, + C608167417759967001F1018 /* MCSMTPDisconnectOperation.h */, C64EA7D816A1386500778456 /* MCSMTPOperation.cc */, C64EA7D916A1386600778456 /* MCSMTPOperation.h */, C64EA7E116A1425400778456 /* MCSMTPOperationCallback.h */, @@ -1797,6 +1804,7 @@ C64EA6C0169E847800778456 /* MCOperationCallback.h */, C64EA6C1169E847800778456 /* MCOperationQueue.cc */, C64EA6C2169E847800778456 /* MCOperationQueue.h */, + C6081678177625AD001F1018 /* MCOperationQueueCallback.h */, C63CD68F16BE566D00DB18F1 /* MCHTMLCleaner.cc */, C63CD69016BE566E00DB18F1 /* MCHTMLCleaner.h */, C64BB22C16E5C1EE000DB34C /* MCIndexSet.cc */, @@ -2419,6 +2427,7 @@ C6F61F9917016B460073032E /* MCOIMAPSearchExpression.mm in Sources */, C6F61F9F17016EA10073032E /* MCOIMAPFolderInfo.m in Sources */, C6F61FB51702AB340073032E /* MCOIMAPBaseOperation.mm in Sources */, + C608167517759967001F1018 /* MCSMTPDisconnectOperation.cc in Sources */, C6A81BBF17068E5E00882C15 /* MCOSMTPSession.mm in Sources */, C6A81BC317068E9500882C15 /* MCOSMTPSendOperation.mm in Sources */, C6A81BC717068EB000882C15 /* MCOSMTPOperation.mm in Sources */, @@ -2597,6 +2606,7 @@ C6BA2C121705F4E6003F0E9E /* MCOIMAPSearchExpression.mm in Sources */, C6BA2C131705F4E6003F0E9E /* MCOIMAPFolderInfo.m in Sources */, C6BA2C141705F4E6003F0E9E /* MCOIMAPBaseOperation.mm in Sources */, + C608167617759968001F1018 /* MCSMTPDisconnectOperation.cc in Sources */, C6A81BC017068E5E00882C15 /* MCOSMTPSession.mm in Sources */, C6A81BC417068E9500882C15 /* MCOSMTPSendOperation.mm in Sources */, C6A81BC817068EB000882C15 /* MCOSMTPOperation.mm in Sources */, diff --git a/src/async/smtp/MCSMTPAsyncSession.cc b/src/async/smtp/MCSMTPAsyncSession.cc index 95101a50..776587e6 100644 --- a/src/async/smtp/MCSMTPAsyncSession.cc +++ b/src/async/smtp/MCSMTPAsyncSession.cc @@ -1,18 +1,39 @@ #include "MCSMTPAsyncSession.h" #include "MCSMTPSession.h" -//#include "MCSMTPSendWithRecipientOperation.h" #include "MCSMTPSendWithDataOperation.h" -//#include "MCSMTPSendWithBuilderOperation.h" #include "MCSMTPCheckAccountOperation.h" +#include "MCSMTPDisconnectOperation.h" #include "MCSMTPOperation.h" +#include "MCOperationQueueCallback.h" using namespace mailcore; +namespace mailcore { + class SMTPOperationQueueCallback : public OperationQueueCallback { + public: + SMTPOperationQueueCallback(SMTPAsyncSession * session) { + mSession = session; + } + + virtual ~SMTPOperationQueueCallback() { + } + + virtual void queueIdle() { + mSession->tryAutomaticDisconnect(); + } + + private: + SMTPAsyncSession * mSession; + }; +} + SMTPAsyncSession::SMTPAsyncSession() { mSession = new SMTPSession(); mQueue = new OperationQueue(); + mQueueCallback = new SMTPOperationQueueCallback(this); + mQueue->setCallback(mQueueCallback); } SMTPAsyncSession::~SMTPAsyncSession() @@ -113,7 +134,7 @@ bool SMTPAsyncSession::useHeloIPEnabled() void SMTPAsyncSession::runOperation(SMTPOperation * operation) { -#warning disconnect after delay + cancelDelayedPerformMethod((Object::Method) &SMTPAsyncSession::tryAutomaticDisconnectAfterDelay, NULL); mQueue->addOperation(operation); } @@ -122,35 +143,31 @@ SMTPSession * SMTPAsyncSession::session() return mSession; } -#if 0 -SMTPOperation * SMTPAsyncSession::sendMessageOperationWithFromAndRecipient(Address * from, Array * recipients, Data * messageData) +void SMTPAsyncSession::tryAutomaticDisconnect() { - SMTPSendWithRecipientOperation * op = new SMTPSendWithRecipientOperation(); - op->setSession(this); - op->setFrom(from); - op->setRecipients(recipients); - op->setMessageData(messageData); - return (SMTPOperation *) op->autorelease(); + // It's safe since no thread is running when this function is called. + if (mSession->isDisconnected()) { + return; + } + + performMethodAfterDelay((Object::Method) &SMTPAsyncSession::tryAutomaticDisconnectAfterDelay, NULL, 30); } -#endif -SMTPOperation * SMTPAsyncSession::sendMessageOperation(Data * messageData) +void SMTPAsyncSession::tryAutomaticDisconnectAfterDelay(void * context) { - SMTPSendWithDataOperation * op = new SMTPSendWithDataOperation(); + SMTPDisconnectOperation * op = new SMTPDisconnectOperation(); op->setSession(this); - op->setMessageData(messageData); - return (SMTPOperation *) op->autorelease(); + op->autorelease(); + op->start(); } -#if 0 -SMTPOperation * SMTPAsyncSession::sendMessageOperation(MessageBuilder * msg) +SMTPOperation * SMTPAsyncSession::sendMessageOperation(Data * messageData) { - SMTPSendWithBuilderOperation * op = new SMTPSendWithBuilderOperation(); + SMTPSendWithDataOperation * op = new SMTPSendWithDataOperation(); op->setSession(this); - op->setBuilder(msg); + op->setMessageData(messageData); return (SMTPOperation *) op->autorelease(); } -#endif SMTPOperation * SMTPAsyncSession::checkAccountOperation(Address * from) { @@ -159,4 +176,3 @@ SMTPOperation * SMTPAsyncSession::checkAccountOperation(Address * from) op->setSession(this); return (SMTPOperation *) op->autorelease(); } - diff --git a/src/async/smtp/MCSMTPAsyncSession.h b/src/async/smtp/MCSMTPAsyncSession.h index 0be287af..9cd7a8f0 100644 --- a/src/async/smtp/MCSMTPAsyncSession.h +++ b/src/async/smtp/MCSMTPAsyncSession.h @@ -13,6 +13,7 @@ namespace mailcore { class SMTPOperation; class SMTPSession; class Address; + class SMTPOperationQueueCallback; class SMTPAsyncSession : public Object { public: @@ -52,13 +53,14 @@ namespace mailcore { public: // private virtual void runOperation(SMTPOperation * operation); virtual SMTPSession * session(); + virtual void tryAutomaticDisconnect(); private: - SMTPSession * mSession; - OperationQueue * mQueue; - - void queue(SMTPOperation * op); - + SMTPSession * mSession; + OperationQueue * mQueue; + SMTPOperationQueueCallback * mQueueCallback; + + virtual void tryAutomaticDisconnectAfterDelay(void * context); }; } diff --git a/src/async/smtp/MCSMTPDisconnectOperation.cc b/src/async/smtp/MCSMTPDisconnectOperation.cc new file mode 100644 index 00000000..8a5b100a --- /dev/null +++ b/src/async/smtp/MCSMTPDisconnectOperation.cc @@ -0,0 +1,29 @@ +// +// SMTPDisconnectOperation.cpp +// mailcore2 +// +// Created by DINH Viêt Hoà on 6/22/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#include "MCSMTPDisconnectOperation.h" + +#include "MCSMTPAsyncSession.h" +#include "MCSMTPSession.h" + +using namespace mailcore; + +SMTPDisconnectOperation::SMTPDisconnectOperation() +{ +} + +SMTPDisconnectOperation::~SMTPDisconnectOperation() +{ +} + +void SMTPDisconnectOperation::main() +{ + session()->session()->disconnect(); + setError(ErrorCode::ErrorNone); + fprintf(stderr, "smtp disconnect\n"); +} diff --git a/src/async/smtp/MCSMTPDisconnectOperation.h b/src/async/smtp/MCSMTPDisconnectOperation.h new file mode 100644 index 00000000..dacf72a6 --- /dev/null +++ b/src/async/smtp/MCSMTPDisconnectOperation.h @@ -0,0 +1,32 @@ +// +// SMTPDisconnectOperation.h +// mailcore2 +// +// Created by DINH Viêt Hoà on 6/22/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#ifndef __MAILCORE_MCSMTPDISCONNECTOPERATION_H_ +#define __MAILCORE_MCSMTPDISCONNECTOPERATION_H_ + +#include <MailCore/MCBaseTypes.h> +#include <MailCore/MCAbstract.h> +#include <MailCore/MCSMTPOperation.h> + +#ifdef __cplusplus + +namespace mailcore { + + class SMTPDisconnectOperation : public SMTPOperation { + public: + SMTPDisconnectOperation(); + virtual ~SMTPDisconnectOperation(); + + public: // subclass behavior + virtual void main(); + }; +} + +#endif + +#endif
\ No newline at end of file diff --git a/src/async/smtp/MCSMTPOperation.cc b/src/async/smtp/MCSMTPOperation.cc index 532c6ab4..e8211a24 100644 --- a/src/async/smtp/MCSMTPOperation.cc +++ b/src/async/smtp/MCSMTPOperation.cc @@ -82,4 +82,3 @@ void SMTPOperation::bodyProgressOnMainThread(void * ctx) } free(context); } - diff --git a/src/async/smtp/MCSMTPSendWithDataOperation.cc b/src/async/smtp/MCSMTPSendWithDataOperation.cc index bb2c5ea9..b64f835b 100644 --- a/src/async/smtp/MCSMTPSendWithDataOperation.cc +++ b/src/async/smtp/MCSMTPSendWithDataOperation.cc @@ -38,4 +38,6 @@ void SMTPSendWithDataOperation::main() ErrorCode error; session()->session()->sendMessage(mMessageData, this, &error); setError(error); + + //tryAutomaticDisconnect(); } diff --git a/src/core/basetypes/MCMainThread.h b/src/core/basetypes/MCMainThread.h index 31819a29..c9fe4e8d 100644 --- a/src/core/basetypes/MCMainThread.h +++ b/src/core/basetypes/MCMainThread.h @@ -5,9 +5,14 @@ #ifdef __cplusplus namespace mailcore { - void callOnMainThread(void (*)(void *), void * context); - void callOnMainThreadAndWait(void (*)(void *), void * context); - void callAfterDelay(void (*)(void *), void * context, double time); + void callOnMainThread(void (*)(void *), void * context); + void callOnMainThreadAndWait(void (*)(void *), void * context); + + // Returns a "call" object. + void * callAfterDelay(void (*)(void *), void * context, double time); + + // Pass the pointer returns by callAfterDelay() to cancel a delayed call. + void cancelDelayedCall(void * call); } #endif diff --git a/src/core/basetypes/MCMainThread.mm b/src/core/basetypes/MCMainThread.mm index 0bdc2ce1..4e9c6fc7 100644 --- a/src/core/basetypes/MCMainThread.mm +++ b/src/core/basetypes/MCMainThread.mm @@ -52,13 +52,18 @@ void mailcore::callOnMainThreadAndWait(void (* function)(void *), void * context [caller release]; } -void mailcore::callAfterDelay(void (* function)(void *), void * context, double time) +void * mailcore::callAfterDelay(void (* function)(void *), void * context, double time) { LEPPPMainThreadCaller * caller; caller = [[LEPPPMainThreadCaller alloc] init]; [caller setFunction:function]; [caller setContext:context]; [caller performSelector:@selector(call) withObject:nil afterDelay:time]; - [caller release]; + return [caller autorelease]; } +void mailcore::cancelDelayedCall(void * delayedCall) +{ + LEPPPMainThreadCaller * caller = (LEPPPMainThreadCaller *) delayedCall; + [NSObject cancelPreviousPerformRequestsWithTarget:caller selector:@selector(call) object:nil]; +} diff --git a/src/core/basetypes/MCObject.cc b/src/core/basetypes/MCObject.cc index 32d51fc4..879c194f 100644 --- a/src/core/basetypes/MCObject.cc +++ b/src/core/basetypes/MCObject.cc @@ -3,6 +3,7 @@ #include <stdlib.h> #include <typeinfo> #include <cxxabi.h> +#include <libetpan/libetpan.h> #include "MCAutoreleasePool.h" #include "MCString.h" @@ -115,6 +116,26 @@ struct mainThreadCallData { Object * obj; void * context; Object::Method method; + void * caller; +}; + +static pthread_once_t delayedPerformOnce = PTHREAD_ONCE_INIT; +static chash * delayedPerformHash = NULL; + +static void reallyInitDelayedPerform() +{ + delayedPerformHash = chash_new(CHASH_DEFAULTSIZE, CHASH_COPYKEY); +} + +static void initDelayedPerform() +{ + pthread_once(&delayedPerformOnce, reallyInitDelayedPerform); +} + +struct mainThreadCallKeyData { + Object * obj; + void * context; + Object::Method method; }; static void performOnMainThread(void * info) @@ -134,7 +155,7 @@ static void performOnMainThread(void * info) free(data); } -static void callAfterDelay(void * info) +static void performAfterDelay(void * info) { struct mainThreadCallData * data; void * context; @@ -146,6 +167,15 @@ static void callAfterDelay(void * info) context = data->context; method = data->method; + chashdatum key; + struct mainThreadCallKeyData keyData; + keyData.obj = obj; + keyData.context = context; + keyData.method = method; + key.data = &keyData; + key.len = sizeof(keyData); + chash_delete(delayedPerformHash, &key, NULL); + (obj->*method)(context); free(data); @@ -159,6 +189,7 @@ void Object::performMethodOnMainThread(Method method, void * context, bool waitU data->obj = this; data->context = context; data->method = method; + data->caller = NULL; if (waitUntilDone) { callOnMainThreadAndWait(performOnMainThread, data); @@ -170,12 +201,48 @@ void Object::performMethodOnMainThread(Method method, void * context, bool waitU void Object::performMethodAfterDelay(Method method, void * context, double delay) { + initDelayedPerform(); + struct mainThreadCallData * data; data = (struct mainThreadCallData *) calloc(sizeof(* data), 1); data->obj = this; data->context = context; data->method = method; + data->caller = callAfterDelay(performAfterDelay, data, delay); + + chashdatum key; + chashdatum value; + struct mainThreadCallKeyData keyData; + keyData.obj = this; + keyData.context = context; + keyData.method = method; + key.data = &keyData; + key.len = sizeof(keyData); + value.data = (void *) data; + value.len = 0; + chash_set(delayedPerformHash, &key, &value, NULL); +} + +void Object::cancelDelayedPerformMethod(Method method, void * context) +{ + initDelayedPerform(); - callAfterDelay(performOnMainThread, data, delay); + int r; + chashdatum key; + chashdatum value; + struct mainThreadCallKeyData keyData; + keyData.obj = this; + keyData.context = context; + keyData.method = method; + key.data = &keyData; + key.len = sizeof(keyData); + r = chash_get(delayedPerformHash, &key, &value); + if (r < 0) + return; + + chash_delete(delayedPerformHash, &key, NULL); + struct mainThreadCallData * data = (struct mainThreadCallData *) value.data; + cancelDelayedCall(data->caller); + free(data); } diff --git a/src/core/basetypes/MCObject.h b/src/core/basetypes/MCObject.h index 0fd65d09..01812191 100644 --- a/src/core/basetypes/MCObject.h +++ b/src/core/basetypes/MCObject.h @@ -38,6 +38,7 @@ namespace mailcore { virtual void performMethod(Method method, void * context); virtual void performMethodOnMainThread(Method method, void * context, bool waitUntilDone = false); virtual void performMethodAfterDelay(Method method, void * context, double delay); + virtual void cancelDelayedPerformMethod(Method method, void * context); private: pthread_mutex_t mLock; diff --git a/src/core/basetypes/MCOperationQueue.cc b/src/core/basetypes/MCOperationQueue.cc index 72d0041d..f13c9cde 100644 --- a/src/core/basetypes/MCOperationQueue.cc +++ b/src/core/basetypes/MCOperationQueue.cc @@ -1,13 +1,15 @@ #include "MCOperationQueue.h" +#include <libetpan/libetpan.h> + #include "MCOperation.h" #include "MCOperationCallback.h" +#include "MCOperationQueueCallback.h" #include "MCMainThread.h" #include "MCUtils.h" #include "MCArray.h" #include "MCLog.h" #include "MCAutoreleasePool.h" -#include <libetpan/libetpan.h> using namespace mailcore; @@ -21,6 +23,8 @@ OperationQueue::OperationQueue() mStartSem = mailsem_new(); mStopSem = mailsem_new(); mWaitingFinishedSem = mailsem_new(); + mQuitting = false; + mCallback = NULL; } OperationQueue::~OperationQueue() @@ -153,6 +157,10 @@ void OperationQueue::stoppedOnMainThread(void * context) mailsem_down(mStopSem); mStarted = false; + if (mCallback) { + mCallback->queueIdle(); + } + release(); // (2) release(); // (3) @@ -181,6 +189,16 @@ unsigned int OperationQueue::count() return count; } +void OperationQueue::setCallback(OperationQueueCallback * callback) +{ + mCallback = callback; +} + +OperationQueueCallback * OperationQueue::callback() +{ + return mCallback; +} + #if 0 void OperationQueue::waitUntilAllOperationsAreFinished() { diff --git a/src/core/basetypes/MCOperationQueue.h b/src/core/basetypes/MCOperationQueue.h index b9323dea..ddfe9de2 100644 --- a/src/core/basetypes/MCOperationQueue.h +++ b/src/core/basetypes/MCOperationQueue.h @@ -10,41 +10,46 @@ #ifdef __cplusplus namespace mailcore { - - class Operation; - class Array; - class OperationQueue : public Object { - public: - OperationQueue(); - virtual ~OperationQueue(); - - virtual void addOperation(Operation * op); - + class Operation; + class OperationQueueCallback; + class Array; + + class OperationQueue : public Object { + public: + OperationQueue(); + virtual ~OperationQueue(); + + virtual void addOperation(Operation * op); + virtual unsigned int count(); - private: - Array * mOperations; - pthread_t mThreadID; - bool mStarted; - struct mailsem * mOperationSem; - struct mailsem * mStartSem; - struct mailsem * mStopSem; - pthread_mutex_t mLock; - bool mWaiting; - struct mailsem * mWaitingFinishedSem; - bool mQuitting; + virtual void setCallback(OperationQueueCallback * callback); + virtual OperationQueueCallback * callback(); - void startThread(); - static void runOperationsOnThread(OperationQueue * queue); - void runOperations(); - void callbackOnMainThread(Operation * op); - void checkRunningOnMainThread(void * context); - void checkRunningAfterDelay(void * context); + private: + Array * mOperations; + pthread_t mThreadID; + bool mStarted; + struct mailsem * mOperationSem; + struct mailsem * mStartSem; + struct mailsem * mStopSem; + pthread_mutex_t mLock; + bool mWaiting; + struct mailsem * mWaitingFinishedSem; + bool mQuitting; + OperationQueueCallback * mCallback; + + void startThread(); + static void runOperationsOnThread(OperationQueue * queue); + void runOperations(); + void callbackOnMainThread(Operation * op); + void checkRunningOnMainThread(void * context); + void checkRunningAfterDelay(void * context); void stoppedOnMainThread(void * context); - - }; - + + }; + } #endif diff --git a/src/core/basetypes/MCOperationQueueCallback.h b/src/core/basetypes/MCOperationQueueCallback.h new file mode 100644 index 00000000..bf7868ae --- /dev/null +++ b/src/core/basetypes/MCOperationQueueCallback.h @@ -0,0 +1,22 @@ +// +// MCOperationQueueCallback.h +// mailcore2 +// +// Created by DINH Viêt Hoà on 6/22/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#ifndef __MAILCORE_OPERATIONQUEUECALLBACK_H_ +#define __MAILCORE_OPERATIONQUEUECALLBACK_H_ + +namespace mailcore { + + class OperationQueue; + + class OperationQueueCallback { + public: + virtual void queueIdle() {} + }; +} + +#endif diff --git a/src/core/smtp/MCSMTPSession.cc b/src/core/smtp/MCSMTPSession.cc index fd5832f3..3e49ea5f 100644 --- a/src/core/smtp/MCSMTPSession.cc +++ b/src/core/smtp/MCSMTPSession.cc @@ -679,3 +679,7 @@ void SMTPSession::sendMessage(MessageBuilder * msg, SMTPProgressCallback * callb recipients->release(); } +bool SMTPSession::isDisconnected() +{ + return mState == STATE_DISCONNECTED; +} diff --git a/src/core/smtp/MCSMTPSession.h b/src/core/smtp/MCSMTPSession.h index 70237c16..57c6e0ce 100644 --- a/src/core/smtp/MCSMTPSession.h +++ b/src/core/smtp/MCSMTPSession.h @@ -85,6 +85,9 @@ namespace mailcore { void sendMessage(Address * from, Array * /* Address */ recipients, Data * messageData, SMTPProgressCallback * callback, ErrorCode * pError); void sendMessage(MessageBuilder * msg, SMTPProgressCallback * callback, ErrorCode * pError); + + public: // private + virtual bool isDisconnected(); }; } |