aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/rfc822/MCMessageParser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/rfc822/MCMessageParser.cpp')
-rw-r--r--src/core/rfc822/MCMessageParser.cpp102
1 files changed, 101 insertions, 1 deletions
diff --git a/src/core/rfc822/MCMessageParser.cpp b/src/core/rfc822/MCMessageParser.cpp
index beddeebc..e68d701b 100644
--- a/src/core/rfc822/MCMessageParser.cpp
+++ b/src/core/rfc822/MCMessageParser.cpp
@@ -71,6 +71,8 @@ void MessageParser::setBytes(char * dataBytes, unsigned int dataLength)
mailimf_fields_free(fields);
}
mailmessage_free(msg);
+
+ setupPartID();
}
MessageParser::MessageParser()
@@ -91,6 +93,7 @@ MessageParser::MessageParser(MessageParser * other) : AbstractMessage(other)
init();
MC_SAFE_REPLACE_RETAIN(Data, mData, other->mData);
MC_SAFE_REPLACE_RETAIN(AbstractPart, mMainPart, other->mMainPart);
+ setupPartID();
}
MessageParser::~MessageParser()
@@ -148,6 +151,7 @@ void MessageParser::importSerializable(HashMap * serializable)
if (mMainPart != NULL) {
mMainPart->applyUniquePartID();
}
+ setupPartID();
}
Object * MessageParser::copy()
@@ -173,7 +177,13 @@ AbstractPart * MessageParser::partForUniqueID(String * uniqueID)
String * MessageParser::htmlRendering(HTMLRendererTemplateCallback * htmlCallback)
{
- return HTMLRenderer::htmlForRFC822Message(this, htmlCallback);
+ return HTMLRenderer::htmlForRFC822Message(this, NULL, htmlCallback);
+}
+
+String * MessageParser::htmlRenderingWithDataCallback(HTMLRendererTemplateCallback * htmlCallback,
+ HTMLRendererRFC822Callback * dataCallback)
+{
+ return HTMLRenderer::htmlForRFC822Message(this, dataCallback, htmlCallback);
}
String * MessageParser::htmlBodyRendering()
@@ -201,6 +211,96 @@ String * MessageParser::plainTextBodyRendering(bool stripWhitespace)
return plainTextBodyString;
}
+void MessageParser::setupPartID()
+{
+ if (mMainPart == NULL) {
+ return;
+ }
+ recursiveSetupPartIDWithPart(mMainPart, MCSTR(""));
+}
+
+void MessageParser::recursiveSetupPartIDWithPart(mailcore::AbstractPart * part,
+ mailcore::String * partIDPrefix)
+{
+ switch (part->partType()) {
+ case PartTypeSingle:
+ {
+ String * partID = NULL;
+ if (partIDPrefix->length() == 0) {
+ partID = MCSTR("1");
+ }
+ else {
+ partID = partIDPrefix;
+ }
+ return recursiveSetupPartIDWithSinglePart((Attachment *) part, partID);
+ }
+ case PartTypeMessage:
+ {
+ String * partID = NULL;
+ if (partIDPrefix->length() == 0) {
+ partID = MCSTR("1");
+ }
+ else {
+ partID = partIDPrefix;
+ }
+ return recursiveSetupPartIDWithMessagePart((MessagePart *) part, partID);
+ }
+ case PartTypeMultipartMixed:
+ case PartTypeMultipartRelated:
+ case PartTypeMultipartAlternative:
+ case PartTypeMultipartSigned:
+ return recursiveSetupPartIDWithMultipart((Multipart *) part, partIDPrefix);
+ default:
+ MCAssert(0);
+ }
+}
+
+void MessageParser::recursiveSetupPartIDWithSinglePart(mailcore::Attachment * part,
+ mailcore::String * partIDPrefix)
+{
+ part->setPartID(partIDPrefix);
+}
+
+void MessageParser::recursiveSetupPartIDWithMessagePart(mailcore::MessagePart * part,
+ mailcore::String * partIDPrefix)
+{
+ part->setPartID(partIDPrefix);
+ String * partID = NULL;
+ switch (part->mainPart()->partType()) {
+ case PartTypeSingle:
+ case PartTypeMessage:
+ {
+ if (partIDPrefix->length() == 0) {
+ partID = MCSTR("1");
+ }
+ else {
+ partID = partIDPrefix->stringByAppendingUTF8Characters(".1");
+ }
+ break;
+ }
+ default:
+ partID = partIDPrefix;
+ break;
+ }
+ recursiveSetupPartIDWithPart(part->mainPart(), partID);
+}
+
+void MessageParser::recursiveSetupPartIDWithMultipart(mailcore::Multipart * part,
+ mailcore::String * partIDPrefix)
+{
+ part->setPartID(partIDPrefix);
+ mc_foreacharrayIndex(idx, AbstractPart, subpart, part->parts()) {
+ String * partID = NULL;
+ if (partIDPrefix->length() == 0) {
+ partID = String::stringWithUTF8Format("%u", idx + 1);
+ }
+ else {
+ partID = partIDPrefix->stringByAppendingUTF8Format(".%u", idx + 1);
+ }
+ recursiveSetupPartIDWithPart(subpart, partID);
+ }
+}
+
static void * createObject()
{
return new MessageParser();