aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/async
diff options
context:
space:
mode:
Diffstat (limited to 'src/async')
-rw-r--r--src/async/imap/MCIMAPAsyncConnection.cc69
-rw-r--r--src/async/imap/MCIMAPAsyncConnection.h194
-rw-r--r--src/async/imap/MCIMAPAsyncSession.cc33
-rw-r--r--src/async/imap/MCIMAPAsyncSession.h12
-rw-r--r--src/async/pop/MCPOPAsyncSession.cc62
-rw-r--r--src/async/pop/MCPOPAsyncSession.h9
-rw-r--r--src/async/smtp/MCSMTPAsyncSession.cc61
-rw-r--r--src/async/smtp/MCSMTPAsyncSession.h10
8 files changed, 350 insertions, 100 deletions
diff --git a/src/async/imap/MCIMAPAsyncConnection.cc b/src/async/imap/MCIMAPAsyncConnection.cc
index 2891d439..fc1935b7 100644
--- a/src/async/imap/MCIMAPAsyncConnection.cc
+++ b/src/async/imap/MCIMAPAsyncConnection.cc
@@ -33,6 +33,7 @@
#include "MCOperationQueueCallback.h"
#include "MCIMAPDisconnectOperation.h"
#include "MCIMAPAsyncSession.h"
+#include "MCConnectionLogger.h"
using namespace mailcore;
@@ -46,11 +47,11 @@ namespace mailcore {
virtual ~IMAPOperationQueueCallback() {
}
- virtual void queueStartRunning() {
+ virtual void queueStartRunning(OperationQueue * queue) {
mConnection->queueStartRunning();
}
- virtual void queueStoppedRunning() {
+ virtual void queueStoppedRunning(OperationQueue * queue) {
mConnection->tryAutomaticDisconnect();
mConnection->queueStoppedRunning();
}
@@ -58,6 +59,24 @@ namespace mailcore {
private:
IMAPAsyncConnection * mConnection;
};
+
+ class IMAPConnectionLogger : public Object, public ConnectionLogger {
+ public:
+ IMAPConnectionLogger(IMAPAsyncConnection * connection) {
+ mConnection = connection;
+ }
+
+ virtual ~IMAPConnectionLogger() {
+ }
+
+ virtual void log(void * context, void * sender, ConnectionLogType logType, Data * buffer)
+ {
+ mConnection->logConnection(logType, buffer);
+ }
+
+ private:
+ IMAPAsyncConnection * mConnection;
+ };
}
IMAPAsyncConnection::IMAPAsyncConnection()
@@ -70,11 +89,16 @@ IMAPAsyncConnection::IMAPAsyncConnection()
mQueueCallback = new IMAPOperationQueueCallback(this);
mQueue->setCallback(mQueueCallback);
mOwner = NULL;
+ mConnectionLogger = NULL;
+ pthread_mutex_init(&mConnectionLoggerLock, NULL);
+ mInternalLogger = new IMAPConnectionLogger(this);
}
IMAPAsyncConnection::~IMAPAsyncConnection()
{
cancelDelayedPerformMethod((Object::Method) &IMAPAsyncConnection::tryAutomaticDisconnectAfterDelay, NULL);
+ pthread_mutex_destroy(&mConnectionLoggerLock);
+ MC_SAFE_RELEASE(mInternalLogger);
MC_SAFE_RELEASE(mQueueCallback);
MC_SAFE_RELEASE(mLastFolder);
MC_SAFE_RELEASE(mDefaultNamespace);
@@ -122,6 +146,16 @@ String * IMAPAsyncConnection::password()
return mSession->password();
}
+void IMAPAsyncConnection::setOAuth2Token(String * token)
+{
+ mSession->setOAuth2Token(token);
+}
+
+String * IMAPAsyncConnection::OAuth2Token()
+{
+ return mSession->OAuth2Token();
+}
+
void IMAPAsyncConnection::setAuthType(AuthType authType)
{
mSession->setAuthType(authType);
@@ -526,4 +560,35 @@ IMAPAsyncSession * IMAPAsyncConnection::owner()
return mOwner;
}
+void IMAPAsyncConnection::setConnectionLogger(ConnectionLogger * logger)
+{
+ pthread_mutex_lock(&mConnectionLoggerLock);
+ mConnectionLogger = logger;
+ if (mConnectionLogger != NULL) {
+ mSession->setConnectionLogger(mInternalLogger);
+ }
+ else {
+ mSession->setConnectionLogger(NULL);
+ }
+ pthread_mutex_unlock(&mConnectionLoggerLock);
+}
+ConnectionLogger * IMAPAsyncConnection::connectionLogger()
+{
+ ConnectionLogger * result;
+
+ pthread_mutex_lock(&mConnectionLoggerLock);
+ result = mConnectionLogger;
+ pthread_mutex_unlock(&mConnectionLoggerLock);
+
+ return result;
+}
+
+void IMAPAsyncConnection::logConnection(ConnectionLogType logType, Data * buffer)
+{
+ pthread_mutex_lock(&mConnectionLoggerLock);
+ if (mConnectionLogger != NULL) {
+ mConnectionLogger->log(this, logType, buffer);
+ }
+ pthread_mutex_unlock(&mConnectionLoggerLock);
+}
diff --git a/src/async/imap/MCIMAPAsyncConnection.h b/src/async/imap/MCIMAPAsyncConnection.h
index d6ef6a91..319cc224 100644
--- a/src/async/imap/MCIMAPAsyncConnection.h
+++ b/src/async/imap/MCIMAPAsyncConnection.h
@@ -8,129 +8,139 @@
#ifdef __cplusplus
namespace mailcore {
-
- class IMAPOperation;
- class IMAPFetchFoldersOperation;
- class IMAPAppendMessageOperation;
- class IMAPCopyMessagesOperation;
- class IMAPFetchMessagesOperation;
- class IMAPFetchContentOperation;
- class IMAPIdleOperation;
- class IMAPFolderInfoOperation;
- class IMAPFolderStatusOperation;
- class IMAPSession;
- class IMAPNamespace;
- class IMAPSearchOperation;
- class IMAPSearchExpression;
- class IMAPFetchNamespaceOperation;
- class IMAPIdentityOperation;
- class IMAPCapabilityOperation;
+
+ class IMAPOperation;
+ class IMAPFetchFoldersOperation;
+ class IMAPAppendMessageOperation;
+ class IMAPCopyMessagesOperation;
+ class IMAPFetchMessagesOperation;
+ class IMAPFetchContentOperation;
+ class IMAPIdleOperation;
+ class IMAPFolderInfoOperation;
+ class IMAPFolderStatusOperation;
+ class IMAPSession;
+ class IMAPNamespace;
+ class IMAPSearchOperation;
+ class IMAPSearchExpression;
+ class IMAPFetchNamespaceOperation;
+ class IMAPIdentityOperation;
+ class IMAPCapabilityOperation;
class IMAPOperationQueueCallback;
class IMAPAsyncSession;
+ class IMAPConnectionLogger;
- class IMAPAsyncConnection : public Object {
- public:
- IMAPAsyncConnection();
- virtual ~IMAPAsyncConnection();
-
- virtual void setHostname(String * hostname);
- virtual String * hostname();
+ class IMAPAsyncConnection : public Object {
+ public:
+ IMAPAsyncConnection();
+ virtual ~IMAPAsyncConnection();
+
+ virtual void setHostname(String * hostname);
+ virtual String * hostname();
+
+ virtual void setPort(unsigned int port);
+ virtual unsigned int port();
+
+ virtual void setUsername(String * username);
+ virtual String * username();
+
+ virtual void setPassword(String * password);
+ virtual String * password();
- virtual void setPort(unsigned int port);
- virtual unsigned int port();
+ virtual void setOAuth2Token(String * token);
+ virtual String * OAuth2Token();
- virtual void setUsername(String * username);
- virtual String * username();
+ virtual void setAuthType(AuthType authType);
+ virtual AuthType authType();
- virtual void setPassword(String * password);
- virtual String * password();
+ virtual void setConnectionType(ConnectionType connectionType);
+ virtual ConnectionType connectionType();
- virtual void setAuthType(AuthType authType);
- virtual AuthType authType();
+ virtual void setTimeout(time_t timeout);
+ virtual time_t timeout();
- virtual void setConnectionType(ConnectionType connectionType);
- virtual ConnectionType connectionType();
+ virtual void setCheckCertificateEnabled(bool enabled);
+ virtual bool isCheckCertificateEnabled();
- virtual void setTimeout(time_t timeout);
- virtual time_t timeout();
-
- virtual void setCheckCertificateEnabled(bool enabled);
- virtual bool isCheckCertificateEnabled();
+ virtual void setVoIPEnabled(bool enabled);
+ virtual bool isVoIPEnabled();
- virtual void setVoIPEnabled(bool enabled);
- virtual bool isVoIPEnabled();
+ virtual void setDelimiter(char delimiter);
+ virtual char delimiter();
- virtual void setDelimiter(char delimiter);
- virtual char delimiter();
+ virtual void setDefaultNamespace(IMAPNamespace * ns);
+ virtual IMAPNamespace * defaultNamespace();
- virtual void setDefaultNamespace(IMAPNamespace * ns);
- virtual IMAPNamespace * defaultNamespace();
+ virtual void setConnectionLogger(ConnectionLogger * logger);
+ virtual ConnectionLogger * connectionLogger();
- virtual IMAPFolderInfoOperation * folderInfoOperation(String * folder);
+ virtual IMAPFolderInfoOperation * folderInfoOperation(String * folder);
virtual IMAPFolderStatusOperation * folderStatusOperation(String * folder);
-
- virtual IMAPFetchFoldersOperation * fetchSubscribedFoldersOperation();
- virtual IMAPFetchFoldersOperation * fetchAllFoldersOperation();
-
- virtual IMAPOperation * renameFolderOperation(String * folder, String * otherName);
- virtual IMAPOperation * deleteFolderOperation(String * folder);
- virtual IMAPOperation * createFolderOperation(String * folder);
-
- virtual IMAPOperation * subscribeFolderOperation(String * folder);
- virtual IMAPOperation * unsubscribeFolderOperation(String * folder);
-
- virtual IMAPAppendMessageOperation * appendMessageOperation(String * folder, Data * messageData, MessageFlag flags);
-
- virtual IMAPCopyMessagesOperation * copyMessagesOperation(String * folder, IndexSet * uids, String * destFolder);
-
- virtual IMAPOperation * expungeOperation(String * folder);
-
- virtual IMAPFetchMessagesOperation * fetchMessagesByUIDOperation(String * folder, IMAPMessagesRequestKind requestKind,
+
+ virtual IMAPFetchFoldersOperation * fetchSubscribedFoldersOperation();
+ virtual IMAPFetchFoldersOperation * fetchAllFoldersOperation();
+
+ virtual IMAPOperation * renameFolderOperation(String * folder, String * otherName);
+ virtual IMAPOperation * deleteFolderOperation(String * folder);
+ virtual IMAPOperation * createFolderOperation(String * folder);
+
+ virtual IMAPOperation * subscribeFolderOperation(String * folder);
+ virtual IMAPOperation * unsubscribeFolderOperation(String * folder);
+
+ virtual IMAPAppendMessageOperation * appendMessageOperation(String * folder, Data * messageData, MessageFlag flags);
+
+ virtual IMAPCopyMessagesOperation * copyMessagesOperation(String * folder, IndexSet * uids, String * destFolder);
+
+ virtual IMAPOperation * expungeOperation(String * folder);
+
+ virtual IMAPFetchMessagesOperation * fetchMessagesByUIDOperation(String * folder, IMAPMessagesRequestKind requestKind,
IndexSet * uids);
- virtual IMAPFetchMessagesOperation * fetchMessagesByNumberOperation(String * folder, IMAPMessagesRequestKind requestKind,
+ virtual IMAPFetchMessagesOperation * fetchMessagesByNumberOperation(String * folder, IMAPMessagesRequestKind requestKind,
IndexSet * numbers);
virtual IMAPFetchMessagesOperation * syncMessagesByUID(String * folder, IMAPMessagesRequestKind requestKind,
IndexSet * uids, uint64_t modSeq);
- virtual IMAPFetchContentOperation * fetchMessageByUIDOperation(String * folder, uint32_t uid);
- virtual IMAPFetchContentOperation * fetchMessageAttachmentByUIDOperation(String * folder, uint32_t uid, String * partID,
+ virtual IMAPFetchContentOperation * fetchMessageByUIDOperation(String * folder, uint32_t uid);
+ 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 * storeLabelsOperation(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, Array * labels);
-
- virtual IMAPSearchOperation * searchOperation(String * folder, IMAPSearchKind kind, String * searchString);
- virtual IMAPSearchOperation * searchOperation(String * folder, IMAPSearchExpression * expression);
-
- virtual IMAPIdleOperation * idleOperation(String * folder, uint32_t lastKnownUID);
-
- virtual IMAPFetchNamespaceOperation * fetchNamespaceOperation();
-
- virtual IMAPIdentityOperation * identityOperation(String * vendor, String * name, String * version);
+
+ virtual IMAPOperation * storeFlagsOperation(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, MessageFlag flags);
+ virtual IMAPOperation * storeLabelsOperation(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, Array * labels);
+
+ virtual IMAPSearchOperation * searchOperation(String * folder, IMAPSearchKind kind, String * searchString);
+ virtual IMAPSearchOperation * searchOperation(String * folder, IMAPSearchExpression * expression);
+
+ virtual IMAPIdleOperation * idleOperation(String * folder, uint32_t lastKnownUID);
+
+ virtual IMAPFetchNamespaceOperation * fetchNamespaceOperation();
+
+ virtual IMAPIdentityOperation * identityOperation(String * vendor, String * name, String * version);
virtual IMAPOperation * checkAccountOperation();
virtual IMAPCapabilityOperation * capabilityOperation();
private:
- IMAPSession * mSession;
- OperationQueue * mQueue;
- char mDelimiter;
- IMAPNamespace * mDefaultNamespace;
- String * mLastFolder;
+ IMAPSession * mSession;
+ OperationQueue * mQueue;
+ char mDelimiter;
+ IMAPNamespace * mDefaultNamespace;
+ String * mLastFolder;
IMAPOperationQueueCallback * mQueueCallback;
- IMAPAsyncSession * mOwner;
+ IMAPAsyncSession * mOwner;
+ ConnectionLogger * mConnectionLogger;
+ IMAPConnectionLogger * mInternalLogger;
+ pthread_mutex_t mConnectionLoggerLock;
virtual void tryAutomaticDisconnectAfterDelay(void * context);
-
+
public: // private
- virtual void runOperation(IMAPOperation * operation);
- virtual IMAPSession * session();
+ virtual void runOperation(IMAPOperation * operation);
+ virtual IMAPSession * session();
- virtual unsigned int operationsCount();
+ virtual unsigned int operationsCount();
- virtual void setLastFolder(String * folder);
- virtual String * lastFolder();
+ virtual void setLastFolder(String * folder);
+ virtual String * lastFolder();
virtual void tryAutomaticDisconnect();
virtual void queueStartRunning();
@@ -138,6 +148,8 @@ namespace mailcore {
virtual void setOwner(IMAPAsyncSession * owner);
virtual IMAPAsyncSession * owner();
+
+ virtual void logConnection(ConnectionLogType logType, Data * buffer);
};
}
diff --git a/src/async/imap/MCIMAPAsyncSession.cc b/src/async/imap/MCIMAPAsyncSession.cc
index 7c085e4a..6981322e 100644
--- a/src/async/imap/MCIMAPAsyncSession.cc
+++ b/src/async/imap/MCIMAPAsyncSession.cc
@@ -11,6 +11,7 @@
#include "MCIMAPAsyncConnection.h"
#include "MCIMAPNamespace.h"
#include "MCOperationQueueCallback.h"
+#include "MCConnectionLogger.h"
#define DEFAULT_MAX_CONNECTIONS 3
@@ -26,6 +27,7 @@ IMAPAsyncSession::IMAPAsyncSession()
mPort = 0;
mUsername = NULL;
mPassword = NULL;
+ mOAuth2Token = NULL;
mAuthType = AuthTypeSASLNone;
mConnectionType = ConnectionTypeClear;
mCheckCertificateEnabled = true;
@@ -33,11 +35,17 @@ IMAPAsyncSession::IMAPAsyncSession()
mDelimiter = 0;
mDefaultNamespace = NULL;
mTimeout = 30.;
+ mConnectionLogger = NULL;
}
IMAPAsyncSession::~IMAPAsyncSession()
{
MC_SAFE_RELEASE(mSessions);
+ MC_SAFE_RELEASE(mHostname);
+ MC_SAFE_RELEASE(mUsername);
+ MC_SAFE_RELEASE(mPassword);
+ MC_SAFE_RELEASE(mOAuth2Token);
+ MC_SAFE_RELEASE(mDefaultNamespace);
}
void IMAPAsyncSession::setHostname(String * hostname)
@@ -80,6 +88,16 @@ String * IMAPAsyncSession::password()
return mPassword;
}
+void IMAPAsyncSession::setOAuth2Token(String * token)
+{
+ MC_SAFE_REPLACE_COPY(String, mOAuth2Token, token);
+}
+
+String * IMAPAsyncSession::OAuth2Token()
+{
+ return mOAuth2Token;
+}
+
void IMAPAsyncSession::setAuthType(AuthType authType)
{
mAuthType = authType;
@@ -174,6 +192,7 @@ unsigned int IMAPAsyncSession::maximumConnections()
IMAPAsyncConnection * IMAPAsyncSession::session()
{
IMAPAsyncConnection * session = new IMAPAsyncConnection();
+ session->setConnectionLogger(mConnectionLogger);
session->setOwner(this);
session->autorelease();
@@ -181,6 +200,7 @@ IMAPAsyncConnection * IMAPAsyncSession::session()
session->setPort(mPort);
session->setUsername(mUsername);
session->setPassword(mPassword);
+ session->setOAuth2Token(mOAuth2Token);
session->setAuthType(mAuthType);
session->setConnectionType(mConnectionType);
session->setTimeout(mTimeout);
@@ -429,3 +449,16 @@ IMAPCapabilityOperation * IMAPAsyncSession::capabilityOperation()
return session->capabilityOperation();
}
+void IMAPAsyncSession::setConnectionLogger(ConnectionLogger * logger)
+{
+ mConnectionLogger = logger;
+ for(unsigned int i = 0 ; i < mSessions->count() ; i ++) {
+ IMAPAsyncConnection * currentSession = (IMAPAsyncConnection *) mSessions->objectAtIndex(i);
+ currentSession->setConnectionLogger(logger);
+ }
+}
+
+ConnectionLogger * IMAPAsyncSession::connectionLogger()
+{
+ return mConnectionLogger;
+}
diff --git a/src/async/imap/MCIMAPAsyncSession.h b/src/async/imap/MCIMAPAsyncSession.h
index 390fdab8..ae1bbb90 100644
--- a/src/async/imap/MCIMAPAsyncSession.h
+++ b/src/async/imap/MCIMAPAsyncSession.h
@@ -51,6 +51,11 @@ namespace mailcore {
virtual void setPassword(String * password);
virtual String * password();
+ // To authenticate using OAuth2, username and oauth2token should be set.
+ // auth type to use is AuthTypeOAuth2.
+ virtual void setOAuth2Token(String * token);
+ virtual String * OAuth2Token();
+
virtual void setAuthType(AuthType authType);
virtual AuthType authType();
@@ -78,6 +83,9 @@ namespace mailcore {
virtual void setMaximumConnections(unsigned int maxConnections);
virtual unsigned int maximumConnections();
+ virtual void setConnectionLogger(ConnectionLogger * logger);
+ virtual ConnectionLogger * connectionLogger();
+
virtual IMAPFolderInfoOperation * folderInfoOperation(String * folder);
virtual IMAPFolderStatusOperation * folderStatusOperation(String * folder);
@@ -124,7 +132,7 @@ namespace mailcore {
virtual IMAPOperation * checkAccountOperation();
virtual IMAPCapabilityOperation * capabilityOperation();
-
+
private:
Array * mSessions;
@@ -132,6 +140,7 @@ namespace mailcore {
unsigned int mPort;
String * mUsername;
String * mPassword;
+ String * mOAuth2Token;
AuthType mAuthType;
ConnectionType mConnectionType;
bool mCheckCertificateEnabled;
@@ -141,6 +150,7 @@ namespace mailcore {
time_t mTimeout;
bool mAllowsFolderConcurrentAccessEnabled;
unsigned int mMaximumConnections;
+ ConnectionLogger * mConnectionLogger;
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 1269a34b..342b0f5e 100644
--- a/src/async/pop/MCPOPAsyncSession.cc
+++ b/src/async/pop/MCPOPAsyncSession.cc
@@ -15,6 +15,7 @@
#include "MCPOPFetchMessagesOperation.h"
#include "MCPOPCheckAccountOperation.h"
#include "MCOperationQueueCallback.h"
+#include "MCConnectionLogger.h"
using namespace mailcore;
@@ -28,17 +29,35 @@ namespace mailcore {
virtual ~POPOperationQueueCallback() {
}
- virtual void queueStartRunning() {
+ virtual void queueStartRunning(OperationQueue * queue) {
mSession->retain();
}
- virtual void queueStoppedRunning() {
+ virtual void queueStoppedRunning(OperationQueue * queue) {
mSession->release();
}
private:
POPAsyncSession * mSession;
};
+
+ class POPConnectionLogger : public Object, public ConnectionLogger {
+ public:
+ POPConnectionLogger(POPAsyncSession * session) {
+ mSession = session;
+ }
+
+ virtual ~POPConnectionLogger() {
+ }
+
+ virtual void log(void * context, void * sender, ConnectionLogType logType, Data * buffer)
+ {
+ mSession->logConnection(logType, buffer);
+ }
+
+ private:
+ POPAsyncSession * mSession;
+ };
}
POPAsyncSession::POPAsyncSession()
@@ -47,10 +66,16 @@ POPAsyncSession::POPAsyncSession()
mQueue = new OperationQueue();
mQueueCallback = new POPOperationQueueCallback(this);
mQueue->setCallback(mQueueCallback);
+ mConnectionLogger = NULL;
+ pthread_mutex_init(&mConnectionLoggerLock, NULL);
+ mInternalLogger = new POPConnectionLogger(this);
+ mSession->setConnectionLogger(mInternalLogger);
}
POPAsyncSession::~POPAsyncSession()
{
+ MC_SAFE_RELEASE(mInternalLogger);
+ pthread_mutex_destroy(&mConnectionLoggerLock);
MC_SAFE_RELEASE(mQueueCallback);
MC_SAFE_RELEASE(mSession);
MC_SAFE_RELEASE(mQueue);
@@ -193,3 +218,36 @@ void POPAsyncSession::runOperation(POPOperation * operation)
{
mQueue->addOperation(operation);
}
+
+void POPAsyncSession::setConnectionLogger(ConnectionLogger * logger)
+{
+ pthread_mutex_lock(&mConnectionLoggerLock);
+ mConnectionLogger = logger;
+ if (mConnectionLogger != NULL) {
+ mSession->setConnectionLogger(mInternalLogger);
+ }
+ else {
+ mSession->setConnectionLogger(NULL);
+ }
+ pthread_mutex_unlock(&mConnectionLoggerLock);
+}
+
+ConnectionLogger * POPAsyncSession::connectionLogger()
+{
+ ConnectionLogger * result;
+
+ pthread_mutex_lock(&mConnectionLoggerLock);
+ result = mConnectionLogger;
+ pthread_mutex_unlock(&mConnectionLoggerLock);
+
+ return result;
+}
+
+void POPAsyncSession::logConnection(ConnectionLogType logType, Data * buffer)
+{
+ pthread_mutex_lock(&mConnectionLoggerLock);
+ if (mConnectionLogger != NULL) {
+ mConnectionLogger->log(this, logType, buffer);
+ }
+ pthread_mutex_unlock(&mConnectionLoggerLock);
+}
diff --git a/src/async/pop/MCPOPAsyncSession.h b/src/async/pop/MCPOPAsyncSession.h
index 452d4d75..0345ecd6 100644
--- a/src/async/pop/MCPOPAsyncSession.h
+++ b/src/async/pop/MCPOPAsyncSession.h
@@ -23,6 +23,7 @@ namespace mailcore {
class POPDeleteMessagesOperation;
class POPFetchMessagesOperation;
class POPOperationQueueCallback;
+ class POPConnectionLogger;
class POPAsyncSession : public Object {
public:
@@ -53,6 +54,9 @@ namespace mailcore {
virtual void setCheckCertificateEnabled(bool enabled);
virtual bool isCheckCertificateEnabled();
+ virtual void setConnectionLogger(ConnectionLogger * logger);
+ virtual ConnectionLogger * connectionLogger();
+
virtual POPFetchMessagesOperation * fetchMessagesOperation();
virtual POPFetchHeaderOperation * fetchHeaderOperation(unsigned int index);
@@ -70,11 +74,14 @@ namespace mailcore {
POPSession * mSession;
OperationQueue * mQueue;
POPOperationQueueCallback * mQueueCallback;
+ ConnectionLogger * mConnectionLogger;
+ pthread_mutex_t mConnectionLoggerLock;
+ POPConnectionLogger * mInternalLogger;
public: // private
virtual void runOperation(POPOperation * operation);
virtual POPSession * session();
-
+ virtual void logConnection(ConnectionLogType logType, Data * buffer);
};
}
diff --git a/src/async/smtp/MCSMTPAsyncSession.cc b/src/async/smtp/MCSMTPAsyncSession.cc
index 723c0330..fafc2e82 100644
--- a/src/async/smtp/MCSMTPAsyncSession.cc
+++ b/src/async/smtp/MCSMTPAsyncSession.cc
@@ -19,11 +19,11 @@ namespace mailcore {
virtual ~SMTPOperationQueueCallback() {
}
- virtual void queueStartRunning() {
+ virtual void queueStartRunning(OperationQueue * queue) {
mSession->retain();
}
- virtual void queueStoppedRunning() {
+ virtual void queueStoppedRunning(OperationQueue * queue) {
mSession->tryAutomaticDisconnect();
mSession->release();
}
@@ -31,6 +31,24 @@ namespace mailcore {
private:
SMTPAsyncSession * mSession;
};
+
+ class SMTPConnectionLogger : public Object, public ConnectionLogger {
+ public:
+ SMTPConnectionLogger(SMTPAsyncSession * session) {
+ mSession = session;
+ }
+
+ virtual ~SMTPConnectionLogger() {
+ }
+
+ virtual void log(void * context, void * sender, ConnectionLogType logType, Data * buffer)
+ {
+ mSession->logConnection(logType, buffer);
+ }
+
+ private:
+ SMTPAsyncSession * mSession;
+ };
}
SMTPAsyncSession::SMTPAsyncSession()
@@ -39,10 +57,16 @@ SMTPAsyncSession::SMTPAsyncSession()
mQueue = new OperationQueue();
mQueueCallback = new SMTPOperationQueueCallback(this);
mQueue->setCallback(mQueueCallback);
+ mConnectionLogger = NULL;
+ pthread_mutex_init(&mConnectionLoggerLock, NULL);
+ mInternalLogger = new SMTPConnectionLogger(this);
+ mSession->setConnectionLogger(mInternalLogger);
}
SMTPAsyncSession::~SMTPAsyncSession()
{
+ MC_SAFE_RELEASE(mInternalLogger);
+ pthread_mutex_destroy(&mConnectionLoggerLock);
cancelDelayedPerformMethod((Object::Method) &SMTPAsyncSession::tryAutomaticDisconnectAfterDelay, NULL);
MC_SAFE_RELEASE(mQueueCallback);
MC_SAFE_RELEASE(mQueue);
@@ -184,3 +208,36 @@ SMTPOperation * SMTPAsyncSession::checkAccountOperation(Address * from)
op->setSession(this);
return (SMTPOperation *) op->autorelease();
}
+
+void SMTPAsyncSession::setConnectionLogger(ConnectionLogger * logger)
+{
+ pthread_mutex_lock(&mConnectionLoggerLock);
+ mConnectionLogger = logger;
+ if (mConnectionLogger != NULL) {
+ mSession->setConnectionLogger(mInternalLogger);
+ }
+ else {
+ mSession->setConnectionLogger(NULL);
+ }
+ pthread_mutex_unlock(&mConnectionLoggerLock);
+}
+
+ConnectionLogger * SMTPAsyncSession::connectionLogger()
+{
+ ConnectionLogger * result;
+
+ pthread_mutex_lock(&mConnectionLoggerLock);
+ result = mConnectionLogger;
+ pthread_mutex_unlock(&mConnectionLoggerLock);
+
+ return result;
+}
+
+void SMTPAsyncSession::logConnection(ConnectionLogType logType, Data * buffer)
+{
+ pthread_mutex_lock(&mConnectionLoggerLock);
+ if (mConnectionLogger != NULL) {
+ mConnectionLogger->log(this, logType, buffer);
+ }
+ pthread_mutex_unlock(&mConnectionLoggerLock);
+}
diff --git a/src/async/smtp/MCSMTPAsyncSession.h b/src/async/smtp/MCSMTPAsyncSession.h
index 9cd7a8f0..9fa6dbdf 100644
--- a/src/async/smtp/MCSMTPAsyncSession.h
+++ b/src/async/smtp/MCSMTPAsyncSession.h
@@ -14,6 +14,7 @@ namespace mailcore {
class SMTPSession;
class Address;
class SMTPOperationQueueCallback;
+ class SMTPConnectionLogger;
class SMTPAsyncSession : public Object {
public:
@@ -47,6 +48,9 @@ namespace mailcore {
virtual void setUseHeloIPEnabled(bool enabled);
virtual bool useHeloIPEnabled();
+ virtual void setConnectionLogger(ConnectionLogger * logger);
+ virtual ConnectionLogger * connectionLogger();
+
virtual SMTPOperation * sendMessageOperation(Data * messageData);
virtual SMTPOperation * checkAccountOperation(Address * from);
@@ -54,11 +58,15 @@ namespace mailcore {
virtual void runOperation(SMTPOperation * operation);
virtual SMTPSession * session();
virtual void tryAutomaticDisconnect();
-
+ virtual void logConnection(ConnectionLogType logType, Data * buffer);
+
private:
SMTPSession * mSession;
OperationQueue * mQueue;
SMTPOperationQueueCallback * mQueueCallback;
+ ConnectionLogger * mConnectionLogger;
+ pthread_mutex_t mConnectionLoggerLock;
+ SMTPConnectionLogger * mInternalLogger;
virtual void tryAutomaticDisconnectAfterDelay(void * context);
};