aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rwxr-xr-xsrc/async/imap/MCIMAPAsyncConnection.cc19
-rwxr-xr-xsrc/async/imap/MCIMAPAsyncConnection.h4
-rwxr-xr-xsrc/async/imap/MCIMAPAsyncSession.cc40
-rwxr-xr-xsrc/async/imap/MCIMAPAsyncSession.h10
-rw-r--r--src/async/pop/MCPOPAsyncSession.cc4
-rw-r--r--src/async/smtp/MCSMTPAsyncSession.cc4
-rw-r--r--src/core/basetypes/MCOperationQueue.cc4
-rw-r--r--src/core/basetypes/MCOperationQueueCallback.h4
-rw-r--r--src/objc/abstract/MCOConstants.h5
-rwxr-xr-xsrc/objc/imap/MCOIMAPSession.h19
-rwxr-xr-xsrc/objc/imap/MCOIMAPSession.mm61
11 files changed, 156 insertions, 18 deletions
diff --git a/src/async/imap/MCIMAPAsyncConnection.cc b/src/async/imap/MCIMAPAsyncConnection.cc
index 8fddd237..d1322687 100755
--- a/src/async/imap/MCIMAPAsyncConnection.cc
+++ b/src/async/imap/MCIMAPAsyncConnection.cc
@@ -50,12 +50,16 @@ namespace mailcore {
virtual ~IMAPOperationQueueCallback() {
}
- virtual void queueStartRunning(OperationQueue * queue) {
+ virtual void queueStartRunning() {
+ mConnection->setQueueRunning(true);
+ mConnection->owner()->operationRunningStateChanged();
mConnection->queueStartRunning();
}
- virtual void queueStoppedRunning(OperationQueue * queue) {
+ virtual void queueStoppedRunning() {
+ mConnection->setQueueRunning(false);
mConnection->tryAutomaticDisconnect();
+ mConnection->owner()->operationRunningStateChanged();
mConnection->queueStoppedRunning();
}
@@ -96,6 +100,7 @@ IMAPAsyncConnection::IMAPAsyncConnection()
pthread_mutex_init(&mConnectionLoggerLock, NULL);
mInternalLogger = new IMAPConnectionLogger(this);
mAutomaticConfigurationEnabled = true;
+ mQueueRunning = false;
}
IMAPAsyncConnection::~IMAPAsyncConnection()
@@ -653,3 +658,13 @@ bool IMAPAsyncConnection::isAutomaticConfigurationEnabled()
{
return mAutomaticConfigurationEnabled;
}
+
+bool IMAPAsyncConnection::isQueueRunning()
+{
+ return mQueueRunning;
+}
+
+void IMAPAsyncConnection::setQueueRunning(bool running)
+{
+ mQueueRunning = running;
+}
diff --git a/src/async/imap/MCIMAPAsyncConnection.h b/src/async/imap/MCIMAPAsyncConnection.h
index 16f9721e..9f1b9d47 100755
--- a/src/async/imap/MCIMAPAsyncConnection.h
+++ b/src/async/imap/MCIMAPAsyncConnection.h
@@ -146,6 +146,7 @@ namespace mailcore {
IMAPConnectionLogger * mInternalLogger;
pthread_mutex_t mConnectionLoggerLock;
bool mAutomaticConfigurationEnabled;
+ bool mQueueRunning;
virtual void tryAutomaticDisconnectAfterDelay(void * context);
virtual IMAPMessageRenderingOperation * renderingOperation(IMAPMessage * message,
@@ -169,6 +170,9 @@ namespace mailcore {
virtual IMAPAsyncSession * owner();
virtual void logConnection(ConnectionLogType logType, Data * buffer);
+
+ virtual bool isQueueRunning();
+ virtual void setQueueRunning(bool running);
};
}
diff --git a/src/async/imap/MCIMAPAsyncSession.cc b/src/async/imap/MCIMAPAsyncSession.cc
index 7986cb0b..5fe9a61b 100755
--- a/src/async/imap/MCIMAPAsyncSession.cc
+++ b/src/async/imap/MCIMAPAsyncSession.cc
@@ -40,6 +40,7 @@ IMAPAsyncSession::IMAPAsyncSession()
mAutomaticConfigurationDone = false;
mServerIdentity = new IMAPIdentity();
mClientIdentity = new IMAPIdentity();
+ mOperationQueueCallback = NULL;
}
IMAPAsyncSession::~IMAPAsyncSession()
@@ -513,3 +514,42 @@ void IMAPAsyncSession::automaticConfigurationDone(IMAPSession * session)
setDefaultNamespace(session->defaultNamespace());
mAutomaticConfigurationDone = true;
}
+
+void IMAPAsyncSession::setOperationQueueCallback(OperationQueueCallback * callback)
+{
+ mOperationQueueCallback = callback;
+}
+
+OperationQueueCallback * IMAPAsyncSession::operationQueueCallback()
+{
+ return mOperationQueueCallback;
+}
+
+bool IMAPAsyncSession::isOperationQueueRunning()
+{
+ return mQueueRunning;
+}
+
+void IMAPAsyncSession::operationRunningStateChanged()
+{
+ bool isRunning = false;
+ for(unsigned int i = 0 ; i < mSessions->count() ; i ++) {
+ IMAPAsyncConnection * currentSession = (IMAPAsyncConnection *) mSessions->objectAtIndex(i);
+ if (currentSession->isQueueRunning()){
+ isRunning = true;
+ break;
+ }
+ }
+ if (mQueueRunning == isRunning) {
+ return;
+ }
+ mQueueRunning = isRunning;
+ if (mOperationQueueCallback != NULL) {
+ if (isRunning) {
+ mOperationQueueCallback->queueStartRunning();
+ }
+ else {
+ mOperationQueueCallback->queueStoppedRunning();
+ }
+ }
+} \ No newline at end of file
diff --git a/src/async/imap/MCIMAPAsyncSession.h b/src/async/imap/MCIMAPAsyncSession.h
index c5ea5fb5..10af928d 100755
--- a/src/async/imap/MCIMAPAsyncSession.h
+++ b/src/async/imap/MCIMAPAsyncSession.h
@@ -38,6 +38,7 @@ namespace mailcore {
class IMAPMessage;
class IMAPSession;
class IMAPIdentity;
+ class OperationQueueCallback;
class IMAPAsyncSession : public Object {
public:
@@ -88,6 +89,10 @@ namespace mailcore {
virtual void setConnectionLogger(ConnectionLogger * logger);
virtual ConnectionLogger * connectionLogger();
+ virtual void setOperationQueueCallback(OperationQueueCallback * callback);
+ virtual OperationQueueCallback * operationQueueCallback();
+ virtual bool isOperationQueueRunning();
+
virtual IMAPIdentity * serverIdentity();
virtual IMAPIdentity * clientIdentity();
@@ -145,7 +150,8 @@ namespace mailcore {
public: // private
virtual void automaticConfigurationDone(IMAPSession * session);
-
+ virtual void operationRunningStateChanged();
+
private:
Array * mSessions;
@@ -166,6 +172,8 @@ namespace mailcore {
bool mAutomaticConfigurationDone;
IMAPIdentity * mServerIdentity;
IMAPIdentity * mClientIdentity;
+ bool mQueueRunning;
+ OperationQueueCallback * mOperationQueueCallback;
virtual IMAPAsyncConnection * sessionForFolder(String * folder, bool urgent = false);
virtual IMAPAsyncConnection * session();
diff --git a/src/async/pop/MCPOPAsyncSession.cc b/src/async/pop/MCPOPAsyncSession.cc
index bfabc847..f5334542 100644
--- a/src/async/pop/MCPOPAsyncSession.cc
+++ b/src/async/pop/MCPOPAsyncSession.cc
@@ -29,11 +29,11 @@ namespace mailcore {
virtual ~POPOperationQueueCallback() {
}
- virtual void queueStartRunning(OperationQueue * queue) {
+ virtual void queueStartRunning() {
mSession->retain();
}
- virtual void queueStoppedRunning(OperationQueue * queue) {
+ virtual void queueStoppedRunning() {
mSession->release();
}
diff --git a/src/async/smtp/MCSMTPAsyncSession.cc b/src/async/smtp/MCSMTPAsyncSession.cc
index 4da41b5d..605f267a 100644
--- a/src/async/smtp/MCSMTPAsyncSession.cc
+++ b/src/async/smtp/MCSMTPAsyncSession.cc
@@ -19,11 +19,11 @@ namespace mailcore {
virtual ~SMTPOperationQueueCallback() {
}
- virtual void queueStartRunning(OperationQueue * queue) {
+ virtual void queueStartRunning() {
mSession->retain();
}
- virtual void queueStoppedRunning(OperationQueue * queue) {
+ virtual void queueStoppedRunning() {
mSession->tryAutomaticDisconnect();
mSession->release();
}
diff --git a/src/core/basetypes/MCOperationQueue.cc b/src/core/basetypes/MCOperationQueue.cc
index c20cb907..2c00f930 100644
--- a/src/core/basetypes/MCOperationQueue.cc
+++ b/src/core/basetypes/MCOperationQueue.cc
@@ -166,7 +166,7 @@ void OperationQueue::stoppedOnMainThread(void * context)
mStarted = false;
if (mCallback) {
- mCallback->queueStoppedRunning(this);
+ mCallback->queueStoppedRunning();
}
release(); // (2)
@@ -180,7 +180,7 @@ void OperationQueue::startThread()
return;
if (mCallback) {
- mCallback->queueStartRunning(this);
+ mCallback->queueStartRunning();
}
retain(); // (3)
diff --git a/src/core/basetypes/MCOperationQueueCallback.h b/src/core/basetypes/MCOperationQueueCallback.h
index 605de030..367888bb 100644
--- a/src/core/basetypes/MCOperationQueueCallback.h
+++ b/src/core/basetypes/MCOperationQueueCallback.h
@@ -15,8 +15,8 @@ namespace mailcore {
class OperationQueueCallback {
public:
- virtual void queueStartRunning(OperationQueue * queue) {}
- virtual void queueStoppedRunning(OperationQueue * queue) {}
+ virtual void queueStartRunning() {}
+ virtual void queueStoppedRunning() {}
};
}
diff --git a/src/objc/abstract/MCOConstants.h b/src/objc/abstract/MCOConstants.h
index 0bdf9af6..0e13f986 100644
--- a/src/objc/abstract/MCOConstants.h
+++ b/src/objc/abstract/MCOConstants.h
@@ -358,4 +358,9 @@ typedef enum {
*/
typedef void (^MCOConnectionLogger)(void * connectionID, MCOConnectionLogType type, NSData * data);
+/**
+ It's called when asynchronous operations stop/start running.
+ */
+typedef void (^MCOOperationQueueRunningChangeBlock)(void);
+
#endif
diff --git a/src/objc/imap/MCOIMAPSession.h b/src/objc/imap/MCOIMAPSession.h
index 66b76276..e63e1745 100755
--- a/src/objc/imap/MCOIMAPSession.h
+++ b/src/objc/imap/MCOIMAPSession.h
@@ -109,6 +109,25 @@
*/
@property (nonatomic, copy) MCOConnectionLogger connectionLogger;
+/**
+ The value will be YES when asynchronous operations are running, else it will return NO.
+*/
+@property (nonatomic, assign, readonly, getter=isOperationQueueRunning) BOOL operationQueueRunning;
+
+/**
+ Sets operation running callback. It will be called when operations start or stop running.
+
+ [session setOperationQueueRunningChangeBlock:^{
+ if ([session isOperationQueueRunning]) {
+ ...
+ }
+ else {
+ ...
+ }
+ }];
+*/
+@property (nonatomic, copy) MCOOperationQueueRunningChangeBlock operationQueueRunningChangeBlock;
+
/** @name Folder Operations */
/**
diff --git a/src/objc/imap/MCOIMAPSession.mm b/src/objc/imap/MCOIMAPSession.mm
index ce814435..8b4bb363 100755
--- a/src/objc/imap/MCOIMAPSession.mm
+++ b/src/objc/imap/MCOIMAPSession.mm
@@ -22,19 +22,20 @@
#import <MailCore/MCAsync.h>
#include "MCIMAPMessageRenderingOperation.h"
-
+#include "MCOperationQueueCallback.h"
using namespace mailcore;
@interface MCOIMAPSession ()
- (void) _logWithSender:(void *)sender connectionType:(MCOConnectionLogType)logType data:(NSData *)data;
+- (void) _queueRunningChanged;
@end
-class MCOIMAPConnectionLoggerBridge : public Object, public ConnectionLogger {
+class MCOIMAPCallbackBridge : public Object, public ConnectionLogger, public OperationQueueCallback {
public:
- MCOIMAPConnectionLoggerBridge(MCOIMAPSession * session)
+ MCOIMAPCallbackBridge(MCOIMAPSession * session)
{
mSession = session;
}
@@ -44,6 +45,16 @@ public:
[mSession _logWithSender:sender connectionType:(MCOConnectionLogType)logType data:MCO_TO_OBJC(data)];
}
+ virtual void queueStartRunning()
+ {
+ [mSession _queueRunningChanged];
+ }
+
+ virtual void queueStoppedRunning()
+ {
+ [mSession _queueRunningChanged];
+ }
+
private:
MCOIMAPSession * mSession;
};
@@ -51,7 +62,8 @@ private:
@implementation MCOIMAPSession {
IMAPAsyncSession * _session;
MCOConnectionLogger _connectionLogger;
- MCOIMAPConnectionLoggerBridge * _loggerBridge;
+ MCOIMAPCallbackBridge * _callbackBridge;
+ MCOOperationQueueRunningChangeBlock _operationQueueRunningChangeBlock;
}
#define nativeType mailcore::IMAPAsyncSession
@@ -65,13 +77,17 @@ private:
self = [super init];
_session = new IMAPAsyncSession();
- _loggerBridge = new MCOIMAPConnectionLoggerBridge(self);
+ _callbackBridge = new MCOIMAPCallbackBridge(self);
+ _session->setOperationQueueCallback(_callbackBridge);
return self;
}
- (void)dealloc {
- MC_SAFE_RELEASE(_loggerBridge);
+ _session->setConnectionLogger(NULL);
+ _session->setOperationQueueCallback(NULL);
+ MC_SAFE_RELEASE(_callbackBridge);
+ [_operationQueueRunningChangeBlock release];
[_connectionLogger release];
_session->release();
[super dealloc];
@@ -116,7 +132,7 @@ MCO_OBJC_SYNTHESIZE_SCALAR(unsigned int, unsigned int, setMaximumConnections, ma
_connectionLogger = [connectionLogger copy];
if (_connectionLogger != nil) {
- _session->setConnectionLogger(_loggerBridge);
+ _session->setConnectionLogger(_callbackBridge);
}
else {
_session->setConnectionLogger(NULL);
@@ -128,6 +144,24 @@ MCO_OBJC_SYNTHESIZE_SCALAR(unsigned int, unsigned int, setMaximumConnections, ma
return _connectionLogger;
}
+- (void) setOperationQueueRunningChangeBlock:(MCOOperationQueueRunningChangeBlock)operationQueueRunningChangeBlock
+{
+ [_operationQueueRunningChangeBlock release];
+ _operationQueueRunningChangeBlock = [operationQueueRunningChangeBlock copy];
+
+ if (_operationQueueRunningChangeBlock != nil) {
+ _session->setOperationQueueCallback(_callbackBridge);
+ }
+ else {
+ _session->setOperationQueueCallback(NULL);
+ }
+}
+
+- (MCOOperationQueueRunningChangeBlock) operationQueueRunningChangeBlock
+{
+ return _operationQueueRunningChangeBlock;
+}
+
#pragma mark - Operations
#define MCO_TO_OBJC_OP(op) [self _objcOperationFromNativeOp:op];
@@ -407,4 +441,17 @@ MCO_OBJC_SYNTHESIZE_SCALAR(unsigned int, unsigned int, setMaximumConnections, ma
return MCO_TO_OBJC_OP(coreOp);
}
+- (void) _queueRunningChanged
+{
+ if (_operationQueueRunningChangeBlock == NULL)
+ return;
+
+ _operationQueueRunningChangeBlock();
+}
+
+- (BOOL) isOperationQueueRunning
+{
+ return _session->isOperationQueueRunning();
+}
+
@end