diff options
author | Hoa V. DINH <dinh.viet.hoa@gmail.com> | 2016-05-01 22:54:40 -0700 |
---|---|---|
committer | Hoa V. DINH <dinh.viet.hoa@gmail.com> | 2016-05-01 22:54:40 -0700 |
commit | 5b9afdca3c850e7b33ac9555e8dc3e5e77d4e241 (patch) | |
tree | ed5a01295758618b4e96b5017cbadccf59154c5a /src/core/renderer/MCHTMLRenderer.cpp | |
parent | 7f4125a9f28c9509c7cc2735c844a50e433501b2 (diff) |
Added partID to RFC 822 messages, provided a way to retrieve data for serialized MessageParser
Diffstat (limited to 'src/core/renderer/MCHTMLRenderer.cpp')
-rw-r--r-- | src/core/renderer/MCHTMLRenderer.cpp | 53 |
1 files changed, 36 insertions, 17 deletions
diff --git a/src/core/renderer/MCHTMLRenderer.cpp b/src/core/renderer/MCHTMLRenderer.cpp index c42bcb45..4c149df9 100644 --- a/src/core/renderer/MCHTMLRenderer.cpp +++ b/src/core/renderer/MCHTMLRenderer.cpp @@ -16,7 +16,7 @@ using namespace mailcore; -class HTMLRendererIMAPDummyCallback : public HTMLRendererIMAPCallback { +class HTMLRendererIMAPDummyCallback : public HTMLRendererIMAPCallback, public HTMLRendererRFC822Callback { private: Array *mRequiredParts; @@ -44,6 +44,12 @@ public: return mRequiredParts; } + virtual Data * dataForRFC822Part(String * folder, Attachment * part) + { + mRequiredParts->addObject(part); + return Data::data(); + } + }; enum { @@ -53,7 +59,8 @@ enum { }; struct htmlRendererContext { - HTMLRendererIMAPCallback * dataCallback; + HTMLRendererIMAPCallback * imapDataCallback; + HTMLRendererRFC822Callback * rfc822DataCallback; HTMLRendererTemplateCallback * htmlCallback; int firstRendered; String * folder; @@ -82,6 +89,7 @@ static String * renderTemplate(String * templateContent, HashMap * values); static String * htmlForAbstractMessage(String * folder, AbstractMessage * message, HTMLRendererIMAPCallback * dataCallback, + HTMLRendererRFC822Callback * rfc822DataCallback, HTMLRendererTemplateCallback * htmlCallback, Array * attachments, Array * relatedAttachments); @@ -176,7 +184,8 @@ static bool messagePartContainsMimeType(AbstractMessagePart * part, String * mim } static String * htmlForAbstractMessage(String * folder, AbstractMessage * message, - HTMLRendererIMAPCallback * dataCallback, + HTMLRendererIMAPCallback * imapDataCallback, + HTMLRendererRFC822Callback * rfc822DataCallback, HTMLRendererTemplateCallback * htmlCallback, Array * attachments, Array * relatedAttachments) @@ -197,7 +206,8 @@ static String * htmlForAbstractMessage(String * folder, AbstractMessage * messag MCAssert(mainPart != NULL); htmlRendererContext context; - context.dataCallback = dataCallback; + context.imapDataCallback = imapDataCallback; + context.rfc822DataCallback = rfc822DataCallback; context.htmlCallback = htmlCallback; context.relatedAttachments = NULL; context.attachments = NULL; @@ -310,10 +320,15 @@ static String * htmlForAbstractSinglePart(AbstractPart * part, htmlRendererConte String * charset = part->charset(); Data * data = NULL; if (part->className()->isEqual(MCSTR("mailcore::IMAPPart"))) { - data = context->dataCallback->dataForIMAPPart(context->folder, (IMAPPart *) part); + data = context->imapDataCallback->dataForIMAPPart(context->folder, (IMAPPart *) part); } else if (part->className()->isEqual(MCSTR("mailcore::Attachment"))) { data = ((Attachment *) part)->data(); + if (data == NULL) { + // It may be NULL when mailcore::MessageParser::attachments() is invoked when + // when mailcore::MessageParser has been serialized/unserialized. + data = context->rfc822DataCallback->dataForRFC822Part(context->folder, (Attachment *) part); + } MCAssert(data != NULL); } if (data == NULL) @@ -329,12 +344,15 @@ static String * htmlForAbstractSinglePart(AbstractPart * part, htmlRendererConte String * charset = part->charset(); Data * data = NULL; if (part->className()->isEqual(MCSTR("mailcore::IMAPPart"))) { - data = context->dataCallback->dataForIMAPPart(context->folder, (IMAPPart *) part); + data = context->imapDataCallback->dataForIMAPPart(context->folder, (IMAPPart *) part); } else if (part->className()->isEqual(MCSTR("mailcore::Attachment"))) { data = ((Attachment *) part)->data(); - // It may be NULL when mailcore::MessageParser::attachments() is invoked when - // when mailcore::MessageParser has been serialized/unserialized. + if (data == NULL) { + // It may be NULL when mailcore::MessageParser::attachments() is invoked when + // when mailcore::MessageParser has been serialized/unserialized. + data = context->rfc822DataCallback->dataForRFC822Part(context->folder, (Attachment *) part); + } } if (data == NULL) return NULL; @@ -381,7 +399,7 @@ static String * htmlForAbstractSinglePart(AbstractPart * part, htmlRendererConte if (context->htmlCallback->canPreviewPart(part)) { if (part->className()->isEqual(MCSTR("mailcore::IMAPPart"))) { - context->dataCallback->prefetchImageIMAPPart(context->folder, (IMAPPart *) part); + context->imapDataCallback->prefetchImageIMAPPart(context->folder, (IMAPPart *) part); } String * url = String::stringWithUTF8Format("x-mailcore-image:%s", part->uniqueID()->UTF8Characters()); @@ -391,7 +409,7 @@ static String * htmlForAbstractSinglePart(AbstractPart * part, htmlRendererConte } else { if (part->className()->isEqual(MCSTR("mailcore::IMAPPart"))) { - context->dataCallback->prefetchAttachmentIMAPPart(context->folder, (IMAPPart *) part); + context->imapDataCallback->prefetchAttachmentIMAPPart(context->folder, (IMAPPart *) part); } HashMap * values = context->htmlCallback->templateValuesForPart(part); content = renderTemplate(context->htmlCallback->templateForAttachment(part), values); @@ -552,9 +570,10 @@ static String * renderTemplate(String * templateContent, HashMap * values) } String * HTMLRenderer::htmlForRFC822Message(MessageParser * message, + HTMLRendererRFC822Callback * dataCallback, HTMLRendererTemplateCallback * htmlCallback) { - return htmlForAbstractMessage(NULL, message, NULL, htmlCallback, NULL, NULL); + return htmlForAbstractMessage(NULL, message, NULL, dataCallback, htmlCallback, NULL, NULL); } String * HTMLRenderer::htmlForIMAPMessage(String * folder, @@ -562,14 +581,14 @@ String * HTMLRenderer::htmlForIMAPMessage(String * folder, HTMLRendererIMAPCallback * dataCallback, HTMLRendererTemplateCallback * htmlCallback) { - return htmlForAbstractMessage(folder, message, dataCallback, htmlCallback, NULL, NULL); + return htmlForAbstractMessage(folder, message, dataCallback, NULL, htmlCallback, NULL, NULL); } Array * HTMLRenderer::attachmentsForMessage(AbstractMessage * message) { Array * attachments = Array::array(); - HTMLRendererIMAPCallback * dataCallback = new HTMLRendererIMAPDummyCallback(); - String * ignoredResult = htmlForAbstractMessage(NULL, message, dataCallback, NULL, attachments, NULL); + HTMLRendererIMAPDummyCallback * dataCallback = new HTMLRendererIMAPDummyCallback(); + String * ignoredResult = htmlForAbstractMessage(NULL, message, dataCallback, dataCallback, NULL, attachments, NULL); delete dataCallback; dataCallback = NULL; (void) ignoredResult; // remove unused variable warning. @@ -579,8 +598,8 @@ Array * HTMLRenderer::attachmentsForMessage(AbstractMessage * message) Array * HTMLRenderer::htmlInlineAttachmentsForMessage(AbstractMessage * message) { Array * htmlInlineAttachments = Array::array(); - HTMLRendererIMAPCallback * dataCallback = new HTMLRendererIMAPDummyCallback(); - String * ignoredResult = htmlForAbstractMessage(NULL, message, dataCallback, NULL, NULL, htmlInlineAttachments); + HTMLRendererIMAPDummyCallback * dataCallback = new HTMLRendererIMAPDummyCallback(); + String * ignoredResult = htmlForAbstractMessage(NULL, message, dataCallback, dataCallback, NULL, NULL, htmlInlineAttachments); delete dataCallback; dataCallback = NULL; (void) ignoredResult; // remove unused variable warning. @@ -590,7 +609,7 @@ Array * HTMLRenderer::htmlInlineAttachmentsForMessage(AbstractMessage * message) Array * HTMLRenderer::requiredPartsForRendering(AbstractMessage * message) { HTMLRendererIMAPDummyCallback * dataCallback = new HTMLRendererIMAPDummyCallback(); - String * ignoredResult = htmlForAbstractMessage(NULL, message, dataCallback, NULL, NULL, NULL); + String * ignoredResult = htmlForAbstractMessage(NULL, message, dataCallback, dataCallback, NULL, NULL, NULL); Array *requiredParts = dataCallback->requiredParts(); |