Merge lp:~zorba-coders/zorba/email_sausalito_fixes_r2651_and_r2676 into lp:zorba/email-module

Proposed by Gabriel Petrovay
Status: Merged
Approved by: Gabriel Petrovay
Approved revision: 42
Merged at revision: 43
Proposed branch: lp:~zorba-coders/zorba/email_sausalito_fixes_r2651_and_r2676
Merge into: lp:zorba/email-module
Diff against target: 228 lines (+115/-18)
4 files modified
examples/Queries/imap/mimetypes_example.xq (+44/-0)
src/com/zorba-xquery/www/modules/email/email.xsd (+4/-3)
src/com/zorba-xquery/www/modules/email/imap.xq.src/imap_function.cpp (+50/-7)
src/com/zorba-xquery/www/modules/email/imap.xq.src/imap_function.h (+17/-8)
To merge this branch: bzr merge lp:~zorba-coders/zorba/email_sausalito_fixes_r2651_and_r2676
Reviewer Review Type Date Requested Status
Gabriel Petrovay (community) Approve
David Graf (community) Approve
Review via email: mp+88236@code.launchpad.net

Commit message

Adds a couple of fixes from Sausalito r2651 and r2676

Description of the change

Adds a couple of fixes from Sausalito r2651 and r2676

To post a comment you must log in.
Revision history for this message
David Graf (davidagraf) :
review: Approve
Revision history for this message
Gabriel Petrovay (gabipetrovay) :
review: Approve
Revision history for this message
Zorba Build Bot (zorba-buildbot) wrote :
Revision history for this message
Zorba Build Bot (zorba-buildbot) wrote :

Validation queue job email_sausalito_fixes_r2651_and_r2676-2012-01-24T11-09-44.273Z is finished. The final status was:

All tests succeeded!

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== added file 'examples/Queries/imap/mimetypes_example.xq'
2--- examples/Queries/imap/mimetypes_example.xq 1970-01-01 00:00:00 +0000
3+++ examples/Queries/imap/mimetypes_example.xq 2012-01-11 16:58:27 +0000
4@@ -0,0 +1,44 @@
5+(:
6+ : This should issue 4
7+ :)
8+
9+import schema namespace email = 'http://www.zorba-xquery.com/modules/email';
10+
11+let $messages :=
12+ for $type in ("application/3gpp-ims+xml","application/cals-1840","application/pkcs7-signature","application/vnd.openxmlformats-officedocument.presentationml.comments+xml")
13+ return
14+ fn:validate {
15+ <email:message xmlns:email="http://www.zorba-xquery.com/modules/email/email">
16+ <envelope>
17+ <date>2010-11-26T15:50:39</date>
18+ <from>
19+ <email>zorba.smtp.sender@gmail.com</email>
20+ </from>
21+ <sender>
22+ <email>zorba.smtp.sender@gmail.com</email>
23+ </sender>
24+ <replyTo>
25+ <email>zorba.smtp.sender@gmail.com</email>
26+ </replyTo>
27+ <subject>RegexTest</subject>
28+ <recipient>
29+ <to>
30+ <email>imaptest@28msec.com</email>
31+ </to>
32+ </recipient>
33+ <messageId>&lt;4ea85e91.679e440a.0f97.241e@mx.google.com&gt;</messageId>
34+ <flags>
35+ <seen/>
36+ </flags>
37+ </envelope>
38+ <mimeVersion>1.0</mimeVersion>
39+ <body>
40+ <multipart contentType="multipart/mixed" charset="us-ascii" contentTransferEncoding="ENC7BIT">
41+ <content contentType="text/plain" charset="us-ascii" contentTransferEncoding="ENCQUOTEDPRINTABLE">=0A Zorba really rocks. =0A </content>
42+ <content contentType="{$type}" charset="us-ascii" contentTransferEncoding="ENCBASE64" contentDisposition="the-truth.gif">some content</content>
43+ </multipart>
44+ </body>
45+ </email:message>
46+ }
47+return
48+ fn:count($messages)
49
50=== modified file 'src/com/zorba-xquery/www/modules/email/email.xsd'
51--- src/com/zorba-xquery/www/modules/email/email.xsd 2011-09-14 07:34:28 +0000
52+++ src/com/zorba-xquery/www/modules/email/email.xsd 2012-01-11 16:58:27 +0000
53@@ -127,7 +127,7 @@
54 <!-- definition of simple elements -->
55 <simpleType name="contentTypeValue">
56 <restriction base="string">
57- <pattern value="[a-zA-Z]+/[a-zA-Z]+((\-|\+|\.)[a-zA-Z]+)*"/>
58+ <pattern value="[a-zA-Z]+/[a-zA-Z0-9\-\+\.]+"/>
59 </restriction>
60 </simpleType>
61
62@@ -146,7 +146,7 @@
63 <attribute name="contentDisposition" type="string"/>
64 <attribute name="contentDisposition-filename" type="string"/>
65 <attribute name="contentDisposition-modification-date" type="dateTime"/>
66- <attribute name="content-id" type="string" />
67+ <attribute name="content-id" type="string"/>
68 </extension>
69 </simpleContent>
70 </complexType>
71@@ -155,10 +155,11 @@
72 <choice maxOccurs="unbounded">
73 <element name="content" type="tns:contentType" minOccurs="1"/>
74 <element name="multipart" type="tns:multipartType" minOccurs="1"/>
75- </choice>
76+ </choice>
77 <attribute name="contentType" type="tns:contentTypeValue"/>
78 <attribute name="charset" type="string" default="us-ascii"/>
79 <attribute name="contentTransferEncoding" type="tns:cteType" default="ENC7BIT"/>
80+ <attribute name="contentDisposition" type="string"/>
81 </complexType>
82
83 <complexType name="bodyTypeChoice">
84
85=== modified file 'src/com/zorba-xquery/www/modules/email/imap.xq.src/imap_function.cpp'
86--- src/com/zorba-xquery/www/modules/email/imap.xq.src/imap_function.cpp 2011-10-05 13:00:46 +0000
87+++ src/com/zorba-xquery/www/modules/email/imap.xq.src/imap_function.cpp 2012-01-11 16:58:27 +0000
88@@ -176,7 +176,7 @@
89 // then push MM
90 // build up map for Months
91
92- std::string lMonths = "JanFebMarAprMayJunJulAugSepOctNovDez";
93+ std::string lMonths = "JanFebMarAprMayJunJulAugSepOctNovDec";
94 size_t lMonthNumber = lMonths.find(lTokens[2]);
95 // if the month was not found, were really in trouble!
96 if (lMonthNumber == std::string::npos) {
97@@ -633,7 +633,6 @@
98 lBodies.erase(lBodies.begin());
99 // get different attributes that we will need in any case, regardless if this is a content or multipart item
100 std::string lContentType = getContentType(lCurrentBody->type, lCurrentBody->subtype);
101- std::string lEncoding = getEncoding(lCurrentBody->encoding);
102 std::string lContentDisposition = "";
103 if (lCurrentBody->disposition.type != NIL) {
104 lContentDisposition = cpystr(lCurrentBody->disposition.type);
105@@ -680,15 +679,29 @@
106 lParam = lParam->next;
107 }
108
109+ std::string lTransferEncodingDecoded;
110+ unsigned short lEncoding = lCurrentBody->encoding;
111+ // decode the body according the transfer encoding if it is quoted-printable
112+ decodeTextualTransferEncoding(lBodyContent, lContentType, lEncoding, lTransferEncodingDecoded);
113+
114 // decode the body according to the charset
115- std::string lDecoded;
116- toUtf8(lBodyContent, lCharset, lDecoded);
117+ std::string lCharsetDecoded;
118+ toUtf8(lTransferEncodingDecoded, lCharset, lCharsetDecoded);
119
120- createContentNode(lCurrentParent, lDecoded, lContentType, "us-ascii", lEncoding, lContentDisposition, lContentDispositionFilename, lContentDispositionModificationDate, lContentId);
121+ createContentNode(lCurrentParent, lCharsetDecoded, lContentType,
122+ "utf-8", getEncoding(lEncoding), lContentDisposition,
123+ lContentDispositionFilename, lContentDispositionModificationDate,
124+ lContentId);
125
126 } else {
127- lMultipartParent = theModule->getItemFactory()->createElementNode(lCurrentParent, lMultipartParentName, lMultipartParentType, false, false, ns_binding);
128- createContentTypeAttributes(lMultipartParent, lContentType, "us-ascii", lEncoding, lContentDisposition, lContentDispositionFilename, lContentDispositionModificationDate);
129+ lMultipartParent = theModule->getItemFactory()->createElementNode(
130+ lCurrentParent, lMultipartParentName, lMultipartParentType, false,
131+ false, ns_binding);
132+
133+ createContentTypeAttributes(lMultipartParent, lContentType, "utf-8",
134+ getEncoding(lCurrentBody->encoding), lContentDisposition,
135+ lContentDispositionFilename, lContentDispositionModificationDate);
136+
137 PART* lPart = lCurrentBody->nested.part;
138 lBodies.insert(lBodies.begin(), &lPart->body);
139 lParents.insert(lParents.begin(), lMultipartParent);
140@@ -833,5 +846,35 @@
141 }
142
143
144+void
145+ImapFunction::decodeTextualTransferEncoding(
146+ const std::string& aValue,
147+ const std::string& aContentType,
148+ unsigned short& aEncoding,
149+ std::string& aResult) const
150+{
151+ if (aEncoding == ENCQUOTEDPRINTABLE) {
152+ unsigned long lNewLength;
153+ void* lNewData = rfc822_qprint((unsigned char*)aValue.c_str(), aValue.length(), &lNewLength);
154+ aResult = std::string((char *)lNewData, lNewLength);
155+ fs_give(&lNewData);
156+ aEncoding = ENC8BIT;
157+ }
158+ else if (aEncoding == ENCBASE64 &&
159+ (
160+ aContentType.find("text") != std::string::npos
161+ || aContentType.find("xml") != std::string::npos
162+ )) {
163+ unsigned long lNewLength;
164+ void* lNewData = rfc822_base64((unsigned char*)aValue.c_str(), aValue.length(), &lNewLength);
165+ aResult = std::string((char *)lNewData, lNewLength);
166+ fs_give(&lNewData);
167+ aEncoding = ENC8BIT;
168+ }
169+ else {
170+ aResult = aValue;
171+ }
172+}
173+
174 } /* namespace emailmodule */
175 } /* namespace zorba */
176
177=== modified file 'src/com/zorba-xquery/www/modules/email/imap.xq.src/imap_function.h'
178--- src/com/zorba-xquery/www/modules/email/imap.xq.src/imap_function.h 2011-10-05 13:00:46 +0000
179+++ src/com/zorba-xquery/www/modules/email/imap.xq.src/imap_function.h 2012-01-11 16:58:27 +0000
180@@ -34,7 +34,7 @@
181 {
182 protected:
183 const ImapModule* theModule;
184- static const char* SCHEMA_NAMESPACE;
185+ static const char* SCHEMA_NAMESPACE;
186
187 void
188 raiseImapError(
189@@ -149,16 +149,22 @@
190
191 void
192 getMessage(
193- Item& aParent,
194- const std::string& aHostName,
195- const std::string& aUserName,
196- const std::string& aPassword,
197- const std::string& aMailbox,
198- const unsigned long aMessageNumber,
199- const bool aUid,
200+ Item& aParent,
201+ const std::string& aHostName,
202+ const std::string& aUserName,
203+ const std::string& aPassword,
204+ const std::string& aMailbox,
205+ const unsigned long aMessageNumber,
206+ const bool aUid,
207 const bool aOnlyEnvelope) const;
208
209 void
210+ decodeTextualTransferEncoding(const std::string& aValue,
211+ const std::string& aContentType,
212+ unsigned short& aEncoding,
213+ std::string& aResult) const;
214+
215+ void
216 toUtf8(
217 const std::string& value,
218 const char* fromCharset,
219@@ -167,6 +173,9 @@
220 void
221 checkStatus(UErrorCode aStatus) const;
222
223+ /**
224+ * Decodes header of an email, e.g. the subject.
225+ */
226 void
227 decodeHeader(
228 const std::string& value,

Subscribers

People subscribed via source and target branches

to all changes: