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
|
#include "MCMessageParser.h"
#include <libetpan/libetpan.h>
#include "MCAttachment.h"
#include "MCMessageHeader.h"
#include "MCHTMLRenderer.h"
#include "HTMLBodyRendererTemplateCallback.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;
}
MessageParser::MessageParser(Data * data)
{
init();
mData = (Data *) data->retain();
mailmessage * msg;
struct mailmime * mime;
msg = data_message_init(data->bytes(), data->length());
mailmessage_get_bodystructure(msg, &mime);
mMainPart = (AbstractPart *) Attachment::attachmentsWithMIME(msg->msg_mime)->retain();
mMainPart->applyUniquePartID();
header()->importIMFFields(msg->msg_fields);
mailmessage_free(msg);
}
MessageParser::MessageParser(MessageParser * 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);
}
AbstractPart * MessageParser::mainPart()
{
return mMainPart;
}
Data * MessageParser::data()
{
return mData;
}
String * MessageParser::description()
{
String * result = String::string();
result->appendUTF8Format("<%s:%p ", MCUTF8(className()), this);
result->appendUTF8Format("<%p>", mMainPart);
result->appendString(mMainPart->description());
result->appendUTF8Characters(">");
return result;
}
Object * MessageParser::copy()
{
return new MessageParser(this);
}
AbstractPart * MessageParser::partForContentID(String * contentID)
{
return mainPart()->partForContentID(contentID);
}
AbstractPart * MessageParser::partForUniqueID(String * uniqueID)
{
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()
{
String * html = htmlBodyRendering();
String * plainTextBodyString = html->flattenHTML();
plainTextBodyString->replaceOccurrencesOfString(MCSTR("\t"), MCSTR(" "));
plainTextBodyString->replaceOccurrencesOfString(MCSTR("\n"), MCSTR(" "));
plainTextBodyString->replaceOccurrencesOfString(MCSTR("\v"), MCSTR(" "));
plainTextBodyString->replaceOccurrencesOfString(MCSTR("\f"), MCSTR(" "));
plainTextBodyString->replaceOccurrencesOfString(MCSTR("\r"), MCSTR(" "));
while (plainTextBodyString->replaceOccurrencesOfString(MCSTR(" "), MCSTR(" "))) {
// do nothing.
}
return plainTextBodyString;
}
|