aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/rfc822/MCMessageParser.cpp
diff options
context:
space:
mode:
authorGravatar Robert Widmann <devteam.codafi@gmail.com>2015-02-21 21:58:36 -0700
committerGravatar Robert Widmann <devteam.codafi@gmail.com>2015-02-21 21:58:36 -0700
commite1fddae3b6edbbd33a22408f30a36704906cd30f (patch)
tree95d7a0b3f33d03e2f8f46193af8b287f0a734fa7 /src/core/rfc822/MCMessageParser.cpp
parent261fe679c7fb736dd3bd01c05871d7b4c5337bb6 (diff)
parent8a0df88bbb36804020111385a7aaed2c701a1944 (diff)
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'src/core/rfc822/MCMessageParser.cpp')
-rw-r--r--src/core/rfc822/MCMessageParser.cpp192
1 files changed, 192 insertions, 0 deletions
diff --git a/src/core/rfc822/MCMessageParser.cpp b/src/core/rfc822/MCMessageParser.cpp
new file mode 100644
index 00000000..71071c02
--- /dev/null
+++ b/src/core/rfc822/MCMessageParser.cpp
@@ -0,0 +1,192 @@
+#include "MCMessageParser.h"
+
+#include <libetpan/libetpan.h>
+#if __APPLE__
+#include <CoreFoundation/CoreFoundation.h>
+#endif
+
+#include "MCAttachment.h"
+#include "MCMessageHeader.h"
+#include "MCHTMLRenderer.h"
+#include "MCHTMLBodyRendererTemplateCallback.h"
+
+using namespace mailcore;
+
+MessageParser * MessageParser::messageParserWithData(Data * data)
+{
+ MessageParser * parser = new MessageParser(data);
+ return (MessageParser *) parser->autorelease();
+}
+
+MessageParser * MessageParser::messageParserWithContentsOfFile(String * filename)
+{
+ Data * data = Data::dataWithContentsOfFile(filename);
+ return messageParserWithData(data);
+}
+
+void MessageParser::init()
+{
+ mData = NULL;
+ mMainPart = NULL;
+#if __APPLE__
+ mNSData = NULL;
+#endif
+}
+
+void MessageParser::setBytes(char * dataBytes, unsigned int dataLength)
+{
+ const char * start = NULL;
+ unsigned int length = 0;
+ if (dataLength > 5) {
+ if (strncmp(dataBytes, "From ", 5) == 0) {
+ start = dataBytes;
+ for(unsigned int i = 0 ; i < dataLength ; i ++) {
+ if (start[i] == '\n') {
+ start = start + i + 1;
+ length = dataLength - (i + 1);
+ break;
+ }
+ }
+ }
+ }
+ if (start != NULL) {
+ dataBytes = (char *) start;
+ dataLength = length;
+ }
+
+ mailmessage * msg;
+ struct mailmime * mime;
+
+ msg = data_message_init(dataBytes, dataLength);
+ mailmessage_get_bodystructure(msg, &mime);
+ mMainPart = (AbstractPart *) Attachment::attachmentsWithMIME(msg->msg_mime)->retain();
+ mMainPart->applyUniquePartID();
+
+ size_t cur_token = 0;
+ struct mailimf_fields * fields;
+ int r = mailimf_envelope_and_optional_fields_parse(dataBytes, dataLength, &cur_token, &fields);
+ if (r == MAILIMAP_NO_ERROR) {
+ header()->importIMFFields(fields);
+ mailimf_fields_free(fields);
+ }
+ mailmessage_free(msg);
+}
+
+MessageParser::MessageParser()
+{
+ init();
+}
+
+MessageParser::MessageParser(Data * data)
+{
+ init();
+
+ setBytes(data->bytes(), data->length());
+ mData = (Data *) data->retain();
+}
+
+MessageParser::MessageParser(MessageParser * other) : AbstractMessage(other)
+{
+ init();
+ MC_SAFE_REPLACE_RETAIN(Data, mData, other->mData);
+ MC_SAFE_REPLACE_RETAIN(AbstractPart, mMainPart, other->mMainPart);
+}
+
+MessageParser::~MessageParser()
+{
+ MC_SAFE_RELEASE(mMainPart);
+ MC_SAFE_RELEASE(mData);
+#if __APPLE__
+ if (mNSData != NULL) {
+ CFRelease(mNSData);
+ }
+#endif
+}
+
+AbstractPart * MessageParser::mainPart()
+{
+ return mMainPart;
+}
+
+Data * MessageParser::data()
+{
+#if __APPLE__
+ if (mNSData != NULL) {
+ return dataFromNSData();
+ }
+#endif
+ return mData;
+}
+
+String * MessageParser::description()
+{
+ String * result = String::string();
+ result->appendUTF8Format("<%s:%p ", MCUTF8(className()), this);
+ result->appendUTF8Format("<%p>", mMainPart);
+ if (mMainPart != NULL) {
+ result->appendString(mMainPart->description());
+ }
+ result->appendUTF8Characters(">");
+
+ return result;
+}
+
+HashMap * MessageParser::serializable()
+{
+ HashMap * result = AbstractMessage::serializable();
+ if (mMainPart != NULL) {
+ result->setObjectForKey(MCSTR("mainPart"), mMainPart->serializable());
+ }
+ return result;
+}
+
+Object * MessageParser::copy()
+{
+ return new MessageParser(this);
+}
+
+AbstractPart * MessageParser::partForContentID(String * contentID)
+{
+ if (mainPart() == NULL) {
+ return NULL;
+ }
+ return mainPart()->partForContentID(contentID);
+}
+
+AbstractPart * MessageParser::partForUniqueID(String * uniqueID)
+{
+ if (mainPart() == NULL) {
+ return NULL;
+ }
+ return mainPart()->partForUniqueID(uniqueID);
+}
+
+String * MessageParser::htmlRendering(HTMLRendererTemplateCallback * htmlCallback)
+{
+ return HTMLRenderer::htmlForRFC822Message(this, htmlCallback);
+}
+
+String * MessageParser::htmlBodyRendering()
+{
+ HTMLBodyRendererTemplateCallback * callback = new HTMLBodyRendererTemplateCallback();
+ String * result = htmlRendering(callback);
+ MC_SAFE_RELEASE(callback);
+ return result;
+}
+
+String * MessageParser::plainTextRendering()
+{
+ String * html = htmlRendering(NULL);
+ return html->flattenHTML();
+}
+
+String * MessageParser::plainTextBodyRendering(bool stripWhitespace)
+{
+ String * html = htmlBodyRendering();
+ String * plainTextBodyString = html->flattenHTML();
+
+ if (stripWhitespace) {
+ plainTextBodyString = plainTextBodyString->stripWhitespace();
+ }
+ return plainTextBodyString;
+}