summaryrefslogtreecommitdiff
authoralwin <alwin>2003-12-16 02:13:09 (UTC)
committer alwin <alwin>2003-12-16 02:13:09 (UTC)
commitf42c15f884d4377bc99d73e16fa1722b0fb2a4d3 (patch) (side-by-side diff)
tree0ecd625c8a5913285fa31a050a9a6e49c13fbe4b
parent32d48372f7b5ec9e4586ea74cc444838b157248e (diff)
downloadopie-f42c15f884d4377bc99d73e16fa1722b0fb2a4d3.zip
opie-f42c15f884d4377bc99d73e16fa1722b0fb2a4d3.tar.gz
opie-f42c15f884d4377bc99d73e16fa1722b0fb2a4d3.tar.bz2
quoted-printable text will be decoded for display
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/net/mail/abstractmail.cpp21
-rw-r--r--noncore/net/mail/abstractmail.h4
-rw-r--r--noncore/net/mail/imapwrapper.cpp18
-rw-r--r--noncore/net/mail/imapwrapper.h4
-rw-r--r--noncore/net/mail/libmailwrapper/abstractmail.cpp21
-rw-r--r--noncore/net/mail/libmailwrapper/abstractmail.h4
-rw-r--r--noncore/net/mail/libmailwrapper/imapwrapper.cpp18
-rw-r--r--noncore/net/mail/libmailwrapper/imapwrapper.h4
8 files changed, 78 insertions, 16 deletions
diff --git a/noncore/net/mail/abstractmail.cpp b/noncore/net/mail/abstractmail.cpp
index 7380c31..0bb2525 100644
--- a/noncore/net/mail/abstractmail.cpp
+++ b/noncore/net/mail/abstractmail.cpp
@@ -1,8 +1,12 @@
#include "abstractmail.h"
#include "imapwrapper.h"
#include "pop3wrapper.h"
+#include <qstring.h>
+#include <stdlib.h>
+#include <libetpan/mailmime_content.h>
+
AbstractMail* AbstractMail::getWrapper(IMAPaccount *a)
{
return new IMAPwrapper(a);
}
@@ -10,4 +14,21 @@ AbstractMail* AbstractMail::getWrapper(IMAPaccount *a)
AbstractMail* AbstractMail::getWrapper(POP3account *a)
{
return new POP3wrapper(a);
}
+
+QString AbstractMail::decode_quoted_printable(const char*text)
+{
+ char*result_text;
+ size_t index = 0;
+ QString result = "";
+ /* reset for recursive use! */
+ size_t target_length = 0;
+ result_text = 0;
+ int err = mailmime_quoted_printable_body_parse(text,strlen(text),
+ &index,&result_text,&target_length,0);
+ if (result_text) {
+ result = result_text;
+ free(result_text);
+ }
+ return result;
+}
diff --git a/noncore/net/mail/abstractmail.h b/noncore/net/mail/abstractmail.h
index 62e0715..4473ad2 100644
--- a/noncore/net/mail/abstractmail.h
+++ b/noncore/net/mail/abstractmail.h
@@ -22,10 +22,10 @@ public:
virtual RecBody fetchBody(const RecMail&mail)=0;
virtual QString fetchPart(const RecMail&mail,const RecPart&part)=0;
virtual void deleteMail(const RecMail&mail)=0;
virtual void answeredMail(const RecMail&mail)=0;
-
+
static AbstractMail* getWrapper(IMAPaccount *a);
static AbstractMail* getWrapper(POP3account *a);
+ static QString decode_quoted_printable(const char*text);
};
-
#endif
diff --git a/noncore/net/mail/imapwrapper.cpp b/noncore/net/mail/imapwrapper.cpp
index ad95384..a4e6228 100644
--- a/noncore/net/mail/imapwrapper.cpp
+++ b/noncore/net/mail/imapwrapper.cpp
@@ -391,15 +391,21 @@ void IMAPwrapper::searchBodyText(const RecMail&mail,mailimap_body_type_1part*mai
switch (mailDescription->bd_type) {
case MAILIMAP_BODY_TYPE_1PART_MSG:
path.append(1);
body_text = fetchPart(mail,path,true);
+ if (singlePart.Encoding()=="quoted-printable") {
+ body_text = decode_quoted_printable(body_text.latin1());
+ }
target_body.setBodytext(body_text);
target_body.setDescription(singlePart);
break;
case MAILIMAP_BODY_TYPE_1PART_TEXT:
qDebug("Mediatype single: %s",mailDescription->bd_data.bd_type_text->bd_media_text);
path.append(1);
body_text = fetchPart(mail,path,true);
+ if (singlePart.Encoding()=="quoted-printable") {
+ body_text = decode_quoted_printable(body_text.latin1());
+ }
target_body.setBodytext(body_text);
target_body.setDescription(singlePart);
break;
case MAILIMAP_BODY_TYPE_1PART_BASIC:
@@ -454,9 +460,9 @@ QStringList IMAPwrapper::address_list_to_stringlist(clist*list)
}
return l;
}
-QString IMAPwrapper::fetchPart(const RecMail&mail,const QValueList<int>&path,bool internal_call)
+QString IMAPwrapper::fetchPart(const RecMail&mail,const QValueList<int>&path,bool internal_call,const QString&enc)
{
QString body("");
const char*mb;
int err;
@@ -506,9 +512,13 @@ QString IMAPwrapper::fetchPart(const RecMail&mail,const QValueList<int>&path,boo
if (msg_att_item->att_data.att_static->att_type == MAILIMAP_MSG_ATT_BODY_SECTION) {
char*text = msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part;
msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part = 0L;
if (text) {
- body = QString(text);
+ if (enc=="quoted-printable") {
+ body = decode_quoted_printable(text);
+ } else {
+ body = QString(text);
+ }
free(text);
} else {
body = "";
}
@@ -546,9 +556,9 @@ void IMAPwrapper::searchBodyText(const RecMail&mail,mailimap_body_type_mpart*mai
QValueList<int>clist = recList;
clist.append(count);
/* important: Check for is NULL 'cause a body can be empty! */
if (currentPart.Type()=="text" && target_body.Bodytext().isNull() ) {
- QString body_text = fetchPart(mail,clist,true);
+ QString body_text = fetchPart(mail,clist,true,currentPart.Encoding());
target_body.setDescription(currentPart);
target_body.setBodytext(body_text);
} else {
QString id("");
@@ -704,9 +714,9 @@ void IMAPwrapper::fillBodyFields(RecPart&target_part,mailimap_body_fields*which)
}
QString IMAPwrapper::fetchPart(const RecMail&mail,const RecPart&part)
{
- return fetchPart(mail,part.Positionlist(),false);
+ return fetchPart(mail,part.Positionlist(),false,part.Encoding());
}
void IMAPwrapper::deleteMail(const RecMail&mail)
{
diff --git a/noncore/net/mail/imapwrapper.h b/noncore/net/mail/imapwrapper.h
index 700d512..768a517 100644
--- a/noncore/net/mail/imapwrapper.h
+++ b/noncore/net/mail/imapwrapper.h
@@ -33,9 +33,9 @@ protected:
RecMail*parse_list_result(mailimap_msg_att*);
void login();
void logout();
- virtual QString fetchPart(const RecMail&mail,const QValueList<int>&path,bool internal_call=false);
+ virtual QString fetchPart(const RecMail&mail,const QValueList<int>&path,bool internal_call=false,const QString&enc="");
void searchBodyText(const RecMail&mail,mailimap_body_type_1part*mailDescription,RecBody&target_body);
void searchBodyText(const RecMail&mail,mailimap_body_type_mpart*mailDescription,RecBody&target_body,int current_recursion=0,QValueList<int>recList=QValueList<int>());
@@ -47,9 +47,9 @@ protected:
/* just helpers */
static void fillBodyFields(RecPart&target_part,mailimap_body_fields*which);
static QStringList address_list_to_stringlist(clist*list);
-private:
+
IMAPaccount *account;
mailimap *m_imap;
};
diff --git a/noncore/net/mail/libmailwrapper/abstractmail.cpp b/noncore/net/mail/libmailwrapper/abstractmail.cpp
index 7380c31..0bb2525 100644
--- a/noncore/net/mail/libmailwrapper/abstractmail.cpp
+++ b/noncore/net/mail/libmailwrapper/abstractmail.cpp
@@ -1,8 +1,12 @@
#include "abstractmail.h"
#include "imapwrapper.h"
#include "pop3wrapper.h"
+#include <qstring.h>
+#include <stdlib.h>
+#include <libetpan/mailmime_content.h>
+
AbstractMail* AbstractMail::getWrapper(IMAPaccount *a)
{
return new IMAPwrapper(a);
}
@@ -10,4 +14,21 @@ AbstractMail* AbstractMail::getWrapper(IMAPaccount *a)
AbstractMail* AbstractMail::getWrapper(POP3account *a)
{
return new POP3wrapper(a);
}
+
+QString AbstractMail::decode_quoted_printable(const char*text)
+{
+ char*result_text;
+ size_t index = 0;
+ QString result = "";
+ /* reset for recursive use! */
+ size_t target_length = 0;
+ result_text = 0;
+ int err = mailmime_quoted_printable_body_parse(text,strlen(text),
+ &index,&result_text,&target_length,0);
+ if (result_text) {
+ result = result_text;
+ free(result_text);
+ }
+ return result;
+}
diff --git a/noncore/net/mail/libmailwrapper/abstractmail.h b/noncore/net/mail/libmailwrapper/abstractmail.h
index 62e0715..4473ad2 100644
--- a/noncore/net/mail/libmailwrapper/abstractmail.h
+++ b/noncore/net/mail/libmailwrapper/abstractmail.h
@@ -22,10 +22,10 @@ public:
virtual RecBody fetchBody(const RecMail&mail)=0;
virtual QString fetchPart(const RecMail&mail,const RecPart&part)=0;
virtual void deleteMail(const RecMail&mail)=0;
virtual void answeredMail(const RecMail&mail)=0;
-
+
static AbstractMail* getWrapper(IMAPaccount *a);
static AbstractMail* getWrapper(POP3account *a);
+ static QString decode_quoted_printable(const char*text);
};
-
#endif
diff --git a/noncore/net/mail/libmailwrapper/imapwrapper.cpp b/noncore/net/mail/libmailwrapper/imapwrapper.cpp
index ad95384..a4e6228 100644
--- a/noncore/net/mail/libmailwrapper/imapwrapper.cpp
+++ b/noncore/net/mail/libmailwrapper/imapwrapper.cpp
@@ -391,15 +391,21 @@ void IMAPwrapper::searchBodyText(const RecMail&mail,mailimap_body_type_1part*mai
switch (mailDescription->bd_type) {
case MAILIMAP_BODY_TYPE_1PART_MSG:
path.append(1);
body_text = fetchPart(mail,path,true);
+ if (singlePart.Encoding()=="quoted-printable") {
+ body_text = decode_quoted_printable(body_text.latin1());
+ }
target_body.setBodytext(body_text);
target_body.setDescription(singlePart);
break;
case MAILIMAP_BODY_TYPE_1PART_TEXT:
qDebug("Mediatype single: %s",mailDescription->bd_data.bd_type_text->bd_media_text);
path.append(1);
body_text = fetchPart(mail,path,true);
+ if (singlePart.Encoding()=="quoted-printable") {
+ body_text = decode_quoted_printable(body_text.latin1());
+ }
target_body.setBodytext(body_text);
target_body.setDescription(singlePart);
break;
case MAILIMAP_BODY_TYPE_1PART_BASIC:
@@ -454,9 +460,9 @@ QStringList IMAPwrapper::address_list_to_stringlist(clist*list)
}
return l;
}
-QString IMAPwrapper::fetchPart(const RecMail&mail,const QValueList<int>&path,bool internal_call)
+QString IMAPwrapper::fetchPart(const RecMail&mail,const QValueList<int>&path,bool internal_call,const QString&enc)
{
QString body("");
const char*mb;
int err;
@@ -506,9 +512,13 @@ QString IMAPwrapper::fetchPart(const RecMail&mail,const QValueList<int>&path,boo
if (msg_att_item->att_data.att_static->att_type == MAILIMAP_MSG_ATT_BODY_SECTION) {
char*text = msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part;
msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part = 0L;
if (text) {
- body = QString(text);
+ if (enc=="quoted-printable") {
+ body = decode_quoted_printable(text);
+ } else {
+ body = QString(text);
+ }
free(text);
} else {
body = "";
}
@@ -546,9 +556,9 @@ void IMAPwrapper::searchBodyText(const RecMail&mail,mailimap_body_type_mpart*mai
QValueList<int>clist = recList;
clist.append(count);
/* important: Check for is NULL 'cause a body can be empty! */
if (currentPart.Type()=="text" && target_body.Bodytext().isNull() ) {
- QString body_text = fetchPart(mail,clist,true);
+ QString body_text = fetchPart(mail,clist,true,currentPart.Encoding());
target_body.setDescription(currentPart);
target_body.setBodytext(body_text);
} else {
QString id("");
@@ -704,9 +714,9 @@ void IMAPwrapper::fillBodyFields(RecPart&target_part,mailimap_body_fields*which)
}
QString IMAPwrapper::fetchPart(const RecMail&mail,const RecPart&part)
{
- return fetchPart(mail,part.Positionlist(),false);
+ return fetchPart(mail,part.Positionlist(),false,part.Encoding());
}
void IMAPwrapper::deleteMail(const RecMail&mail)
{
diff --git a/noncore/net/mail/libmailwrapper/imapwrapper.h b/noncore/net/mail/libmailwrapper/imapwrapper.h
index 700d512..768a517 100644
--- a/noncore/net/mail/libmailwrapper/imapwrapper.h
+++ b/noncore/net/mail/libmailwrapper/imapwrapper.h
@@ -33,9 +33,9 @@ protected:
RecMail*parse_list_result(mailimap_msg_att*);
void login();
void logout();
- virtual QString fetchPart(const RecMail&mail,const QValueList<int>&path,bool internal_call=false);
+ virtual QString fetchPart(const RecMail&mail,const QValueList<int>&path,bool internal_call=false,const QString&enc="");
void searchBodyText(const RecMail&mail,mailimap_body_type_1part*mailDescription,RecBody&target_body);
void searchBodyText(const RecMail&mail,mailimap_body_type_mpart*mailDescription,RecBody&target_body,int current_recursion=0,QValueList<int>recList=QValueList<int>());
@@ -47,9 +47,9 @@ protected:
/* just helpers */
static void fillBodyFields(RecPart&target_part,mailimap_body_fields*which);
static QStringList address_list_to_stringlist(clist*list);
-private:
+
IMAPaccount *account;
mailimap *m_imap;
};