summaryrefslogtreecommitdiffabout
path: root/kmicromail/libmailwrapper/genericwrapper.cpp
authorzautrix <zautrix>2004-09-11 15:41:30 (UTC)
committer zautrix <zautrix>2004-09-11 15:41:30 (UTC)
commit32f9963a39236d08718a36d5adad2a0c5c4e2602 (patch) (unidiff)
tree8856a90d505df8dc3afa0d72541f27cb68913a0d /kmicromail/libmailwrapper/genericwrapper.cpp
parentd7a273f40838f56205c1377ed0bcc5457bd46ea3 (diff)
downloadkdepimpi-32f9963a39236d08718a36d5adad2a0c5c4e2602.zip
kdepimpi-32f9963a39236d08718a36d5adad2a0c5c4e2602.tar.gz
kdepimpi-32f9963a39236d08718a36d5adad2a0c5c4e2602.tar.bz2
Mail enhancements
Diffstat (limited to 'kmicromail/libmailwrapper/genericwrapper.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--kmicromail/libmailwrapper/genericwrapper.cpp64
1 files changed, 52 insertions, 12 deletions
diff --git a/kmicromail/libmailwrapper/genericwrapper.cpp b/kmicromail/libmailwrapper/genericwrapper.cpp
index 9614d53..2b04847 100644
--- a/kmicromail/libmailwrapper/genericwrapper.cpp
+++ b/kmicromail/libmailwrapper/genericwrapper.cpp
@@ -1,74 +1,119 @@
1// CHANGED 2004-09-31 Lutz Rogowski 1// CHANGED 2004-09-31 Lutz Rogowski
2#include "genericwrapper.h" 2#include "genericwrapper.h"
3#include <libetpan/libetpan.h> 3#include <libetpan/libetpan.h>
4#include "mailtypes.h" 4#include "mailtypes.h"
5 5
6#include <kconfig.h>
7#include <kglobal.h>
8#include <kstandarddirs.h>
6 9
7 10
8using namespace Opie::Core; 11using namespace Opie::Core;
9Genericwrapper::Genericwrapper() 12Genericwrapper::Genericwrapper()
10 : AbstractMail() 13 : AbstractMail()
11{ 14{
12 bodyCache.clear(); 15 bodyCache.clear();
13 m_storage = 0; 16 m_storage = 0;
14 m_folder = 0; 17 m_folder = 0;
15} 18}
16 19
17Genericwrapper::~Genericwrapper() 20Genericwrapper::~Genericwrapper()
18{ 21{
19 if (m_folder) { 22 if (m_folder) {
20 mailfolder_free(m_folder); 23 mailfolder_free(m_folder);
21 } 24 }
22 if (m_storage) { 25 if (m_storage) {
23 mailstorage_free(m_storage); 26 mailstorage_free(m_storage);
24 } 27 }
25 cleanMimeCache(); 28 cleanMimeCache();
26} 29}
30QString Genericwrapper::parseDateTime( mailimf_date_time *date )
31{
32 static bool init = false ;
33 if ( ! init ) {
34 KConfig kon ( locateLocal( "config", "korganizerrc" ) );
35 kon.setGroup("Locale");
36 KGlobal::locale()->setIntDateFormat( (KLocale::IntDateFormat)kon.readNumEntry( "PreferredDate",0) );
37 QString dummy = kon.readEntry( "UserDateFormatShort","%aK %d.%m.%y" );// kon.readEntry( "");
38 KGlobal::locale()->setHore24Format( !kon.readBoolEntry( "PreferredTime",0 ) );
39 KGlobal::locale()->setDateFormatShort(dummy.replace( QRegExp("K"), QString(",") ));
40 kon.setGroup("Time & Date");
41 KGlobal::locale()->setDaylightSaving( kon.readBoolEntry( "UseDaylightsaving", true ),
42 kon.readNumEntry( "DaylightsavingStart", 90),
43 kon.readNumEntry( "DaylightsavingEnd",304) );
44 KGlobal::locale()->setTimezone( kon.readEntry( "TimeZoneName" ," 00:00 Europe/London(UTC)") );
45
46 init = true;
47
48 }
49 QDateTime dt (QDate(date->dt_year,date->dt_month, date->dt_day ),QTime(date->dt_hour, date->dt_min, date->dt_sec ) );
50 int off = KGlobal::locale()->localTimeOffset( dt );
51 dt = dt.addSecs( off*60 );
52 QString ret = KGlobal::locale()->formatDateTime( dt,true,true);
53 if ( off < 0 )
54 ret += " -";
55 else
56 ret += " +";
57 ret += QString::number( off / 60 );
58 ret += "h";
59#if 0
60 char tmp[23];
61
62 // snprintf( tmp, 23, "%02i.%02i.%04i %02i:%02i:%02i %+05i",
63 // date->dt_day, date->dt_month, date->dt_year, date->dt_hour, date->dt_min, date->dt_sec, date->dt_zone );
64 snprintf( tmp, 23, "%04i-%02i-%02i %02i:%02i:%02i %+05i",
65 date->dt_year,date->dt_month, date->dt_day, date->dt_hour, date->dt_min, date->dt_sec, date->dt_zone );
66
67
68 return QString( tmp );
69#endif
70 return ret;
71}
27 72
28void Genericwrapper::fillSingleBody(RecPartP&target,mailmessage*,mailmime*mime) 73void Genericwrapper::fillSingleBody(RecPartP&target,mailmessage*,mailmime*mime)
29{ 74{
30 if (!mime) { 75 if (!mime) {
31 return; 76 return;
32 } 77 }
33 mailmime_field*field = 0; 78 mailmime_field*field = 0;
34 mailmime_single_fields fields; 79 mailmime_single_fields fields;
35 memset(&fields, 0, sizeof(struct mailmime_single_fields)); 80 memset(&fields, 0, sizeof(struct mailmime_single_fields));
36 if (mime->mm_mime_fields != NULL) { 81 if (mime->mm_mime_fields != NULL) {
37 mailmime_single_fields_init(&fields, mime->mm_mime_fields, 82 mailmime_single_fields_init(&fields, mime->mm_mime_fields,
38 mime->mm_content_type); 83 mime->mm_content_type);
39 } 84 }
40 85
41 mailmime_content*type = fields.fld_content; 86 mailmime_content*type = fields.fld_content;
42 clistcell*current; 87 clistcell*current;
43 if (!type) { 88 if (!type) {
44 target->setType("text"); 89 target->setType("text");
45 target->setSubtype("plain"); 90 target->setSubtype("plain");
46 } else { 91 } else {
47 target->setSubtype(type->ct_subtype); 92 target->setSubtype(type->ct_subtype);
48 switch(type->ct_type->tp_data.tp_discrete_type->dt_type) { 93 switch(type->ct_type->tp_data.tp_discrete_type->dt_type) {
49 case MAILMIME_DISCRETE_TYPE_TEXT: 94 case MAILMIME_DISCRETE_TYPE_TEXT:
50 target->setType("text"); 95 target->setType("text");
51 break; 96 break;
52 case MAILMIME_DISCRETE_TYPE_IMAGE: 97 case MAILMIME_DISCRETE_TYPE_IMAGE:
53 target->setType("image"); 98 target->setType("image");
54 break; 99 break;
55 case MAILMIME_DISCRETE_TYPE_AUDIO: 100 case MAILMIME_DISCRETE_TYPE_AUDIO:
56 target->setType("audio"); 101 target->setType("audio");
57 break; 102 break;
58 case MAILMIME_DISCRETE_TYPE_VIDEO: 103 case MAILMIME_DISCRETE_TYPE_VIDEO:
59 target->setType("video"); 104 target->setType("video");
60 break; 105 break;
61 case MAILMIME_DISCRETE_TYPE_APPLICATION: 106 case MAILMIME_DISCRETE_TYPE_APPLICATION:
62 target->setType("application"); 107 target->setType("application");
63 break; 108 break;
64 case MAILMIME_DISCRETE_TYPE_EXTENSION: 109 case MAILMIME_DISCRETE_TYPE_EXTENSION:
65 default: 110 default:
66 if (type->ct_type->tp_data.tp_discrete_type->dt_extension) { 111 if (type->ct_type->tp_data.tp_discrete_type->dt_extension) {
67 target->setType(type->ct_type->tp_data.tp_discrete_type->dt_extension); 112 target->setType(type->ct_type->tp_data.tp_discrete_type->dt_extension);
68 } 113 }
69 break; 114 break;
70 } 115 }
71 if (type->ct_parameters) { 116 if (type->ct_parameters) {
72 fillParameters(target,type->ct_parameters); 117 fillParameters(target,type->ct_parameters);
73 } 118 }
74 } 119 }
@@ -197,107 +242,96 @@ void Genericwrapper::traverseBody(RecBodyP&target,mailmessage*message,mailmime*m
197 } 242 }
198 traverseBody(target,message, cbody,countlist,current_rec+1,ccount); 243 traverseBody(target,message, cbody,countlist,current_rec+1,ccount);
199 if (cbody->mm_type==MAILMIME_MULTIPLE) { 244 if (cbody->mm_type==MAILMIME_MULTIPLE) {
200 countlist = recList; 245 countlist = recList;
201 } 246 }
202 ++ccount; 247 ++ccount;
203 } 248 }
204 } 249 }
205 break; 250 break;
206 case MAILMIME_MESSAGE: 251 case MAILMIME_MESSAGE:
207 { 252 {
208 QValueList<int>countlist = recList; 253 QValueList<int>countlist = recList;
209 countlist.append(current_count); 254 countlist.append(current_count);
210 /* the own header is always at recursion 0 - we don't need that */ 255 /* the own header is always at recursion 0 - we don't need that */
211 if (current_rec > 0) { 256 if (current_rec > 0) {
212 part->setPositionlist(countlist); 257 part->setPositionlist(countlist);
213 r = mailmessage_fetch_section(message,mime,&data,&len); 258 r = mailmessage_fetch_section(message,mime,&data,&len);
214 part->setSize(len); 259 part->setSize(len);
215 part->setPositionlist(countlist); 260 part->setPositionlist(countlist);
216 b = gen_attachment_id(); 261 b = gen_attachment_id();
217 part->setIdentifier(b); 262 part->setIdentifier(b);
218 part->setType("message"); 263 part->setType("message");
219 part->setSubtype("rfc822"); 264 part->setSubtype("rfc822");
220 bodyCache[b]=new encodedString(data,len); 265 bodyCache[b]=new encodedString(data,len);
221 target->addPart(part); 266 target->addPart(part);
222 } 267 }
223 if (mime->mm_data.mm_message.mm_msg_mime != NULL) { 268 if (mime->mm_data.mm_message.mm_msg_mime != NULL) {
224 traverseBody(target,message,mime->mm_data.mm_message.mm_msg_mime,countlist,current_rec+1); 269 traverseBody(target,message,mime->mm_data.mm_message.mm_msg_mime,countlist,current_rec+1);
225 } 270 }
226 } 271 }
227 break; 272 break;
228 } 273 }
229} 274}
230 275
231RecBodyP Genericwrapper::parseMail( mailmessage * msg ) 276RecBodyP Genericwrapper::parseMail( mailmessage * msg )
232{ 277{
233 int err = MAILIMF_NO_ERROR; 278 int err = MAILIMF_NO_ERROR;
234 mailmime_single_fields fields; 279 mailmime_single_fields fields;
235 /* is bound to msg and will be freed there */ 280 /* is bound to msg and will be freed there */
236 mailmime * mime=0; 281 mailmime * mime=0;
237 RecBodyP body = new RecBody(); 282 RecBodyP body = new RecBody();
238 memset(&fields, 0, sizeof(struct mailmime_single_fields)); 283 memset(&fields, 0, sizeof(struct mailmime_single_fields));
239 err = mailmessage_get_bodystructure(msg,&mime); 284 err = mailmessage_get_bodystructure(msg,&mime);
240 QValueList<int>recList; 285 QValueList<int>recList;
241 traverseBody(body,msg,mime,recList); 286 traverseBody(body,msg,mime,recList);
242 return body; 287 return body;
243} 288}
244 289
245QString Genericwrapper::parseDateTime( mailimf_date_time *date )
246{
247 char tmp[23];
248
249 // snprintf( tmp, 23, "%02i.%02i.%04i %02i:%02i:%02i %+05i",
250 // date->dt_day, date->dt_month, date->dt_year, date->dt_hour, date->dt_min, date->dt_sec, date->dt_zone );
251 snprintf( tmp, 23, "%04i-%02i-%02i %02i:%02i:%02i %+05i",
252 date->dt_year,date->dt_month, date->dt_day, date->dt_hour, date->dt_min, date->dt_sec, date->dt_zone );
253
254 return QString( tmp );
255}
256 290
257QString Genericwrapper::parseAddressList( mailimf_address_list *list ) 291QString Genericwrapper::parseAddressList( mailimf_address_list *list )
258{ 292{
259 QString result( "" ); 293 QString result( "" );
260 294
261 bool first = true; 295 bool first = true;
262 if (list == 0) return result; 296 if (list == 0) return result;
263 for ( clistiter *current = clist_begin( list->ad_list ); current != NULL; current = current->next ) { 297 for ( clistiter *current = clist_begin( list->ad_list ); current != NULL; current = current->next ) {
264 mailimf_address *addr = (mailimf_address *) current->data; 298 mailimf_address *addr = (mailimf_address *) current->data;
265 299
266 if ( !first ) { 300 if ( !first ) {
267 result.append( "," ); 301 result.append( "," );
268 } else { 302 } else {
269 first = false; 303 first = false;
270 } 304 }
271 305
272 switch ( addr->ad_type ) { 306 switch ( addr->ad_type ) {
273 case MAILIMF_ADDRESS_MAILBOX: 307 case MAILIMF_ADDRESS_MAILBOX:
274 result.append( parseMailbox( addr->ad_data.ad_mailbox ) ); 308 result.append( parseMailbox( addr->ad_data.ad_mailbox ) );
275 break; 309 break;
276 case MAILIMF_ADDRESS_GROUP: 310 case MAILIMF_ADDRESS_GROUP:
277 result.append( parseGroup( addr->ad_data.ad_group ) ); 311 result.append( parseGroup( addr->ad_data.ad_group ) );
278 break; 312 break;
279 default: 313 default:
280 ; // odebug << "Generic: unkown mailimf address type" << oendl; 314 ; // odebug << "Generic: unkown mailimf address type" << oendl;
281 break; 315 break;
282 } 316 }
283 } 317 }
284 318
285 return result; 319 return result;
286} 320}
287 321
288QString Genericwrapper::parseGroup( mailimf_group *group ) 322QString Genericwrapper::parseGroup( mailimf_group *group )
289{ 323{
290 QString result( "" ); 324 QString result( "" );
291 325
292 result.append( group->grp_display_name ); 326 result.append( group->grp_display_name );
293 result.append( ": " ); 327 result.append( ": " );
294 328
295 if ( group->grp_mb_list != NULL ) { 329 if ( group->grp_mb_list != NULL ) {
296 result.append( parseMailboxList( group->grp_mb_list ) ); 330 result.append( parseMailboxList( group->grp_mb_list ) );
297 } 331 }
298 332
299 result.append( ";" ); 333 result.append( ";" );
300 334
301 return result; 335 return result;
302} 336}
303 337
@@ -403,79 +437,85 @@ void Genericwrapper::parseList(QValueList<Opie::Core::OSmartPointer<RecMail> > &
403 return; 437 return;
404 } 438 }
405 r = mailsession_get_envelopes_list(session, env_list); 439 r = mailsession_get_envelopes_list(session, env_list);
406 if (r != MAIL_NO_ERROR) { 440 if (r != MAIL_NO_ERROR) {
407 ; // odebug << "Error filling message list" << oendl; 441 ; // odebug << "Error filling message list" << oendl;
408 if (env_list) { 442 if (env_list) {
409 mailmessage_list_free(env_list); 443 mailmessage_list_free(env_list);
410 } 444 }
411 return; 445 return;
412 } 446 }
413 mailimf_references * refs = 0; 447 mailimf_references * refs = 0;
414 mailimf_in_reply_to * in_replies = 0; 448 mailimf_in_reply_to * in_replies = 0;
415 uint32_t i = 0; 449 uint32_t i = 0;
416 for(; i < carray_count(env_list->msg_tab) ; ++i) { 450 for(; i < carray_count(env_list->msg_tab) ; ++i) {
417 mailmessage * msg; 451 mailmessage * msg;
418 QBitArray mFlags(7); 452 QBitArray mFlags(7);
419 msg = (mailmessage*)carray_get(env_list->msg_tab, i); 453 msg = (mailmessage*)carray_get(env_list->msg_tab, i);
420 if (msg->msg_fields == NULL) { 454 if (msg->msg_fields == NULL) {
421 //; // odebug << "could not fetch envelope of message " << i << "" << oendl; 455 //; // odebug << "could not fetch envelope of message " << i << "" << oendl;
422 continue; 456 continue;
423 } 457 }
424 RecMailP mail = new RecMail(); 458 RecMailP mail = new RecMail();
425 mail->setWrapper(this); 459 mail->setWrapper(this);
426 mail_flags * flag_result = 0; 460 mail_flags * flag_result = 0;
427 r = mailmessage_get_flags(msg,&flag_result); 461 r = mailmessage_get_flags(msg,&flag_result);
428 if (r == MAIL_ERROR_NOT_IMPLEMENTED) { 462 if (r == MAIL_ERROR_NOT_IMPLEMENTED) {
429 mFlags.setBit(FLAG_SEEN); 463 mFlags.setBit(FLAG_SEEN);
430 } 464 }
431 mailimf_single_fields single_fields; 465 mailimf_single_fields single_fields;
432 mailimf_single_fields_init(&single_fields, msg->msg_fields); 466 mailimf_single_fields_init(&single_fields, msg->msg_fields);
433 mail->setMsgsize(msg->msg_size); 467 mail->setMsgsize(msg->msg_size);
434 mail->setFlags(mFlags); 468 mail->setFlags(mFlags);
435 mail->setMbox(mailbox); 469 mail->setMbox(mailbox);
436 mail->setNumber(msg->msg_index); 470 mail->setNumber(msg->msg_index);
437 if (single_fields.fld_subject) 471 if (single_fields.fld_subject)
438 mail->setSubject( convert_String(single_fields.fld_subject->sbj_value)); 472 mail->setSubject( convert_String(single_fields.fld_subject->sbj_value));
439 if (single_fields.fld_from) 473 if (single_fields.fld_from)
440 mail->setFrom(parseMailboxList(single_fields.fld_from->frm_mb_list)); 474 mail->setFrom(parseMailboxList(single_fields.fld_from->frm_mb_list));
441 if (!mbox_as_to) { 475 if (!mbox_as_to) {
442 if (single_fields.fld_to) 476 if (single_fields.fld_to)
443 mail->setTo( parseAddressList( single_fields.fld_to->to_addr_list ) ); 477 mail->setTo( parseAddressList( single_fields.fld_to->to_addr_list ) );
444 } else { 478 } else {
445 mail->setTo(mailbox); 479 mail->setTo(mailbox);
446 } 480 }
447 if (single_fields.fld_cc) 481 if (single_fields.fld_cc)
448 mail->setCC( parseAddressList( single_fields.fld_cc->cc_addr_list ) ); 482 mail->setCC( parseAddressList( single_fields.fld_cc->cc_addr_list ) );
449 if (single_fields.fld_bcc) 483 if (single_fields.fld_bcc)
450 mail->setBcc( parseAddressList( single_fields.fld_bcc->bcc_addr_list ) ); 484 mail->setBcc( parseAddressList( single_fields.fld_bcc->bcc_addr_list ) );
451 if (single_fields.fld_orig_date) 485 if (single_fields.fld_orig_date) {
452 mail->setDate( parseDateTime( single_fields.fld_orig_date->dt_date_time ) ); 486 mail->setDate( parseDateTime( single_fields.fld_orig_date->dt_date_time ) );
487 char tmp[23];
488 struct mailimf_date_time* date = single_fields.fld_orig_date->dt_date_time;
489 snprintf( tmp, 23, "%04i-%02i-%02i %02i:%02i:%02i %05i",
490 date->dt_year,date->dt_month, date->dt_day, date->dt_hour, date->dt_min, date->dt_sec, date->dt_zone );
491 mail->setIsoDate( QString( tmp ) );
492 }
453 // crashes when accessing pop3 account? 493 // crashes when accessing pop3 account?
454 if (single_fields.fld_message_id) { 494 if (single_fields.fld_message_id) {
455 mail->setMsgid(QString(single_fields.fld_message_id->mid_value)); 495 mail->setMsgid(QString(single_fields.fld_message_id->mid_value));
456 ; // odebug << "Msgid == " << mail->Msgid().latin1() << "" << oendl; 496 ; // odebug << "Msgid == " << mail->Msgid().latin1() << "" << oendl;
457 } 497 }
458 if (single_fields.fld_reply_to) { 498 if (single_fields.fld_reply_to) {
459 QStringList t = parseAddressList(single_fields.fld_reply_to->rt_addr_list); 499 QStringList t = parseAddressList(single_fields.fld_reply_to->rt_addr_list);
460 if (t.count()>0) { 500 if (t.count()>0) {
461 mail->setReplyto(t[0]); 501 mail->setReplyto(t[0]);
462 } 502 }
463 } 503 }
464#if 0 504#if 0
465 refs = single_fields.fld_references; 505 refs = single_fields.fld_references;
466 if (refs && refs->mid_list && clist_count(refs->mid_list)) { 506 if (refs && refs->mid_list && clist_count(refs->mid_list)) {
467 char * text = (char*)refs->mid_list->first->data; 507 char * text = (char*)refs->mid_list->first->data;
468 mail->setReplyto(QString(text)); 508 mail->setReplyto(QString(text));
469 } 509 }
470#endif 510#endif
471 if (single_fields.fld_in_reply_to && single_fields.fld_in_reply_to->mid_list && 511 if (single_fields.fld_in_reply_to && single_fields.fld_in_reply_to->mid_list &&
472 clist_count(single_fields.fld_in_reply_to->mid_list)) { 512 clist_count(single_fields.fld_in_reply_to->mid_list)) {
473 mail->setInreply(parseInreplies(single_fields.fld_in_reply_to)); 513 mail->setInreply(parseInreplies(single_fields.fld_in_reply_to));
474 } 514 }
475 if ( maxSizeInKb == 0 || mail->Msgsize()<=maxSizeInKb*1024 ) 515 if ( maxSizeInKb == 0 || mail->Msgsize()<=maxSizeInKb*1024 )
476 target.append(mail); 516 target.append(mail);
477 } 517 }
478 if (env_list) { 518 if (env_list) {
479 mailmessage_list_free(env_list); 519 mailmessage_list_free(env_list);
480 } 520 }
481} 521}