From 71c5c1ebb30cd54f68e8be11e8dede5d8efb4dec Mon Sep 17 00:00:00 2001 From: Nikolay Morev Date: Tue, 2 Feb 2016 19:55:20 +0300 Subject: Add IMAP MOVE command support --- build-mac/mailcore2.xcodeproj/project.pbxproj | 24 +++++++ build-windows/build_headers.list | 2 + .../mailcore2/mailcore2/mailcore2.vcxproj | 2 + .../mailcore2/mailcore2/mailcore2.vcxproj.filters | 6 ++ src/async/imap/MCAsyncIMAP.h | 1 + src/async/imap/MCIMAPAsyncSession.cpp | 12 ++++ src/async/imap/MCIMAPAsyncSession.h | 2 + src/async/imap/MCIMAPMoveMessagesOperation.cpp | 61 ++++++++++++++++ src/async/imap/MCIMAPMoveMessagesOperation.h | 46 ++++++++++++ src/cmake/async.cmake | 1 + src/cmake/objc.cmake | 1 + src/cmake/public-headers.cmake | 2 + src/core/imap/MCIMAPSession.cpp | 84 ++++++++++++++++++++++ src/core/imap/MCIMAPSession.h | 3 + src/objc/imap/MCOIMAP.h | 1 + src/objc/imap/MCOIMAPMoveMessagesOperation.h | 39 ++++++++++ src/objc/imap/MCOIMAPMoveMessagesOperation.mm | 71 ++++++++++++++++++ src/objc/imap/MCOIMAPSession.h | 15 ++++ src/objc/imap/MCOIMAPSession.mm | 9 +++ 19 files changed, 382 insertions(+) create mode 100644 src/async/imap/MCIMAPMoveMessagesOperation.cpp create mode 100644 src/async/imap/MCIMAPMoveMessagesOperation.h create mode 100644 src/objc/imap/MCOIMAPMoveMessagesOperation.h create mode 100644 src/objc/imap/MCOIMAPMoveMessagesOperation.mm diff --git a/build-mac/mailcore2.xcodeproj/project.pbxproj b/build-mac/mailcore2.xcodeproj/project.pbxproj index c398cf01..58f1c43d 100755 --- a/build-mac/mailcore2.xcodeproj/project.pbxproj +++ b/build-mac/mailcore2.xcodeproj/project.pbxproj @@ -157,6 +157,14 @@ 84E65533199BE15500EC8CC4 /* MCNNTPSession.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 849189A018C93FB7002063A3 /* MCNNTPSession.h */; }; 84E65534199BE2BF00EC8CC4 /* MCNNTPGroupInfo.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 849189AA18C94986002063A3 /* MCNNTPGroupInfo.h */; }; 84E65535199BE2C300EC8CC4 /* MCNNTPGroupInfo.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 849189AA18C94986002063A3 /* MCNNTPGroupInfo.h */; }; + 8568A4131C610D9800FF4470 /* MCIMAPMoveMessagesOperation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8568A4111C610D9800FF4470 /* MCIMAPMoveMessagesOperation.cpp */; }; + 8568A4141C610DA800FF4470 /* MCIMAPMoveMessagesOperation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8568A4111C610D9800FF4470 /* MCIMAPMoveMessagesOperation.cpp */; }; + 8568A41A1C610F6600FF4470 /* MCOIMAPMoveMessagesOperation.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8568A4191C610F6600FF4470 /* MCOIMAPMoveMessagesOperation.mm */; }; + 8568A41B1C610F6600FF4470 /* MCOIMAPMoveMessagesOperation.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8568A4191C610F6600FF4470 /* MCOIMAPMoveMessagesOperation.mm */; }; + 8568A41C1C61167F00FF4470 /* MCIMAPMoveMessagesOperation.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8568A4121C610D9800FF4470 /* MCIMAPMoveMessagesOperation.h */; }; + 8568A41D1C61169000FF4470 /* MCOIMAPMoveMessagesOperation.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8568A4181C610F6600FF4470 /* MCOIMAPMoveMessagesOperation.h */; }; + 8568A41E1C61169A00FF4470 /* MCOIMAPMoveMessagesOperation.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8568A4181C610F6600FF4470 /* MCOIMAPMoveMessagesOperation.h */; }; + 8568A41F1C6116B600FF4470 /* MCIMAPMoveMessagesOperation.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8568A4121C610D9800FF4470 /* MCIMAPMoveMessagesOperation.h */; }; 8B0095C91A00DDC500F84BC0 /* MCSMTPLoginOperation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8B0095C71A00DDC500F84BC0 /* MCSMTPLoginOperation.cpp */; }; 8B0095CC1A00DDE700F84BC0 /* MCOSMTPLoginOperation.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8B0095CB1A00DDE700F84BC0 /* MCOSMTPLoginOperation.mm */; }; 8B0095CD1A00DE2A00F84BC0 /* MCOSMTPLoginOperation.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8B0095CA1A00DDE700F84BC0 /* MCOSMTPLoginOperation.h */; }; @@ -1104,6 +1112,7 @@ 84D73781199C010A005124E5 /* MCONNTPFetchArticleOperation.h in CopyFiles */, 84D73782199C010B005124E5 /* MCONNTPFetchAllArticlesOperation.h in CopyFiles */, C6F61FA3170187BD0073032E /* MCOIMAPCopyMessagesOperation.h in CopyFiles */, + 8568A41D1C61169000FF4470 /* MCOIMAPMoveMessagesOperation.h in CopyFiles */, C6D6F95A171E5D60006F5B28 /* MCJSON.h in CopyFiles */, C6F61FA2170187BC0073032E /* MCOIMAPAppendMessageOperation.h in CopyFiles */, C6D6F958171E5D5C006F5B28 /* MCNull.h in CopyFiles */, @@ -1178,6 +1187,7 @@ C62C6EEA16A6972100737497 /* MCIMAPFetchNamespaceOperation.h in CopyFiles */, C62C6EE716A6971000737497 /* MCIMAPIdleOperation.h in CopyFiles */, C62C6EE416A696F600737497 /* MCIMAPCopyMessagesOperation.h in CopyFiles */, + 8568A41C1C61167F00FF4470 /* MCIMAPMoveMessagesOperation.h in CopyFiles */, C64EA753169E859600778456 /* MCAddress.h in CopyFiles */, C64EA754169E859600778456 /* MCMessageConstants.h in CopyFiles */, C64EA755169E859600778456 /* MCMessageHeader.h in CopyFiles */, @@ -1340,6 +1350,7 @@ C69BA85D17DEFD9A00D601B7 /* NSIndexSet+MCO.h in CopyFiles */, C6BA2B161705F4E6003F0E9E /* MCOIMAPFetchMessagesOperation.h in CopyFiles */, C6BA2B171705F4E6003F0E9E /* MCOIMAPCopyMessagesOperation.h in CopyFiles */, + 8568A41E1C61169A00FF4470 /* MCOIMAPMoveMessagesOperation.h in CopyFiles */, C6D6F95D171E5D67006F5B28 /* MCMD5.h in CopyFiles */, C6BA2B181705F4E6003F0E9E /* MCOIMAPAppendMessageOperation.h in CopyFiles */, C6D6F95B171E5D63006F5B28 /* MCNull.h in CopyFiles */, @@ -1413,6 +1424,7 @@ C6BA2B5E1705F4E6003F0E9E /* MCIMAPFetchNamespaceOperation.h in CopyFiles */, C6BA2B5F1705F4E6003F0E9E /* MCIMAPIdleOperation.h in CopyFiles */, C6BA2B601705F4E6003F0E9E /* MCIMAPCopyMessagesOperation.h in CopyFiles */, + 8568A41F1C6116B600FF4470 /* MCIMAPMoveMessagesOperation.h in CopyFiles */, C6BA2B611705F4E6003F0E9E /* MCAddress.h in CopyFiles */, C6BA2B621705F4E6003F0E9E /* MCMessageConstants.h in CopyFiles */, C6BA2B631705F4E6003F0E9E /* MCMessageHeader.h in CopyFiles */, @@ -1560,6 +1572,10 @@ 84D7378E199C02A8005124E5 /* MCONNTPDisconnectOperation.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MCONNTPDisconnectOperation.mm; sourceTree = ""; }; 84D73791199C0511005124E5 /* MCONNTPGroupInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCONNTPGroupInfo.h; sourceTree = ""; }; 84D73792199C0511005124E5 /* MCONNTPGroupInfo.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MCONNTPGroupInfo.mm; sourceTree = ""; }; + 8568A4111C610D9800FF4470 /* MCIMAPMoveMessagesOperation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MCIMAPMoveMessagesOperation.cpp; sourceTree = ""; }; + 8568A4121C610D9800FF4470 /* MCIMAPMoveMessagesOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCIMAPMoveMessagesOperation.h; sourceTree = ""; }; + 8568A4181C610F6600FF4470 /* MCOIMAPMoveMessagesOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCOIMAPMoveMessagesOperation.h; sourceTree = ""; }; + 8568A4191C610F6600FF4470 /* MCOIMAPMoveMessagesOperation.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MCOIMAPMoveMessagesOperation.mm; sourceTree = ""; }; 8B0095C71A00DDC500F84BC0 /* MCSMTPLoginOperation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MCSMTPLoginOperation.cpp; sourceTree = ""; }; 8B0095C81A00DDC500F84BC0 /* MCSMTPLoginOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCSMTPLoginOperation.h; sourceTree = ""; }; 8B0095CA1A00DDE700F84BC0 /* MCOSMTPLoginOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCOSMTPLoginOperation.h; sourceTree = ""; }; @@ -2543,6 +2559,8 @@ C64EA81016A299EB00778456 /* MCIMAPAppendMessageOperation.h */, C64EA81216A29A0A00778456 /* MCIMAPCopyMessagesOperation.cpp */, C64EA81316A29A1000778456 /* MCIMAPCopyMessagesOperation.h */, + 8568A4111C610D9800FF4470 /* MCIMAPMoveMessagesOperation.cpp */, + 8568A4121C610D9800FF4470 /* MCIMAPMoveMessagesOperation.h */, C64EA81516A29A8500778456 /* MCIMAPExpungeOperation.cpp */, C64EA81616A29A8600778456 /* MCIMAPExpungeOperation.h */, C64EA81816A29AD400778456 /* MCIMAPFetchMessagesOperation.cpp */, @@ -3075,6 +3093,8 @@ C6F61F7D170169FB0073032E /* MCOIMAPAppendMessageOperation.mm */, C6F61F7F17016A0D0073032E /* MCOIMAPCopyMessagesOperation.h */, C6F61F8017016A0D0073032E /* MCOIMAPCopyMessagesOperation.mm */, + 8568A4181C610F6600FF4470 /* MCOIMAPMoveMessagesOperation.h */, + 8568A4191C610F6600FF4470 /* MCOIMAPMoveMessagesOperation.mm */, C6F61F8217016A200073032E /* MCOIMAPFetchMessagesOperation.h */, C6F61F8317016A200073032E /* MCOIMAPFetchMessagesOperation.mm */, C6F61F8517016AD60073032E /* MCOIMAPFetchContentOperation.h */, @@ -3529,6 +3549,7 @@ 84D7372C199BF66C005124E5 /* MCNNTPAsyncSession.cpp in Sources */, C64EA81116A299ED00778456 /* MCIMAPAppendMessageOperation.cpp in Sources */, C64EA81416A29A2300778456 /* MCIMAPCopyMessagesOperation.cpp in Sources */, + 8568A4131C610D9800FF4470 /* MCIMAPMoveMessagesOperation.cpp in Sources */, C64EA81716A29A8700778456 /* MCIMAPExpungeOperation.cpp in Sources */, BDCD7CE31A70771B0001DCC3 /* uobject.cpp in Sources */, C69BA85B17DEFCCB00D601B7 /* NSIndexSet+MCO.m in Sources */, @@ -3593,6 +3614,7 @@ C64BB23916EDAA3F000DB34C /* MCOAbstractMessagePart.mm in Sources */, C64BB23C16EDAAC7000DB34C /* MCOAbstractMultipart.mm in Sources */, BDCD7CD71A70771B0001DCC3 /* uarrsort.c in Sources */, + 8568A41A1C610F6600FF4470 /* MCOIMAPMoveMessagesOperation.mm in Sources */, C6D4FD4319FB7DAA001F7E01 /* MCDataMac.mm in Sources */, C64BB23F16EDAAE1000DB34C /* MCOAbstractPart.mm in Sources */, C64BB24216EDAAF4000DB34C /* MCOAddress.mm in Sources */, @@ -3803,6 +3825,7 @@ C6BA2BC81705F4E6003F0E9E /* MCIMAPCreateFolderOperation.cpp in Sources */, C6BA2BC91705F4E6003F0E9E /* MCIMAPSubscribeFolderOperation.cpp in Sources */, 84D7372D199BF66C005124E5 /* MCNNTPAsyncSession.cpp in Sources */, + 8568A4141C610DA800FF4470 /* MCIMAPMoveMessagesOperation.cpp in Sources */, C6BA2BCA1705F4E6003F0E9E /* MCIMAPAppendMessageOperation.cpp in Sources */, C6BA2BCB1705F4E6003F0E9E /* MCIMAPCopyMessagesOperation.cpp in Sources */, BDCD7CE41A70771B0001DCC3 /* uobject.cpp in Sources */, @@ -3867,6 +3890,7 @@ BDCD7CE61A70771B0001DCC3 /* ustring.cpp in Sources */, C6BA2BF01705F4E6003F0E9E /* MCOAbstractMessage.mm in Sources */, C6BA2BF11705F4E6003F0E9E /* MCOAbstractMessagePart.mm in Sources */, + 8568A41B1C610F6600FF4470 /* MCOIMAPMoveMessagesOperation.mm in Sources */, BDCD7CD81A70771B0001DCC3 /* uarrsort.c in Sources */, C6D4FD4419FB7DB2001F7E01 /* MCDataMac.mm in Sources */, C6BA2BF21705F4E6003F0E9E /* MCOAbstractMultipart.mm in Sources */, diff --git a/build-windows/build_headers.list b/build-windows/build_headers.list index 7f752f15..bce6d763 100644 --- a/build-windows/build_headers.list +++ b/build-windows/build_headers.list @@ -85,6 +85,7 @@ src\async\imap\MCIMAPOperation.h src\async\imap\MCIMAPFetchFoldersOperation.h src\async\imap\MCIMAPAppendMessageOperation.h src\async\imap\MCIMAPCopyMessagesOperation.h +src\async\imap\MCIMAPMoveMessagesOperation.h src\async\imap\MCIMAPFetchMessagesOperation.h src\async\imap\MCIMAPFetchContentOperation.h src\async\imap\MCIMAPFetchParsedContentOperation.h @@ -159,6 +160,7 @@ src\objc\imap\MCOIMAPFolderStatusOperation.h src\objc\imap\MCOIMAPFolderStatus.h src\objc\imap\MCOIMAPAppendMessageOperation.h src\objc\imap\MCOIMAPCopyMessagesOperation.h +src\objc\imap\MCOIMAPMoveMessagesOperation.h src\objc\imap\MCOIMAPFetchMessagesOperation.h src\objc\imap\MCOIMAPFetchContentOperation.h src\objc\imap\MCOIMAPFetchParsedContentOperation.h diff --git a/build-windows/mailcore2/mailcore2/mailcore2.vcxproj b/build-windows/mailcore2/mailcore2/mailcore2.vcxproj index 6739c221..dbafb587 100644 --- a/build-windows/mailcore2/mailcore2/mailcore2.vcxproj +++ b/build-windows/mailcore2/mailcore2/mailcore2.vcxproj @@ -27,6 +27,7 @@ + @@ -188,6 +189,7 @@ + diff --git a/build-windows/mailcore2/mailcore2/mailcore2.vcxproj.filters b/build-windows/mailcore2/mailcore2/mailcore2.vcxproj.filters index f73a2742..009251c9 100644 --- a/build-windows/mailcore2/mailcore2/mailcore2.vcxproj.filters +++ b/build-windows/mailcore2/mailcore2/mailcore2.vcxproj.filters @@ -375,6 +375,9 @@ Source Files\async\imap + + Source Files\async\imap + Source Files\async\imap @@ -782,6 +785,9 @@ Source Files\async\imap + + Source Files\async\imap + Source Files\async\imap diff --git a/src/async/imap/MCAsyncIMAP.h b/src/async/imap/MCAsyncIMAP.h index aa6d6b68..1fb51de0 100755 --- a/src/async/imap/MCAsyncIMAP.h +++ b/src/async/imap/MCAsyncIMAP.h @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include diff --git a/src/async/imap/MCIMAPAsyncSession.cpp b/src/async/imap/MCIMAPAsyncSession.cpp index a8cccea5..7f00d105 100755 --- a/src/async/imap/MCIMAPAsyncSession.cpp +++ b/src/async/imap/MCIMAPAsyncSession.cpp @@ -26,6 +26,7 @@ #include "MCIMAPExpungeOperation.h" #include "MCIMAPAppendMessageOperation.h" #include "MCIMAPCopyMessagesOperation.h" +#include "MCIMAPMoveMessagesOperation.h" #include "MCIMAPFetchMessagesOperation.h" #include "MCIMAPFetchContentOperation.h" #include "MCIMAPFetchParsedContentOperation.h" @@ -453,6 +454,17 @@ IMAPCopyMessagesOperation * IMAPAsyncSession::copyMessagesOperation(String * fol return op; } +IMAPMoveMessagesOperation * IMAPAsyncSession::moveMessagesOperation(String * folder, IndexSet * uids, String * destFolder) +{ + IMAPMoveMessagesOperation * op = new IMAPMoveMessagesOperation(); + op->setMainSession(this); + op->setFolder(folder); + op->setUids(uids); + op->setDestFolder(destFolder); + op->autorelease(); + return op; +} + IMAPOperation * IMAPAsyncSession::expungeOperation(String * folder) { IMAPExpungeOperation * op = new IMAPExpungeOperation(); diff --git a/src/async/imap/MCIMAPAsyncSession.h b/src/async/imap/MCIMAPAsyncSession.h index 62577a6e..bbffacbd 100755 --- a/src/async/imap/MCIMAPAsyncSession.h +++ b/src/async/imap/MCIMAPAsyncSession.h @@ -21,6 +21,7 @@ namespace mailcore { class IMAPFetchFoldersOperation; class IMAPAppendMessageOperation; class IMAPCopyMessagesOperation; + class IMAPMoveMessagesOperation; class IMAPFetchMessagesOperation; class IMAPFetchContentOperation; class IMAPFetchParsedContentOperation; @@ -121,6 +122,7 @@ namespace mailcore { virtual IMAPAppendMessageOperation * appendMessageOperation(String * folder, Data * messageData, MessageFlag flags, Array * customFlags = NULL); virtual IMAPCopyMessagesOperation * copyMessagesOperation(String * folder, IndexSet * uids, String * destFolder); + virtual IMAPMoveMessagesOperation * moveMessagesOperation(String * folder, IndexSet * uids, String * destFolder); virtual IMAPOperation * expungeOperation(String * folder); diff --git a/src/async/imap/MCIMAPMoveMessagesOperation.cpp b/src/async/imap/MCIMAPMoveMessagesOperation.cpp new file mode 100644 index 00000000..cc8de937 --- /dev/null +++ b/src/async/imap/MCIMAPMoveMessagesOperation.cpp @@ -0,0 +1,61 @@ +// +// IMAPMoveMessagesOperation.cpp +// mailcore2 +// +// Created by Nikolay Morev on 02/02/16. +// Copyright © 2016 MailCore. All rights reserved. +// + +#include "MCIMAPMoveMessagesOperation.h" + +#include "MCIMAPSession.h" +#include "MCIMAPAsyncConnection.h" + +using namespace mailcore; + +IMAPMoveMessagesOperation::IMAPMoveMessagesOperation() +{ + mUids = NULL; + mDestFolder = NULL; + mUidMapping = NULL; +} + +IMAPMoveMessagesOperation::~IMAPMoveMessagesOperation() +{ + MC_SAFE_RELEASE(mUidMapping); + MC_SAFE_RELEASE(mUids); + MC_SAFE_RELEASE(mDestFolder); +} + +void IMAPMoveMessagesOperation::setUids(IndexSet * uids) +{ + MC_SAFE_REPLACE_RETAIN(IndexSet, mUids, uids); +} + +IndexSet * IMAPMoveMessagesOperation::uids() +{ + return mUids; +} + +HashMap * IMAPMoveMessagesOperation::uidMapping() +{ + return mUidMapping; +} + +void IMAPMoveMessagesOperation::setDestFolder(String * destFolder) +{ + MC_SAFE_REPLACE_COPY(String, mDestFolder, destFolder); +} + +String * IMAPMoveMessagesOperation::destFolder() +{ + return mDestFolder; +} + +void IMAPMoveMessagesOperation::main() +{ + ErrorCode error; + session()->session()->moveMessages(folder(), mUids, mDestFolder, &mUidMapping, &error); + MC_SAFE_RETAIN(mUidMapping); + setError(error); +} diff --git a/src/async/imap/MCIMAPMoveMessagesOperation.h b/src/async/imap/MCIMAPMoveMessagesOperation.h new file mode 100644 index 00000000..1c4342f5 --- /dev/null +++ b/src/async/imap/MCIMAPMoveMessagesOperation.h @@ -0,0 +1,46 @@ +// +// IMAPMoveMessagesOperation.hpp +// mailcore2 +// +// Created by Nikolay Morev on 02/02/16. +// Copyright © 2016 MailCore. All rights reserved. +// + +#ifndef MAILCORE_MCIMAPMOVEMESSAGESOPERATION_H + +#define MAILCORE_MCIMAPMOVEMESSAGESOPERATION_H + +#include + +#ifdef __cplusplus + +namespace mailcore { + + class MAILCORE_EXPORT IMAPMoveMessagesOperation : public IMAPOperation { + public: + IMAPMoveMessagesOperation(); + virtual ~IMAPMoveMessagesOperation(); + + virtual void setDestFolder(String * destFolder); + virtual String * destFolder(); + + virtual void setUids(IndexSet * uids); + virtual IndexSet * uids(); + + // Result. + virtual HashMap * uidMapping(); + + public: // subclass behavior + virtual void main(); + + private: + IndexSet * mUids; + String * mDestFolder; + HashMap * mUidMapping; + }; + +} + +#endif + +#endif diff --git a/src/cmake/async.cmake b/src/cmake/async.cmake index 79c97f5d..329c958e 100644 --- a/src/cmake/async.cmake +++ b/src/cmake/async.cmake @@ -8,6 +8,7 @@ set(async_imap_files async/imap/MCIMAPCheckAccountOperation.cpp async/imap/MCIMAPConnectOperation.cpp async/imap/MCIMAPCopyMessagesOperation.cpp + async/imap/MCIMAPMoveMessagesOperation.cpp async/imap/MCIMAPCreateFolderOperation.cpp async/imap/MCIMAPDeleteFolderOperation.cpp async/imap/MCIMAPDisconnectOperation.cpp diff --git a/src/cmake/objc.cmake b/src/cmake/objc.cmake index 328ceb24..12a06bd1 100644 --- a/src/cmake/objc.cmake +++ b/src/cmake/objc.cmake @@ -15,6 +15,7 @@ set(objc_imap_files objc/imap/MCOIMAPBaseOperation.mm objc/imap/MCOIMAPCapabilityOperation.mm objc/imap/MCOIMAPCopyMessagesOperation.mm + objc/imap/MCOIMAPMoveMessagesOperation.mm objc/imap/MCOIMAPFetchContentOperation.mm objc/imap/MCOIMAPFetchParsedContentOperation.mm objc/imap/MCOIMAPFetchFoldersOperation.mm diff --git a/src/cmake/public-headers.cmake b/src/cmake/public-headers.cmake index 7677a5aa..db0ebd71 100644 --- a/src/cmake/public-headers.cmake +++ b/src/cmake/public-headers.cmake @@ -86,6 +86,7 @@ async/imap/MCIMAPOperation.h async/imap/MCIMAPFetchFoldersOperation.h async/imap/MCIMAPAppendMessageOperation.h async/imap/MCIMAPCopyMessagesOperation.h +async/imap/MCIMAPMoveMessagesOperation.h async/imap/MCIMAPFetchMessagesOperation.h async/imap/MCIMAPFetchContentOperation.h async/imap/MCIMAPFetchParsedContentOperation.h @@ -161,6 +162,7 @@ objc/imap/MCOIMAPFolderStatusOperation.h objc/imap/MCOIMAPFolderStatus.h objc/imap/MCOIMAPAppendMessageOperation.h objc/imap/MCOIMAPCopyMessagesOperation.h +objc/imap/MCOIMAPMoveMessagesOperation.h objc/imap/MCOIMAPFetchMessagesOperation.h objc/imap/MCOIMAPFetchContentOperation.h objc/imap/MCOIMAPFetchParsedContentOperation.h diff --git a/src/core/imap/MCIMAPSession.cpp b/src/core/imap/MCIMAPSession.cpp index 2fe39d40..c1209c9d 100755 --- a/src/core/imap/MCIMAPSession.cpp +++ b/src/core/imap/MCIMAPSession.cpp @@ -1739,6 +1739,90 @@ void IMAPSession::copyMessages(String * folder, IndexSet * uidSet, String * dest mailimap_set_free(set); } +void IMAPSession::moveMessages(String * folder, IndexSet * uidSet, String * destFolder, + HashMap ** pUidMapping, ErrorCode * pError) +{ + int r; + struct mailimap_set * set; + struct mailimap_set * src_uid; + struct mailimap_set * dest_uid; + uint32_t uidvalidity; + clist * setList; + IndexSet * uidSetResult; + HashMap * uidMapping = NULL; + + selectIfNeeded(folder, pError); + if (* pError != ErrorNone) + return; + + set = setFromIndexSet(uidSet); + if (clist_count(set->set_list) == 0) { + mailimap_set_free(set); + return; + } + + setList = splitSet(set, 10); + uidSetResult = NULL; + + for(clistiter * iter = clist_begin(setList) ; iter != NULL ; iter = clist_next(iter)) { + struct mailimap_set * current_set; + + current_set = (struct mailimap_set *) clist_content(iter); + + r = mailimap_uidplus_uid_move(mImap, current_set, MCUTF8(destFolder), + &uidvalidity, &src_uid, &dest_uid); + if (r == MAILIMAP_ERROR_STREAM) { + mShouldDisconnect = true; + * pError = ErrorConnection; + goto release; + } + else if (r == MAILIMAP_ERROR_PARSE) { + * pError = ErrorParse; + goto release; + } + else if (hasError(r)) { + * pError = ErrorCopy; + goto release; + } + + if ((src_uid != NULL) && (dest_uid != NULL)) { + if (uidMapping == NULL) { + uidMapping = HashMap::hashMap(); + } + + Array * srcUidsArray = arrayFromSet(src_uid); + Array * destUidsArray = arrayFromSet(dest_uid); + + for(int i = 0 ; i < srcUidsArray->count() && i < destUidsArray->count() ; i ++) { + uidMapping->setObjectForKey(srcUidsArray->objectAtIndex(i), destUidsArray->objectAtIndex(i)); + } + } + + if (src_uid != NULL) { + mailimap_set_free(src_uid); + } + + if (dest_uid != NULL) { + mailimap_set_free(dest_uid); + } + } + if (pUidMapping != NULL) { + * pUidMapping = uidMapping; + } + * pError = ErrorNone; + + release: + + for(clistiter * iter = clist_begin(setList) ; iter != NULL ; iter = clist_next(iter)) { + struct mailimap_set * current_set; + + current_set = (struct mailimap_set *) clist_content(iter); + mailimap_set_free(current_set); + } + clist_free(setList); + mailimap_set_free(set); +} + void IMAPSession::expunge(String * folder, ErrorCode * pError) { int r; diff --git a/src/core/imap/MCIMAPSession.h b/src/core/imap/MCIMAPSession.h index b3fdcb4e..c122e546 100755 --- a/src/core/imap/MCIMAPSession.h +++ b/src/core/imap/MCIMAPSession.h @@ -89,6 +89,9 @@ namespace mailcore { virtual void copyMessages(String * folder, IndexSet * uidSet, String * destFolder, HashMap ** pUidMapping, ErrorCode * pError); + virtual void moveMessages(String * folder, IndexSet * uidSet, String * destFolder, + HashMap ** pUidMapping, ErrorCode * pError); + virtual void expunge(String * folder, ErrorCode * pError); virtual Array * /* IMAPMessage */ fetchMessagesByUID(String * folder, IMAPMessagesRequestKind requestKind, diff --git a/src/objc/imap/MCOIMAP.h b/src/objc/imap/MCOIMAP.h index 9483a36b..11cbc2ae 100755 --- a/src/objc/imap/MCOIMAP.h +++ b/src/objc/imap/MCOIMAP.h @@ -27,6 +27,7 @@ #import #import #import +#import #import #import #import diff --git a/src/objc/imap/MCOIMAPMoveMessagesOperation.h b/src/objc/imap/MCOIMAPMoveMessagesOperation.h new file mode 100644 index 00000000..77460878 --- /dev/null +++ b/src/objc/imap/MCOIMAPMoveMessagesOperation.h @@ -0,0 +1,39 @@ +// +// MCOIMAPMoveMessagesOperation.h +// mailcore2 +// +// Created by Nikolay Morev on 02/02/16. +// Copyright © 2016 MailCore. All rights reserved. +// + +#import + +#ifndef MAILCORE_MCOMOVEMESSAGESOPERATION_H + +#define MAILCORE_MCOMOVEMESSAGESOPERATION_H + +/** Implements an operation for moving messages between folders */ + +@class MCOIndexSet; + +NS_ASSUME_NONNULL_BEGIN +@interface MCOIMAPMoveMessagesOperation : MCOIMAPBaseOperation + +/** + Starts the asynchronous move operation. + + @param completionBlock Called when the operation is finished. + + - On success `error` will be nil and `destUids` will contain the UIDs of the messages created + in the destination folder. If the server doesn't support UIDPLUS then `destUids` will be nil. + + - On failure, `error` will be set with `MCOErrorDomain` as domain and an + error code available in `MCOConstants.h`, `destUids` will be nil + */ + +- (void) start:(void (^)(NSError * __nullable error, NSDictionary * __nullable uidMapping))completionBlock; + +@end +NS_ASSUME_NONNULL_END + +#endif diff --git a/src/objc/imap/MCOIMAPMoveMessagesOperation.mm b/src/objc/imap/MCOIMAPMoveMessagesOperation.mm new file mode 100644 index 00000000..b88109f4 --- /dev/null +++ b/src/objc/imap/MCOIMAPMoveMessagesOperation.mm @@ -0,0 +1,71 @@ +// +// MCOIMAPMoveMessagesOperation.m +// mailcore2 +// +// Created by Nikolay Morev on 02/02/16. +// Copyright © 2016 MailCore. All rights reserved. +// + +#import "MCOIMAPMoveMessagesOperation.h" + +#include "MCAsyncIMAP.h" + +#import "MCOOperation+Private.h" +#import "MCOUtils.h" +#import "MCOIndexSet.h" + +typedef void (^CompletionType)(NSError *error, MCOIndexSet * destUids); + +@implementation MCOIMAPMoveMessagesOperation { + CompletionType _completionBlock; +} + +#define nativeType mailcore::IMAPMoveMessagesOperation + ++ (void) load +{ + MCORegisterClass(self, &typeid(nativeType)); +} + ++ (NSObject *) mco_objectWithMCObject:(mailcore::Object *)object +{ + nativeType * op = (nativeType *) object; + return [[[self alloc] initWithMCOperation:op] autorelease]; +} + +- (void) dealloc +{ + [_completionBlock release]; + [super dealloc]; +} + +- (void) start:(void (^)(NSError *error, NSDictionary * uidMapping))completionBlock +{ + _completionBlock = [completionBlock copy]; + [self start]; +} + +- (void) cancel +{ + [_completionBlock release]; + _completionBlock = nil; + [super cancel]; +} + +- (void) operationCompleted +{ + if (_completionBlock == NULL) + return; + + nativeType *op = MCO_NATIVE_INSTANCE; + if (op->error() == mailcore::ErrorNone) { + _completionBlock(nil, MCO_TO_OBJC(op->uidMapping())); + } + else { + _completionBlock([NSError mco_errorWithErrorCode:op->error()], 0); + } + [_completionBlock release]; + _completionBlock = nil; +} + +@end diff --git a/src/objc/imap/MCOIMAPSession.h b/src/objc/imap/MCOIMAPSession.h index add9a428..bab3be7f 100755 --- a/src/objc/imap/MCOIMAPSession.h +++ b/src/objc/imap/MCOIMAPSession.h @@ -20,6 +20,7 @@ @class MCOIMAPFolderStatusOperation; @class MCOIMAPAppendMessageOperation; @class MCOIMAPCopyMessagesOperation; +@class MCOIMAPMoveMessagesOperation; @class MCOIndexSet; @class MCOIMAPFetchMessagesOperation; @class MCOIMAPFetchContentOperation; @@ -317,6 +318,20 @@ uids:(MCOIndexSet *)uids destFolder:(NSString *)destFolder NS_RETURNS_NOT_RETAINED; +/** + Returns an operation to move messages to a folder. + + MCOIMAPMoveMessagesOperation * op = [session moveMessagesOperationWithFolder:@"INBOX" + uids:[MCIndexSet indexSetWithIndex:456] + destFolder:@"Cocoa"]; + [op start:^(NSError * __nullable error, NSDictionary * uidMapping) { + NSLog(@"moved to folder with UID mapping %@", uidMapping); + }]; +*/ +- (MCOIMAPMoveMessagesOperation *)moveMessagesOperationWithFolder:(NSString *)folder + uids:(MCOIndexSet *)uids + destFolder:(NSString *)destFolder NS_RETURNS_NOT_RETAINED; + /** Returns an operation to change flags of messages. diff --git a/src/objc/imap/MCOIMAPSession.mm b/src/objc/imap/MCOIMAPSession.mm index e978afac..32dd1119 100755 --- a/src/objc/imap/MCOIMAPSession.mm +++ b/src/objc/imap/MCOIMAPSession.mm @@ -274,6 +274,15 @@ MCO_OBJC_SYNTHESIZE_SCALAR(dispatch_queue_t, dispatch_queue_t, setDispatchQueue, return MCO_TO_OBJC_OP(coreOp); } +- (MCOIMAPMoveMessagesOperation *)moveMessagesOperationWithFolder:(NSString *)folder + uids:(MCOIndexSet *)uids + destFolder:(NSString *)destFolder +{ + IMAPMoveMessagesOperation * coreOp = MCO_NATIVE_INSTANCE->moveMessagesOperation([folder mco_mcString], + MCO_FROM_OBJC(IndexSet, uids), + [destFolder mco_mcString]); + return MCO_TO_OBJC_OP(coreOp); +} - (MCOIMAPOperation *) expungeOperation:(NSString *)folder { -- cgit v1.2.3