summaryrefslogtreecommitdiff
path: root/noncore/net/mail/libmailwrapper
authoralwin <alwin>2003-12-12 13:56:20 (UTC)
committer alwin <alwin>2003-12-12 13:56:20 (UTC)
commit8af6feb08d168fefaa2568b057efa132386471f6 (patch) (unidiff)
tree3c5dd691e33ebf62156a22e4916ba8b34625acf5 /noncore/net/mail/libmailwrapper
parent2a3290782c29e14de64d031fbdf4ce79fdfa1506 (diff)
downloadopie-8af6feb08d168fefaa2568b057efa132386471f6.zip
opie-8af6feb08d168fefaa2568b057efa132386471f6.tar.gz
opie-8af6feb08d168fefaa2568b057efa132386471f6.tar.bz2
fetching mail body and attachments is working.
Diffstat (limited to 'noncore/net/mail/libmailwrapper') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/net/mail/libmailwrapper/imapwrapper.cpp143
-rw-r--r--noncore/net/mail/libmailwrapper/imapwrapper.h6
-rw-r--r--noncore/net/mail/libmailwrapper/mailtypes.cpp62
-rw-r--r--noncore/net/mail/libmailwrapper/mailtypes.h25
4 files changed, 141 insertions, 95 deletions
diff --git a/noncore/net/mail/libmailwrapper/imapwrapper.cpp b/noncore/net/mail/libmailwrapper/imapwrapper.cpp
index fa967da..da5974c 100644
--- a/noncore/net/mail/libmailwrapper/imapwrapper.cpp
+++ b/noncore/net/mail/libmailwrapper/imapwrapper.cpp
@@ -373,79 +373,33 @@ void IMAPwrapper::searchBodyText(const RecMail&mail,mailimap_body_type_1part*mai
373 if (!mailDescription) { 373 if (!mailDescription) {
374 return; 374 return;
375 } 375 }
376 QString sub; 376 QString sub,body_text;
377 RecPart singlePart;
378 QValueList<int> path;
379 fillSinglePart(singlePart,mailDescription);
377 switch (mailDescription->bd_type) { 380 switch (mailDescription->bd_type) {
378 case MAILIMAP_BODY_TYPE_1PART_MSG: 381 case MAILIMAP_BODY_TYPE_1PART_MSG:
379 target_body.setType("text"); 382 path.append(1);
380 sub = mailDescription->bd_data.bd_type_text->bd_media_text; 383 body_text = fetchPart(mail,path,true);
381 target_body.setSubtype(sub.lower()); 384 target_body.setBodytext(body_text);
382 fillPlainBody(mail,target_body); 385 target_body.setDescription(singlePart);
383 break; 386 break;
384 case MAILIMAP_BODY_TYPE_1PART_TEXT: 387 case MAILIMAP_BODY_TYPE_1PART_TEXT:
385 qDebug("Mediatype single: %s",mailDescription->bd_data.bd_type_text->bd_media_text); 388 qDebug("Mediatype single: %s",mailDescription->bd_data.bd_type_text->bd_media_text);
386 target_body.setType("text"); 389 path.append(1);
387 sub = mailDescription->bd_data.bd_type_text->bd_media_text; 390 body_text = fetchPart(mail,path,true);
388 target_body.setSubtype(sub.lower()); 391 target_body.setBodytext(body_text);
389 fillPlainBody(mail,target_body); 392 target_body.setDescription(singlePart);
393 break;
394 case MAILIMAP_BODY_TYPE_1PART_BASIC:
395 qDebug("Single attachment");
396 target_body.setBodytext("");
397 target_body.addPart(singlePart);
390 break; 398 break;
391 default: 399 default:
392 break; 400 break;
393 } 401 }
394 return;
395}
396
397void IMAPwrapper::fillPlainBody(const RecMail&mail,RecBody&target_body)
398{
399 const char *mb;
400 QString body="";
401 int err = MAILIMAP_NO_ERROR;
402 clist *result;
403 clistcell *current,*cur;
404 mailimap_fetch_att *fetchAtt;
405 mailimap_fetch_type *fetchType;
406 mailimap_set *set;
407
408 mb = mail.getMbox().latin1();
409
410 if (!m_imap) {
411 return;
412 }
413
414 result = clist_new();
415 set = set = mailimap_set_new_single(mail.getNumber());
416 mailimap_section * section = mailimap_section_new_text();
417 fetchAtt = mailimap_fetch_att_new_body_peek_section(section);
418 fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt);
419 err = mailimap_fetch( m_imap, set, fetchType, &result );
420 mailimap_set_free( set );
421 mailimap_fetch_type_free( fetchType );
422
423 402
424 if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) {
425 mailimap_msg_att * msg_att;
426 msg_att = (mailimap_msg_att*)current->data;
427 mailimap_msg_att_item*msg_att_item;
428 for(cur = clist_begin(msg_att->att_list) ; cur != NULL ; cur = clist_next(cur)) {
429 msg_att_item = (mailimap_msg_att_item*)clist_content(cur);
430 if (msg_att_item->att_type == MAILIMAP_MSG_ATT_ITEM_STATIC) {
431 if (msg_att_item->att_data.att_static->att_type == MAILIMAP_MSG_ATT_BODY_SECTION) {
432 char*text = msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part;
433 msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part = 0L;
434 if (text) {
435 body = QString(text);
436 free(text);
437 } else {
438 body = "";
439 }
440 }
441 }
442 }
443
444 } else {
445 qDebug("error fetching text: %s",m_imap->imap_response);
446 }
447 mailimap_fetch_list_free(result);
448 target_body.setBodytext(body);
449 return; 403 return;
450} 404}
451 405
@@ -490,7 +444,7 @@ QStringList IMAPwrapper::address_list_to_stringlist(clist*list)
490 return l; 444 return l;
491} 445}
492 446
493QString IMAPwrapper::fetchPart(const RecMail&mail,QValueList<int>&path,bool internal_call) 447QString IMAPwrapper::fetchPart(const RecMail&mail,const QValueList<int>&path,bool internal_call)
494{ 448{
495 QString body(""); 449 QString body("");
496 const char*mb; 450 const char*mb;
@@ -584,17 +538,17 @@ void IMAPwrapper::searchBodyText(const RecMail&mail,mailimap_body_type_mpart*mai
584 /* important: Check for is NULL 'cause a body can be empty! */ 538 /* important: Check for is NULL 'cause a body can be empty! */
585 if (currentPart.Type()=="text" && target_body.Bodytext().isNull() ) { 539 if (currentPart.Type()=="text" && target_body.Bodytext().isNull() ) {
586 QString body_text = fetchPart(mail,clist,true); 540 QString body_text = fetchPart(mail,clist,true);
541 target_body.setDescription(currentPart);
587 target_body.setBodytext(body_text); 542 target_body.setBodytext(body_text);
588 target_body.setType(currentPart.Type());
589 target_body.setSubtype(currentPart.Subtype());
590 } else { 543 } else {
591 QString id(""); 544 QString id("");
592 for (unsigned int j = 0; j < clist.count();++j) { 545 for (unsigned int j = 0; j < clist.count();++j) {
593 id+=(j>0?".":""); 546 id+=(j>0?" ":"");
594 id+=QString("%1").arg(clist[j]); 547 id+=QString("%1").arg(clist[j]);
595 } 548 }
596 qDebug("ID= %s",id.latin1()); 549 qDebug("ID= %s",id.latin1());
597 currentPart.setIdentifier(id); 550 currentPart.setIdentifier(id);
551 currentPart.setPositionlist(clist);
598 target_body.addPart(currentPart); 552 target_body.addPart(currentPart);
599 } 553 }
600 } 554 }
@@ -614,6 +568,9 @@ void IMAPwrapper::fillSinglePart(RecPart&target_part,mailimap_body_type_1part*De
614 case MAILIMAP_BODY_TYPE_1PART_BASIC: 568 case MAILIMAP_BODY_TYPE_1PART_BASIC:
615 fillSingleBasicPart(target_part,Description->bd_data.bd_type_basic); 569 fillSingleBasicPart(target_part,Description->bd_data.bd_type_basic);
616 break; 570 break;
571 case MAILIMAP_BODY_TYPE_1PART_MSG:
572 fillSingleMsgPart(target_part,Description->bd_data.bd_type_msg);
573 break;
617 default: 574 default:
618 break; 575 break;
619 } 576 }
@@ -631,6 +588,22 @@ void IMAPwrapper::fillSingleTextPart(RecPart&target_part,mailimap_body_type_text
631 fillBodyFields(target_part,which->bd_fields); 588 fillBodyFields(target_part,which->bd_fields);
632} 589}
633 590
591void IMAPwrapper::fillSingleMsgPart(RecPart&target_part,mailimap_body_type_msg*which)
592{
593 if (!which) {
594 return;
595 }
596// QString sub;
597// sub = which->bd_media_text;
598// target_part.setSubtype(sub.lower());
599 qDebug("Message part");
600 /* we set this type to text/plain */
601 target_part.setType("text");
602 target_part.setSubtype("plain");
603 target_part.setLines(which->bd_lines);
604 fillBodyFields(target_part,which->bd_fields);
605}
606
634void IMAPwrapper::fillSingleBasicPart(RecPart&target_part,mailimap_body_type_basic*which) 607void IMAPwrapper::fillSingleBasicPart(RecPart&target_part,mailimap_body_type_basic*which)
635{ 608{
636 if (!which) { 609 if (!which) {
@@ -680,5 +653,41 @@ void IMAPwrapper::fillBodyFields(RecPart&target_part,mailimap_body_fields*which)
680 mailimap_single_body_fld_param*param; 653 mailimap_single_body_fld_param*param;
681 for (cur = clist_begin(which->bd_parameter->pa_list);cur!=NULL;cur=clist_next(cur)) { 654 for (cur = clist_begin(which->bd_parameter->pa_list);cur!=NULL;cur=clist_next(cur)) {
682 param = (mailimap_single_body_fld_param*)cur->data; 655 param = (mailimap_single_body_fld_param*)cur->data;
656 if (param) {
657 target_part.addParameter(QString(param->pa_name).lower(),QString(param->pa_value));
658 }
683 } 659 }
660 mailimap_body_fld_enc*enc = which->bd_encoding;
661 QString encoding("");
662 switch (enc->enc_type) {
663 case MAILIMAP_BODY_FLD_ENC_7BIT:
664 encoding = "7bit";
665 break;
666 case MAILIMAP_BODY_FLD_ENC_8BIT:
667 encoding = "8bit";
668 break;
669 case MAILIMAP_BODY_FLD_ENC_BINARY:
670 encoding="binary";
671 break;
672 case MAILIMAP_BODY_FLD_ENC_BASE64:
673 encoding="base64";
674 break;
675 case MAILIMAP_BODY_FLD_ENC_QUOTED_PRINTABLE:
676 encoding="quoted-printable";
677 break;
678 case MAILIMAP_BODY_FLD_ENC_OTHER:
679 default:
680 if (enc->enc_value) {
681 char*t=enc->enc_value;
682 encoding=QString(enc->enc_value);
683 enc->enc_value=0L;
684 free(t);
685 }
686 }
687 target_part.setEncoding(encoding);
688}
689
690QString IMAPwrapper::fetchPart(const RecMail&mail,const RecPart&part)
691{
692 return fetchPart(mail,part.Positionlist(),false);
684} 693}
diff --git a/noncore/net/mail/libmailwrapper/imapwrapper.h b/noncore/net/mail/libmailwrapper/imapwrapper.h
index 5ea45f3..95de215 100644
--- a/noncore/net/mail/libmailwrapper/imapwrapper.h
+++ b/noncore/net/mail/libmailwrapper/imapwrapper.h
@@ -8,6 +8,7 @@ struct mailimap;
8struct mailimap_body_type_1part; 8struct mailimap_body_type_1part;
9struct mailimap_body_type_text; 9struct mailimap_body_type_text;
10struct mailimap_body_type_basic; 10struct mailimap_body_type_basic;
11struct mailimap_body_type_msg;
11struct mailimap_body_type_mpart; 12struct mailimap_body_type_mpart;
12struct mailimap_body_fields; 13struct mailimap_body_fields;
13struct mailimap_msg_att; 14struct mailimap_msg_att;
@@ -25,7 +26,8 @@ public:
25 QList<IMAPFolder>* listFolders(); 26 QList<IMAPFolder>* listFolders();
26 void listMessages(const QString & mailbox,QList<RecMail>&target ); 27 void listMessages(const QString & mailbox,QList<RecMail>&target );
27 RecBody fetchBody(const RecMail&mail); 28 RecBody fetchBody(const RecMail&mail);
28 QString fetchPart(const RecMail&mail,QValueList<int>&path,bool internal_call=false); 29 QString fetchPart(const RecMail&mail,const QValueList<int>&path,bool internal_call=false);
30 QString fetchPart(const RecMail&mail,const RecPart&part);
29 static void imap_progress( size_t current, size_t maximum ); 31 static void imap_progress( size_t current, size_t maximum );
30 32
31protected: 33protected:
@@ -36,10 +38,10 @@ protected:
36 void searchBodyText(const RecMail&mail,mailimap_body_type_1part*mailDescription,RecBody&target_body); 38 void searchBodyText(const RecMail&mail,mailimap_body_type_1part*mailDescription,RecBody&target_body);
37 void searchBodyText(const RecMail&mail,mailimap_body_type_mpart*mailDescription,RecBody&target_body,int current_recursion=0,QValueList<int>recList=QValueList<int>()); 39 void searchBodyText(const RecMail&mail,mailimap_body_type_mpart*mailDescription,RecBody&target_body,int current_recursion=0,QValueList<int>recList=QValueList<int>());
38 40
39 void fillPlainBody(const RecMail&mail,RecBody&target_body);
40 void fillSinglePart(RecPart&target_part,mailimap_body_type_1part*Description); 41 void fillSinglePart(RecPart&target_part,mailimap_body_type_1part*Description);
41 void fillSingleTextPart(RecPart&target_part,mailimap_body_type_text*which); 42 void fillSingleTextPart(RecPart&target_part,mailimap_body_type_text*which);
42 void fillSingleBasicPart(RecPart&target_part,mailimap_body_type_basic*which); 43 void fillSingleBasicPart(RecPart&target_part,mailimap_body_type_basic*which);
44 void fillSingleMsgPart(RecPart&target_part,mailimap_body_type_msg*which);
43 45
44 /* just helpers */ 46 /* just helpers */
45 static void fillBodyFields(RecPart&target_part,mailimap_body_fields*which); 47 static void fillBodyFields(RecPart&target_part,mailimap_body_fields*which);
diff --git a/noncore/net/mail/libmailwrapper/mailtypes.cpp b/noncore/net/mail/libmailwrapper/mailtypes.cpp
index 6a66113..f56bb63 100644
--- a/noncore/net/mail/libmailwrapper/mailtypes.cpp
+++ b/noncore/net/mail/libmailwrapper/mailtypes.cpp
@@ -70,11 +70,8 @@ const QStringList& RecMail::Bcc()const
70RecPart::RecPart() 70RecPart::RecPart()
71 : m_type(""),m_subtype(""),m_identifier(""),m_encoding(""),m_lines(0) 71 : m_type(""),m_subtype(""),m_identifier(""),m_encoding(""),m_lines(0)
72{ 72{
73} 73 m_Parameters.clear();
74 74 m_poslist.clear();
75RecPart::RecPart(const QString&identifier,const QString&type,const QString&subtype,const QString&encoding,unsigned int lines)
76 : m_type(type),m_subtype(subtype),m_identifier(identifier),m_encoding(encoding),m_lines(lines)
77{
78} 75}
79 76
80RecPart::~RecPart() 77RecPart::~RecPart()
@@ -131,8 +128,43 @@ void RecPart::setEncoding(const QString&encoding)
131 m_encoding = encoding; 128 m_encoding = encoding;
132} 129}
133 130
131void RecPart::setParameters(const part_plist_t&list)
132{
133 m_Parameters = list;
134}
135
136const part_plist_t& RecPart::Parameters()const
137{
138 return m_Parameters;
139}
140
141void RecPart::addParameter(const QString&key,const QString&value)
142{
143 m_Parameters[key]=value;
144}
145
146const QString RecPart::searchParamter(const QString&key)const
147{
148 QString value("");
149 part_plist_t::ConstIterator it = m_Parameters.find(key);
150 if (it != m_Parameters.end()) {
151 value = it.data();
152 }
153 return value;
154}
155
156void RecPart::setPositionlist(const QValueList<int>&poslist)
157{
158 m_poslist = poslist;
159}
160
161const QValueList<int>& RecPart::Positionlist()const
162{
163 return m_poslist;
164}
165
134RecBody::RecBody() 166RecBody::RecBody()
135 : m_BodyText(),m_PartsList() 167 : m_BodyText(),m_PartsList(),m_description()
136{ 168{
137 m_PartsList.setAutoDelete(true); 169 m_PartsList.setAutoDelete(true);
138} 170}
@@ -168,22 +200,12 @@ void RecBody::addPart(const RecPart& part)
168 m_PartsList.append(p); 200 m_PartsList.append(p);
169} 201}
170 202
171void RecBody::setType(const QString&type) 203void RecBody::setDescription(const RecPart&des)
172{ 204{
173 m_type = type; 205 m_description = des;
174} 206}
175 207
176const QString& RecBody::Type()const 208const RecPart& RecBody::Description()const
177{ 209{
178 return m_type; 210 return m_description;
179}
180
181void RecBody::setSubtype(const QString&type)
182{
183 m_subtype = type;
184}
185
186const QString& RecBody::Subtype()const
187{
188 return m_subtype;
189} 211}
diff --git a/noncore/net/mail/libmailwrapper/mailtypes.h b/noncore/net/mail/libmailwrapper/mailtypes.h
index 900f10a..60db527 100644
--- a/noncore/net/mail/libmailwrapper/mailtypes.h
+++ b/noncore/net/mail/libmailwrapper/mailtypes.h
@@ -12,6 +12,8 @@
12#include <qbitarray.h> 12#include <qbitarray.h>
13#include <qstring.h> 13#include <qstring.h>
14#include <qstringlist.h> 14#include <qstringlist.h>
15#include <qmap.h>
16#include <qvaluelist.h>
15 17
16/* a class to describe mails in a mailbox */ 18/* a class to describe mails in a mailbox */
17/* Attention! 19/* Attention!
@@ -68,14 +70,19 @@ protected:
68 void copy_old(const RecMail&old); 70 void copy_old(const RecMail&old);
69}; 71};
70 72
73typedef QMap<QString,QString> part_plist_t;
74
71class RecPart 75class RecPart
72{ 76{
73protected: 77protected:
74 QString m_type,m_subtype,m_identifier,m_encoding; 78 QString m_type,m_subtype,m_identifier,m_encoding;
75 unsigned int m_lines; 79 unsigned int m_lines;
80 part_plist_t m_Parameters;
81 /* describes the position in the mail */
82 QValueList<int> m_poslist;
83
76public: 84public:
77 RecPart(); 85 RecPart();
78 RecPart(const QString&identifier,const QString&type="",const QString&subtype="",const QString&encoding="BASE64",unsigned int lines=0);
79 virtual ~RecPart(); 86 virtual ~RecPart();
80 87
81 const QString&Type()const; 88 const QString&Type()const;
@@ -88,24 +95,30 @@ public:
88 void setEncoding(const QString&encoding); 95 void setEncoding(const QString&encoding);
89 void setLines(unsigned int lines); 96 void setLines(unsigned int lines);
90 const unsigned int Lines()const; 97 const unsigned int Lines()const;
98
99 void setParameters(const part_plist_t&list);
100 const part_plist_t&Parameters()const;
101 void addParameter(const QString&key,const QString&value);
102 const QString searchParamter(const QString&key)const;
103 void setPositionlist(const QValueList<int>&poslist);
104 const QValueList<int>& Positionlist()const;
91}; 105};
92 106
93class RecBody 107class RecBody
94{ 108{
95protected: 109protected:
96 QString m_BodyText,m_type,m_subtype; 110 QString m_BodyText;
97 QList<RecPart> m_PartsList; 111 QList<RecPart> m_PartsList;
112 RecPart m_description;
98 113
99public: 114public:
100 RecBody(); 115 RecBody();
101 virtual ~RecBody(); 116 virtual ~RecBody();
102 void setBodytext(const QString&); 117 void setBodytext(const QString&);
103 const QString& Bodytext()const; 118 const QString& Bodytext()const;
104 void setType(const QString&);
105 const QString&Type()const;
106 void setSubtype(const QString&);
107 const QString&Subtype()const;
108 119
120 void setDescription(const RecPart&des);
121 const RecPart& Description()const;
109 122
110 void setParts(const QList<RecPart>&parts); 123 void setParts(const QList<RecPart>&parts);
111 const QList<RecPart>& Parts()const; 124 const QList<RecPart>& Parts()const;