summaryrefslogtreecommitdiff
authoralwin <alwin>2004-01-02 02:46:27 (UTC)
committer alwin <alwin>2004-01-02 02:46:27 (UTC)
commit5fbf2a6b9cda98ab16fa1f0e1ac848a9bb523a72 (patch) (unidiff)
tree3056d87b4ef4f5684f357b3aa45dd654f3b49e14
parent8bd5873a04bc8c506694d00be4111549d969fd2a (diff)
downloadopie-5fbf2a6b9cda98ab16fa1f0e1ac848a9bb523a72.zip
opie-5fbf2a6b9cda98ab16fa1f0e1ac848a9bb523a72.tar.gz
opie-5fbf2a6b9cda98ab16fa1f0e1ac848a9bb523a72.tar.bz2
mail-parts will get a path id for hierarchic structure of the content
while displaying enclosed rfc mails (like forwards) will be marked as a body-part.
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/net/mail/genericwrapper.cpp47
-rw-r--r--noncore/net/mail/genericwrapper.h2
-rw-r--r--noncore/net/mail/libmailwrapper/genericwrapper.cpp47
-rw-r--r--noncore/net/mail/libmailwrapper/genericwrapper.h2
4 files changed, 78 insertions, 20 deletions
diff --git a/noncore/net/mail/genericwrapper.cpp b/noncore/net/mail/genericwrapper.cpp
index bef6ae5..5de9299 100644
--- a/noncore/net/mail/genericwrapper.cpp
+++ b/noncore/net/mail/genericwrapper.cpp
@@ -78,155 +78,184 @@ void Genericwrapper::fillSingleBody(RecPart&target,mailmessage*,mailmime*mime)
78 } 78 }
79 } 79 }
80 } 80 }
81} 81}
82 82
83void Genericwrapper::fillParameters(RecPart&target,clist*parameters) 83void Genericwrapper::fillParameters(RecPart&target,clist*parameters)
84{ 84{
85 if (!parameters) {return;} 85 if (!parameters) {return;}
86 clistcell*current=0; 86 clistcell*current=0;
87 mailmime_parameter*param; 87 mailmime_parameter*param;
88 for (current=clist_begin(parameters);current!=0;current=clist_next(current)) { 88 for (current=clist_begin(parameters);current!=0;current=clist_next(current)) {
89 param = (mailmime_parameter*)current->data; 89 param = (mailmime_parameter*)current->data;
90 if (param) { 90 if (param) {
91 target.addParameter(QString(param->pa_name).lower(),QString(param->pa_value)); 91 target.addParameter(QString(param->pa_name).lower(),QString(param->pa_value));
92 } 92 }
93 } 93 }
94} 94}
95 95
96QString Genericwrapper::getencoding(mailmime_mechanism*aEnc) 96QString Genericwrapper::getencoding(mailmime_mechanism*aEnc)
97{ 97{
98 QString enc="7bit"; 98 QString enc="7bit";
99 if (!aEnc) return enc; 99 if (!aEnc) return enc;
100 switch(aEnc->enc_type) { 100 switch(aEnc->enc_type) {
101 case MAILMIME_MECHANISM_7BIT: 101 case MAILMIME_MECHANISM_7BIT:
102 enc = "7bit"; 102 enc = "7bit";
103 break; 103 break;
104 case MAILMIME_MECHANISM_8BIT: 104 case MAILMIME_MECHANISM_8BIT:
105 enc = "8bit"; 105 enc = "8bit";
106 break; 106 break;
107 case MAILMIME_MECHANISM_BINARY: 107 case MAILMIME_MECHANISM_BINARY:
108 enc = "binary"; 108 enc = "binary";
109 break; 109 break;
110 case MAILMIME_MECHANISM_QUOTED_PRINTABLE: 110 case MAILMIME_MECHANISM_QUOTED_PRINTABLE:
111 enc = "quoted-printable"; 111 enc = "quoted-printable";
112 break; 112 break;
113 case MAILMIME_MECHANISM_BASE64: 113 case MAILMIME_MECHANISM_BASE64:
114 enc = "base64"; 114 enc = "base64";
115 break; 115 break;
116 case MAILMIME_MECHANISM_TOKEN: 116 case MAILMIME_MECHANISM_TOKEN:
117 default: 117 default:
118 if (aEnc->enc_token) { 118 if (aEnc->enc_token) {
119 enc = QString(aEnc->enc_token); 119 enc = QString(aEnc->enc_token);
120 } 120 }
121 break; 121 break;
122 } 122 }
123 return enc; 123 return enc;
124} 124}
125 125
126void Genericwrapper::traverseBody(RecBody&target,mailmessage*message,mailmime*mime,unsigned int current_rec) 126void Genericwrapper::traverseBody(RecBody&target,mailmessage*message,mailmime*mime,QValueList<int>recList,unsigned int current_rec,int current_count)
127{ 127{
128 if (current_rec >= 10) { 128 if (current_rec >= 10) {
129 qDebug("too deep recursion!"); 129 qDebug("too deep recursion!");
130 } 130 }
131 if (!message || !mime) { 131 if (!message || !mime) {
132 return; 132 return;
133 } 133 }
134 int r; 134 int r;
135 char*data = 0; 135 char*data = 0;
136 size_t len; 136 size_t len;
137 clistiter * cur = 0; 137 clistiter * cur = 0;
138 QString b; 138 QString b;
139 RecPart part; 139 RecPart part;
140 140
141 //current_count;
142
141 switch (mime->mm_type) { 143 switch (mime->mm_type) {
142 case MAILMIME_SINGLE: 144 case MAILMIME_SINGLE:
145 {
146 QValueList<int>countlist = recList;
147 countlist.append(current_count);
143 r = mailmessage_fetch_section(message,mime,&data,&len); 148 r = mailmessage_fetch_section(message,mime,&data,&len);
144 part.setSize(len); 149 part.setSize(len);
150 part.setPositionlist(countlist);
151 b = gen_attachment_id();
152 part.setIdentifier(b);
145 fillSingleBody(part,message,mime); 153 fillSingleBody(part,message,mime);
146 if (part.Type()=="text" && target.Bodytext().isNull()) { 154 if (part.Type()=="text" && target.Bodytext().isNull()) {
147 encodedString*r = new encodedString(); 155 encodedString*r = new encodedString();
148 r->setContent(data,len); 156 r->setContent(data,len);
149 encodedString*res = decode_String(r,part.Encoding()); 157 encodedString*res = decode_String(r,part.Encoding());
150 b = QString(res->Content()); 158 b = QString(res->Content());
151 delete r; 159 delete r;
152 delete res; 160 delete res;
153 target.setBodytext(b); 161 target.setBodytext(b);
154 target.setDescription(part); 162 target.setDescription(part);
155 } else { 163 } else {
156 b = gen_attachment_id();
157 part.setIdentifier(b);
158 bodyCache[b]=new encodedString(data,len); 164 bodyCache[b]=new encodedString(data,len);
159 target.addPart(part); 165 target.addPart(part);
160 } 166 }
161 break; 167 }
168 break;
162 case MAILMIME_MULTIPLE: 169 case MAILMIME_MULTIPLE:
170 {
171 unsigned int ccount = current_count;
163 for (cur = clist_begin(mime->mm_data.mm_multipart.mm_mp_list) ; cur != NULL ; cur = clist_next(cur)) { 172 for (cur = clist_begin(mime->mm_data.mm_multipart.mm_mp_list) ; cur != NULL ; cur = clist_next(cur)) {
164 traverseBody(target,message, (mailmime*)clist_content(cur),current_rec+1); 173 traverseBody(target,message, (mailmime*)clist_content(cur),recList,current_rec+1,ccount);
174 ++ccount;
165 } 175 }
166 break; 176 }
177 break;
167 case MAILMIME_MESSAGE: 178 case MAILMIME_MESSAGE:
179 {
180 QValueList<int>countlist = recList;
181 countlist.append(current_count);
182 /* the own header is always at recursion 0 - we don't need that */
183 if (current_rec > 0) {
184 part.setPositionlist(countlist);
185 r = mailmessage_fetch_section(message,mime,&data,&len);
186 part.setSize(len);
187 part.setPositionlist(countlist);
188 b = gen_attachment_id();
189 part.setIdentifier(b);
190 part.setType("message");
191 part.setSubtype("rfc822");
192 bodyCache[b]=new encodedString(data,len);
193 target.addPart(part);
194 }
168 if (mime->mm_data.mm_message.mm_msg_mime != NULL) { 195 if (mime->mm_data.mm_message.mm_msg_mime != NULL) {
169 traverseBody(target,message,mime->mm_data.mm_message.mm_msg_mime,current_rec+1); 196 traverseBody(target,message,mime->mm_data.mm_message.mm_msg_mime,countlist,current_rec+1);
170 } 197 }
171 break; 198 }
199 break;
172 } 200 }
173} 201}
174 202
175RecBody Genericwrapper::parseMail( mailmessage * msg ) 203RecBody Genericwrapper::parseMail( mailmessage * msg )
176{ 204{
177 int err = MAILIMF_NO_ERROR; 205 int err = MAILIMF_NO_ERROR;
178 mailmime_single_fields fields; 206 mailmime_single_fields fields;
179 /* is bound to msg and will be freed there */ 207 /* is bound to msg and will be freed there */
180 mailmime * mime=0; 208 mailmime * mime=0;
181 RecBody body; 209 RecBody body;
182 memset(&fields, 0, sizeof(struct mailmime_single_fields)); 210 memset(&fields, 0, sizeof(struct mailmime_single_fields));
183 err = mailmessage_get_bodystructure(msg,&mime); 211 err = mailmessage_get_bodystructure(msg,&mime);
184 traverseBody(body,msg,mime); 212 QValueList<int>recList;
213 traverseBody(body,msg,mime,recList);
185 return body; 214 return body;
186} 215}
187 216
188RecMail *Genericwrapper::parseHeader( const char *header ) 217RecMail *Genericwrapper::parseHeader( const char *header )
189{ 218{
190 int err = MAILIMF_NO_ERROR; 219 int err = MAILIMF_NO_ERROR;
191 size_t curTok = 0; 220 size_t curTok = 0;
192 RecMail *mail = new RecMail(); 221 RecMail *mail = new RecMail();
193 mailimf_fields *fields = 0; 222 mailimf_fields *fields = 0;
194 mailimf_references * refs = 0; 223 mailimf_references * refs = 0;
195 mailimf_keywords*keys = 0; 224 mailimf_keywords*keys = 0;
196 QString status; 225 QString status;
197 QString value; 226 QString value;
198 QBitArray mFlags(7); 227 QBitArray mFlags(7);
199 228
200 err = mailimf_fields_parse( (char *) header, strlen( header ), &curTok, &fields ); 229 err = mailimf_fields_parse( (char *) header, strlen( header ), &curTok, &fields );
201 for ( clistiter *current = clist_begin( fields->fld_list ); current != NULL; current = current->next ) { 230 for ( clistiter *current = clist_begin( fields->fld_list ); current != NULL; current = current->next ) {
202 mailimf_field *field = (mailimf_field *) current->data; 231 mailimf_field *field = (mailimf_field *) current->data;
203 switch ( field->fld_type ) { 232 switch ( field->fld_type ) {
204 case MAILIMF_FIELD_FROM: 233 case MAILIMF_FIELD_FROM:
205 mail->setFrom( parseMailboxList( field->fld_data.fld_from->frm_mb_list ) ); 234 mail->setFrom( parseMailboxList( field->fld_data.fld_from->frm_mb_list ) );
206 break; 235 break;
207 case MAILIMF_FIELD_TO: 236 case MAILIMF_FIELD_TO:
208 mail->setTo( parseAddressList( field->fld_data.fld_to->to_addr_list ) ); 237 mail->setTo( parseAddressList( field->fld_data.fld_to->to_addr_list ) );
209 break; 238 break;
210 case MAILIMF_FIELD_CC: 239 case MAILIMF_FIELD_CC:
211 mail->setCC( parseAddressList( field->fld_data.fld_cc->cc_addr_list ) ); 240 mail->setCC( parseAddressList( field->fld_data.fld_cc->cc_addr_list ) );
212 break; 241 break;
213 case MAILIMF_FIELD_BCC: 242 case MAILIMF_FIELD_BCC:
214 mail->setBcc( parseAddressList( field->fld_data.fld_bcc->bcc_addr_list ) ); 243 mail->setBcc( parseAddressList( field->fld_data.fld_bcc->bcc_addr_list ) );
215 break; 244 break;
216 case MAILIMF_FIELD_SUBJECT: 245 case MAILIMF_FIELD_SUBJECT:
217 mail->setSubject(convert_String( field->fld_data.fld_subject->sbj_value ) ); 246 mail->setSubject(convert_String( field->fld_data.fld_subject->sbj_value ) );
218 break; 247 break;
219 case MAILIMF_FIELD_ORIG_DATE: 248 case MAILIMF_FIELD_ORIG_DATE:
220 mail->setDate( parseDateTime( field->fld_data.fld_orig_date->dt_date_time ) ); 249 mail->setDate( parseDateTime( field->fld_data.fld_orig_date->dt_date_time ) );
221 break; 250 break;
222 case MAILIMF_FIELD_MESSAGE_ID: 251 case MAILIMF_FIELD_MESSAGE_ID:
223 mail->setMsgid(QString(field->fld_data.fld_message_id->mid_value)); 252 mail->setMsgid(QString(field->fld_data.fld_message_id->mid_value));
224 break; 253 break;
225 case MAILIMF_FIELD_REFERENCES: 254 case MAILIMF_FIELD_REFERENCES:
226 refs = field->fld_data.fld_references; 255 refs = field->fld_data.fld_references;
227 if (refs && refs->mid_list && clist_count(refs->mid_list)) { 256 if (refs && refs->mid_list && clist_count(refs->mid_list)) {
228 char * text = (char*)refs->mid_list->first->data; 257 char * text = (char*)refs->mid_list->first->data;
229 mail->setReplyto(QString(text)); 258 mail->setReplyto(QString(text));
230 } 259 }
231 break; 260 break;
232 case MAILIMF_FIELD_KEYWORDS: 261 case MAILIMF_FIELD_KEYWORDS:
diff --git a/noncore/net/mail/genericwrapper.h b/noncore/net/mail/genericwrapper.h
index 54d6ea9..c00d864 100644
--- a/noncore/net/mail/genericwrapper.h
+++ b/noncore/net/mail/genericwrapper.h
@@ -1,59 +1,59 @@
1#ifndef __GENERIC_WRAPPER_H 1#ifndef __GENERIC_WRAPPER_H
2#define __GENERIC_WRAPPER_H 2#define __GENERIC_WRAPPER_H
3 3
4#include "abstractmail.h" 4#include "abstractmail.h"
5#include <qmap.h> 5#include <qmap.h>
6#include <qstring.h> 6#include <qstring.h>
7#include <libetpan/clist.h> 7#include <libetpan/clist.h>
8 8
9class RecMail; 9class RecMail;
10class RecBody; 10class RecBody;
11class encodedString; 11class encodedString;
12struct mailpop3; 12struct mailpop3;
13struct mailmessage; 13struct mailmessage;
14struct mailmime; 14struct mailmime;
15struct mailmime_mechanism; 15struct mailmime_mechanism;
16struct mailimf_mailbox_list; 16struct mailimf_mailbox_list;
17struct mailimf_mailbox; 17struct mailimf_mailbox;
18struct mailimf_date_time; 18struct mailimf_date_time;
19struct mailimf_group; 19struct mailimf_group;
20struct mailimf_address_list; 20struct mailimf_address_list;
21struct mailsession; 21struct mailsession;
22 22
23/* this class hold just the funs shared between 23/* this class hold just the funs shared between
24 * mbox and pop3 (later mh, too) mail access. 24 * mbox and pop3 (later mh, too) mail access.
25 * it is not desigend to make a instance of it! 25 * it is not desigend to make a instance of it!
26 */ 26 */
27class Genericwrapper : public AbstractMail 27class Genericwrapper : public AbstractMail
28{ 28{
29 Q_OBJECT 29 Q_OBJECT
30public: 30public:
31 Genericwrapper(); 31 Genericwrapper();
32 virtual ~Genericwrapper(); 32 virtual ~Genericwrapper();
33 33
34 virtual encodedString* fetchDecodedPart(const RecMail&mail,const RecPart&part); 34 virtual encodedString* fetchDecodedPart(const RecMail&mail,const RecPart&part);
35 virtual encodedString* fetchRawPart(const RecMail&mail,const RecPart&part); 35 virtual encodedString* fetchRawPart(const RecMail&mail,const RecPart&part);
36 virtual QString fetchTextPart(const RecMail&mail,const RecPart&part); 36 virtual QString fetchTextPart(const RecMail&mail,const RecPart&part);
37 virtual void cleanMimeCache(); 37 virtual void cleanMimeCache();
38 38
39protected: 39protected:
40 RecMail *parseHeader( const char *header ); 40 RecMail *parseHeader( const char *header );
41 RecBody parseMail( mailmessage * msg ); 41 RecBody parseMail( mailmessage * msg );
42 QString parseMailboxList( mailimf_mailbox_list *list ); 42 QString parseMailboxList( mailimf_mailbox_list *list );
43 QString parseMailbox( mailimf_mailbox *box ); 43 QString parseMailbox( mailimf_mailbox *box );
44 QString parseGroup( mailimf_group *group ); 44 QString parseGroup( mailimf_group *group );
45 QString parseAddressList( mailimf_address_list *list ); 45 QString parseAddressList( mailimf_address_list *list );
46 QString parseDateTime( mailimf_date_time *date ); 46 QString parseDateTime( mailimf_date_time *date );
47 47
48 void traverseBody(RecBody&target,mailmessage*message,mailmime*mime,unsigned int current_rek=0); 48 void traverseBody(RecBody&target,mailmessage*message,mailmime*mime,QValueList<int>recList,unsigned int current_rek=0,int current_count=0);
49 static void fillSingleBody(RecPart&target,mailmessage*message,mailmime*mime); 49 static void fillSingleBody(RecPart&target,mailmessage*message,mailmime*mime);
50 static void fillParameters(RecPart&target,clist*parameters); 50 static void fillParameters(RecPart&target,clist*parameters);
51 static QString getencoding(mailmime_mechanism*aEnc); 51 static QString getencoding(mailmime_mechanism*aEnc);
52 virtual void parseList(QList<RecMail> &target,mailsession*session,const QString&mailbox); 52 virtual void parseList(QList<RecMail> &target,mailsession*session,const QString&mailbox);
53 53
54 QString msgTempName; 54 QString msgTempName;
55 unsigned int last_msg_id; 55 unsigned int last_msg_id;
56 QMap<QString,encodedString*> bodyCache; 56 QMap<QString,encodedString*> bodyCache;
57}; 57};
58 58
59#endif 59#endif
diff --git a/noncore/net/mail/libmailwrapper/genericwrapper.cpp b/noncore/net/mail/libmailwrapper/genericwrapper.cpp
index bef6ae5..5de9299 100644
--- a/noncore/net/mail/libmailwrapper/genericwrapper.cpp
+++ b/noncore/net/mail/libmailwrapper/genericwrapper.cpp
@@ -78,155 +78,184 @@ void Genericwrapper::fillSingleBody(RecPart&target,mailmessage*,mailmime*mime)
78 } 78 }
79 } 79 }
80 } 80 }
81} 81}
82 82
83void Genericwrapper::fillParameters(RecPart&target,clist*parameters) 83void Genericwrapper::fillParameters(RecPart&target,clist*parameters)
84{ 84{
85 if (!parameters) {return;} 85 if (!parameters) {return;}
86 clistcell*current=0; 86 clistcell*current=0;
87 mailmime_parameter*param; 87 mailmime_parameter*param;
88 for (current=clist_begin(parameters);current!=0;current=clist_next(current)) { 88 for (current=clist_begin(parameters);current!=0;current=clist_next(current)) {
89 param = (mailmime_parameter*)current->data; 89 param = (mailmime_parameter*)current->data;
90 if (param) { 90 if (param) {
91 target.addParameter(QString(param->pa_name).lower(),QString(param->pa_value)); 91 target.addParameter(QString(param->pa_name).lower(),QString(param->pa_value));
92 } 92 }
93 } 93 }
94} 94}
95 95
96QString Genericwrapper::getencoding(mailmime_mechanism*aEnc) 96QString Genericwrapper::getencoding(mailmime_mechanism*aEnc)
97{ 97{
98 QString enc="7bit"; 98 QString enc="7bit";
99 if (!aEnc) return enc; 99 if (!aEnc) return enc;
100 switch(aEnc->enc_type) { 100 switch(aEnc->enc_type) {
101 case MAILMIME_MECHANISM_7BIT: 101 case MAILMIME_MECHANISM_7BIT:
102 enc = "7bit"; 102 enc = "7bit";
103 break; 103 break;
104 case MAILMIME_MECHANISM_8BIT: 104 case MAILMIME_MECHANISM_8BIT:
105 enc = "8bit"; 105 enc = "8bit";
106 break; 106 break;
107 case MAILMIME_MECHANISM_BINARY: 107 case MAILMIME_MECHANISM_BINARY:
108 enc = "binary"; 108 enc = "binary";
109 break; 109 break;
110 case MAILMIME_MECHANISM_QUOTED_PRINTABLE: 110 case MAILMIME_MECHANISM_QUOTED_PRINTABLE:
111 enc = "quoted-printable"; 111 enc = "quoted-printable";
112 break; 112 break;
113 case MAILMIME_MECHANISM_BASE64: 113 case MAILMIME_MECHANISM_BASE64:
114 enc = "base64"; 114 enc = "base64";
115 break; 115 break;
116 case MAILMIME_MECHANISM_TOKEN: 116 case MAILMIME_MECHANISM_TOKEN:
117 default: 117 default:
118 if (aEnc->enc_token) { 118 if (aEnc->enc_token) {
119 enc = QString(aEnc->enc_token); 119 enc = QString(aEnc->enc_token);
120 } 120 }
121 break; 121 break;
122 } 122 }
123 return enc; 123 return enc;
124} 124}
125 125
126void Genericwrapper::traverseBody(RecBody&target,mailmessage*message,mailmime*mime,unsigned int current_rec) 126void Genericwrapper::traverseBody(RecBody&target,mailmessage*message,mailmime*mime,QValueList<int>recList,unsigned int current_rec,int current_count)
127{ 127{
128 if (current_rec >= 10) { 128 if (current_rec >= 10) {
129 qDebug("too deep recursion!"); 129 qDebug("too deep recursion!");
130 } 130 }
131 if (!message || !mime) { 131 if (!message || !mime) {
132 return; 132 return;
133 } 133 }
134 int r; 134 int r;
135 char*data = 0; 135 char*data = 0;
136 size_t len; 136 size_t len;
137 clistiter * cur = 0; 137 clistiter * cur = 0;
138 QString b; 138 QString b;
139 RecPart part; 139 RecPart part;
140 140
141 //current_count;
142
141 switch (mime->mm_type) { 143 switch (mime->mm_type) {
142 case MAILMIME_SINGLE: 144 case MAILMIME_SINGLE:
145 {
146 QValueList<int>countlist = recList;
147 countlist.append(current_count);
143 r = mailmessage_fetch_section(message,mime,&data,&len); 148 r = mailmessage_fetch_section(message,mime,&data,&len);
144 part.setSize(len); 149 part.setSize(len);
150 part.setPositionlist(countlist);
151 b = gen_attachment_id();
152 part.setIdentifier(b);
145 fillSingleBody(part,message,mime); 153 fillSingleBody(part,message,mime);
146 if (part.Type()=="text" && target.Bodytext().isNull()) { 154 if (part.Type()=="text" && target.Bodytext().isNull()) {
147 encodedString*r = new encodedString(); 155 encodedString*r = new encodedString();
148 r->setContent(data,len); 156 r->setContent(data,len);
149 encodedString*res = decode_String(r,part.Encoding()); 157 encodedString*res = decode_String(r,part.Encoding());
150 b = QString(res->Content()); 158 b = QString(res->Content());
151 delete r; 159 delete r;
152 delete res; 160 delete res;
153 target.setBodytext(b); 161 target.setBodytext(b);
154 target.setDescription(part); 162 target.setDescription(part);
155 } else { 163 } else {
156 b = gen_attachment_id();
157 part.setIdentifier(b);
158 bodyCache[b]=new encodedString(data,len); 164 bodyCache[b]=new encodedString(data,len);
159 target.addPart(part); 165 target.addPart(part);
160 } 166 }
161 break; 167 }
168 break;
162 case MAILMIME_MULTIPLE: 169 case MAILMIME_MULTIPLE:
170 {
171 unsigned int ccount = current_count;
163 for (cur = clist_begin(mime->mm_data.mm_multipart.mm_mp_list) ; cur != NULL ; cur = clist_next(cur)) { 172 for (cur = clist_begin(mime->mm_data.mm_multipart.mm_mp_list) ; cur != NULL ; cur = clist_next(cur)) {
164 traverseBody(target,message, (mailmime*)clist_content(cur),current_rec+1); 173 traverseBody(target,message, (mailmime*)clist_content(cur),recList,current_rec+1,ccount);
174 ++ccount;
165 } 175 }
166 break; 176 }
177 break;
167 case MAILMIME_MESSAGE: 178 case MAILMIME_MESSAGE:
179 {
180 QValueList<int>countlist = recList;
181 countlist.append(current_count);
182 /* the own header is always at recursion 0 - we don't need that */
183 if (current_rec > 0) {
184 part.setPositionlist(countlist);
185 r = mailmessage_fetch_section(message,mime,&data,&len);
186 part.setSize(len);
187 part.setPositionlist(countlist);
188 b = gen_attachment_id();
189 part.setIdentifier(b);
190 part.setType("message");
191 part.setSubtype("rfc822");
192 bodyCache[b]=new encodedString(data,len);
193 target.addPart(part);
194 }
168 if (mime->mm_data.mm_message.mm_msg_mime != NULL) { 195 if (mime->mm_data.mm_message.mm_msg_mime != NULL) {
169 traverseBody(target,message,mime->mm_data.mm_message.mm_msg_mime,current_rec+1); 196 traverseBody(target,message,mime->mm_data.mm_message.mm_msg_mime,countlist,current_rec+1);
170 } 197 }
171 break; 198 }
199 break;
172 } 200 }
173} 201}
174 202
175RecBody Genericwrapper::parseMail( mailmessage * msg ) 203RecBody Genericwrapper::parseMail( mailmessage * msg )
176{ 204{
177 int err = MAILIMF_NO_ERROR; 205 int err = MAILIMF_NO_ERROR;
178 mailmime_single_fields fields; 206 mailmime_single_fields fields;
179 /* is bound to msg and will be freed there */ 207 /* is bound to msg and will be freed there */
180 mailmime * mime=0; 208 mailmime * mime=0;
181 RecBody body; 209 RecBody body;
182 memset(&fields, 0, sizeof(struct mailmime_single_fields)); 210 memset(&fields, 0, sizeof(struct mailmime_single_fields));
183 err = mailmessage_get_bodystructure(msg,&mime); 211 err = mailmessage_get_bodystructure(msg,&mime);
184 traverseBody(body,msg,mime); 212 QValueList<int>recList;
213 traverseBody(body,msg,mime,recList);
185 return body; 214 return body;
186} 215}
187 216
188RecMail *Genericwrapper::parseHeader( const char *header ) 217RecMail *Genericwrapper::parseHeader( const char *header )
189{ 218{
190 int err = MAILIMF_NO_ERROR; 219 int err = MAILIMF_NO_ERROR;
191 size_t curTok = 0; 220 size_t curTok = 0;
192 RecMail *mail = new RecMail(); 221 RecMail *mail = new RecMail();
193 mailimf_fields *fields = 0; 222 mailimf_fields *fields = 0;
194 mailimf_references * refs = 0; 223 mailimf_references * refs = 0;
195 mailimf_keywords*keys = 0; 224 mailimf_keywords*keys = 0;
196 QString status; 225 QString status;
197 QString value; 226 QString value;
198 QBitArray mFlags(7); 227 QBitArray mFlags(7);
199 228
200 err = mailimf_fields_parse( (char *) header, strlen( header ), &curTok, &fields ); 229 err = mailimf_fields_parse( (char *) header, strlen( header ), &curTok, &fields );
201 for ( clistiter *current = clist_begin( fields->fld_list ); current != NULL; current = current->next ) { 230 for ( clistiter *current = clist_begin( fields->fld_list ); current != NULL; current = current->next ) {
202 mailimf_field *field = (mailimf_field *) current->data; 231 mailimf_field *field = (mailimf_field *) current->data;
203 switch ( field->fld_type ) { 232 switch ( field->fld_type ) {
204 case MAILIMF_FIELD_FROM: 233 case MAILIMF_FIELD_FROM:
205 mail->setFrom( parseMailboxList( field->fld_data.fld_from->frm_mb_list ) ); 234 mail->setFrom( parseMailboxList( field->fld_data.fld_from->frm_mb_list ) );
206 break; 235 break;
207 case MAILIMF_FIELD_TO: 236 case MAILIMF_FIELD_TO:
208 mail->setTo( parseAddressList( field->fld_data.fld_to->to_addr_list ) ); 237 mail->setTo( parseAddressList( field->fld_data.fld_to->to_addr_list ) );
209 break; 238 break;
210 case MAILIMF_FIELD_CC: 239 case MAILIMF_FIELD_CC:
211 mail->setCC( parseAddressList( field->fld_data.fld_cc->cc_addr_list ) ); 240 mail->setCC( parseAddressList( field->fld_data.fld_cc->cc_addr_list ) );
212 break; 241 break;
213 case MAILIMF_FIELD_BCC: 242 case MAILIMF_FIELD_BCC:
214 mail->setBcc( parseAddressList( field->fld_data.fld_bcc->bcc_addr_list ) ); 243 mail->setBcc( parseAddressList( field->fld_data.fld_bcc->bcc_addr_list ) );
215 break; 244 break;
216 case MAILIMF_FIELD_SUBJECT: 245 case MAILIMF_FIELD_SUBJECT:
217 mail->setSubject(convert_String( field->fld_data.fld_subject->sbj_value ) ); 246 mail->setSubject(convert_String( field->fld_data.fld_subject->sbj_value ) );
218 break; 247 break;
219 case MAILIMF_FIELD_ORIG_DATE: 248 case MAILIMF_FIELD_ORIG_DATE:
220 mail->setDate( parseDateTime( field->fld_data.fld_orig_date->dt_date_time ) ); 249 mail->setDate( parseDateTime( field->fld_data.fld_orig_date->dt_date_time ) );
221 break; 250 break;
222 case MAILIMF_FIELD_MESSAGE_ID: 251 case MAILIMF_FIELD_MESSAGE_ID:
223 mail->setMsgid(QString(field->fld_data.fld_message_id->mid_value)); 252 mail->setMsgid(QString(field->fld_data.fld_message_id->mid_value));
224 break; 253 break;
225 case MAILIMF_FIELD_REFERENCES: 254 case MAILIMF_FIELD_REFERENCES:
226 refs = field->fld_data.fld_references; 255 refs = field->fld_data.fld_references;
227 if (refs && refs->mid_list && clist_count(refs->mid_list)) { 256 if (refs && refs->mid_list && clist_count(refs->mid_list)) {
228 char * text = (char*)refs->mid_list->first->data; 257 char * text = (char*)refs->mid_list->first->data;
229 mail->setReplyto(QString(text)); 258 mail->setReplyto(QString(text));
230 } 259 }
231 break; 260 break;
232 case MAILIMF_FIELD_KEYWORDS: 261 case MAILIMF_FIELD_KEYWORDS:
diff --git a/noncore/net/mail/libmailwrapper/genericwrapper.h b/noncore/net/mail/libmailwrapper/genericwrapper.h
index 54d6ea9..c00d864 100644
--- a/noncore/net/mail/libmailwrapper/genericwrapper.h
+++ b/noncore/net/mail/libmailwrapper/genericwrapper.h
@@ -1,59 +1,59 @@
1#ifndef __GENERIC_WRAPPER_H 1#ifndef __GENERIC_WRAPPER_H
2#define __GENERIC_WRAPPER_H 2#define __GENERIC_WRAPPER_H
3 3
4#include "abstractmail.h" 4#include "abstractmail.h"
5#include <qmap.h> 5#include <qmap.h>
6#include <qstring.h> 6#include <qstring.h>
7#include <libetpan/clist.h> 7#include <libetpan/clist.h>
8 8
9class RecMail; 9class RecMail;
10class RecBody; 10class RecBody;
11class encodedString; 11class encodedString;
12struct mailpop3; 12struct mailpop3;
13struct mailmessage; 13struct mailmessage;
14struct mailmime; 14struct mailmime;
15struct mailmime_mechanism; 15struct mailmime_mechanism;
16struct mailimf_mailbox_list; 16struct mailimf_mailbox_list;
17struct mailimf_mailbox; 17struct mailimf_mailbox;
18struct mailimf_date_time; 18struct mailimf_date_time;
19struct mailimf_group; 19struct mailimf_group;
20struct mailimf_address_list; 20struct mailimf_address_list;
21struct mailsession; 21struct mailsession;
22 22
23/* this class hold just the funs shared between 23/* this class hold just the funs shared between
24 * mbox and pop3 (later mh, too) mail access. 24 * mbox and pop3 (later mh, too) mail access.
25 * it is not desigend to make a instance of it! 25 * it is not desigend to make a instance of it!
26 */ 26 */
27class Genericwrapper : public AbstractMail 27class Genericwrapper : public AbstractMail
28{ 28{
29 Q_OBJECT 29 Q_OBJECT
30public: 30public:
31 Genericwrapper(); 31 Genericwrapper();
32 virtual ~Genericwrapper(); 32 virtual ~Genericwrapper();
33 33
34 virtual encodedString* fetchDecodedPart(const RecMail&mail,const RecPart&part); 34 virtual encodedString* fetchDecodedPart(const RecMail&mail,const RecPart&part);
35 virtual encodedString* fetchRawPart(const RecMail&mail,const RecPart&part); 35 virtual encodedString* fetchRawPart(const RecMail&mail,const RecPart&part);
36 virtual QString fetchTextPart(const RecMail&mail,const RecPart&part); 36 virtual QString fetchTextPart(const RecMail&mail,const RecPart&part);
37 virtual void cleanMimeCache(); 37 virtual void cleanMimeCache();
38 38
39protected: 39protected:
40 RecMail *parseHeader( const char *header ); 40 RecMail *parseHeader( const char *header );
41 RecBody parseMail( mailmessage * msg ); 41 RecBody parseMail( mailmessage * msg );
42 QString parseMailboxList( mailimf_mailbox_list *list ); 42 QString parseMailboxList( mailimf_mailbox_list *list );
43 QString parseMailbox( mailimf_mailbox *box ); 43 QString parseMailbox( mailimf_mailbox *box );
44 QString parseGroup( mailimf_group *group ); 44 QString parseGroup( mailimf_group *group );
45 QString parseAddressList( mailimf_address_list *list ); 45 QString parseAddressList( mailimf_address_list *list );
46 QString parseDateTime( mailimf_date_time *date ); 46 QString parseDateTime( mailimf_date_time *date );
47 47
48 void traverseBody(RecBody&target,mailmessage*message,mailmime*mime,unsigned int current_rek=0); 48 void traverseBody(RecBody&target,mailmessage*message,mailmime*mime,QValueList<int>recList,unsigned int current_rek=0,int current_count=0);
49 static void fillSingleBody(RecPart&target,mailmessage*message,mailmime*mime); 49 static void fillSingleBody(RecPart&target,mailmessage*message,mailmime*mime);
50 static void fillParameters(RecPart&target,clist*parameters); 50 static void fillParameters(RecPart&target,clist*parameters);
51 static QString getencoding(mailmime_mechanism*aEnc); 51 static QString getencoding(mailmime_mechanism*aEnc);
52 virtual void parseList(QList<RecMail> &target,mailsession*session,const QString&mailbox); 52 virtual void parseList(QList<RecMail> &target,mailsession*session,const QString&mailbox);
53 53
54 QString msgTempName; 54 QString msgTempName;
55 unsigned int last_msg_id; 55 unsigned int last_msg_id;
56 QMap<QString,encodedString*> bodyCache; 56 QMap<QString,encodedString*> bodyCache;
57}; 57};
58 58
59#endif 59#endif