aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/renderer/MCHTMLRendererCallback.cc
blob: edaf7e923e0c3781d6698ac2ad942acad97151e5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
//
//  MCHTMLRendererCallback.cpp
//  mailcore2
//
//  Created by DINH Viêt Hoà on 2/2/13.
//  Copyright (c) 2013 MailCore. All rights reserved.
//

#include "MCHTMLRendererCallback.h"

#include "MCAddressDisplay.h"
#include "MCDateFormatter.h"
#include "MCSizeFormatter.h"
#include "MCAttachment.h"

using namespace mailcore;

mailcore::HashMap * HTMLRendererTemplateCallback::templateValuesForHeader(mailcore::MessageHeader * header)
{
    mailcore::HashMap * result = mailcore::HashMap::hashMap();
    
    if (header->from() != NULL) {
        result->setObjectForKey(MCSTR("HASFROM"), mailcore::HashMap::hashMap());
        result->setObjectForKey(MCSTR("FROM"), mailcore::AddressDisplay::displayStringForAddress(header->from())->htmlEncodedString());
        result->setObjectForKey(MCSTR("SHORTFROM"), mailcore::AddressDisplay::shortDisplayStringForAddress(header->from())->htmlEncodedString());
        result->setObjectForKey(MCSTR("VERYSHORTFROM"), mailcore::AddressDisplay::veryShortDisplayStringForAddress(header->from())->htmlEncodedString());
    }
    else {
        result->setObjectForKey(MCSTR("NOFROM"), mailcore::HashMap::hashMap());
    }
    
    if ((header->to() != NULL) && (header->to()->count() > 0)) {
        result->setObjectForKey(MCSTR("HASTO"), mailcore::HashMap::hashMap());
        result->setObjectForKey(MCSTR("TO"), mailcore::AddressDisplay::displayStringForAddresses(header->to())->htmlEncodedString());
        result->setObjectForKey(MCSTR("SHORTTO"), mailcore::AddressDisplay::shortDisplayStringForAddresses(header->to())->htmlEncodedString());
        result->setObjectForKey(MCSTR("VERYSHORTTO"), mailcore::AddressDisplay::veryShortDisplayStringForAddresses(header->to())->htmlEncodedString());
    }
    else {
        result->setObjectForKey(MCSTR("NOTO"), mailcore::HashMap::hashMap());
    }
    
    if ((header->cc() != NULL) && (header->cc()->count() > 0)) {
        result->setObjectForKey(MCSTR("HASCC"), mailcore::HashMap::hashMap());
        result->setObjectForKey(MCSTR("CC"), mailcore::AddressDisplay::displayStringForAddresses(header->cc())->htmlEncodedString());
        result->setObjectForKey(MCSTR("SHORTCC"), mailcore::AddressDisplay::shortDisplayStringForAddresses(header->cc())->htmlEncodedString());
        result->setObjectForKey(MCSTR("VERYSHORTCC"), mailcore::AddressDisplay::veryShortDisplayStringForAddresses(header->cc())->htmlEncodedString());
    }
    else {
        result->setObjectForKey(MCSTR("NOCC"), mailcore::HashMap::hashMap());
    }
    
    if ((header->bcc() != NULL) && (header->bcc()->count() > 0)) {
        result->setObjectForKey(MCSTR("HASBCC"), mailcore::HashMap::hashMap());
        result->setObjectForKey(MCSTR("BCC"), mailcore::AddressDisplay::displayStringForAddresses(header->bcc())->htmlEncodedString());
        result->setObjectForKey(MCSTR("SHORTBCC"), mailcore::AddressDisplay::shortDisplayStringForAddresses(header->bcc())->htmlEncodedString());
        result->setObjectForKey(MCSTR("VERYSHORTBCC"), mailcore::AddressDisplay::veryShortDisplayStringForAddresses(header->bcc())->htmlEncodedString());
    }
    else {
        result->setObjectForKey(MCSTR("NOBCC"), mailcore::HashMap::hashMap());
    }
    
    mailcore::Array * recipient = new mailcore::Array();
    recipient->addObjectsFromArray(header->to());
    recipient->addObjectsFromArray(header->cc());
    recipient->addObjectsFromArray(header->bcc());
    
    if (recipient->count() > 0) {
        result->setObjectForKey(MCSTR("HASRECIPIENT"), mailcore::HashMap::hashMap());
        result->setObjectForKey(MCSTR("RECIPIENT"), mailcore::AddressDisplay::displayStringForAddresses(recipient)->htmlEncodedString());
        result->setObjectForKey(MCSTR("SHORTRECIPIENT"), mailcore::AddressDisplay::shortDisplayStringForAddresses(recipient)->htmlEncodedString());
        result->setObjectForKey(MCSTR("VERYSHORTRECIPIENT"), mailcore::AddressDisplay::veryShortDisplayStringForAddresses(recipient)->htmlEncodedString());
    }
    else {
        result->setObjectForKey(MCSTR("NORECIPIENT"), mailcore::HashMap::hashMap());
    }
    recipient->release();
    
    if ((header->replyTo() != NULL) && (header->replyTo()->count() > 0)) {
        result->setObjectForKey(MCSTR("HASREPLYTO"), mailcore::HashMap::hashMap());
        result->setObjectForKey(MCSTR("REPLYTO"), mailcore::AddressDisplay::displayStringForAddresses(header->replyTo())->htmlEncodedString());
        result->setObjectForKey(MCSTR("SHORTREPLYTO"), mailcore::AddressDisplay::shortDisplayStringForAddresses(header->replyTo())->htmlEncodedString());
        result->setObjectForKey(MCSTR("VERYSHORTREPLYTO"), mailcore::AddressDisplay::veryShortDisplayStringForAddresses(header->replyTo())->htmlEncodedString());
    }
    else {
        result->setObjectForKey(MCSTR("NOREPLYTO"), mailcore::HashMap::hashMap());
    }
    
    if ((header->subject() != NULL) && (header->subject()->length() > 0)) {
        result->setObjectForKey(MCSTR("EXTRACTEDSUBJECT"), header->partialExtractedSubject()->htmlEncodedString());
        result->setObjectForKey(MCSTR("SUBJECT"), header->subject()->htmlEncodedString());
        result->setObjectForKey(MCSTR("HASSUBJECT"), mailcore::HashMap::hashMap());
    }
    else {
        result->setObjectForKey(MCSTR("NOSUBJECT"), mailcore::HashMap::hashMap());
    }
    
    mailcore::String * dateString;
    static mailcore::DateFormatter * fullFormatter = NULL;
    if (fullFormatter == NULL) {
        fullFormatter = new mailcore::DateFormatter();
        fullFormatter->setDateStyle(mailcore::DateFormatStyleFull);
        fullFormatter->setTimeStyle(mailcore::DateFormatStyleFull);
    }
    dateString = fullFormatter->stringFromDate(header->date());
    if (dateString != NULL) {
        result->setObjectForKey(MCSTR("FULLDATE"), dateString->htmlEncodedString());
    }
    static mailcore::DateFormatter * longFormatter = NULL;
    if (longFormatter == NULL) {
        longFormatter = new mailcore::DateFormatter();
        longFormatter->setDateStyle(mailcore::DateFormatStyleLong);
        longFormatter->setTimeStyle(mailcore::DateFormatStyleLong);
    }
    dateString = longFormatter->stringFromDate(header->date());
    if (dateString != NULL) {
        result->setObjectForKey(MCSTR("LONGDATE"), dateString->htmlEncodedString());
    }
    static mailcore::DateFormatter * mediumFormatter = NULL;
    if (mediumFormatter == NULL) {
        mediumFormatter = new mailcore::DateFormatter();
        mediumFormatter->setDateStyle(mailcore::DateFormatStyleMedium);
        mediumFormatter->setTimeStyle(mailcore::DateFormatStyleMedium);
    }
    dateString = mediumFormatter->stringFromDate(header->date());
    if (dateString != NULL) {
        result->setObjectForKey(MCSTR("MEDIUMDATE"), dateString->htmlEncodedString());
    }
    static mailcore::DateFormatter * shortFormatter = NULL;
    if (shortFormatter == NULL) {
        shortFormatter = new mailcore::DateFormatter();
        shortFormatter->setDateStyle(mailcore::DateFormatStyleShort);
        shortFormatter->setTimeStyle(mailcore::DateFormatStyleShort);
    }
    dateString = shortFormatter->stringFromDate(header->date());
    if (dateString != NULL) {
        result->setObjectForKey(MCSTR("SHORTDATE"), dateString->htmlEncodedString());
    }
    
    return result;
}

mailcore::HashMap * HTMLRendererTemplateCallback::templateValuesForPart(mailcore::AbstractPart * part)
{
    mailcore::HashMap * result = mailcore::HashMap::hashMap();
    mailcore::String * filename = NULL;
    
    if (part->filename() != NULL) {
        filename = part->filename()->lastPathComponent();
    }
    
    if (filename != NULL) {
        result->setObjectForKey(MCSTR("FILENAME"), filename->htmlEncodedString());
        result->setObjectForKey(MCSTR("HASFILENAME"), mailcore::HashMap::hashMap());
    }
    else {
        result->setObjectForKey(MCSTR("NOFILENAME"), mailcore::HashMap::hashMap());
    }
    
    if (part->className()->isEqual(MCSTR("mailcore::IMAPPart"))) {
        mailcore::IMAPPart * imapPart = (mailcore::IMAPPart *) part;
        mailcore::String * value = mailcore::SizeFormatter::stringWithSize(imapPart->decodedSize());
        result->setObjectForKey(MCSTR("SIZE"), value);
        result->setObjectForKey(MCSTR("HASSIZE"), mailcore::HashMap::hashMap());
    }
    else if (part->className()->isEqual(MCSTR("mailcore::Attachment"))) {
        mailcore::Attachment * attachment = (mailcore::Attachment *) part;
        mailcore::String * value = mailcore::SizeFormatter::stringWithSize(attachment->data()->length());
        result->setObjectForKey(MCSTR("SIZE"), value);
        result->setObjectForKey(MCSTR("HASSIZE"), mailcore::HashMap::hashMap());
    }
    else {
        result->setObjectForKey(MCSTR("NOSIZE"), mailcore::HashMap::hashMap());
    }
    
    if (part->contentID() != NULL) {
        result->setObjectForKey(MCSTR("CONTENTID"), part->contentID());
    }
    if (part->uniqueID() != NULL) {
        result->setObjectForKey(MCSTR("UNIQUEID"), part->uniqueID());
    }
    
    return result;
}

mailcore::String * HTMLRendererTemplateCallback::templateForMainHeader(MessageHeader * header)
{
    return MCSTR("<div style=\"background-color:#eee\">\
                 {{#HASFROM}}\
                 <div><b>From:</b> {{FROM}}</div>\
                 {{/HASFROM}}\
                 {{#HASTO}}\
                 <div><b>To:</b> {{TO}}</div>\
                 {{/HASTO}}\
                 {{#HASCC}}\
                 <div><b>Cc:</b> {{CC}}</div>\
                 {{/HASCC}}\
                 {{#HASBCC}}\
                 <div><b>Bcc:</b> {{BCC}}</div>\
                 {{/HASBCC}}\
                 {{#NORECIPIENT}}\
                 <div><b>To:</b> <i>Undisclosed recipient</i></div>\
                 {{/NORECIPIENT}}\
                 {{#HASSUBJECT}}\
                 <div><b>Subject:</b> {{EXTRACTEDSUBJECT}}</div>\
                 {{/HASSUBJECT}}\
                 {{#NOSUBJECT}}\
                 <div><b>Subject:</b> <i>No Subject</i></div>\
                 {{/NOSUBJECT}}\
                 <div><b>Date:</b> {{LONGDATE}}</div>\
                 </div>");
}

mailcore::String * HTMLRendererTemplateCallback::templateForEmbeddedMessageHeader(MessageHeader * header)
{
    return templateForMainHeader(header);
}

mailcore::String * HTMLRendererTemplateCallback::templateForImage(AbstractPart * part)
{
    return MCSTR("");
}

mailcore::String * HTMLRendererTemplateCallback::templateForAttachment(AbstractPart * part)
{
    return MCSTR("{{#HASSIZE}}\
                 {{#HASFILENAME}}\
                 <div>- {{FILENAME}}, {{SIZE}}</div>\
                 {{/HASFILENAME}}\
                 {{#NOFILENAME}}\
                 <div>- Untitled, {{SIZE}}</div>\
                 {{/NOFILENAME}}\
                 {{/HASSIZE}}\
                 {{#NOSIZE}}\
                 {{#HASFILENAME}}\
                 <div>- {{FILENAME}}</div>\
                 {{/HASFILENAME}}\
                 {{#NOFILENAME}}\
                 <div>- Untitled</div>\
                 {{/NOFILENAME}}\
                 {{/NOSIZE}}\
                 ");
}

mailcore::String * HTMLRendererTemplateCallback::templateForMessage(AbstractMessage * message)
{
    return MCSTR("<div style=\"padding-bottom: 20px;\">{{HEADER}}</div><div>{{BODY}}</div>");
}


mailcore::String * HTMLRendererTemplateCallback::templateForEmbeddedMessage(AbstractMessagePart * part)
{
    return MCSTR("<div style=\"padding-bottom: 20px;\">{{HEADER}}</div><div>{{BODY}}</div>");
}

mailcore::String * HTMLRendererTemplateCallback::templateForAttachmentSeparator()
{
    return MCSTR("<hr/>");
}

mailcore::String * HTMLRendererTemplateCallback::filterHTMLForMessage(mailcore::String * html)
{
    return html;
}

mailcore::String * HTMLRendererTemplateCallback::cleanHTMLForPart(mailcore::String * html)
{
    return html->cleanedHTMLString();
}

mailcore::String * HTMLRendererTemplateCallback::filterHTMLForPart(mailcore::String * html)
{
    return html;
}

bool HTMLRendererTemplateCallback::canPreviewPart(AbstractPart * part)
{
    return false;
}

bool HTMLRendererTemplateCallback::shouldShowPart(AbstractPart * part)
{
    return true;
}