diff options
| author | Sam Varshavchik | 2013-08-19 16:39:41 -0400 |
|---|---|---|
| committer | Sam Varshavchik | 2013-08-25 14:43:51 -0400 |
| commit | 9c45d9ad13fdf439d44d7443ae75da15ea0223ed (patch) | |
| tree | 7a81a04cb51efb078ee350859a64be2ebc6b8813 /libmail/addmessageimport.C | |
| parent | a9520698b770168d1f33d6301463bb70a19655ec (diff) | |
| download | courier-libs-9c45d9ad13fdf439d44d7443ae75da15ea0223ed.tar.bz2 | |
Initial checkin
Imported from subversion report, converted to git. Updated all paths in
scripts and makefiles, reflecting the new directory hierarchy.
Diffstat (limited to 'libmail/addmessageimport.C')
| -rw-r--r-- | libmail/addmessageimport.C | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/libmail/addmessageimport.C b/libmail/addmessageimport.C new file mode 100644 index 0000000..9027545 --- /dev/null +++ b/libmail/addmessageimport.C @@ -0,0 +1,194 @@ +/* +** Copyright 2002-2008, Double Precision Inc. +** +** See COPYING for distribution information. +*/ +#include "libmail_config.h" +#include "addmessage.H" +#include "attachments.H" +#include <errno.h> +#include <cstring> + +using namespace std; + +class mail::addMessage::assembleImportHelper : public callback::message { + + mail::addMessage *addMessagePtr; + size_t &handleRet; + mail::ptr<mail::account> acct; + string msgUid; + size_t msgNum; + const mail::mimestruct &attachment; + mail::callback &cb; + FILE *tmpfp; + + string headers; + + // Imported from mail::callback::message: + void messageTextCallback(size_t n, std::string text); + + // Imported from mail::callback: + void success(std::string message); + void fail(std::string message); + + void reportProgress(size_t bytesCompleted, + size_t bytesEstimatedTotal, + size_t messagesCompleted, + size_t messagesEstimatedTotal); + +public: + assembleImportHelper(mail::addMessage *addMessagePtr, + size_t &handleRetArg, + mail::account *acctArg, + std::string msgUidArg, + size_t msgNumArg, + const mail::mimestruct &attachmentArg, + mail::callback &cbArg); + ~assembleImportHelper(); + void go(); +}; + +void mail::addMessage::assembleImportAttachment(size_t &handleRet, + mail::account *acct, + std::string msgUid, + const mail::mimestruct &attachment, + mail::callback &cb) +{ + size_t n=0; + mail::addMessage::assembleImportHelper *h; + + if (!mail::addMessage::chkMsgNum(acct, msgUid, n)) + { + cb.fail("Message not found."); + return; + } + + h=new mail::addMessage::assembleImportHelper(this, + handleRet, acct, + msgUid, n, attachment, + cb); + + if (!h) + { + cb.fail(strerror(errno)); + return; + } + + try + { + h->go(); + } catch (...) { + delete h; + cb.fail(strerror(errno)); + } +} + +mail::addMessage::assembleImportHelper +::assembleImportHelper(mail::addMessage *addMessagePtrArg, + size_t &handleRetArg, + mail::account *acctArg, + std::string msgUidArg, + size_t msgNumArg, + const mail::mimestruct &attachmentArg, + mail::callback &cbArg) + : addMessagePtr(addMessagePtrArg), + handleRet(handleRetArg), + acct(acctArg), + msgUid(msgUidArg), + msgNum(msgNumArg), + attachment(attachmentArg), + cb(cbArg), + tmpfp(NULL) +{ +} + +mail::addMessage::assembleImportHelper::~assembleImportHelper() +{ + if (tmpfp) + fclose(tmpfp); +} + +void mail::addMessage::assembleImportHelper::go() +{ + acct->readMessageContent(msgNum, true, attachment, + mail::readHeaders, + *this); + +} + +void mail::addMessage::assembleImportHelper::messageTextCallback(size_t n, + string text) +{ + if (tmpfp == NULL) + { + // Reading headers. + headers += text; + } + else + { + // Reading content + if (fwrite(text.c_str(), text.size(), 1, tmpfp) != 1) + ; // Supress warning + } +} + +void mail::addMessage::assembleImportHelper::success(string message) +{ + if (tmpfp == NULL) // Just read headers, check for error, read body. + { + if (acct.isDestroyed() || !chkMsgNum(acct, msgUid, msgNum)) + { + fail("Message not found."); + return; + } + if ((tmpfp=tmpfile()) == NULL) + { + fail(strerror(errno)); + return; + } + + acct->readMessageContentDecoded(msgNum, true, attachment, + *this); + return; + } + + // Just read the content. + + if (fseek(tmpfp, 0L, SEEK_SET) < 0 || ferror(tmpfp)) + { + fail(strerror(errno)); + return; + } + + string::iterator hstart, hend; + + string encoding= + mail::Attachment::find_header("CONTENT-TRANSFER-ENCODING:", + headers, hstart, hend); + + if (hstart != hend) + headers.erase(hstart, hend); + + addMessagePtr-> + assembleContent(handleRet, + mail::Attachment(headers, fileno(tmpfp), "", + encoding), cb); + delete this; +} + +void mail::addMessage::assembleImportHelper::fail(string message) +{ + cb.fail(message); + delete this; +} + +void mail::addMessage::assembleImportHelper::reportProgress(size_t bytesCompleted, + size_t bytesEstimatedTotal, + size_t messagesCompleted, + size_t messagesEstimatedTotal) +{ + cb.reportProgress(bytesCompleted, + bytesEstimatedTotal, + messagesCompleted, + messagesEstimatedTotal); +} |
