diff options
-rwxr-xr-x | src/async/imap/MCIMAPAsyncConnection.cc | 19 | ||||
-rwxr-xr-x | src/async/imap/MCIMAPAsyncConnection.h | 4 | ||||
-rwxr-xr-x | src/async/imap/MCIMAPAsyncSession.cc | 40 | ||||
-rwxr-xr-x | src/async/imap/MCIMAPAsyncSession.h | 10 | ||||
-rw-r--r-- | src/async/pop/MCPOPAsyncSession.cc | 4 | ||||
-rw-r--r-- | src/async/smtp/MCSMTPAsyncSession.cc | 4 | ||||
-rw-r--r-- | src/core/basetypes/MCOperationQueue.cc | 4 | ||||
-rw-r--r-- | src/core/basetypes/MCOperationQueueCallback.h | 4 | ||||
-rw-r--r-- | src/objc/abstract/MCOConstants.h | 5 | ||||
-rwxr-xr-x | src/objc/imap/MCOIMAPSession.h | 19 | ||||
-rwxr-xr-x | src/objc/imap/MCOIMAPSession.mm | 61 |
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 |