summaryrefslogtreecommitdiff
path: root/noncore/net/mail/libmailwrapper/pop3wrapper.cpp
authoralwin <alwin>2003-12-21 21:33:49 (UTC)
committer alwin <alwin>2003-12-21 21:33:49 (UTC)
commit6e7358f954618d8fdbbe852df7df862c3c132bbd (patch) (unidiff)
tree0e2a94a0a42393b811d85172677c117517db5fd4 /noncore/net/mail/libmailwrapper/pop3wrapper.cpp
parentfafcc882ba0d797d5aa8ed7f2f8d5518ba6d2960 (diff)
downloadopie-6e7358f954618d8fdbbe852df7df862c3c132bbd.zip
opie-6e7358f954618d8fdbbe852df7df862c3c132bbd.tar.gz
opie-6e7358f954618d8fdbbe852df7df862c3c132bbd.tar.bz2
- mbox-wrapper mostly finished
- special-folders "Local Folders" will be displayed ToDo: "STORE" - method for all wrapper, but mostly for mbox for send queue.
Diffstat (limited to 'noncore/net/mail/libmailwrapper/pop3wrapper.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/net/mail/libmailwrapper/pop3wrapper.cpp418
1 files changed, 15 insertions, 403 deletions
diff --git a/noncore/net/mail/libmailwrapper/pop3wrapper.cpp b/noncore/net/mail/libmailwrapper/pop3wrapper.cpp
index d3447f4..efd83ba 100644
--- a/noncore/net/mail/libmailwrapper/pop3wrapper.cpp
+++ b/noncore/net/mail/libmailwrapper/pop3wrapper.cpp
@@ -11,12 +11,12 @@
11#define HARD_MSG_SIZE_LIMIT 5242880 11#define HARD_MSG_SIZE_LIMIT 5242880
12 12
13POP3wrapper::POP3wrapper( POP3account *a ) 13POP3wrapper::POP3wrapper( POP3account *a )
14 : Genericwrapper()
14{ 15{
15 account = a; 16 account = a;
16 m_pop3 = NULL; 17 m_pop3 = NULL;
17 msgTempName = a->getFileName()+"_msg_cache"; 18 msgTempName = a->getFileName()+"_msg_cache";
18 last_msg_id = 0; 19 last_msg_id = 0;
19 bodyCache.clear();
20} 20}
21 21
22POP3wrapper::~POP3wrapper() 22POP3wrapper::~POP3wrapper()
@@ -26,18 +26,6 @@ POP3wrapper::~POP3wrapper()
26 if (msg_cache.exists()) { 26 if (msg_cache.exists()) {
27 msg_cache.remove(); 27 msg_cache.remove();
28 } 28 }
29 cleanUpCache();
30}
31
32void POP3wrapper::cleanUpCache()
33{
34 QMap<QString,encodedString*>::Iterator it = bodyCache.begin();
35 for (;it!=bodyCache.end();++it) {
36 encodedString*t = it.data();
37 //it.setValue(0);
38 if (t) delete t;
39 }
40 bodyCache.clear();
41} 29}
42 30
43void POP3wrapper::pop3_progress( size_t current, size_t maximum ) 31void POP3wrapper::pop3_progress( size_t current, size_t maximum )
@@ -50,21 +38,22 @@ RecBody POP3wrapper::fetchBody( const RecMail &mail )
50 int err = MAILPOP3_NO_ERROR; 38 int err = MAILPOP3_NO_ERROR;
51 char *message; 39 char *message;
52 size_t length = 0; 40 size_t length = 0;
53 41
54 login(); 42 login();
55 if ( !m_pop3 ) { 43 if ( !m_pop3 ) {
56 return RecBody(); 44 return RecBody();
57 } 45 }
58 46
59 RecBody body; 47 RecBody body;
60 48 mailmessage * msg = 0;
49
61 QFile msg_cache(msgTempName); 50 QFile msg_cache(msgTempName);
62 51
63 if (mail.Msgsize()>HARD_MSG_SIZE_LIMIT) { 52 if (mail.Msgsize()>HARD_MSG_SIZE_LIMIT) {
64 qDebug("Message to large: %i",mail.Msgsize()); 53 qDebug("Message to large: %i",mail.Msgsize());
65 return body; 54 return body;
66 } 55 }
67 cleanUpCache(); 56 cleanMimeCache();
68 if (mail.getNumber()!=last_msg_id) { 57 if (mail.getNumber()!=last_msg_id) {
69 if (msg_cache.exists()) { 58 if (msg_cache.exists()) {
70 msg_cache.remove(); 59 msg_cache.remove();
@@ -92,48 +81,24 @@ RecBody POP3wrapper::fetchBody( const RecMail &mail )
92 memset(message,0,msg.length()+1); 81 memset(message,0,msg.length()+1);
93 memcpy(message,msg.latin1(),msg.length()); 82 memcpy(message,msg.latin1(),msg.length());
94 } 83 }
95 body = parseMail(message);
96 free(message);
97 return body;
98}
99
100RecBody POP3wrapper::parseMail( char *message )
101{
102 int err = MAILIMF_NO_ERROR;
103 /* these vars are used recurcive! set it to 0!!!!!!!!!!!!!!!!! */
104 size_t curTok = 0;
105 mailimf_message *result = 0;
106 mailmessage * msg=0;
107 mailmime_single_fields fields;
108 84
109 /* is bound to msg and will be freed there */ 85 /* transform to libetpan stuff */
110 struct mailmime * mime=0;
111
112 RecBody body;
113
114
115 err = mailimf_message_parse( (char *) message, strlen( message ), &curTok, &result );
116 if ( err != MAILIMF_NO_ERROR ) {
117 if (result) mailimf_message_free(result);
118 return body;
119 }
120
121 char*body_msg = message;
122 msg = mailmessage_new(); 86 msg = mailmessage_new();
123 mailmessage_init(msg, NULL, data_message_driver, 0, strlen(body_msg)); 87 mailmessage_init(msg, NULL, data_message_driver, 0, strlen(message));
124 generic_message_t * msg_data; 88 generic_message_t * msg_data;
125 msg_data = (generic_message_t *)msg->msg_data; 89 msg_data = (generic_message_t *)msg->msg_data;
126 msg_data->msg_fetched = 1; 90 msg_data->msg_fetched = 1;
127 msg_data->msg_message = body_msg; 91 msg_data->msg_message = message;
128 msg_data->msg_length = strlen(body_msg); 92 msg_data->msg_length = strlen(message);
129 93
94 /* parse the mail */
95 body = parseMail(msg);
130 96
131 memset(&fields, 0, sizeof(struct mailmime_single_fields)); 97 /* clean up */
132 err = mailmessage_get_bodystructure(msg,&mime); 98 mailmessage_free(msg);
133 traverseBody(body,msg,mime); 99 free(message);
134
135 mailmessage_free(msg);
136 100
101 /* finish */
137 return body; 102 return body;
138} 103}
139 104
@@ -169,175 +134,6 @@ void POP3wrapper::listMessages(const QString &, QList<RecMail> &target )
169 } 134 }
170} 135}
171 136
172RecMail *POP3wrapper::parseHeader( const char *header )
173{
174 int err = MAILIMF_NO_ERROR;
175 size_t curTok = 0;
176 RecMail *mail = new RecMail();
177 mailimf_fields *fields;
178 mailimf_references * refs;
179 mailimf_keywords*keys;
180 QString status;
181 QString value;
182 QBitArray mFlags(7);
183
184 err = mailimf_fields_parse( (char *) header, strlen( header ), &curTok, &fields );
185 for ( clistiter *current = clist_begin( fields->fld_list ); current != NULL; current = current->next ) {
186 mailimf_field *field = (mailimf_field *) current->data;
187 switch ( field->fld_type ) {
188 case MAILIMF_FIELD_FROM:
189 mail->setFrom( parseMailboxList( field->fld_data.fld_from->frm_mb_list ) );
190 break;
191 case MAILIMF_FIELD_TO:
192 mail->setTo( parseAddressList( field->fld_data.fld_to->to_addr_list ) );
193 break;
194 case MAILIMF_FIELD_CC:
195 mail->setCC( parseAddressList( field->fld_data.fld_cc->cc_addr_list ) );
196 break;
197 case MAILIMF_FIELD_BCC:
198 mail->setBcc( parseAddressList( field->fld_data.fld_bcc->bcc_addr_list ) );
199 break;
200 case MAILIMF_FIELD_SUBJECT:
201 mail->setSubject(convert_String( field->fld_data.fld_subject->sbj_value ) );
202 break;
203 case MAILIMF_FIELD_ORIG_DATE:
204 mail->setDate( parseDateTime( field->fld_data.fld_orig_date->dt_date_time ) );
205 break;
206 case MAILIMF_FIELD_MESSAGE_ID:
207 mail->setMsgid(QString(field->fld_data.fld_message_id->mid_value));
208 break;
209 case MAILIMF_FIELD_REFERENCES:
210 refs = field->fld_data.fld_references;
211 if (refs && refs->mid_list && clist_count(refs->mid_list)) {
212 char * text = (char*)refs->mid_list->first->data;
213 mail->setReplyto(QString(text));
214 }
215 break;
216 case MAILIMF_FIELD_KEYWORDS:
217 keys = field->fld_data.fld_keywords;
218 for (clistcell*cur = clist_begin(keys->kw_list);cur!=0;cur=clist_next(cur)) {
219 qDebug("Keyword: %s",(char*)cur->data);
220 }
221 break;
222 case MAILIMF_FIELD_OPTIONAL_FIELD:
223 status = field->fld_data.fld_optional_field->fld_name;
224 value = field->fld_data.fld_optional_field->fld_value;
225 if (status.lower()=="status") {
226 if (value.lower()=="ro") {
227 mFlags.setBit(FLAG_SEEN);
228 }
229 } else if (status.lower()=="x-status") {
230 qDebug("X-Status: %s",value.latin1());
231 if (value.lower()=="a") {
232 mFlags.setBit(FLAG_ANSWERED);
233 }
234 } else {
235// qDebug("Optionales feld: %s -> %s)",field->fld_data.fld_optional_field->fld_name,
236// field->fld_data.fld_optional_field->fld_value);
237 }
238 break;
239 default:
240 qDebug("Non parsed field");
241 break;
242 }
243 }
244 if (fields) mailimf_fields_free(fields);
245 mail->setFlags(mFlags);
246 return mail;
247}
248
249QString POP3wrapper::parseDateTime( mailimf_date_time *date )
250{
251 char tmp[23];
252
253 snprintf( tmp, 23, "%02i.%02i.%04i %02i:%02i:%02i %+05i",
254 date->dt_day, date->dt_month, date->dt_year, date->dt_hour, date->dt_min, date->dt_sec, date->dt_zone );
255
256 return QString( tmp );
257}
258
259QString POP3wrapper::parseAddressList( mailimf_address_list *list )
260{
261 QString result( "" );
262
263 bool first = true;
264 for ( clistiter *current = clist_begin( list->ad_list ); current != NULL; current = current->next ) {
265 mailimf_address *addr = (mailimf_address *) current->data;
266
267 if ( !first ) {
268 result.append( "," );
269 } else {
270 first = false;
271 }
272
273 switch ( addr->ad_type ) {
274 case MAILIMF_ADDRESS_MAILBOX:
275 result.append( parseMailbox( addr->ad_data.ad_mailbox ) );
276 break;
277 case MAILIMF_ADDRESS_GROUP:
278 result.append( parseGroup( addr->ad_data.ad_group ) );
279 break;
280 default:
281 qDebug( "POP3: unkown mailimf address type" );
282 break;
283 }
284 }
285
286 return result;
287}
288
289QString POP3wrapper::parseGroup( mailimf_group *group )
290{
291 QString result( "" );
292
293 result.append( group->grp_display_name );
294 result.append( ": " );
295
296 if ( group->grp_mb_list != NULL ) {
297 result.append( parseMailboxList( group->grp_mb_list ) );
298 }
299
300 result.append( ";" );
301
302 return result;
303}
304
305QString POP3wrapper::parseMailbox( mailimf_mailbox *box )
306{
307 QString result( "" );
308
309 if ( box->mb_display_name == NULL ) {
310 result.append( box->mb_addr_spec );
311 } else {
312 result.append( convert_String(box->mb_display_name).latin1() );
313 result.append( " <" );
314 result.append( box->mb_addr_spec );
315 result.append( ">" );
316 }
317
318 return result;
319}
320
321QString POP3wrapper::parseMailboxList( mailimf_mailbox_list *list )
322{
323 QString result( "" );
324
325 bool first = true;
326 for ( clistiter *current = clist_begin( list->mb_list ); current != NULL; current = current->next ) {
327 mailimf_mailbox *box = (mailimf_mailbox *) current->data;
328
329 if ( !first ) {
330 result.append( "," );
331 } else {
332 first = false;
333 }
334
335 result.append( parseMailbox( box ) );
336 }
337
338 return result;
339}
340
341void POP3wrapper::login() 137void POP3wrapper::login()
342{ 138{
343 /* we'll hold the line */ 139 /* we'll hold the line */
@@ -419,14 +215,6 @@ QList<Folder>* POP3wrapper::listFolders()
419 return folders; 215 return folders;
420} 216}
421 217
422QString POP3wrapper::fetchTextPart(const RecMail&mail,const RecPart&part)
423{
424 encodedString*t = fetchDecodedPart(mail,part);
425 QString text=t->Content();
426 delete t;
427 return text;
428}
429
430void POP3wrapper::deleteMail(const RecMail&mail) 218void POP3wrapper::deleteMail(const RecMail&mail)
431{ 219{
432 login(); 220 login();
@@ -440,179 +228,3 @@ void POP3wrapper::deleteMail(const RecMail&mail)
440void POP3wrapper::answeredMail(const RecMail&) 228void POP3wrapper::answeredMail(const RecMail&)
441{ 229{
442} 230}
443
444encodedString* POP3wrapper::fetchDecodedPart(const RecMail&,const RecPart&part)
445{
446 QMap<QString,encodedString*>::ConstIterator it = bodyCache.find(part.Identifier());
447 if (it==bodyCache.end()) return new encodedString();
448 encodedString*t = decode_String(it.data(),part.Encoding());
449 return t;
450}
451
452encodedString* POP3wrapper::fetchRawPart(const RecMail&mail,const RecPart&part)
453{
454 QMap<QString,encodedString*>::ConstIterator it = bodyCache.find(part.Identifier());
455 if (it==bodyCache.end()) return new encodedString();
456 encodedString*t = it.data();
457 return t;
458}
459
460void POP3wrapper::traverseBody(RecBody&target,mailmessage*message,mailmime*mime,unsigned int current_rec)
461{
462 if (current_rec >= 10) {
463 qDebug("too deep recursion!");
464 }
465 if (!message || !mime) {
466 return;
467 }
468 int r;
469 char*data = 0;
470 size_t len;
471 clistiter * cur = 0;
472 int res;
473 QString b;
474 RecPart part;
475
476 switch (mime->mm_type) {
477 case MAILMIME_SINGLE:
478 r = mailmessage_fetch_section(message,mime,&data,&len);
479 part.setSize(len);
480 fillSingleBody(part,message,mime);
481 if (part.Type()=="text" && target.Bodytext().isNull()) {
482 encodedString*r = new encodedString();
483 r->setContent(data,len);
484 encodedString*res = decode_String(r,part.Encoding());
485 b = QString(res->Content());
486 delete r;
487 delete res;
488 target.setBodytext(b);
489 target.setDescription(part);
490 } else {
491 b = gen_attachment_id();
492 part.setIdentifier(b);
493 bodyCache[b]=new encodedString(data,len);
494 target.addPart(part);
495 }
496 break;
497 case MAILMIME_MULTIPLE:
498 for (cur = clist_begin(mime->mm_data.mm_multipart.mm_mp_list) ; cur != NULL ; cur = clist_next(cur)) {
499 traverseBody(target,message, (mailmime*)clist_content(cur),current_rec+1);
500 }
501 break;
502 case MAILMIME_MESSAGE:
503 if (mime->mm_data.mm_message.mm_msg_mime != NULL) {
504 traverseBody(target,message,mime->mm_data.mm_message.mm_msg_mime,current_rec+1);
505 }
506 break;
507 }
508}
509
510QString POP3wrapper::getencoding(mailmime_mechanism*aEnc)
511{
512 QString enc="7bit";
513 if (!aEnc) return enc;
514 switch(aEnc->enc_type) {
515 case MAILMIME_MECHANISM_7BIT:
516 enc = "7bit";
517 break;
518 case MAILMIME_MECHANISM_8BIT:
519 enc = "8bit";
520 break;
521 case MAILMIME_MECHANISM_BINARY:
522 enc = "binary";
523 break;
524 case MAILMIME_MECHANISM_QUOTED_PRINTABLE:
525 enc = "quoted-printable";
526 break;
527 case MAILMIME_MECHANISM_BASE64:
528 enc = "base64";
529 break;
530 case MAILMIME_MECHANISM_TOKEN:
531 default:
532 if (aEnc->enc_token) {
533 enc = QString(aEnc->enc_token);
534 }
535 break;
536 }
537 return enc;
538}
539
540void POP3wrapper::fillSingleBody(RecPart&target,mailmessage*,mailmime*mime)
541{
542 if (!mime) {
543 return;
544 }
545 mailmime_field*field = 0;
546 mailmime_single_fields fields;
547 memset(&fields, 0, sizeof(struct mailmime_single_fields));
548 if (mime->mm_mime_fields != NULL) {
549 mailmime_single_fields_init(&fields, mime->mm_mime_fields,
550 mime->mm_content_type);
551 }
552
553 mailmime_content*type = fields.fld_content;
554 clistcell*current;
555 if (!type) {
556 target.setType("text");
557 target.setSubtype("plain");
558 } else {
559 target.setSubtype(type->ct_subtype);
560 switch(type->ct_type->tp_data.tp_discrete_type->dt_type) {
561 case MAILMIME_DISCRETE_TYPE_TEXT:
562 target.setType("text");
563 break;
564 case MAILMIME_DISCRETE_TYPE_IMAGE:
565 target.setType("image");
566 break;
567 case MAILMIME_DISCRETE_TYPE_AUDIO:
568 target.setType("audio");
569 break;
570 case MAILMIME_DISCRETE_TYPE_VIDEO:
571 target.setType("video");
572 break;
573 case MAILMIME_DISCRETE_TYPE_APPLICATION:
574 target.setType("application");
575 break;
576 case MAILMIME_DISCRETE_TYPE_EXTENSION:
577 default:
578 if (type->ct_type->tp_data.tp_discrete_type->dt_extension) {
579 target.setType(type->ct_type->tp_data.tp_discrete_type->dt_extension);
580 }
581 break;
582 }
583 if (type->ct_parameters) {
584 fillParameters(target,type->ct_parameters);
585 }
586 }
587 if (mime->mm_mime_fields && mime->mm_mime_fields->fld_list) {
588 for (current=clist_begin(mime->mm_mime_fields->fld_list);current!=0;current=clist_next(current)) {
589 field = (mailmime_field*)current->data;
590 switch(field->fld_type) {
591 case MAILMIME_FIELD_TRANSFER_ENCODING:
592 target.setEncoding(getencoding(field->fld_data.fld_encoding));
593 break;
594 case MAILMIME_FIELD_ID:
595 target.setIdentifier(field->fld_data.fld_id);
596 break;
597 case MAILMIME_FIELD_DESCRIPTION:
598 target.setDescription(field->fld_data.fld_description);
599 break;
600 default:
601 break;
602 }
603 }
604 }
605}
606
607void POP3wrapper::fillParameters(RecPart&target,clist*parameters)
608{
609 if (!parameters) {return;}
610 clistcell*current=0;
611 mailmime_parameter*param;
612 for (current=clist_begin(parameters);current!=0;current=clist_next(current)) {
613 param = (mailmime_parameter*)current->data;
614 if (param) {
615 target.addParameter(QString(param->pa_name).lower(),QString(param->pa_value));
616 }
617 }
618}