aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--build-mac/mailcore2.xcodeproj/project.pbxproj10
-rw-r--r--src/async/smtp/MCSMTPAsyncSession.cc60
-rw-r--r--src/async/smtp/MCSMTPAsyncSession.h12
-rw-r--r--src/async/smtp/MCSMTPDisconnectOperation.cc29
-rw-r--r--src/async/smtp/MCSMTPDisconnectOperation.h32
-rw-r--r--src/async/smtp/MCSMTPOperation.cc1
-rw-r--r--src/async/smtp/MCSMTPSendWithDataOperation.cc2
-rw-r--r--src/core/basetypes/MCMainThread.h11
-rw-r--r--src/core/basetypes/MCMainThread.mm9
-rw-r--r--src/core/basetypes/MCObject.cc71
-rw-r--r--src/core/basetypes/MCObject.h1
-rw-r--r--src/core/basetypes/MCOperationQueue.cc20
-rw-r--r--src/core/basetypes/MCOperationQueue.h65
-rw-r--r--src/core/basetypes/MCOperationQueueCallback.h22
-rw-r--r--src/core/smtp/MCSMTPSession.cc4
-rw-r--r--src/core/smtp/MCSMTPSession.h3
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();
};
}