aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/async
diff options
context:
space:
mode:
authorGravatar Dmitry Isaikin <isaikin-dmitry@yandex.ru>2016-06-06 04:28:53 +0400
committerGravatar HoĆ  V. DINH <dinh.viet.hoa@gmail.com>2016-06-05 17:28:53 -0700
commiteeed76e48c830fe742eadd435682f3b1e6036f83 (patch)
tree36bad63fccde47e6cdecb7033f65a3d75e1bbb71 /src/async
parent6dbe79ccf3f085da9a195ee3f9a59cb4449f6505 (diff)
Add possibility of fetching message attachment by chunks and store it to file. (#1438)
Diffstat (limited to 'src/async')
-rw-r--r--src/async/imap/MCAsyncIMAP.h1
-rw-r--r--src/async/imap/MCIMAPAsyncConnection.cpp1
-rw-r--r--src/async/imap/MCIMAPAsyncConnection.h1
-rw-r--r--src/async/imap/MCIMAPAsyncSession.cpp19
-rw-r--r--src/async/imap/MCIMAPAsyncSession.h9
-rw-r--r--src/async/imap/MCIMAPFetchContentToFileOperation.cpp91
-rw-r--r--src/async/imap/MCIMAPFetchContentToFileOperation.h53
7 files changed, 174 insertions, 1 deletions
diff --git a/src/async/imap/MCAsyncIMAP.h b/src/async/imap/MCAsyncIMAP.h
index e6d6d367..effa0947 100644
--- a/src/async/imap/MCAsyncIMAP.h
+++ b/src/async/imap/MCAsyncIMAP.h
@@ -18,6 +18,7 @@
#include <MailCore/MCIMAPMoveMessagesOperation.h>
#include <MailCore/MCIMAPFetchMessagesOperation.h>
#include <MailCore/MCIMAPFetchContentOperation.h>
+#include <MailCore/MCIMAPFetchContentToFileOperation.h>
#include <MailCore/MCIMAPFetchParsedContentOperation.h>
#include <MailCore/MCIMAPIdleOperation.h>
#include <MailCore/MCIMAPFolderInfo.h>
diff --git a/src/async/imap/MCIMAPAsyncConnection.cpp b/src/async/imap/MCIMAPAsyncConnection.cpp
index ff12c881..4ae633ec 100644
--- a/src/async/imap/MCIMAPAsyncConnection.cpp
+++ b/src/async/imap/MCIMAPAsyncConnection.cpp
@@ -21,6 +21,7 @@
#include "MCIMAPCopyMessagesOperation.h"
#include "MCIMAPFetchMessagesOperation.h"
#include "MCIMAPFetchContentOperation.h"
+#include "MCIMAPFetchContentToFileOperation.h"
#include "MCIMAPFetchParsedContentOperation.h"
#include "MCIMAPStoreFlagsOperation.h"
#include "MCIMAPStoreLabelsOperation.h"
diff --git a/src/async/imap/MCIMAPAsyncConnection.h b/src/async/imap/MCIMAPAsyncConnection.h
index 40b11b90..c665b26d 100644
--- a/src/async/imap/MCIMAPAsyncConnection.h
+++ b/src/async/imap/MCIMAPAsyncConnection.h
@@ -15,6 +15,7 @@ namespace mailcore {
class IMAPCopyMessagesOperation;
class IMAPFetchMessagesOperation;
class IMAPFetchContentOperation;
+ class IMAPFetchContentToFileOperation;
class IMAPFetchParsedContentOperation;
class IMAPIdleOperation;
class IMAPFolderInfoOperation;
diff --git a/src/async/imap/MCIMAPAsyncSession.cpp b/src/async/imap/MCIMAPAsyncSession.cpp
index 5c599558..58dc0dbb 100644
--- a/src/async/imap/MCIMAPAsyncSession.cpp
+++ b/src/async/imap/MCIMAPAsyncSession.cpp
@@ -29,6 +29,7 @@
#include "MCIMAPMoveMessagesOperation.h"
#include "MCIMAPFetchMessagesOperation.h"
#include "MCIMAPFetchContentOperation.h"
+#include "MCIMAPFetchContentToFileOperation.h"
#include "MCIMAPFetchParsedContentOperation.h"
#include "MCIMAPStoreFlagsOperation.h"
#include "MCIMAPStoreLabelsOperation.h"
@@ -588,6 +589,24 @@ IMAPFetchContentOperation * IMAPAsyncSession::fetchMessageAttachmentByUIDOperati
return op;
}
+IMAPFetchContentToFileOperation * IMAPAsyncSession::fetchMessageAttachmentToFileByUIDOperation(
+ String * folder, uint32_t uid, String * partID,
+ Encoding encoding,
+ String * filename,
+ bool urgent)
+{
+ IMAPFetchContentToFileOperation * op = new IMAPFetchContentToFileOperation();
+ op->setMainSession(this);
+ op->setFolder(folder);
+ op->setUid(uid);
+ op->setPartID(partID);
+ op->setEncoding(encoding);
+ op->setFilename(filename);
+ op->setUrgent(urgent);
+ op->autorelease();
+ return op;
+}
+
IMAPFetchContentOperation * IMAPAsyncSession::fetchMessageByNumberOperation(String * folder, uint32_t number, bool urgent)
{
IMAPFetchContentOperation * op = new IMAPFetchContentOperation();
diff --git a/src/async/imap/MCIMAPAsyncSession.h b/src/async/imap/MCIMAPAsyncSession.h
index 0230deda..05437207 100644
--- a/src/async/imap/MCIMAPAsyncSession.h
+++ b/src/async/imap/MCIMAPAsyncSession.h
@@ -24,6 +24,7 @@ namespace mailcore {
class IMAPMoveMessagesOperation;
class IMAPFetchMessagesOperation;
class IMAPFetchContentOperation;
+ class IMAPFetchContentToFileOperation;
class IMAPFetchParsedContentOperation;
class IMAPIdleOperation;
class IMAPFolderInfoOperation;
@@ -142,7 +143,13 @@ namespace mailcore {
virtual IMAPFetchContentOperation * fetchMessageByUIDOperation(String * folder, uint32_t uid, bool urgent = false);
virtual IMAPFetchContentOperation * fetchMessageAttachmentByUIDOperation(String * folder, uint32_t uid, String * partID,
Encoding encoding, bool urgent = false);
-
+
+ virtual IMAPFetchContentToFileOperation * fetchMessageAttachmentToFileByUIDOperation(
+ String * folder, uint32_t uid, String * partID,
+ Encoding encoding,
+ String * filename,
+ bool urgent = false);
+
virtual IMAPFetchContentOperation * fetchMessageByNumberOperation(String * folder, uint32_t number, bool urgent = false);
virtual IMAPCustomCommandOperation * customCommand(String *command, bool urgent);
virtual IMAPFetchContentOperation * fetchMessageAttachmentByNumberOperation(String * folder, uint32_t number, String * partID,
diff --git a/src/async/imap/MCIMAPFetchContentToFileOperation.cpp b/src/async/imap/MCIMAPFetchContentToFileOperation.cpp
new file mode 100644
index 00000000..82a1fa23
--- /dev/null
+++ b/src/async/imap/MCIMAPFetchContentToFileOperation.cpp
@@ -0,0 +1,91 @@
+//
+// IMAPFetchContentToFileOperation.cpp
+// mailcore2
+//
+// Created by Dmitry Isaikin on 2/08/16.
+// Copyright (c) 2016 MailCore. All rights reserved.
+//
+
+#include "MCIMAPFetchContentToFileOperation.h"
+
+#include "MCIMAPSession.h"
+#include "MCIMAPAsyncConnection.h"
+
+using namespace mailcore;
+
+IMAPFetchContentToFileOperation::IMAPFetchContentToFileOperation()
+{
+ mUid = 0;
+ mPartID = NULL;
+ mEncoding = Encoding7Bit;
+ mFilename = NULL;
+ mLoadingByChunksEnabled = true;
+ mChunksSize = 2*1024*1024;
+ mEstimatedSize = 0;
+}
+
+IMAPFetchContentToFileOperation::~IMAPFetchContentToFileOperation()
+{
+ MC_SAFE_RELEASE(mPartID);
+ MC_SAFE_RELEASE(mFilename);
+}
+
+void IMAPFetchContentToFileOperation::setUid(uint32_t uid)
+{
+ mUid = uid;
+}
+
+void IMAPFetchContentToFileOperation::setPartID(String * partID)
+{
+ MC_SAFE_REPLACE_COPY(String, mPartID, partID);
+}
+
+void IMAPFetchContentToFileOperation::setEncoding(Encoding encoding)
+{
+ mEncoding = encoding;
+}
+
+void IMAPFetchContentToFileOperation::setFilename(String * filename)
+{
+ MC_SAFE_REPLACE_COPY(String, mFilename, filename);
+}
+
+void IMAPFetchContentToFileOperation::setLoadingByChunksEnabled(bool loadingByChunksEnabled)
+{
+ mLoadingByChunksEnabled = loadingByChunksEnabled;
+}
+
+bool IMAPFetchContentToFileOperation::isLoadingByChunksEnabled()
+{
+ return mLoadingByChunksEnabled;
+}
+
+void IMAPFetchContentToFileOperation::setChunksSize(uint32_t chunksSize)
+{
+ mChunksSize = chunksSize;
+}
+
+uint32_t IMAPFetchContentToFileOperation::chunksSize()
+{
+ return mChunksSize;
+}
+
+void IMAPFetchContentToFileOperation::setEstimatedSize(uint32_t estimatedSize)
+{
+ mEstimatedSize = estimatedSize;
+}
+
+uint32_t IMAPFetchContentToFileOperation::estimatedSize()
+{
+ return mEstimatedSize;
+}
+
+void IMAPFetchContentToFileOperation::main()
+{
+ ErrorCode error = ErrorNone;
+ session()->session()->fetchMessageAttachmentToFileByUID(folder(), mUid, mPartID,
+ mEstimatedSize, mEncoding,
+ mFilename, mChunksSize,
+ this, &error);
+ setError(error);
+}
diff --git a/src/async/imap/MCIMAPFetchContentToFileOperation.h b/src/async/imap/MCIMAPFetchContentToFileOperation.h
new file mode 100644
index 00000000..35d7026f
--- /dev/null
+++ b/src/async/imap/MCIMAPFetchContentToFileOperation.h
@@ -0,0 +1,53 @@
+//
+// IMAPFetchContentToFileOperation.h
+// mailcore2
+//
+// Created by Dmitry Isaikin on 2/08/16.
+// Copyright (c) 2016 MailCore. All rights reserved.
+//
+
+#ifndef MAILCORE_IMAPFETCHCONTENTTOFILEOPERATION_H
+
+#define MAILCORE_IMAPFETCHCONTENTTOFILEOPERATION_H
+
+#include <MailCore/MCIMAPOperation.h>
+
+#ifdef __cplusplus
+
+namespace mailcore {
+
+ class MAILCORE_EXPORT IMAPFetchContentToFileOperation : public IMAPOperation {
+ public:
+ IMAPFetchContentToFileOperation();
+ virtual ~IMAPFetchContentToFileOperation();
+
+ virtual void setUid(uint32_t uid);
+ virtual void setPartID(String * partID);
+ virtual void setEncoding(Encoding encoding);
+ virtual void setFilename(String * filename);
+
+ virtual void setLoadingByChunksEnabled(bool loadingByChunksEnabled);
+ virtual bool isLoadingByChunksEnabled();
+ virtual void setChunksSize(uint32_t chunksSize);
+ virtual uint32_t chunksSize();
+ virtual void setEstimatedSize(uint32_t estimatedSize);
+ virtual uint32_t estimatedSize();
+
+ public: // subclass behavior
+ virtual void main();
+
+ private:
+ uint32_t mUid;
+ String * mPartID;
+ Encoding mEncoding;
+ String * mFilename;
+ bool mLoadingByChunksEnabled;
+ uint32_t mChunksSize;
+ uint32_t mEstimatedSize;
+ };
+
+}
+
+#endif
+
+#endif