diff options
author | DINH Viet Hoa <hoa@sprw.me> | 2013-01-17 00:08:32 -0800 |
---|---|---|
committer | DINH Viet Hoa <hoa@sprw.me> | 2013-01-17 00:08:32 -0800 |
commit | ada1598162092e9affc9337dedeb6c805ae72121 (patch) | |
tree | 3f4a48873cbe720b3ff78b34b994840f30237180 | |
parent | e75be6c8b9a9b694e86c4054b4493f8ec405df2f (diff) |
implemented POP async API
27 files changed, 838 insertions, 17 deletions
diff --git a/build-mac/mailcore2.xcodeproj/project.pbxproj b/build-mac/mailcore2.xcodeproj/project.pbxproj index d4cfb285..3607fcb3 100644 --- a/build-mac/mailcore2.xcodeproj/project.pbxproj +++ b/build-mac/mailcore2.xcodeproj/project.pbxproj @@ -23,6 +23,19 @@ C62C6EEA16A6972100737497 /* MCIMAPFetchNamespaceOperation.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C64EA82B16A2A01400778456 /* MCIMAPFetchNamespaceOperation.h */; }; C62C6EEB16A6972700737497 /* MCIMAPIdentityOperation.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C62C6ED316A2A0E600737497 /* MCIMAPIdentityOperation.h */; }; C62C6EEC16A69D3D00737497 /* MCIMAPOperationCallback.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C64EA7F416A15A6300778456 /* MCIMAPOperationCallback.h */; }; + C62C6EEF16A7B67600737497 /* MCPOPAsyncSession.cc in Sources */ = {isa = PBXBuildFile; fileRef = C62C6EED16A7B67600737497 /* MCPOPAsyncSession.cc */; }; + C62C6EF216A7C6DE00737497 /* MCPOPFetchHeaderOperation.cc in Sources */ = {isa = PBXBuildFile; fileRef = C62C6EF016A7C6DE00737497 /* MCPOPFetchHeaderOperation.cc */; }; + C62C6EF516A7C6EA00737497 /* MCPOPFetchMessageOperation.cc in Sources */ = {isa = PBXBuildFile; fileRef = C62C6EF316A7C6E900737497 /* MCPOPFetchMessageOperation.cc */; }; + C62C6EF816A7C6F500737497 /* MCPOPDeleteMessagesOperation.cc in Sources */ = {isa = PBXBuildFile; fileRef = C62C6EF616A7C6F500737497 /* MCPOPDeleteMessagesOperation.cc */; }; + C62C6EFB16A7C94000737497 /* MCPOPOperation.cc in Sources */ = {isa = PBXBuildFile; fileRef = C62C6EF916A7C93F00737497 /* MCPOPOperation.cc */; }; + C62C6EFE16A7DD0D00737497 /* MCPOPOperation.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C62C6EFA16A7C94000737497 /* MCPOPOperation.h */; }; + C62C6EFF16A7E30900737497 /* MCPOPAsyncSession.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C62C6EEE16A7B67600737497 /* MCPOPAsyncSession.h */; }; + C62C6F0016A7E32800737497 /* MCPOPFetchHeaderOperation.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C62C6EF116A7C6DE00737497 /* MCPOPFetchHeaderOperation.h */; }; + C62C6F0116A7E32F00737497 /* MCPOPFetchMessageOperation.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C62C6EF416A7C6E900737497 /* MCPOPFetchMessageOperation.h */; }; + C62C6F0216A7E3A700737497 /* MCAsyncPOP.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C62C6EFD16A7DD0300737497 /* MCAsyncPOP.h */; }; + C62C6F0316A7E3B000737497 /* MCPOPOperationCallback.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C62C6EFC16A7CA1500737497 /* MCPOPOperationCallback.h */; }; + C62C6F0616A7E54500737497 /* MCPOPFetchMessagesOperation.cc in Sources */ = {isa = PBXBuildFile; fileRef = C62C6F0416A7E54200737497 /* MCPOPFetchMessagesOperation.cc */; }; + C62C6F0716A7E7CC00737497 /* MCPOPFetchMessagesOperation.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C62C6F0516A7E54400737497 /* MCPOPFetchMessagesOperation.h */; }; C64EA6F4169E847800778456 /* MCAbstractMessage.cc in Sources */ = {isa = PBXBuildFile; fileRef = C64EA694169E847800778456 /* MCAbstractMessage.cc */; }; C64EA6F6169E847800778456 /* MCAbstractMessagePart.cc in Sources */ = {isa = PBXBuildFile; fileRef = C64EA696169E847800778456 /* MCAbstractMessagePart.cc */; }; C64EA6F8169E847800778456 /* MCAbstractMultipart.cc in Sources */ = {isa = PBXBuildFile; fileRef = C64EA698169E847800778456 /* MCAbstractMultipart.cc */; }; @@ -166,14 +179,17 @@ C64EA74C169E859600778456 /* MCIMAPAsyncSession.h in CopyFiles */, C62C6EE016A696AB00737497 /* MCAsyncIMAP.h in CopyFiles */, C64EA74E169E859600778456 /* MCAbstract.h in CopyFiles */, + C62C6F0016A7E32800737497 /* MCPOPFetchHeaderOperation.h in CopyFiles */, C62C6EE216A696B400737497 /* MCIMAPFetchFoldersOperation.h in CopyFiles */, C64EA74F169E859600778456 /* MCAbstractMessage.h in CopyFiles */, C64EA7E516A14A5400778456 /* MCAsync.h in CopyFiles */, C64EA750169E859600778456 /* MCAbstractMessagePart.h in CopyFiles */, C62C6EDB16A3FC8700737497 /* MCIMAPOperation.h in CopyFiles */, + C62C6EFE16A7DD0D00737497 /* MCPOPOperation.h in CopyFiles */, C64EA751169E859600778456 /* MCAbstractMultipart.h in CopyFiles */, C64EA752169E859600778456 /* MCAbstractPart.h in CopyFiles */, C62C6EEC16A69D3D00737497 /* MCIMAPOperationCallback.h in CopyFiles */, + C62C6EFF16A7E30900737497 /* MCPOPAsyncSession.h in CopyFiles */, C62C6EE816A6971500737497 /* MCIMAPFolderInfoOperation.h in CopyFiles */, C62C6EE516A6970400737497 /* MCIMAPFetchMessagesOperation.h in CopyFiles */, C62C6EE916A6971B00737497 /* MCIMAPSearchOperation.h in CopyFiles */, @@ -218,11 +234,15 @@ C64EA76F169E859600778456 /* MCIMAPPart.h in CopyFiles */, C64EA770169E859600778456 /* MCIMAPProgressCallback.h in CopyFiles */, C64EA771169E859600778456 /* MCIMAPSearchExpression.h in CopyFiles */, + C62C6F0216A7E3A700737497 /* MCAsyncPOP.h in CopyFiles */, + C62C6F0316A7E3B000737497 /* MCPOPOperationCallback.h in CopyFiles */, + C62C6F0116A7E32F00737497 /* MCPOPFetchMessageOperation.h in CopyFiles */, C64EA772169E859600778456 /* MCIMAPSession.h in CopyFiles */, C64EA773169E859600778456 /* MCPOP.h in CopyFiles */, C64EA774169E859600778456 /* MCPOPMessageInfo.h in CopyFiles */, C64EA775169E859600778456 /* MCPOPProgressCallback.h in CopyFiles */, C64EA776169E859600778456 /* MCPOPSession.h in CopyFiles */, + C62C6F0716A7E7CC00737497 /* MCPOPFetchMessagesOperation.h in CopyFiles */, C64EA777169E859600778456 /* MCAttachment.h in CopyFiles */, C64EA7DC16A13A4C00778456 /* MCSMTPOperation.h in CopyFiles */, C64EA74D169E859600778456 /* MCSMTPAsyncSession.h in CopyFiles */, @@ -253,6 +273,20 @@ C62C6ED316A2A0E600737497 /* MCIMAPIdentityOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCIMAPIdentityOperation.h; sourceTree = "<group>"; }; C62C6ED616A398FA00737497 /* MCIMAPFolderInfoOperation.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MCIMAPFolderInfoOperation.cc; sourceTree = "<group>"; }; C62C6ED716A398FA00737497 /* MCIMAPFolderInfoOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCIMAPFolderInfoOperation.h; sourceTree = "<group>"; }; + C62C6EED16A7B67600737497 /* MCPOPAsyncSession.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MCPOPAsyncSession.cc; sourceTree = "<group>"; }; + C62C6EEE16A7B67600737497 /* MCPOPAsyncSession.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCPOPAsyncSession.h; sourceTree = "<group>"; }; + C62C6EF016A7C6DE00737497 /* MCPOPFetchHeaderOperation.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MCPOPFetchHeaderOperation.cc; sourceTree = "<group>"; }; + C62C6EF116A7C6DE00737497 /* MCPOPFetchHeaderOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCPOPFetchHeaderOperation.h; sourceTree = "<group>"; }; + C62C6EF316A7C6E900737497 /* MCPOPFetchMessageOperation.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MCPOPFetchMessageOperation.cc; sourceTree = "<group>"; }; + C62C6EF416A7C6E900737497 /* MCPOPFetchMessageOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCPOPFetchMessageOperation.h; sourceTree = "<group>"; }; + C62C6EF616A7C6F500737497 /* MCPOPDeleteMessagesOperation.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MCPOPDeleteMessagesOperation.cc; sourceTree = "<group>"; }; + C62C6EF716A7C6F500737497 /* MCPOPDeleteMessagesOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCPOPDeleteMessagesOperation.h; sourceTree = "<group>"; }; + C62C6EF916A7C93F00737497 /* MCPOPOperation.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MCPOPOperation.cc; sourceTree = "<group>"; }; + C62C6EFA16A7C94000737497 /* MCPOPOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCPOPOperation.h; sourceTree = "<group>"; }; + C62C6EFC16A7CA1500737497 /* MCPOPOperationCallback.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MCPOPOperationCallback.h; sourceTree = "<group>"; }; + C62C6EFD16A7DD0300737497 /* MCAsyncPOP.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MCAsyncPOP.h; sourceTree = "<group>"; }; + C62C6F0416A7E54200737497 /* MCPOPFetchMessagesOperation.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MCPOPFetchMessagesOperation.cc; sourceTree = "<group>"; }; + C62C6F0516A7E54400737497 /* MCPOPFetchMessagesOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCPOPFetchMessagesOperation.h; sourceTree = "<group>"; }; C64EA537169E772200778456 /* libmailcore2.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libmailcore2.a; sourceTree = BUILT_PRODUCTS_DIR; }; C64EA68C169E847800778456 /* MCIMAPAsyncSession.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCIMAPAsyncSession.h; sourceTree = "<group>"; }; C64EA68F169E847800778456 /* MCSMTPAsyncSession.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MCSMTPAsyncSession.cc; sourceTree = "<group>"; }; @@ -529,6 +563,20 @@ C64EA68D169E847800778456 /* pop */ = { isa = PBXGroup; children = ( + C62C6EFD16A7DD0300737497 /* MCAsyncPOP.h */, + C62C6EED16A7B67600737497 /* MCPOPAsyncSession.cc */, + C62C6EEE16A7B67600737497 /* MCPOPAsyncSession.h */, + C62C6EF016A7C6DE00737497 /* MCPOPFetchHeaderOperation.cc */, + C62C6EF116A7C6DE00737497 /* MCPOPFetchHeaderOperation.h */, + C62C6EF316A7C6E900737497 /* MCPOPFetchMessageOperation.cc */, + C62C6EF416A7C6E900737497 /* MCPOPFetchMessageOperation.h */, + C62C6EF616A7C6F500737497 /* MCPOPDeleteMessagesOperation.cc */, + C62C6EF716A7C6F500737497 /* MCPOPDeleteMessagesOperation.h */, + C62C6F0416A7E54200737497 /* MCPOPFetchMessagesOperation.cc */, + C62C6F0516A7E54400737497 /* MCPOPFetchMessagesOperation.h */, + C62C6EF916A7C93F00737497 /* MCPOPOperation.cc */, + C62C6EFA16A7C94000737497 /* MCPOPOperation.h */, + C62C6EFC16A7CA1500737497 /* MCPOPOperationCallback.h */, ); path = pop; sourceTree = "<group>"; @@ -861,6 +909,12 @@ C62C6ED416A2A0E600737497 /* MCIMAPIdentityOperation.cc in Sources */, C62C6ED816A398FA00737497 /* MCIMAPFolderInfoOperation.cc in Sources */, C62C6EDA16A3D60700737497 /* MCIMAPAsyncSession.cc in Sources */, + C62C6EEF16A7B67600737497 /* MCPOPAsyncSession.cc in Sources */, + C62C6EF216A7C6DE00737497 /* MCPOPFetchHeaderOperation.cc in Sources */, + C62C6EF516A7C6EA00737497 /* MCPOPFetchMessageOperation.cc in Sources */, + C62C6EF816A7C6F500737497 /* MCPOPDeleteMessagesOperation.cc in Sources */, + C62C6EFB16A7C94000737497 /* MCPOPOperation.cc in Sources */, + C62C6F0616A7E54500737497 /* MCPOPFetchMessagesOperation.cc in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/src/async/MCAsync.h b/src/async/MCAsync.h index 4fa1428c..245bf15b 100644 --- a/src/async/MCAsync.h +++ b/src/async/MCAsync.h @@ -10,5 +10,7 @@ #define mailcore2_MCAsync_h #include <mailcore/MCAsyncSMTP.h> +#include <mailcore/MCAsyncIMAP.h> +#include <mailcore/MCAsyncPOP.h> #endif diff --git a/src/async/imap/MCIMAPCopyMessagesOperation.cc b/src/async/imap/MCIMAPCopyMessagesOperation.cc index b7321d97..b207c71e 100644 --- a/src/async/imap/MCIMAPCopyMessagesOperation.cc +++ b/src/async/imap/MCIMAPCopyMessagesOperation.cc @@ -68,8 +68,6 @@ void IMAPCopyMessagesOperation::main() { ErrorCode error; session()->session()->copyMessages(mFolder, mUids, mDestFolder, &mDestUids, &error); - if (mDestUids != NULL) { - mDestUids->retain(); - } + MC_SAFE_RETAIN(mDestUids); setError(error); } diff --git a/src/async/imap/MCIMAPFetchMessagesOperation.cc b/src/async/imap/MCIMAPFetchMessagesOperation.cc index c08d1c52..3c6ba49b 100644 --- a/src/async/imap/MCIMAPFetchMessagesOperation.cc +++ b/src/async/imap/MCIMAPFetchMessagesOperation.cc @@ -110,28 +110,22 @@ Array * IMAPFetchMessagesOperation::messages() void IMAPFetchMessagesOperation::main() { ErrorCode error; - MCLog("1"); if (mFetchByUidEnabled) { - MCLog("2"); if (mUids != NULL) { - MCLog("3"); mMessages = session()->session()->fetchMessagesByUID(mFolder, mKind, mUids, this, &error); } else { - MCLog("4"); mMessages = session()->session()->fetchMessagesByUID(mFolder, mKind, mFirst, mLast, this, &error); } } else { - MCLog("5"); if (mNumbers != NULL) { - MCLog("6"); mMessages = session()->session()->fetchMessagesByNumber(mFolder, mKind, mNumbers, this, &error); } else { - MCLog("7"); mMessages = session()->session()->fetchMessagesByNumber(mFolder, mKind, mFirst, mLast, this, &error); } } + MC_SAFE_RETAIN(mMessages); setError(error); } diff --git a/src/async/imap/MCIMAPFetchNamespaceOperation.cc b/src/async/imap/MCIMAPFetchNamespaceOperation.cc index 5aea5237..ecd2af63 100644 --- a/src/async/imap/MCIMAPFetchNamespaceOperation.cc +++ b/src/async/imap/MCIMAPFetchNamespaceOperation.cc @@ -28,6 +28,6 @@ void IMAPFetchNamespaceOperation::main() ErrorCode error; mNamespaces = session()->session()->fetchNamespace(&error); setError(error); - mNamespaces->retain(); + MC_SAFE_RETAIN(mNamespaces); } diff --git a/src/async/imap/MCIMAPFolderInfoOperation.cc b/src/async/imap/MCIMAPFolderInfoOperation.cc index 3f2970e3..452b9551 100644 --- a/src/async/imap/MCIMAPFolderInfoOperation.cc +++ b/src/async/imap/MCIMAPFolderInfoOperation.cc @@ -55,6 +55,7 @@ void IMAPFolderInfoOperation::main() { ErrorCode error; session()->session()->select(mFolder, &error); +#warning set results setError(error); } diff --git a/src/async/imap/MCIMAPIdentityOperation.cc b/src/async/imap/MCIMAPIdentityOperation.cc index 16ffd6a4..0996970e 100644 --- a/src/async/imap/MCIMAPIdentityOperation.cc +++ b/src/async/imap/MCIMAPIdentityOperation.cc @@ -68,6 +68,7 @@ void IMAPIdentityOperation::main() { ErrorCode error; mServerIdentity = session()->session()->identity(mVendor, mName, mVersion, &error); + MC_SAFE_RETAIN(mServerIdentity); setError(error); } diff --git a/src/async/imap/MCIMAPSearchOperation.cc b/src/async/imap/MCIMAPSearchOperation.cc index 395d3924..4a4cec67 100644 --- a/src/async/imap/MCIMAPSearchOperation.cc +++ b/src/async/imap/MCIMAPSearchOperation.cc @@ -20,6 +20,7 @@ IMAPSearchOperation::IMAPSearchOperation() mKind = IMAPSearchKindNone; mSearchString = NULL; mExpression = NULL; + mUids = NULL; } IMAPSearchOperation::~IMAPSearchOperation() @@ -27,6 +28,7 @@ IMAPSearchOperation::~IMAPSearchOperation() MC_SAFE_RELEASE(mFolder); MC_SAFE_RELEASE(mSearchString); MC_SAFE_RELEASE(mExpression); + MC_SAFE_RELEASE(mUids); } void IMAPSearchOperation::setFolder(String * folder) @@ -69,15 +71,21 @@ IMAPSearchExpression * IMAPSearchOperation::searchExpression() return mExpression; } +Array * IMAPSearchOperation::uids() +{ + return mUids; +} + void IMAPSearchOperation::main() { ErrorCode error; if (mExpression != NULL) { - session()->session()->search(mFolder, mExpression, &error); + mUids = session()->session()->search(mFolder, mExpression, &error); } else { - session()->session()->search(mFolder, mKind, mSearchString, &error); + mUids = session()->session()->search(mFolder, mKind, mSearchString, &error); } + MC_SAFE_RETAIN(mUids); setError(error); } diff --git a/src/async/imap/MCIMAPSearchOperation.h b/src/async/imap/MCIMAPSearchOperation.h index cf93d1a9..b039bd24 100644 --- a/src/async/imap/MCIMAPSearchOperation.h +++ b/src/async/imap/MCIMAPSearchOperation.h @@ -22,6 +22,7 @@ namespace mailcore { IMAPSearchKind mKind; String * mSearchString; IMAPSearchExpression * mExpression; + Array * mUids; public: IMAPSearchOperation(); @@ -39,6 +40,8 @@ namespace mailcore { virtual void setSearchExpression(IMAPSearchExpression * expression); virtual IMAPSearchExpression * searchExpression(); + virtual Array * uids(); + virtual void main(); }; } diff --git a/src/async/pop/MCAsyncPOP.h b/src/async/pop/MCAsyncPOP.h new file mode 100644 index 00000000..d41d406d --- /dev/null +++ b/src/async/pop/MCAsyncPOP.h @@ -0,0 +1,19 @@ +// +// MCAsyncPOP.h +// mailcore2 +// +// Created by DINH Viêt Hoà on 1/16/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#ifndef mailcore2_MCAsyncPOP_h +#define mailcore2_MCAsyncPOP_h + +#include <mailcore/MCPOPAsyncSession.h> +#include <mailcore/MCPOPOperation.h> +#include <mailcore/MCPOPFetchHeaderOperation.h> +#include <mailcore/MCPOPFetchMessageOperation.h> +#include <mailcore/MCPOPFetchMessagesOperation.h> +#include <mailcore/MCPOPOperationCallback.h> + +#endif diff --git a/src/async/pop/MCPOPAsyncSession.cc b/src/async/pop/MCPOPAsyncSession.cc new file mode 100644 index 00000000..c09eb1d7 --- /dev/null +++ b/src/async/pop/MCPOPAsyncSession.cc @@ -0,0 +1,155 @@ +// +// MCPopAsyncSession.cpp +// mailcore2 +// +// Created by DINH Viêt Hoà on 1/16/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#include "MCPOPAsyncSession.h" + +#include "MCPOP.h" +#include "MCPOPFetchHeaderOperation.h" +#include "MCPOPFetchMessageOperation.h" +#include "MCPOPDeleteMessagesOperation.h" +#include "MCPOPFetchMessagesOperation.h" + +using namespace mailcore; + +POPAsyncSession::POPAsyncSession() +{ + mSession = new POPSession(); + mQueue = new OperationQueue(); +} + +POPAsyncSession::~POPAsyncSession() +{ + MC_SAFE_RELEASE(mSession); + MC_SAFE_RELEASE(mQueue); +} + +void POPAsyncSession::setHostname(String * hostname) +{ + mSession->setHostname(hostname); +} + +String * POPAsyncSession::hostname() +{ + return mSession->hostname(); +} + +void POPAsyncSession::setPort(unsigned int port) +{ + mSession->setPort(port); +} + +unsigned int POPAsyncSession::port() +{ + return mSession->port(); +} + +void POPAsyncSession::setUsername(String * username) +{ + mSession->setUsername(username); +} + +String * POPAsyncSession::username() +{ + return mSession->username(); +} + +void POPAsyncSession::setPassword(String * password) +{ + mSession->setPassword(password); +} + +String * POPAsyncSession::password() +{ + return mSession->password(); +} + +void POPAsyncSession::setAuthType(AuthType authType) +{ + mSession->setAuthType(authType); +} + +AuthType POPAsyncSession::authType() +{ + return mSession->authType(); +} + +void POPAsyncSession::setConnectionType(ConnectionType connectionType) +{ + mSession->setConnectionType(connectionType); +} + +ConnectionType POPAsyncSession::connectionType() +{ + return mSession->connectionType(); +} + +void POPAsyncSession::setTimeout(time_t timeout) +{ + mSession->setTimeout(timeout); +} + +time_t POPAsyncSession::timeout() +{ + return mSession->timeout(); +} + +void POPAsyncSession::setCheckCertificateEnabled(bool enabled) +{ + mSession->setCheckCertificateEnabled(enabled); +} + +bool POPAsyncSession::isCheckCertificateEnabled() +{ + return mSession->isCheckCertificateEnabled(); +} + +POPFetchMessagesOperation * POPAsyncSession::fetchMessagesOperation() +{ + POPFetchMessagesOperation * op = new POPFetchMessagesOperation(); + op->setSession(this); + op->autorelease(); + return op; +} + +POPFetchHeaderOperation * POPAsyncSession::fetchHeaderOperation(unsigned int index) +{ + POPFetchHeaderOperation * op = new POPFetchHeaderOperation(); + op->setSession(this); + op->setMessageIndex(index); + op->autorelease(); + return op; +} + +POPFetchMessageOperation * POPAsyncSession::fetchMessage(unsigned int index) +{ + POPFetchMessageOperation * op = new POPFetchMessageOperation(); + op->setSession(this); + op->setMessageIndex(index); + op->autorelease(); + return op; +} + +POPOperation * POPAsyncSession::deleteMessages(Array * indexes) +{ + POPDeleteMessagesOperation * op = new POPDeleteMessagesOperation(); + op->setSession(this); + op->setMessageIndexes(indexes); + op->autorelease(); + return op; +} + +POPSession * POPAsyncSession::session() +{ + return mSession; +} + +void POPAsyncSession::runOperation(POPOperation * operation) +{ + // TODO: disconnect after delay + mQueue->addOperation(operation); +} diff --git a/src/async/pop/MCPOPAsyncSession.h b/src/async/pop/MCPOPAsyncSession.h new file mode 100644 index 00000000..fe713c4e --- /dev/null +++ b/src/async/pop/MCPOPAsyncSession.h @@ -0,0 +1,70 @@ +// +// MCPopAsyncSession.h +// mailcore2 +// +// Created by DINH Viêt Hoà on 1/16/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#ifndef __mailcore2__MCPopAsyncSession__ +#define __mailcore2__MCPopAsyncSession__ + +#include <mailcore/MCBaseTypes.h> + +namespace mailcore { + + class POPOperation; + class POPSession; + class POPFetchHeaderOperation; + class POPFetchMessageOperation; + class POPDeleteMessagesOperation; + class POPFetchMessagesOperation; + + class POPAsyncSession : public Object { + private: + POPSession * mSession; + OperationQueue * mQueue; + + public: + POPAsyncSession(); + virtual ~POPAsyncSession(); + + virtual void setHostname(String * hostname); + virtual String * hostname(); + + virtual void setPort(unsigned int port); + virtual unsigned int port(); + + virtual void setUsername(String * login); + virtual String * username(); + + virtual void setPassword(String * password); + virtual String * password(); + + virtual void setAuthType(AuthType authType); + virtual AuthType authType(); + + virtual void setConnectionType(ConnectionType connectionType); + virtual ConnectionType connectionType(); + + virtual void setTimeout(time_t timeout); + virtual time_t timeout(); + + virtual void setCheckCertificateEnabled(bool enabled); + virtual bool isCheckCertificateEnabled(); + + virtual POPFetchMessagesOperation * fetchMessagesOperation(); + + virtual POPFetchHeaderOperation * fetchHeaderOperation(unsigned int index); + + virtual POPFetchMessageOperation * fetchMessage(unsigned int index); + + virtual POPOperation * deleteMessages(Array * indexes); + + // private + virtual void runOperation(POPOperation * operation); + virtual POPSession * session(); + }; +} + +#endif /* defined(__mailcore2__MCPopAsyncSession__) */ diff --git a/src/async/pop/MCPOPDeleteMessagesOperation.cc b/src/async/pop/MCPOPDeleteMessagesOperation.cc new file mode 100644 index 00000000..b655ab59 --- /dev/null +++ b/src/async/pop/MCPOPDeleteMessagesOperation.cc @@ -0,0 +1,51 @@ +// +// MCPOPDeleteMessagesOperation.cc +// mailcore2 +// +// Created by DINH Viêt Hoà on 1/16/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#include "MCPOPDeleteMessagesOperation.h" + +#include "MCPOPAsyncSession.h" +#include "MCPOPSession.h" + +using namespace mailcore; + +POPDeleteMessagesOperation::POPDeleteMessagesOperation() +{ + mMessageIndexes = NULL; +} + +POPDeleteMessagesOperation::~POPDeleteMessagesOperation() +{ + MC_SAFE_RELEASE(mMessageIndexes); +} + +void POPDeleteMessagesOperation::setMessageIndexes(Array * indexes) +{ + MC_SAFE_REPLACE_RETAIN(Array, mMessageIndexes, indexes); +} + +Array * POPDeleteMessagesOperation::messageIndexes() +{ + return mMessageIndexes; +} + +void POPDeleteMessagesOperation::main() +{ + if (mMessageIndexes == NULL) + return; + + ErrorCode error; + for(unsigned int i = 0 ; i < mMessageIndexes->count() ; i ++) { + Value * value = (Value *) mMessageIndexes->objectAtIndex(i); + session()->session()->deleteMessage(value->unsignedIntValue(), &error); + if (error != ErrorNone) { + setError(error); + return; + } + } +} + diff --git a/src/async/pop/MCPOPDeleteMessagesOperation.h b/src/async/pop/MCPOPDeleteMessagesOperation.h new file mode 100644 index 00000000..1eca422a --- /dev/null +++ b/src/async/pop/MCPOPDeleteMessagesOperation.h @@ -0,0 +1,33 @@ +// +// MCPOPDeleteMessagesOperation.h +// mailcore2 +// +// Created by DINH Viêt Hoà on 1/16/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#ifndef __mailcore2__MCPOPDeleteMessagesOperation__ +#define __mailcore2__MCPOPDeleteMessagesOperation__ + +#include <mailcore/MCPOPOperation.h> + +namespace mailcore { + + class POPDeleteMessagesOperation : public POPOperation { + private: + Array * mMessageIndexes; + + public: + POPDeleteMessagesOperation(); + virtual ~POPDeleteMessagesOperation(); + + virtual void setMessageIndexes(Array * indexes); + virtual Array * messageIndexes(); + + virtual void main(); + }; + +} + + +#endif /* defined(__mailcore2__MCPOPDeleteMessagesOperation__) */ diff --git a/src/async/pop/MCPOPFetchHeaderOperation.cc b/src/async/pop/MCPOPFetchHeaderOperation.cc new file mode 100644 index 00000000..3c6360a8 --- /dev/null +++ b/src/async/pop/MCPOPFetchHeaderOperation.cc @@ -0,0 +1,49 @@ +// +// MCPOPFetchHeaderOperation.cc +// mailcore2 +// +// Created by DINH Viêt Hoà on 1/16/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#include "MCPOPFetchHeaderOperation.h" + +#include "MCPOPAsyncSession.h" +#include "MCPOPSession.h" +#include "MCMessageHeader.h" + +using namespace mailcore; + +POPFetchHeaderOperation::POPFetchHeaderOperation() +{ + mMessageIndex = 0; + mHeader = NULL; +} + +POPFetchHeaderOperation::~POPFetchHeaderOperation() +{ + MC_SAFE_RELEASE(mHeader); +} + +void POPFetchHeaderOperation::setMessageIndex(unsigned int messageIndex) +{ + mMessageIndex = messageIndex; +} + +unsigned int POPFetchHeaderOperation::messageIndex() +{ + return mMessageIndex; +} + +MessageHeader * POPFetchHeaderOperation::header() +{ + return mHeader; +} + +void POPFetchHeaderOperation::main() +{ + ErrorCode error; + mHeader = session()->session()->fetchHeader(mMessageIndex, &error); + mHeader->retain(); + setError(error); +} diff --git a/src/async/pop/MCPOPFetchHeaderOperation.h b/src/async/pop/MCPOPFetchHeaderOperation.h new file mode 100644 index 00000000..2b48062d --- /dev/null +++ b/src/async/pop/MCPOPFetchHeaderOperation.h @@ -0,0 +1,36 @@ +// +// MCPOPFetchHeaderOperation.h +// mailcore2 +// +// Created by DINH Viêt Hoà on 1/16/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#ifndef __mailcore2__MCPOPFetchHeaderOperation__ +#define __mailcore2__MCPOPFetchHeaderOperation__ + +#include <mailcore/MCPOPOperation.h> + +namespace mailcore { + + class MessageHeader; + + class POPFetchHeaderOperation : public POPOperation { + private: + unsigned int mMessageIndex; + MessageHeader * mHeader; + + public: + POPFetchHeaderOperation(); + virtual ~POPFetchHeaderOperation(); + + virtual void setMessageIndex(unsigned int messageIndex); + virtual unsigned int messageIndex(); + + virtual MessageHeader * header(); + + virtual void main(); + }; +} + +#endif /* defined(__mailcore2__MCPOPFetchHeaderOperation__) */ diff --git a/src/async/pop/MCPOPFetchMessageOperation.cc b/src/async/pop/MCPOPFetchMessageOperation.cc new file mode 100644 index 00000000..4f909568 --- /dev/null +++ b/src/async/pop/MCPOPFetchMessageOperation.cc @@ -0,0 +1,49 @@ +// +// MCPOPFetchMessageOperation.cc +// mailcore2 +// +// Created by DINH Viêt Hoà on 1/16/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#include "MCPOPFetchMessageOperation.h" + +#include "MCPOPAsyncSession.h" +#include "MCPOPSession.h" + +using namespace mailcore; + +POPFetchMessageOperation::POPFetchMessageOperation() +{ + mMessageIndex = 0; + mData = NULL; +} + +POPFetchMessageOperation::~POPFetchMessageOperation() +{ + MC_SAFE_RELEASE(mData); +} + +void POPFetchMessageOperation::setMessageIndex(unsigned int messageIndex) +{ + mMessageIndex = messageIndex; +} + +unsigned int POPFetchMessageOperation::messageIndex() +{ + return mMessageIndex; +} + +Data * POPFetchMessageOperation::data() +{ + return mData; +} + +void POPFetchMessageOperation::main() +{ + ErrorCode error; + mData = session()->session()->fetchMessage(mMessageIndex, this, &error); + mData->retain(); + setError(error); +} + diff --git a/src/async/pop/MCPOPFetchMessageOperation.h b/src/async/pop/MCPOPFetchMessageOperation.h new file mode 100644 index 00000000..d60841d7 --- /dev/null +++ b/src/async/pop/MCPOPFetchMessageOperation.h @@ -0,0 +1,33 @@ +// +// MCPOPFetchMessageOperation.h +// mailcore2 +// +// Created by DINH Viêt Hoà on 1/16/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#ifndef __mailcore2__MCPOPFetchMessageOperation__ +#define __mailcore2__MCPOPFetchMessageOperation__ + +#include <mailcore/MCPOPOperation.h> + +namespace mailcore { + class POPFetchMessageOperation : public POPOperation { + private: + unsigned int mMessageIndex; + Data * mData; + + public: + POPFetchMessageOperation(); + virtual ~POPFetchMessageOperation(); + + virtual void setMessageIndex(unsigned int messageIndex); + virtual unsigned int messageIndex(); + + virtual Data * data(); + + virtual void main(); + }; +} + +#endif /* defined(__mailcore2__MCPOPFetchMessageOperation__) */ diff --git a/src/async/pop/MCPOPFetchMessagesOperation.cc b/src/async/pop/MCPOPFetchMessagesOperation.cc new file mode 100644 index 00000000..9b7627fa --- /dev/null +++ b/src/async/pop/MCPOPFetchMessagesOperation.cc @@ -0,0 +1,37 @@ +// +// MCPOPFetchMessagesOperation.cc +// mailcore2 +// +// Created by DINH Viêt Hoà on 1/16/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#include "MCPOPFetchMessagesOperation.h" + +#include "MCPOPAsyncSession.h" +#include "MCPOPSession.h" + +using namespace mailcore; + +POPFetchMessagesOperation::POPFetchMessagesOperation() +{ + mMessages = NULL; +} + +POPFetchMessagesOperation::~POPFetchMessagesOperation() +{ + MC_SAFE_RELEASE(mMessages); +} + +Array * POPFetchMessagesOperation::messages() +{ + return mMessages; +} + +void POPFetchMessagesOperation::main() +{ + ErrorCode error; + mMessages = session()->session()->fetchMessages(&error); + setError(error); + MC_SAFE_RETAIN(mMessages); +} diff --git a/src/async/pop/MCPOPFetchMessagesOperation.h b/src/async/pop/MCPOPFetchMessagesOperation.h new file mode 100644 index 00000000..b8c3d703 --- /dev/null +++ b/src/async/pop/MCPOPFetchMessagesOperation.h @@ -0,0 +1,27 @@ +// +// MCPOPFetchMessagesOperation.h +// mailcore2 +// +// Created by DINH Viêt Hoà on 1/16/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#ifndef __mailcore2__MCPOPFetchMessagesOperation__ +#define __mailcore2__MCPOPFetchMessagesOperation__ + +#include <mailcore/MCPOPOperation.h> + +namespace mailcore { + class POPFetchMessagesOperation : public POPOperation { + Array * mMessages; + public: + POPFetchMessagesOperation(); + virtual ~POPFetchMessagesOperation(); + + virtual Array * messages(); + + virtual void main(); + }; +} + +#endif /* defined(__mailcore2__MCPOPFetchMessagesOperation__) */ diff --git a/src/async/pop/MCPOPOperation.cc b/src/async/pop/MCPOPOperation.cc new file mode 100644 index 00000000..7fb279d6 --- /dev/null +++ b/src/async/pop/MCPOPOperation.cc @@ -0,0 +1,86 @@ +// +// MCPOPOperation.cc +// mailcore2 +// +// Created by DINH Viêt Hoà on 1/16/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#include "MCPOPOperation.h" + +#include <stdlib.h> + +#include "MCPOPSession.h" +#include "MCPOPAsyncSession.h" +#include "MCPOPOperationCallback.h" + +using namespace mailcore; + +POPOperation::POPOperation() +{ + mSession = NULL; + mPopCallback = NULL; + mError = ErrorNone; +} + +POPOperation::~POPOperation() +{ + MC_SAFE_RELEASE(mSession); +} + +void POPOperation::setSession(POPAsyncSession * session) +{ + MC_SAFE_REPLACE_RETAIN(POPAsyncSession, mSession, session); +} + +POPAsyncSession * POPOperation::session() +{ + return mSession; +} + +void POPOperation::setPopCallback(POPOperationCallback * callback) +{ + mPopCallback = callback; +} + +POPOperationCallback * POPOperation::popCallback() +{ + return mPopCallback; +} + +void POPOperation::setError(ErrorCode error) +{ + mError = error; +} + +ErrorCode POPOperation::error() +{ + return mError; +} + +void POPOperation::start() +{ + mSession->runOperation(this); +} + +struct progressContext { + unsigned int current; + unsigned int maximum; +}; + +void POPOperation::bodyProgress(POPSession * session, unsigned int current, unsigned int maximum) +{ + struct progressContext * context = (struct progressContext *) calloc(sizeof(* context), 1); + context->current = current; + context->maximum = maximum; + performMethodOnMainThread((Object::Method) &POPOperation::bodyProgressOnMainThread, context); +} + +void POPOperation::bodyProgressOnMainThread(void * ctx) +{ + struct progressContext * context = (struct progressContext *) ctx; + if (mPopCallback != NULL) { + mPopCallback->bodyProgress(this, context->current, context->maximum); + } + free(context); +} diff --git a/src/async/pop/MCPOPOperation.h b/src/async/pop/MCPOPOperation.h new file mode 100644 index 00000000..9fcc6af6 --- /dev/null +++ b/src/async/pop/MCPOPOperation.h @@ -0,0 +1,46 @@ +// +// MCPOPOperation.h +// mailcore2 +// +// Created by DINH Viêt Hoà on 1/16/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#ifndef __mailcore2__MCPOPOperation__ +#define __mailcore2__MCPOPOperation__ + +#include <mailcore/MCBaseTypes.h> +#include <mailcore/MCPOPProgressCallback.h> + +namespace mailcore { + + class POPAsyncSession; + class POPOperationCallback; + + class POPOperation : public Operation, public POPProgressCallback { + POPAsyncSession * mSession; + POPOperationCallback * mPopCallback; + ErrorCode mError; + private: + virtual void bodyProgress(POPSession * session, unsigned int current, unsigned int maximum); + virtual void bodyProgressOnMainThread(void * context); + + public: + POPOperation(); + virtual ~POPOperation(); + + virtual void setSession(POPAsyncSession * session); + virtual POPAsyncSession * session(); + + virtual void setPopCallback(POPOperationCallback * callback); + virtual POPOperationCallback * popCallback(); + + virtual void setError(ErrorCode error); + virtual ErrorCode error(); + + virtual void start(); + }; + +} + +#endif /* defined(__mailcore2__MCPOPOperation__) */ diff --git a/src/async/pop/MCPOPOperationCallback.h b/src/async/pop/MCPOPOperationCallback.h new file mode 100644 index 00000000..a71bd008 --- /dev/null +++ b/src/async/pop/MCPOPOperationCallback.h @@ -0,0 +1,23 @@ +// +// MCPOPOperationCallback.h +// mailcore2 +// +// Created by DINH Viêt Hoà on 1/16/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#ifndef mailcore2_MCPOPOperationCallback_h +#define mailcore2_MCPOPOperationCallback_h + +namespace mailcore { + + class POPOperation; + + class POPOperationCallback { + public: + virtual void bodyProgress(POPOperation * session, unsigned int current, unsigned int maximum) {}; + }; + +} + +#endif diff --git a/src/core/imap/MCIMAPSession.cc b/src/core/imap/MCIMAPSession.cc index c22f082b..4e9dc3b8 100644 --- a/src/core/imap/MCIMAPSession.cc +++ b/src/core/imap/MCIMAPSession.cc @@ -281,6 +281,7 @@ void IMAPSession::init() mVoIPEnabled = true; mDelimiter = 0; + mBodyProgressEnabled = true; mIdleEnabled = false; mXListEnabled = false; mWelcomeString = NULL; @@ -1718,12 +1719,16 @@ Array * IMAPSession::fetchMessages(String * folder, IMAPMessagesRequestKind requ mailimap_set_msg_att_handler(mImap, msg_att_handler, &msg_att_data); + mBodyProgressEnabled = false; + if (fetchByUID) { r = mailimap_uid_fetch(mImap, imapset, fetch_type, &fetch_result); } else { r = mailimap_fetch(mImap, imapset, fetch_type, &fetch_result); } + mBodyProgressEnabled = true; + mProgressCallback = NULL; mLastFetchedSequenceNumber = msg_att_data.mLastFetchedSequenceNumber; @@ -2290,6 +2295,9 @@ HashMap * IMAPSession::identity(String * vendor, String * name, String * version void IMAPSession::bodyProgress(unsigned int current, unsigned int maximum) { + if (!mBodyProgressEnabled) + return; + if (mProgressCallback != NULL) { mProgressCallback->bodyProgress(this, current, maximum); } diff --git a/src/core/imap/MCIMAPSession.h b/src/core/imap/MCIMAPSession.h index ea9a39cd..5581aca0 100644 --- a/src/core/imap/MCIMAPSession.h +++ b/src/core/imap/MCIMAPSession.h @@ -30,6 +30,7 @@ namespace mailcore { char mDelimiter; IMAPNamespace * mDefaultNamespace; + bool mBodyProgressEnabled; bool mIdleEnabled; bool mXListEnabled; String * mWelcomeString; @@ -72,7 +73,7 @@ namespace mailcore { virtual void setPort(unsigned int port); virtual unsigned int port(); - virtual void setUsername(String * login); + virtual void setUsername(String * username); virtual String * username(); virtual void setPassword(String * password); diff --git a/src/core/pop/MCPOPSession.h b/src/core/pop/MCPOPSession.h index d0d8dc4e..523e1be6 100644 --- a/src/core/pop/MCPOPSession.h +++ b/src/core/pop/MCPOPSession.h @@ -48,7 +48,7 @@ namespace mailcore { virtual void setPort(unsigned int port); virtual unsigned int port(); - virtual void setUsername(String * login); + virtual void setUsername(String * username); virtual String * username(); virtual void setPassword(String * password); diff --git a/tests/main.mm b/tests/main.mm index 1ef4927d..622c35b1 100644 --- a/tests/main.mm +++ b/tests/main.mm @@ -234,6 +234,42 @@ static void testAsyncIMAP() //session->release(); } +class TestPOPCallback : public mailcore::Object, public mailcore::OperationCallback, public mailcore::POPOperationCallback { + virtual void operationFinished(mailcore::Operation * op) + { + mailcore::POPFetchMessagesOperation * fetchOp = (mailcore::POPFetchMessagesOperation *) op; + MCLog("callback %s %s", MCUTF8DESC(fetchOp->messages()), MCUTF8DESC(this)); + } + + virtual void bodyProgress(mailcore::IMAPOperation * op, unsigned int current, unsigned int maximum) + { + MCLog("progress %s %s %i/%i", MCUTF8DESC(op), MCUTF8DESC(this), current, maximum); + } +}; + +static void testAsyncPOP() +{ + mailcore::POPAsyncSession * session; + TestPOPCallback * callback = new TestPOPCallback(); + + session = new mailcore::POPAsyncSession(); + session->setHostname(MCSTR("pop.gmail.com")); + session->setPort(995); + session->setUsername(email); + session->setPassword(password); + session->setConnectionType(mailcore::ConnectionTypeTLS); + + mailcore::POPFetchMessagesOperation * op = session->fetchMessagesOperation(); + op->setCallback(callback); + op->setPopCallback(callback); + op->start(); + + //mailcore::Array * messages = session->fetchMessages(&error); + //MCLog("%s", MCUTF8DESC(messages)); + + [[NSRunLoop currentRunLoop] run]; +} + void testAll() { u_setDataDirectory("/usr/local/share/icu"); @@ -242,13 +278,14 @@ void testAll() mailstream_debug = 1; - mailcore::Data * data = testMessageBuilder(); + //mailcore::Data * data = testMessageBuilder(); //testMessageParser(data); //testSMTP(data); //testIMAP(); //testPOP(); //testAsyncSMTP(data); - testAsyncIMAP(); + //testAsyncIMAP(); + testAsyncPOP(); MCLog("pool release"); pool->release(); |