aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rwxr-xr-xbuild-mac/mailcore2.xcodeproj/project.pbxproj24
-rw-r--r--build-windows/build_headers.list2
-rw-r--r--build-windows/mailcore2/mailcore2/mailcore2.vcxproj2
-rw-r--r--build-windows/mailcore2/mailcore2/mailcore2.vcxproj.filters6
-rwxr-xr-xsrc/async/imap/MCAsyncIMAP.h1
-rwxr-xr-xsrc/async/imap/MCIMAPAsyncSession.cpp12
-rwxr-xr-xsrc/async/imap/MCIMAPAsyncSession.h2
-rw-r--r--src/async/imap/MCIMAPMoveMessagesOperation.cpp61
-rw-r--r--src/async/imap/MCIMAPMoveMessagesOperation.h46
-rw-r--r--src/cmake/async.cmake1
-rw-r--r--src/cmake/objc.cmake1
-rw-r--r--src/cmake/public-headers.cmake2
-rwxr-xr-xsrc/core/imap/MCIMAPSession.cpp84
-rwxr-xr-xsrc/core/imap/MCIMAPSession.h3
-rwxr-xr-xsrc/objc/imap/MCOIMAP.h1
-rw-r--r--src/objc/imap/MCOIMAPMoveMessagesOperation.h39
-rw-r--r--src/objc/imap/MCOIMAPMoveMessagesOperation.mm71
-rwxr-xr-xsrc/objc/imap/MCOIMAPSession.h15
-rwxr-xr-xsrc/objc/imap/MCOIMAPSession.mm9
19 files changed, 382 insertions, 0 deletions
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 = "<group>"; };
84D73791199C0511005124E5 /* MCONNTPGroupInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCONNTPGroupInfo.h; sourceTree = "<group>"; };
84D73792199C0511005124E5 /* MCONNTPGroupInfo.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MCONNTPGroupInfo.mm; sourceTree = "<group>"; };
+ 8568A4111C610D9800FF4470 /* MCIMAPMoveMessagesOperation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MCIMAPMoveMessagesOperation.cpp; sourceTree = "<group>"; };
+ 8568A4121C610D9800FF4470 /* MCIMAPMoveMessagesOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCIMAPMoveMessagesOperation.h; sourceTree = "<group>"; };
+ 8568A4181C610F6600FF4470 /* MCOIMAPMoveMessagesOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCOIMAPMoveMessagesOperation.h; sourceTree = "<group>"; };
+ 8568A4191C610F6600FF4470 /* MCOIMAPMoveMessagesOperation.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MCOIMAPMoveMessagesOperation.mm; sourceTree = "<group>"; };
8B0095C71A00DDC500F84BC0 /* MCSMTPLoginOperation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MCSMTPLoginOperation.cpp; sourceTree = "<group>"; };
8B0095C81A00DDC500F84BC0 /* MCSMTPLoginOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCSMTPLoginOperation.h; sourceTree = "<group>"; };
8B0095CA1A00DDE700F84BC0 /* MCOSMTPLoginOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCOSMTPLoginOperation.h; sourceTree = "<group>"; };
@@ -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 @@
<ClInclude Include="..\..\..\src\async\imap\MCIMAPCheckAccountOperation.h" />
<ClInclude Include="..\..\..\src\async\imap\MCIMAPConnectOperation.h" />
<ClInclude Include="..\..\..\src\async\imap\MCIMAPCopyMessagesOperation.h" />
+ <ClInclude Include="..\..\..\src\async\imap\MCIMAPMoveMessagesOperation.h" />
<ClInclude Include="..\..\..\src\async\imap\MCIMAPCreateFolderOperation.h" />
<ClInclude Include="..\..\..\src\async\imap\MCIMAPDeleteFolderOperation.h" />
<ClInclude Include="..\..\..\src\async\imap\MCIMAPDisconnectOperation.h" />
@@ -188,6 +189,7 @@
<ClCompile Include="..\..\..\src\async\imap\MCIMAPCheckAccountOperation.cpp" />
<ClCompile Include="..\..\..\src\async\imap\MCIMAPConnectOperation.cpp" />
<ClCompile Include="..\..\..\src\async\imap\MCIMAPCopyMessagesOperation.cpp" />
+ <ClCompile Include="..\..\..\src\async\imap\MCIMAPMoveMessagesOperation.cpp" />
<ClCompile Include="..\..\..\src\async\imap\MCIMAPCreateFolderOperation.cpp" />
<ClCompile Include="..\..\..\src\async\imap\MCIMAPDeleteFolderOperation.cpp" />
<ClCompile Include="..\..\..\src\async\imap\MCIMAPDisconnectOperation.cpp" />
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 @@
<ClInclude Include="..\..\..\src\async\imap\MCIMAPCopyMessagesOperation.h">
<Filter>Source Files\async\imap</Filter>
</ClInclude>
+ <ClInclude Include="..\..\..\src\async\imap\MCIMAPMoveMessagesOperation.h">
+ <Filter>Source Files\async\imap</Filter>
+ </ClInclude>
<ClInclude Include="..\..\..\src\async\imap\MCIMAPCreateFolderOperation.h">
<Filter>Source Files\async\imap</Filter>
</ClInclude>
@@ -782,6 +785,9 @@
<ClCompile Include="..\..\..\src\async\imap\MCIMAPCopyMessagesOperation.cpp">
<Filter>Source Files\async\imap</Filter>
</ClCompile>
+ <ClCompile Include="..\..\..\src\async\imap\MCIMAPMoveMessagesOperation.cpp">
+ <Filter>Source Files\async\imap</Filter>
+ </ClCompile>
<ClCompile Include="..\..\..\src\async\imap\MCIMAPCreateFolderOperation.cpp">
<Filter>Source Files\async\imap</Filter>
</ClCompile>
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 <MailCore/MCIMAPFetchFoldersOperation.h>
#include <MailCore/MCIMAPAppendMessageOperation.h>
#include <MailCore/MCIMAPCopyMessagesOperation.h>
+#include <MailCore/MCIMAPMoveMessagesOperation.h>
#include <MailCore/MCIMAPFetchMessagesOperation.h>
#include <MailCore/MCIMAPFetchContentOperation.h>
#include <MailCore/MCIMAPFetchParsedContentOperation.h>
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 <MailCore/MCIMAPOperation.h>
+
+#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 <MailCore/MCOIMAPFolderStatus.h>
#import <MailCore/MCOIMAPAppendMessageOperation.h>
#import <MailCore/MCOIMAPCopyMessagesOperation.h>
+#import <MailCore/MCOIMAPMoveMessagesOperation.h>
#import <MailCore/MCOIMAPFetchMessagesOperation.h>
#import <MailCore/MCOIMAPFetchContentOperation.h>
#import <MailCore/MCOIMAPFetchParsedContentOperation.h>
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 <MailCore/MCOIMAPBaseOperation.h>
+
+#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;
@@ -318,6 +319,20 @@
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.
For example: Adds the seen flag to the message with UID 456.
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
{