summaryrefslogtreecommitdiff
authoralwin <alwin>2004-01-03 02:17:50 (UTC)
committer alwin <alwin>2004-01-03 02:17:50 (UTC)
commit1214e08e45cda6f0de39a8f3bcff2e69244bb87f (patch) (unidiff)
treed51a018b6014904c09272c684e211d8d05cf360e
parent79bca648a80c42d5dc7e7674b251715292db33b3 (diff)
downloadopie-1214e08e45cda6f0de39a8f3bcff2e69244bb87f.zip
opie-1214e08e45cda6f0de39a8f3bcff2e69244bb87f.tar.gz
opie-1214e08e45cda6f0de39a8f3bcff2e69244bb87f.tar.bz2
improved parsing of mailbodies 'cause it failed on multi-part fields which
contains multipart-fields, too.
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/net/mail/imapwrapper.cpp43
-rw-r--r--noncore/net/mail/imapwrapper.h3
-rw-r--r--noncore/net/mail/libmailwrapper/imapwrapper.cpp43
-rw-r--r--noncore/net/mail/libmailwrapper/imapwrapper.h3
4 files changed, 84 insertions, 8 deletions
diff --git a/noncore/net/mail/imapwrapper.cpp b/noncore/net/mail/imapwrapper.cpp
index f7e93aa..ae196bb 100644
--- a/noncore/net/mail/imapwrapper.cpp
+++ b/noncore/net/mail/imapwrapper.cpp
@@ -1,898 +1,935 @@
1#include <stdlib.h> 1#include <stdlib.h>
2#include <libetpan/libetpan.h> 2#include <libetpan/libetpan.h>
3#include <qpe/global.h> 3#include <qpe/global.h>
4 4
5#include "imapwrapper.h" 5#include "imapwrapper.h"
6#include "mailtypes.h" 6#include "mailtypes.h"
7#include "logindialog.h" 7#include "logindialog.h"
8 8
9IMAPwrapper::IMAPwrapper( IMAPaccount *a ) 9IMAPwrapper::IMAPwrapper( IMAPaccount *a )
10 : AbstractMail() 10 : AbstractMail()
11{ 11{
12 account = a; 12 account = a;
13 m_imap = 0; 13 m_imap = 0;
14} 14}
15 15
16IMAPwrapper::~IMAPwrapper() 16IMAPwrapper::~IMAPwrapper()
17{ 17{
18 logout(); 18 logout();
19} 19}
20 20
21void IMAPwrapper::imap_progress( size_t current, size_t maximum ) 21void IMAPwrapper::imap_progress( size_t current, size_t maximum )
22{ 22{
23 qDebug( "IMAP: %i of %i", current, maximum ); 23 qDebug( "IMAP: %i of %i", current, maximum );
24} 24}
25 25
26void IMAPwrapper::login() 26void IMAPwrapper::login()
27{ 27{
28 const char *server, *user, *pass; 28 const char *server, *user, *pass;
29 uint16_t port; 29 uint16_t port;
30 int err = MAILIMAP_NO_ERROR; 30 int err = MAILIMAP_NO_ERROR;
31 31
32 /* we are connected this moment */ 32 /* we are connected this moment */
33 /* TODO: setup a timer holding the line or if connection closed - delete the value */ 33 /* TODO: setup a timer holding the line or if connection closed - delete the value */
34 if (m_imap) { 34 if (m_imap) {
35 err = mailimap_noop(m_imap); 35 err = mailimap_noop(m_imap);
36 if (err!=MAILIMAP_NO_ERROR) { 36 if (err!=MAILIMAP_NO_ERROR) {
37 logout(); 37 logout();
38 } else { 38 } else {
39 mailstream_flush(m_imap->imap_stream); 39 mailstream_flush(m_imap->imap_stream);
40 return; 40 return;
41 } 41 }
42 } 42 }
43 server = account->getServer().latin1(); 43 server = account->getServer().latin1();
44 port = account->getPort().toUInt(); 44 port = account->getPort().toUInt();
45 if ( account->getUser().isEmpty() || account->getPassword().isEmpty() ) { 45 if ( account->getUser().isEmpty() || account->getPassword().isEmpty() ) {
46 LoginDialog login( account->getUser(), account->getPassword(), NULL, 0, true ); 46 LoginDialog login( account->getUser(), account->getPassword(), NULL, 0, true );
47 login.show(); 47 login.show();
48 if ( QDialog::Accepted == login.exec() ) { 48 if ( QDialog::Accepted == login.exec() ) {
49 // ok 49 // ok
50 user = strdup( login.getUser().latin1() ); 50 user = strdup( login.getUser().latin1() );
51 pass = strdup( login.getPassword().latin1() ); 51 pass = strdup( login.getPassword().latin1() );
52 } else { 52 } else {
53 // cancel 53 // cancel
54 qDebug( "IMAP: Login canceled" ); 54 qDebug( "IMAP: Login canceled" );
55 return; 55 return;
56 } 56 }
57 } else { 57 } else {
58 user = account->getUser().latin1(); 58 user = account->getUser().latin1();
59 pass = account->getPassword().latin1(); 59 pass = account->getPassword().latin1();
60 } 60 }
61 61
62 m_imap = mailimap_new( 20, &imap_progress ); 62 m_imap = mailimap_new( 20, &imap_progress );
63 63
64 /* connect */ 64 /* connect */
65 if (account->getSSL()) { 65 if (account->getSSL()) {
66 err = mailimap_ssl_connect( m_imap, (char*)server, port ); 66 err = mailimap_ssl_connect( m_imap, (char*)server, port );
67 } else { 67 } else {
68 err = mailimap_socket_connect( m_imap, (char*)server, port ); 68 err = mailimap_socket_connect( m_imap, (char*)server, port );
69 } 69 }
70 70
71 if ( err != MAILIMAP_NO_ERROR && 71 if ( err != MAILIMAP_NO_ERROR &&
72 err != MAILIMAP_NO_ERROR_AUTHENTICATED && 72 err != MAILIMAP_NO_ERROR_AUTHENTICATED &&
73 err != MAILIMAP_NO_ERROR_NON_AUTHENTICATED ) { 73 err != MAILIMAP_NO_ERROR_NON_AUTHENTICATED ) {
74 QString failure = ""; 74 QString failure = "";
75 if (err == MAILIMAP_ERROR_CONNECTION_REFUSED) { 75 if (err == MAILIMAP_ERROR_CONNECTION_REFUSED) {
76 failure="Connection refused"; 76 failure="Connection refused";
77 } else { 77 } else {
78 failure="Unknown failure"; 78 failure="Unknown failure";
79 } 79 }
80 Global::statusMessage(tr("error connecting imap server: %1").arg(failure)); 80 Global::statusMessage(tr("error connecting imap server: %1").arg(failure));
81 mailimap_free( m_imap ); 81 mailimap_free( m_imap );
82 m_imap = 0; 82 m_imap = 0;
83 return; 83 return;
84 } 84 }
85 85
86 /* login */ 86 /* login */
87 err = mailimap_login_simple( m_imap, (char*)user, (char*)pass ); 87 err = mailimap_login_simple( m_imap, (char*)user, (char*)pass );
88 if ( err != MAILIMAP_NO_ERROR ) { 88 if ( err != MAILIMAP_NO_ERROR ) {
89 Global::statusMessage(tr("error logging in imap server: %1").arg(m_imap->imap_response)); 89 Global::statusMessage(tr("error logging in imap server: %1").arg(m_imap->imap_response));
90 err = mailimap_close( m_imap ); 90 err = mailimap_close( m_imap );
91 mailimap_free( m_imap ); 91 mailimap_free( m_imap );
92 m_imap = 0; 92 m_imap = 0;
93 } 93 }
94} 94}
95 95
96void IMAPwrapper::logout() 96void IMAPwrapper::logout()
97{ 97{
98 int err = MAILIMAP_NO_ERROR; 98 int err = MAILIMAP_NO_ERROR;
99 if (!m_imap) return; 99 if (!m_imap) return;
100 err = mailimap_logout( m_imap ); 100 err = mailimap_logout( m_imap );
101 err = mailimap_close( m_imap ); 101 err = mailimap_close( m_imap );
102 mailimap_free( m_imap ); 102 mailimap_free( m_imap );
103 m_imap = 0; 103 m_imap = 0;
104} 104}
105 105
106void IMAPwrapper::listMessages(const QString&mailbox,QList<RecMail> &target ) 106void IMAPwrapper::listMessages(const QString&mailbox,QList<RecMail> &target )
107{ 107{
108 const char *mb = 0; 108 const char *mb = 0;
109 int err = MAILIMAP_NO_ERROR; 109 int err = MAILIMAP_NO_ERROR;
110 clist *result = 0; 110 clist *result = 0;
111 clistcell *current; 111 clistcell *current;
112// mailimap_fetch_att *fetchAtt,*fetchAttFlags,*fetchAttDate,*fetchAttSize; 112// mailimap_fetch_att *fetchAtt,*fetchAttFlags,*fetchAttDate,*fetchAttSize;
113 mailimap_fetch_type *fetchType = 0; 113 mailimap_fetch_type *fetchType = 0;
114 mailimap_set *set = 0; 114 mailimap_set *set = 0;
115 115
116 mb = mailbox.latin1(); 116 mb = mailbox.latin1();
117 login(); 117 login();
118 if (!m_imap) { 118 if (!m_imap) {
119 return; 119 return;
120 } 120 }
121 /* select mailbox READONLY for operations */ 121 /* select mailbox READONLY for operations */
122 err = mailimap_examine( m_imap, (char*)mb); 122 err = mailimap_examine( m_imap, (char*)mb);
123 if ( err != MAILIMAP_NO_ERROR ) { 123 if ( err != MAILIMAP_NO_ERROR ) {
124 Global::statusMessage(tr("error selecting mailbox: %1").arg(m_imap->imap_response)); 124 Global::statusMessage(tr("error selecting mailbox: %1").arg(m_imap->imap_response));
125 return; 125 return;
126 } 126 }
127 127
128 int last = m_imap->imap_selection_info->sel_exists; 128 int last = m_imap->imap_selection_info->sel_exists;
129 129
130 if (last == 0) { 130 if (last == 0) {
131 Global::statusMessage(tr("Mailbox has no mails")); 131 Global::statusMessage(tr("Mailbox has no mails"));
132 return; 132 return;
133 } else { 133 } else {
134 Global::statusMessage(tr("Mailbox has %1 mails").arg(last)); 134 Global::statusMessage(tr("Mailbox has %1 mails").arg(last));
135 } 135 }
136 136
137 /* the range has to start at 1!!! not with 0!!!! */ 137 /* the range has to start at 1!!! not with 0!!!! */
138 set = mailimap_set_new_interval( 1, last ); 138 set = mailimap_set_new_interval( 1, last );
139 fetchType = mailimap_fetch_type_new_fetch_att_list_empty(); 139 fetchType = mailimap_fetch_type_new_fetch_att_list_empty();
140 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_envelope()); 140 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_envelope());
141 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_flags()); 141 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_flags());
142 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_internaldate()); 142 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_internaldate());
143 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_rfc822_size()); 143 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_rfc822_size());
144 144
145 err = mailimap_fetch( m_imap, set, fetchType, &result ); 145 err = mailimap_fetch( m_imap, set, fetchType, &result );
146 mailimap_set_free( set ); 146 mailimap_set_free( set );
147 mailimap_fetch_type_free( fetchType ); 147 mailimap_fetch_type_free( fetchType );
148 148
149 QString date,subject,from; 149 QString date,subject,from;
150 150
151 if ( err == MAILIMAP_NO_ERROR ) { 151 if ( err == MAILIMAP_NO_ERROR ) {
152 mailimap_msg_att * msg_att; 152 mailimap_msg_att * msg_att;
153 int i = 0; 153 int i = 0;
154 for (current = clist_begin(result); current != 0; current=clist_next(current)) { 154 for (current = clist_begin(result); current != 0; current=clist_next(current)) {
155 ++i; 155 ++i;
156 msg_att = (mailimap_msg_att*)current->data; 156 msg_att = (mailimap_msg_att*)current->data;
157 RecMail*m = parse_list_result(msg_att); 157 RecMail*m = parse_list_result(msg_att);
158 if (m) { 158 if (m) {
159 m->setNumber(i); 159 m->setNumber(i);
160 m->setMbox(mailbox); 160 m->setMbox(mailbox);
161 m->setWrapper(this); 161 m->setWrapper(this);
162 target.append(m); 162 target.append(m);
163 } 163 }
164 } 164 }
165 } else { 165 } else {
166 Global::statusMessage(tr("Error fetching headers: %1").arg(m_imap->imap_response)); 166 Global::statusMessage(tr("Error fetching headers: %1").arg(m_imap->imap_response));
167 } 167 }
168 if (result) mailimap_fetch_list_free(result); 168 if (result) mailimap_fetch_list_free(result);
169} 169}
170 170
171QList<Folder>* IMAPwrapper::listFolders() 171QList<Folder>* IMAPwrapper::listFolders()
172{ 172{
173 const char *path, *mask; 173 const char *path, *mask;
174 int err = MAILIMAP_NO_ERROR; 174 int err = MAILIMAP_NO_ERROR;
175 clist *result = 0; 175 clist *result = 0;
176 clistcell *current = 0; 176 clistcell *current = 0;
177 clistcell*cur_flag = 0; 177 clistcell*cur_flag = 0;
178 mailimap_mbx_list_flags*bflags = 0; 178 mailimap_mbx_list_flags*bflags = 0;
179 179
180 QList<Folder> * folders = new QList<Folder>(); 180 QList<Folder> * folders = new QList<Folder>();
181 folders->setAutoDelete( false ); 181 folders->setAutoDelete( false );
182 login(); 182 login();
183 if (!m_imap) { 183 if (!m_imap) {
184 return folders; 184 return folders;
185 } 185 }
186 186
187/* 187/*
188 * First we have to check for INBOX 'cause it sometimes it's not inside the path. 188 * First we have to check for INBOX 'cause it sometimes it's not inside the path.
189 * We must not forget to filter them out in next loop! 189 * We must not forget to filter them out in next loop!
190 * it seems like ugly code. and yes - it is ugly code. but the best way. 190 * it seems like ugly code. and yes - it is ugly code. but the best way.
191 */ 191 */
192 QString temp; 192 QString temp;
193 mask = "INBOX" ; 193 mask = "INBOX" ;
194 mailimap_mailbox_list *list; 194 mailimap_mailbox_list *list;
195 err = mailimap_list( m_imap, (char*)"", (char*)mask, &result ); 195 err = mailimap_list( m_imap, (char*)"", (char*)mask, &result );
196 QString del; 196 QString del;
197 bool selectable = true; 197 bool selectable = true;
198 bool no_inferiors = false; 198 bool no_inferiors = false;
199 if ( err == MAILIMAP_NO_ERROR ) { 199 if ( err == MAILIMAP_NO_ERROR ) {
200 current = result->first; 200 current = result->first;
201 for ( int i = result->count; i > 0; i-- ) { 201 for ( int i = result->count; i > 0; i-- ) {
202 list = (mailimap_mailbox_list *) current->data; 202 list = (mailimap_mailbox_list *) current->data;
203 // it is better use the deep copy mechanism of qt itself 203 // it is better use the deep copy mechanism of qt itself
204 // instead of using strdup! 204 // instead of using strdup!
205 temp = list->mb_name; 205 temp = list->mb_name;
206 del = list->mb_delimiter; 206 del = list->mb_delimiter;
207 current = current->next; 207 current = current->next;
208 if ( (bflags = list->mb_flag) ) { 208 if ( (bflags = list->mb_flag) ) {
209 selectable = !(bflags->mbf_type==MAILIMAP_MBX_LIST_FLAGS_SFLAG&& 209 selectable = !(bflags->mbf_type==MAILIMAP_MBX_LIST_FLAGS_SFLAG&&
210 bflags->mbf_sflag==MAILIMAP_MBX_LIST_SFLAG_NOSELECT); 210 bflags->mbf_sflag==MAILIMAP_MBX_LIST_SFLAG_NOSELECT);
211 for(cur_flag=clist_begin(bflags->mbf_oflags);cur_flag;cur_flag=clist_next(cur_flag)) { 211 for(cur_flag=clist_begin(bflags->mbf_oflags);cur_flag;cur_flag=clist_next(cur_flag)) {
212 if ( ((mailimap_mbx_list_oflag*)cur_flag->data)->of_type==MAILIMAP_MBX_LIST_OFLAG_NOINFERIORS) { 212 if ( ((mailimap_mbx_list_oflag*)cur_flag->data)->of_type==MAILIMAP_MBX_LIST_OFLAG_NOINFERIORS) {
213 no_inferiors = true; 213 no_inferiors = true;
214 } 214 }
215 } 215 }
216 } 216 }
217 folders->append( new IMAPFolder(temp,del,selectable,no_inferiors,account->getPrefix())); 217 folders->append( new IMAPFolder(temp,del,selectable,no_inferiors,account->getPrefix()));
218 } 218 }
219 } else { 219 } else {
220 qDebug("error fetching folders: %s",m_imap->imap_response); 220 qDebug("error fetching folders: %s",m_imap->imap_response);
221 } 221 }
222 mailimap_list_result_free( result ); 222 mailimap_list_result_free( result );
223 223
224/* 224/*
225 * second stage - get the other then inbox folders 225 * second stage - get the other then inbox folders
226 */ 226 */
227 mask = "*" ; 227 mask = "*" ;
228 path = account->getPrefix().latin1(); 228 path = account->getPrefix().latin1();
229 if (!path) path = ""; 229 if (!path) path = "";
230 qDebug(path); 230 qDebug(path);
231 err = mailimap_list( m_imap, (char*)path, (char*)mask, &result ); 231 err = mailimap_list( m_imap, (char*)path, (char*)mask, &result );
232 if ( err == MAILIMAP_NO_ERROR ) { 232 if ( err == MAILIMAP_NO_ERROR ) {
233 current = result->first; 233 current = result->first;
234 for ( current=clist_begin(result);current!=NULL;current=clist_next(current)) { 234 for ( current=clist_begin(result);current!=NULL;current=clist_next(current)) {
235 no_inferiors = false; 235 no_inferiors = false;
236 list = (mailimap_mailbox_list *) current->data; 236 list = (mailimap_mailbox_list *) current->data;
237 // it is better use the deep copy mechanism of qt itself 237 // it is better use the deep copy mechanism of qt itself
238 // instead of using strdup! 238 // instead of using strdup!
239 temp = list->mb_name; 239 temp = list->mb_name;
240 if (temp.lower()=="inbox") 240 if (temp.lower()=="inbox")
241 continue; 241 continue;
242 if (temp.lower()==account->getPrefix().lower()) 242 if (temp.lower()==account->getPrefix().lower())
243 continue; 243 continue;
244 if ( (bflags = list->mb_flag) ) { 244 if ( (bflags = list->mb_flag) ) {
245 selectable = !(bflags->mbf_type==MAILIMAP_MBX_LIST_FLAGS_SFLAG&& 245 selectable = !(bflags->mbf_type==MAILIMAP_MBX_LIST_FLAGS_SFLAG&&
246 bflags->mbf_sflag==MAILIMAP_MBX_LIST_SFLAG_NOSELECT); 246 bflags->mbf_sflag==MAILIMAP_MBX_LIST_SFLAG_NOSELECT);
247 for(cur_flag=clist_begin(bflags->mbf_oflags);cur_flag;cur_flag=clist_next(cur_flag)) { 247 for(cur_flag=clist_begin(bflags->mbf_oflags);cur_flag;cur_flag=clist_next(cur_flag)) {
248 if ( ((mailimap_mbx_list_oflag*)cur_flag->data)->of_type==MAILIMAP_MBX_LIST_OFLAG_NOINFERIORS) { 248 if ( ((mailimap_mbx_list_oflag*)cur_flag->data)->of_type==MAILIMAP_MBX_LIST_OFLAG_NOINFERIORS) {
249 no_inferiors = true; 249 no_inferiors = true;
250 } 250 }
251 } 251 }
252 } 252 }
253 del = list->mb_delimiter; 253 del = list->mb_delimiter;
254 folders->append(new IMAPFolder(temp,del,selectable,no_inferiors,account->getPrefix())); 254 folders->append(new IMAPFolder(temp,del,selectable,no_inferiors,account->getPrefix()));
255 } 255 }
256 } else { 256 } else {
257 qDebug("error fetching folders %s",m_imap->imap_response); 257 qDebug("error fetching folders %s",m_imap->imap_response);
258 } 258 }
259 if (result) mailimap_list_result_free( result ); 259 if (result) mailimap_list_result_free( result );
260 return folders; 260 return folders;
261} 261}
262 262
263RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att) 263RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att)
264{ 264{
265 RecMail * m = 0; 265 RecMail * m = 0;
266 mailimap_msg_att_item *item=0; 266 mailimap_msg_att_item *item=0;
267 clistcell *current,*c,*cf; 267 clistcell *current,*c,*cf;
268 mailimap_msg_att_dynamic*flist; 268 mailimap_msg_att_dynamic*flist;
269 mailimap_flag_fetch*cflag; 269 mailimap_flag_fetch*cflag;
270 int size; 270 int size;
271 QBitArray mFlags(7); 271 QBitArray mFlags(7);
272 QStringList addresslist; 272 QStringList addresslist;
273 273
274 if (!m_att) { 274 if (!m_att) {
275 return m; 275 return m;
276 } 276 }
277 m = new RecMail(); 277 m = new RecMail();
278 for (c = clist_begin(m_att->att_list); c!=NULL;c=clist_next(c) ) { 278 for (c = clist_begin(m_att->att_list); c!=NULL;c=clist_next(c) ) {
279 current = c; 279 current = c;
280 size = 0; 280 size = 0;
281 item = (mailimap_msg_att_item*)current->data; 281 item = (mailimap_msg_att_item*)current->data;
282 if (item->att_type!=MAILIMAP_MSG_ATT_ITEM_STATIC) { 282 if (item->att_type!=MAILIMAP_MSG_ATT_ITEM_STATIC) {
283 flist = (mailimap_msg_att_dynamic*)item->att_data.att_dyn; 283 flist = (mailimap_msg_att_dynamic*)item->att_data.att_dyn;
284 if (!flist->att_list) { 284 if (!flist->att_list) {
285 continue; 285 continue;
286 } 286 }
287 cf = flist->att_list->first; 287 cf = flist->att_list->first;
288 for (cf = clist_begin(flist->att_list); cf!=NULL; cf = clist_next(cf)) { 288 for (cf = clist_begin(flist->att_list); cf!=NULL; cf = clist_next(cf)) {
289 cflag = (mailimap_flag_fetch*)cf->data; 289 cflag = (mailimap_flag_fetch*)cf->data;
290 if (cflag->fl_type==MAILIMAP_FLAG_FETCH_OTHER && cflag->fl_flag!=0) { 290 if (cflag->fl_type==MAILIMAP_FLAG_FETCH_OTHER && cflag->fl_flag!=0) {
291 switch (cflag->fl_flag->fl_type) { 291 switch (cflag->fl_flag->fl_type) {
292 case MAILIMAP_FLAG_ANSWERED: /* \Answered flag */ 292 case MAILIMAP_FLAG_ANSWERED: /* \Answered flag */
293 mFlags.setBit(FLAG_ANSWERED); 293 mFlags.setBit(FLAG_ANSWERED);
294 break; 294 break;
295 case MAILIMAP_FLAG_FLAGGED: /* \Flagged flag */ 295 case MAILIMAP_FLAG_FLAGGED: /* \Flagged flag */
296 mFlags.setBit(FLAG_FLAGGED); 296 mFlags.setBit(FLAG_FLAGGED);
297 break; 297 break;
298 case MAILIMAP_FLAG_DELETED: /* \Deleted flag */ 298 case MAILIMAP_FLAG_DELETED: /* \Deleted flag */
299 mFlags.setBit(FLAG_DELETED); 299 mFlags.setBit(FLAG_DELETED);
300 break; 300 break;
301 case MAILIMAP_FLAG_SEEN: /* \Seen flag */ 301 case MAILIMAP_FLAG_SEEN: /* \Seen flag */
302 mFlags.setBit(FLAG_SEEN); 302 mFlags.setBit(FLAG_SEEN);
303 break; 303 break;
304 case MAILIMAP_FLAG_DRAFT: /* \Draft flag */ 304 case MAILIMAP_FLAG_DRAFT: /* \Draft flag */
305 mFlags.setBit(FLAG_DRAFT); 305 mFlags.setBit(FLAG_DRAFT);
306 break; 306 break;
307 case MAILIMAP_FLAG_KEYWORD: /* keyword flag */ 307 case MAILIMAP_FLAG_KEYWORD: /* keyword flag */
308 break; 308 break;
309 case MAILIMAP_FLAG_EXTENSION: /* \extension flag */ 309 case MAILIMAP_FLAG_EXTENSION: /* \extension flag */
310 break; 310 break;
311 default: 311 default:
312 break; 312 break;
313 } 313 }
314 } else if (cflag->fl_type==MAILIMAP_FLAG_FETCH_RECENT) { 314 } else if (cflag->fl_type==MAILIMAP_FLAG_FETCH_RECENT) {
315 mFlags.setBit(FLAG_RECENT); 315 mFlags.setBit(FLAG_RECENT);
316 } 316 }
317 } 317 }
318 continue; 318 continue;
319 } 319 }
320 if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_ENVELOPE) { 320 if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_ENVELOPE) {
321 mailimap_envelope * head = item->att_data.att_static->att_data.att_env; 321 mailimap_envelope * head = item->att_data.att_static->att_data.att_env;
322 m->setDate(head->env_date); 322 m->setDate(head->env_date);
323 m->setSubject(convert_String((const char*)head->env_subject)); 323 m->setSubject(convert_String((const char*)head->env_subject));
324 //m->setSubject(head->env_subject); 324 //m->setSubject(head->env_subject);
325 if (head->env_from!=NULL) { 325 if (head->env_from!=NULL) {
326 addresslist = address_list_to_stringlist(head->env_from->frm_list); 326 addresslist = address_list_to_stringlist(head->env_from->frm_list);
327 if (addresslist.count()) { 327 if (addresslist.count()) {
328 m->setFrom(addresslist.first()); 328 m->setFrom(addresslist.first());
329 } 329 }
330 } 330 }
331 if (head->env_to!=NULL) { 331 if (head->env_to!=NULL) {
332 addresslist = address_list_to_stringlist(head->env_to->to_list); 332 addresslist = address_list_to_stringlist(head->env_to->to_list);
333 m->setTo(addresslist); 333 m->setTo(addresslist);
334 } 334 }
335 if (head->env_cc!=NULL) { 335 if (head->env_cc!=NULL) {
336 addresslist = address_list_to_stringlist(head->env_cc->cc_list); 336 addresslist = address_list_to_stringlist(head->env_cc->cc_list);
337 m->setCC(addresslist); 337 m->setCC(addresslist);
338 } 338 }
339 if (head->env_bcc!=NULL) { 339 if (head->env_bcc!=NULL) {
340 addresslist = address_list_to_stringlist(head->env_bcc->bcc_list); 340 addresslist = address_list_to_stringlist(head->env_bcc->bcc_list);
341 m->setBcc(addresslist); 341 m->setBcc(addresslist);
342 } 342 }
343 if (head->env_reply_to!=NULL) { 343 if (head->env_reply_to!=NULL) {
344 addresslist = address_list_to_stringlist(head->env_reply_to->rt_list); 344 addresslist = address_list_to_stringlist(head->env_reply_to->rt_list);
345 if (addresslist.count()) { 345 if (addresslist.count()) {
346 m->setReplyto(addresslist.first()); 346 m->setReplyto(addresslist.first());
347 } 347 }
348 } 348 }
349 m->setMsgid(QString(head->env_message_id)); 349 m->setMsgid(QString(head->env_message_id));
350 } else if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_INTERNALDATE) { 350 } else if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_INTERNALDATE) {
351#if 0 351#if 0
352 mailimap_date_time*d = item->att_data.att_static->att_data.att_internal_date; 352 mailimap_date_time*d = item->att_data.att_static->att_data.att_internal_date;
353 QDateTime da(QDate(d->dt_year,d->dt_month,d->dt_day),QTime(d->dt_hour,d->dt_min,d->dt_sec)); 353 QDateTime da(QDate(d->dt_year,d->dt_month,d->dt_day),QTime(d->dt_hour,d->dt_min,d->dt_sec));
354 qDebug("%i %i %i - %i %i %i",d->dt_year,d->dt_month,d->dt_day,d->dt_hour,d->dt_min,d->dt_sec); 354 qDebug("%i %i %i - %i %i %i",d->dt_year,d->dt_month,d->dt_day,d->dt_hour,d->dt_min,d->dt_sec);
355 qDebug(da.toString()); 355 qDebug(da.toString());
356#endif 356#endif
357 } else if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_RFC822_SIZE) { 357 } else if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_RFC822_SIZE) {
358 size = item->att_data.att_static->att_data.att_rfc822_size; 358 size = item->att_data.att_static->att_data.att_rfc822_size;
359 } 359 }
360 } 360 }
361 /* msg is already deleted */ 361 /* msg is already deleted */
362 if (mFlags.testBit(FLAG_DELETED) && m) { 362 if (mFlags.testBit(FLAG_DELETED) && m) {
363 delete m; 363 delete m;
364 m = 0; 364 m = 0;
365 } 365 }
366 if (m) { 366 if (m) {
367 m->setFlags(mFlags); 367 m->setFlags(mFlags);
368 m->setMsgsize(size); 368 m->setMsgsize(size);
369 } 369 }
370 return m; 370 return m;
371} 371}
372 372
373RecBody IMAPwrapper::fetchBody(const RecMail&mail) 373RecBody IMAPwrapper::fetchBody(const RecMail&mail)
374{ 374{
375 RecBody body; 375 RecBody body;
376 const char *mb; 376 const char *mb;
377 int err = MAILIMAP_NO_ERROR; 377 int err = MAILIMAP_NO_ERROR;
378 clist *result = 0; 378 clist *result = 0;
379 clistcell *current; 379 clistcell *current;
380 mailimap_fetch_att *fetchAtt = 0; 380 mailimap_fetch_att *fetchAtt = 0;
381 mailimap_fetch_type *fetchType = 0; 381 mailimap_fetch_type *fetchType = 0;
382 mailimap_set *set = 0; 382 mailimap_set *set = 0;
383 mailimap_body*body_desc = 0; 383 mailimap_body*body_desc = 0;
384 384
385 mb = mail.getMbox().latin1(); 385 mb = mail.getMbox().latin1();
386 386
387 login(); 387 login();
388 if (!m_imap) { 388 if (!m_imap) {
389 return body; 389 return body;
390 } 390 }
391 391
392 err = mailimap_select( m_imap, (char*)mb); 392 err = mailimap_select( m_imap, (char*)mb);
393 if ( err != MAILIMAP_NO_ERROR ) { 393 if ( err != MAILIMAP_NO_ERROR ) {
394 qDebug("error selecting mailbox: %s",m_imap->imap_response); 394 qDebug("error selecting mailbox: %s",m_imap->imap_response);
395 return body; 395 return body;
396 } 396 }
397 397
398 /* the range has to start at 1!!! not with 0!!!! */ 398 /* the range has to start at 1!!! not with 0!!!! */
399 set = mailimap_set_new_interval( mail.getNumber(),mail.getNumber() ); 399 set = mailimap_set_new_interval( mail.getNumber(),mail.getNumber() );
400 fetchAtt = mailimap_fetch_att_new_bodystructure(); 400 fetchAtt = mailimap_fetch_att_new_bodystructure();
401 fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt); 401 fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt);
402 err = mailimap_fetch( m_imap, set, fetchType, &result ); 402 err = mailimap_fetch( m_imap, set, fetchType, &result );
403 mailimap_set_free( set ); 403 mailimap_set_free( set );
404 mailimap_fetch_type_free( fetchType ); 404 mailimap_fetch_type_free( fetchType );
405 405
406 if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) { 406 if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) {
407 mailimap_msg_att * msg_att; 407 mailimap_msg_att * msg_att;
408 msg_att = (mailimap_msg_att*)current->data; 408 msg_att = (mailimap_msg_att*)current->data;
409 mailimap_msg_att_item*item = (mailimap_msg_att_item*)msg_att->att_list->first->data; 409 mailimap_msg_att_item*item = (mailimap_msg_att_item*)msg_att->att_list->first->data;
410 QValueList<int> path; 410 QValueList<int> path;
411 body_desc = item->att_data.att_static->att_data.att_body; 411 body_desc = item->att_data.att_static->att_data.att_body;
412 traverseBody(mail,body_desc,body,0,path); 412 traverseBody(mail,body_desc,body,0,path);
413 } else { 413 } else {
414 qDebug("error fetching body: %s",m_imap->imap_response); 414 qDebug("error fetching body: %s",m_imap->imap_response);
415 } 415 }
416 if (result) mailimap_fetch_list_free(result); 416 if (result) mailimap_fetch_list_free(result);
417 return body; 417 return body;
418} 418}
419 419
420QStringList IMAPwrapper::address_list_to_stringlist(clist*list) 420QStringList IMAPwrapper::address_list_to_stringlist(clist*list)
421{ 421{
422 QStringList l; 422 QStringList l;
423 QString from; 423 QString from;
424 bool named_from; 424 bool named_from;
425 clistcell *current = NULL; 425 clistcell *current = NULL;
426 mailimap_address * current_address=NULL; 426 mailimap_address * current_address=NULL;
427 if (!list) { 427 if (!list) {
428 return l; 428 return l;
429 } 429 }
430 unsigned int count = 0; 430 unsigned int count = 0;
431 for (current=clist_begin(list);current!= NULL;current=clist_next(current)) { 431 for (current=clist_begin(list);current!= NULL;current=clist_next(current)) {
432 from = ""; 432 from = "";
433 named_from = false; 433 named_from = false;
434 current_address=(mailimap_address*)current->data; 434 current_address=(mailimap_address*)current->data;
435 if (current_address->ad_personal_name){ 435 if (current_address->ad_personal_name){
436 from+=convert_String((const char*)current_address->ad_personal_name); 436 from+=convert_String((const char*)current_address->ad_personal_name);
437 from+=" "; 437 from+=" ";
438 named_from = true; 438 named_from = true;
439 } 439 }
440 if (named_from && (current_address->ad_mailbox_name || current_address->ad_host_name)) { 440 if (named_from && (current_address->ad_mailbox_name || current_address->ad_host_name)) {
441 from+="<"; 441 from+="<";
442 } 442 }
443 if (current_address->ad_mailbox_name) { 443 if (current_address->ad_mailbox_name) {
444 from+=QString(current_address->ad_mailbox_name); 444 from+=QString(current_address->ad_mailbox_name);
445 from+="@"; 445 from+="@";
446 } 446 }
447 if (current_address->ad_host_name) { 447 if (current_address->ad_host_name) {
448 from+=QString(current_address->ad_host_name); 448 from+=QString(current_address->ad_host_name);
449 } 449 }
450 if (named_from && (current_address->ad_mailbox_name || current_address->ad_host_name)) { 450 if (named_from && (current_address->ad_mailbox_name || current_address->ad_host_name)) {
451 from+=">"; 451 from+=">";
452 } 452 }
453 l.append(QString(from)); 453 l.append(QString(from));
454 if (++count > 99) { 454 if (++count > 99) {
455 break; 455 break;
456 } 456 }
457 } 457 }
458 return l; 458 return l;
459} 459}
460 460
461encodedString*IMAPwrapper::fetchRawPart(const RecMail&mail,const QValueList<int>&path,bool internal_call) 461encodedString*IMAPwrapper::fetchRawPart(const RecMail&mail,const QValueList<int>&path,bool internal_call)
462{ 462{
463 encodedString*res=new encodedString; 463 encodedString*res=new encodedString;
464 const char*mb; 464 const char*mb;
465 int err; 465 int err;
466 mailimap_fetch_type *fetchType; 466 mailimap_fetch_type *fetchType;
467 mailimap_set *set; 467 mailimap_set *set;
468 clistcell*current,*cur; 468 clistcell*current,*cur;
469 469
470 login(); 470 login();
471 if (!m_imap) { 471 if (!m_imap) {
472 return res; 472 return res;
473 } 473 }
474 if (!internal_call) { 474 if (!internal_call) {
475 mb = mail.getMbox().latin1(); 475 mb = mail.getMbox().latin1();
476 err = mailimap_select( m_imap, (char*)mb); 476 err = mailimap_select( m_imap, (char*)mb);
477 if ( err != MAILIMAP_NO_ERROR ) { 477 if ( err != MAILIMAP_NO_ERROR ) {
478 qDebug("error selecting mailbox: %s",m_imap->imap_response); 478 qDebug("error selecting mailbox: %s",m_imap->imap_response);
479 return res; 479 return res;
480 } 480 }
481 } 481 }
482 set = mailimap_set_new_single(mail.getNumber()); 482 set = mailimap_set_new_single(mail.getNumber());
483 clist*id_list=clist_new(); 483 clist*id_list=clist_new();
484 for (unsigned j=0; j < path.count();++j) { 484 for (unsigned j=0; j < path.count();++j) {
485 uint32_t * p_id = (uint32_t *)malloc(sizeof(*p_id)); 485 uint32_t * p_id = (uint32_t *)malloc(sizeof(*p_id));
486 *p_id = path[j]; 486 *p_id = path[j];
487 clist_append(id_list,p_id); 487 clist_append(id_list,p_id);
488 } 488 }
489 mailimap_section_part * section_part = mailimap_section_part_new(id_list); 489 mailimap_section_part * section_part = mailimap_section_part_new(id_list);
490 mailimap_section_spec * section_spec = mailimap_section_spec_new(MAILIMAP_SECTION_SPEC_SECTION_PART, NULL, section_part, NULL); 490 mailimap_section_spec * section_spec = mailimap_section_spec_new(MAILIMAP_SECTION_SPEC_SECTION_PART, NULL, section_part, NULL);
491 mailimap_section * section = mailimap_section_new(section_spec); 491 mailimap_section * section = mailimap_section_new(section_spec);
492 mailimap_fetch_att * fetch_att = mailimap_fetch_att_new_body_section(section); 492 mailimap_fetch_att * fetch_att = mailimap_fetch_att_new_body_section(section);
493 493
494 fetchType = mailimap_fetch_type_new_fetch_att(fetch_att); 494 fetchType = mailimap_fetch_type_new_fetch_att(fetch_att);
495 495
496 clist*result = 0; 496 clist*result = 0;
497 497
498 err = mailimap_fetch( m_imap, set, fetchType, &result ); 498 err = mailimap_fetch( m_imap, set, fetchType, &result );
499 mailimap_set_free( set ); 499 mailimap_set_free( set );
500 mailimap_fetch_type_free( fetchType ); 500 mailimap_fetch_type_free( fetchType );
501 501
502 if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) { 502 if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) {
503 mailimap_msg_att * msg_att; 503 mailimap_msg_att * msg_att;
504 msg_att = (mailimap_msg_att*)current->data; 504 msg_att = (mailimap_msg_att*)current->data;
505 mailimap_msg_att_item*msg_att_item; 505 mailimap_msg_att_item*msg_att_item;
506 for(cur = clist_begin(msg_att->att_list) ; cur != NULL ; cur = clist_next(cur)) { 506 for(cur = clist_begin(msg_att->att_list) ; cur != NULL ; cur = clist_next(cur)) {
507 msg_att_item = (mailimap_msg_att_item*)clist_content(cur); 507 msg_att_item = (mailimap_msg_att_item*)clist_content(cur);
508 if (msg_att_item->att_type == MAILIMAP_MSG_ATT_ITEM_STATIC) { 508 if (msg_att_item->att_type == MAILIMAP_MSG_ATT_ITEM_STATIC) {
509 if (msg_att_item->att_data.att_static->att_type == MAILIMAP_MSG_ATT_BODY_SECTION) { 509 if (msg_att_item->att_data.att_static->att_type == MAILIMAP_MSG_ATT_BODY_SECTION) {
510 char*text = msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part; 510 char*text = msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part;
511 /* detach - we take over the content */ 511 /* detach - we take over the content */
512 msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part = 0L; 512 msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part = 0L;
513 res->setContent(text,msg_att_item->att_data.att_static->att_data.att_body_section->sec_length); 513 res->setContent(text,msg_att_item->att_data.att_static->att_data.att_body_section->sec_length);
514 } 514 }
515 } 515 }
516 } 516 }
517 } else { 517 } else {
518 qDebug("error fetching text: %s",m_imap->imap_response); 518 qDebug("error fetching text: %s",m_imap->imap_response);
519 } 519 }
520 if (result) mailimap_fetch_list_free(result); 520 if (result) mailimap_fetch_list_free(result);
521 return res; 521 return res;
522} 522}
523 523
524/* current_recursion is for recursive calls. 524/* current_recursion is for recursive calls.
525 current_count means the position inside the internal loop! */ 525 current_count means the position inside the internal loop! */
526void IMAPwrapper::traverseBody(const RecMail&mail,mailimap_body*body,RecBody&target_body, 526void IMAPwrapper::traverseBody(const RecMail&mail,mailimap_body*body,RecBody&target_body,
527 int current_recursion,QValueList<int>recList,int current_count) 527 int current_recursion,QValueList<int>recList,int current_count)
528{ 528{
529 if (!body || current_recursion>=10) { 529 if (!body || current_recursion>=10) {
530 return; 530 return;
531 } 531 }
532 ++current_count;
533 switch (body->bd_type) { 532 switch (body->bd_type) {
534 case MAILIMAP_BODY_1PART: 533 case MAILIMAP_BODY_1PART:
535 { 534 {
536 QValueList<int>countlist = recList; 535 QValueList<int>countlist = recList;
537 countlist.append(current_count); 536 countlist.append(current_count);
538 RecPart currentPart; 537 RecPart currentPart;
539 mailimap_body_type_1part*part1 = body->bd_data.bd_body_1part; 538 mailimap_body_type_1part*part1 = body->bd_data.bd_body_1part;
540 QString id(""); 539 QString id("");
541 currentPart.setPositionlist(countlist); 540 currentPart.setPositionlist(countlist);
542 for (unsigned int j = 0; j < countlist.count();++j) { 541 for (unsigned int j = 0; j < countlist.count();++j) {
543 id+=(j>0?" ":""); 542 id+=(j>0?" ":"");
544 id+=QString("%1").arg(countlist[j]); 543 id+=QString("%1").arg(countlist[j]);
545 } 544 }
546 qDebug("ID = %s",id.latin1()); 545 qDebug("ID = %s",id.latin1());
547 currentPart.setIdentifier(id); 546 currentPart.setIdentifier(id);
548 fillSinglePart(currentPart,part1); 547 fillSinglePart(currentPart,part1);
549 /* important: Check for is NULL 'cause a body can be empty! 548 /* important: Check for is NULL 'cause a body can be empty!
550 And we put it only into the mail if it is the FIRST part */ 549 And we put it only into the mail if it is the FIRST part */
551 if (part1->bd_type==MAILIMAP_BODY_TYPE_1PART_TEXT && target_body.Bodytext().isNull() && countlist[0]==1) { 550 if (part1->bd_type==MAILIMAP_BODY_TYPE_1PART_TEXT && target_body.Bodytext().isNull() && countlist[0]==1) {
552 QString body_text = fetchTextPart(mail,countlist,true,currentPart.Encoding()); 551 QString body_text = fetchTextPart(mail,countlist,true,currentPart.Encoding());
553 target_body.setDescription(currentPart); 552 target_body.setDescription(currentPart);
554 target_body.setBodytext(body_text); 553 target_body.setBodytext(body_text);
554 if (countlist.count()>1) {
555 target_body.addPart(currentPart);
556 }
555 } else { 557 } else {
556 target_body.addPart(currentPart); 558 target_body.addPart(currentPart);
557 } 559 }
558 if (part1->bd_type==MAILIMAP_BODY_TYPE_1PART_MSG) { 560 if (part1->bd_type==MAILIMAP_BODY_TYPE_1PART_MSG) {
559 traverseBody(mail,part1->bd_data.bd_type_msg->bd_body,target_body,current_recursion+1,countlist); 561 traverseBody(mail,part1->bd_data.bd_type_msg->bd_body,target_body,current_recursion+1,countlist);
560 } 562 }
561 } 563 }
562 break; 564 break;
563 case MAILIMAP_BODY_MPART: 565 case MAILIMAP_BODY_MPART:
564 { 566 {
567 QValueList<int>countlist = recList;
565 clistcell*current=0; 568 clistcell*current=0;
566 mailimap_body*current_body=0; 569 mailimap_body*current_body=0;
567 unsigned int ccount = current_count-1; 570 unsigned int ccount = 1;
568 mailimap_body_type_mpart*mailDescription = body->bd_data.bd_body_mpart; 571 mailimap_body_type_mpart*mailDescription = body->bd_data.bd_body_mpart;
569 for (current=clist_begin(mailDescription->bd_list);current!=0;current=clist_next(current)) { 572 for (current=clist_begin(mailDescription->bd_list);current!=0;current=clist_next(current)) {
570 current_body = (mailimap_body*)current->data; 573 current_body = (mailimap_body*)current->data;
571 traverseBody(mail,current_body,target_body,current_recursion+1,recList,ccount); 574 if (current_body->bd_type==MAILIMAP_BODY_MPART) {
575 RecPart targetPart;
576 targetPart.setType("multipart");
577 fillMultiPart(targetPart,mailDescription);
578 countlist.append(current_count);
579 targetPart.setPositionlist(countlist);
580 target_body.addPart(targetPart);
581 QString id("");
582 for (unsigned int j = 0; j < countlist.count();++j) {
583 id+=(j>0?" ":"");
584 id+=QString("%1").arg(countlist[j]);
585 }
586 qDebug("ID(mpart) = %s",id.latin1());
587 }
588 traverseBody(mail,current_body,target_body,current_recursion+1,countlist,ccount);
589 if (current_body->bd_type==MAILIMAP_BODY_MPART) {
590 countlist = recList;
591 }
572 ++ccount; 592 ++ccount;
573 } 593 }
574 } 594 }
575 break; 595 break;
576 default: 596 default:
577 break; 597 break;
578 } 598 }
579} 599}
580 600
581void IMAPwrapper::fillSinglePart(RecPart&target_part,mailimap_body_type_1part*Description) 601void IMAPwrapper::fillSinglePart(RecPart&target_part,mailimap_body_type_1part*Description)
582{ 602{
583 if (!Description) { 603 if (!Description) {
584 return; 604 return;
585 } 605 }
586 switch (Description->bd_type) { 606 switch (Description->bd_type) {
587 case MAILIMAP_BODY_TYPE_1PART_TEXT: 607 case MAILIMAP_BODY_TYPE_1PART_TEXT:
588 target_part.setType("text"); 608 target_part.setType("text");
589 fillSingleTextPart(target_part,Description->bd_data.bd_type_text); 609 fillSingleTextPart(target_part,Description->bd_data.bd_type_text);
590 break; 610 break;
591 case MAILIMAP_BODY_TYPE_1PART_BASIC: 611 case MAILIMAP_BODY_TYPE_1PART_BASIC:
592 fillSingleBasicPart(target_part,Description->bd_data.bd_type_basic); 612 fillSingleBasicPart(target_part,Description->bd_data.bd_type_basic);
593 break; 613 break;
594 case MAILIMAP_BODY_TYPE_1PART_MSG: 614 case MAILIMAP_BODY_TYPE_1PART_MSG:
595 target_part.setType("message"); 615 target_part.setType("message");
596 fillSingleMsgPart(target_part,Description->bd_data.bd_type_msg); 616 fillSingleMsgPart(target_part,Description->bd_data.bd_type_msg);
597 break; 617 break;
598 default: 618 default:
599 break; 619 break;
600 } 620 }
601} 621}
602 622
603void IMAPwrapper::fillSingleTextPart(RecPart&target_part,mailimap_body_type_text*which) 623void IMAPwrapper::fillSingleTextPart(RecPart&target_part,mailimap_body_type_text*which)
604{ 624{
605 if (!which) { 625 if (!which) {
606 return; 626 return;
607 } 627 }
608 QString sub; 628 QString sub;
609 sub = which->bd_media_text; 629 sub = which->bd_media_text;
630 qDebug("Type= text/%s",which->bd_media_text);
610 target_part.setSubtype(sub.lower()); 631 target_part.setSubtype(sub.lower());
611 target_part.setLines(which->bd_lines); 632 target_part.setLines(which->bd_lines);
612 fillBodyFields(target_part,which->bd_fields); 633 fillBodyFields(target_part,which->bd_fields);
613} 634}
614 635
615void IMAPwrapper::fillSingleMsgPart(RecPart&target_part,mailimap_body_type_msg*which) 636void IMAPwrapper::fillSingleMsgPart(RecPart&target_part,mailimap_body_type_msg*which)
616{ 637{
617 if (!which) { 638 if (!which) {
618 return; 639 return;
619 } 640 }
620 target_part.setSubtype("rfc822"); 641 target_part.setSubtype("rfc822");
621 qDebug("Message part"); 642 qDebug("Message part");
622 /* we set this type to text/plain */ 643 /* we set this type to text/plain */
623 target_part.setLines(which->bd_lines); 644 target_part.setLines(which->bd_lines);
624 fillBodyFields(target_part,which->bd_fields); 645 fillBodyFields(target_part,which->bd_fields);
625} 646}
626 647
648void IMAPwrapper::fillMultiPart(RecPart&target_part,mailimap_body_type_mpart*which)
649{
650 if (!which) return;
651 target_part.setSubtype(which->bd_media_subtype);
652 if (which->bd_ext_mpart && which->bd_ext_mpart->bd_parameter && which->bd_ext_mpart->bd_parameter->pa_list) {
653 clistcell*cur = 0;
654 mailimap_single_body_fld_param*param=0;
655 for (cur = clist_begin(which->bd_ext_mpart->bd_parameter->pa_list);cur!=NULL;cur=clist_next(cur)) {
656 param = (mailimap_single_body_fld_param*)cur->data;
657 if (param) {
658 target_part.addParameter(QString(param->pa_name).lower(),QString(param->pa_value));
659 }
660 }
661 }
662}
663
627void IMAPwrapper::fillSingleBasicPart(RecPart&target_part,mailimap_body_type_basic*which) 664void IMAPwrapper::fillSingleBasicPart(RecPart&target_part,mailimap_body_type_basic*which)
628{ 665{
629 if (!which) { 666 if (!which) {
630 return; 667 return;
631 } 668 }
632 QString type,sub; 669 QString type,sub;
633 switch (which->bd_media_basic->med_type) { 670 switch (which->bd_media_basic->med_type) {
634 case MAILIMAP_MEDIA_BASIC_APPLICATION: 671 case MAILIMAP_MEDIA_BASIC_APPLICATION:
635 type = "application"; 672 type = "application";
636 break; 673 break;
637 case MAILIMAP_MEDIA_BASIC_AUDIO: 674 case MAILIMAP_MEDIA_BASIC_AUDIO:
638 type = "audio"; 675 type = "audio";
639 break; 676 break;
640 case MAILIMAP_MEDIA_BASIC_IMAGE: 677 case MAILIMAP_MEDIA_BASIC_IMAGE:
641 type = "image"; 678 type = "image";
642 break; 679 break;
643 case MAILIMAP_MEDIA_BASIC_MESSAGE: 680 case MAILIMAP_MEDIA_BASIC_MESSAGE:
644 type = "message"; 681 type = "message";
645 break; 682 break;
646 case MAILIMAP_MEDIA_BASIC_VIDEO: 683 case MAILIMAP_MEDIA_BASIC_VIDEO:
647 type = "video"; 684 type = "video";
648 break; 685 break;
649 case MAILIMAP_MEDIA_BASIC_OTHER: 686 case MAILIMAP_MEDIA_BASIC_OTHER:
650 default: 687 default:
651 if (which->bd_media_basic->med_basic_type) { 688 if (which->bd_media_basic->med_basic_type) {
652 type = which->bd_media_basic->med_basic_type; 689 type = which->bd_media_basic->med_basic_type;
653 } else { 690 } else {
654 type = ""; 691 type = "";
655 } 692 }
656 break; 693 break;
657 } 694 }
658 if (which->bd_media_basic->med_subtype) { 695 if (which->bd_media_basic->med_subtype) {
659 sub = which->bd_media_basic->med_subtype; 696 sub = which->bd_media_basic->med_subtype;
660 } else { 697 } else {
661 sub = ""; 698 sub = "";
662 } 699 }
663 qDebug("Type = %s/%s",type.latin1(),sub.latin1()); 700 qDebug("Type = %s/%s",type.latin1(),sub.latin1());
664 target_part.setType(type.lower()); 701 target_part.setType(type.lower());
665 target_part.setSubtype(sub.lower()); 702 target_part.setSubtype(sub.lower());
666 fillBodyFields(target_part,which->bd_fields); 703 fillBodyFields(target_part,which->bd_fields);
667} 704}
668 705
669void IMAPwrapper::fillBodyFields(RecPart&target_part,mailimap_body_fields*which) 706void IMAPwrapper::fillBodyFields(RecPart&target_part,mailimap_body_fields*which)
670{ 707{
671 if (!which) return; 708 if (!which) return;
672 if (which->bd_parameter && which->bd_parameter->pa_list && which->bd_parameter->pa_list->count>0) { 709 if (which->bd_parameter && which->bd_parameter->pa_list && which->bd_parameter->pa_list->count>0) {
673 clistcell*cur; 710 clistcell*cur;
674 mailimap_single_body_fld_param*param=0; 711 mailimap_single_body_fld_param*param=0;
675 for (cur = clist_begin(which->bd_parameter->pa_list);cur!=NULL;cur=clist_next(cur)) { 712 for (cur = clist_begin(which->bd_parameter->pa_list);cur!=NULL;cur=clist_next(cur)) {
676 param = (mailimap_single_body_fld_param*)cur->data; 713 param = (mailimap_single_body_fld_param*)cur->data;
677 if (param) { 714 if (param) {
678 target_part.addParameter(QString(param->pa_name).lower(),QString(param->pa_value)); 715 target_part.addParameter(QString(param->pa_name).lower(),QString(param->pa_value));
679 } 716 }
680 } 717 }
681 } 718 }
682 mailimap_body_fld_enc*enc = which->bd_encoding; 719 mailimap_body_fld_enc*enc = which->bd_encoding;
683 QString encoding(""); 720 QString encoding("");
684 switch (enc->enc_type) { 721 switch (enc->enc_type) {
685 case MAILIMAP_BODY_FLD_ENC_7BIT: 722 case MAILIMAP_BODY_FLD_ENC_7BIT:
686 encoding = "7bit"; 723 encoding = "7bit";
687 break; 724 break;
688 case MAILIMAP_BODY_FLD_ENC_8BIT: 725 case MAILIMAP_BODY_FLD_ENC_8BIT:
689 encoding = "8bit"; 726 encoding = "8bit";
690 break; 727 break;
691 case MAILIMAP_BODY_FLD_ENC_BINARY: 728 case MAILIMAP_BODY_FLD_ENC_BINARY:
692 encoding="binary"; 729 encoding="binary";
693 break; 730 break;
694 case MAILIMAP_BODY_FLD_ENC_BASE64: 731 case MAILIMAP_BODY_FLD_ENC_BASE64:
695 encoding="base64"; 732 encoding="base64";
696 break; 733 break;
697 case MAILIMAP_BODY_FLD_ENC_QUOTED_PRINTABLE: 734 case MAILIMAP_BODY_FLD_ENC_QUOTED_PRINTABLE:
698 encoding="quoted-printable"; 735 encoding="quoted-printable";
699 break; 736 break;
700 case MAILIMAP_BODY_FLD_ENC_OTHER: 737 case MAILIMAP_BODY_FLD_ENC_OTHER:
701 default: 738 default:
702 if (enc->enc_value) { 739 if (enc->enc_value) {
703 char*t=enc->enc_value; 740 char*t=enc->enc_value;
704 encoding=QString(enc->enc_value); 741 encoding=QString(enc->enc_value);
705 enc->enc_value=0L; 742 enc->enc_value=0L;
706 free(t); 743 free(t);
707 } 744 }
708 } 745 }
709 if (which->bd_description) { 746 if (which->bd_description) {
710 target_part.setDescription(QString(which->bd_description)); 747 target_part.setDescription(QString(which->bd_description));
711 } 748 }
712 target_part.setEncoding(encoding); 749 target_part.setEncoding(encoding);
713 target_part.setSize(which->bd_size); 750 target_part.setSize(which->bd_size);
714} 751}
715 752
716void IMAPwrapper::deleteMail(const RecMail&mail) 753void IMAPwrapper::deleteMail(const RecMail&mail)
717{ 754{
718 mailimap_flag_list*flist; 755 mailimap_flag_list*flist;
719 mailimap_set *set; 756 mailimap_set *set;
720 mailimap_store_att_flags * store_flags; 757 mailimap_store_att_flags * store_flags;
721 int err; 758 int err;
722 login(); 759 login();
723 if (!m_imap) { 760 if (!m_imap) {
724 return; 761 return;
725 } 762 }
726 const char *mb = mail.getMbox().latin1(); 763 const char *mb = mail.getMbox().latin1();
727 err = mailimap_select( m_imap, (char*)mb); 764 err = mailimap_select( m_imap, (char*)mb);
728 if ( err != MAILIMAP_NO_ERROR ) { 765 if ( err != MAILIMAP_NO_ERROR ) {
729 qDebug("error selecting mailbox for delete: %s",m_imap->imap_response); 766 qDebug("error selecting mailbox for delete: %s",m_imap->imap_response);
730 return; 767 return;
731 } 768 }
732 flist = mailimap_flag_list_new_empty(); 769 flist = mailimap_flag_list_new_empty();
733 mailimap_flag_list_add(flist,mailimap_flag_new_deleted()); 770 mailimap_flag_list_add(flist,mailimap_flag_new_deleted());
734 store_flags = mailimap_store_att_flags_new_set_flags(flist); 771 store_flags = mailimap_store_att_flags_new_set_flags(flist);
735 set = mailimap_set_new_single(mail.getNumber()); 772 set = mailimap_set_new_single(mail.getNumber());
736 err = mailimap_store(m_imap,set,store_flags); 773 err = mailimap_store(m_imap,set,store_flags);
737 mailimap_set_free( set ); 774 mailimap_set_free( set );
738 mailimap_store_att_flags_free(store_flags); 775 mailimap_store_att_flags_free(store_flags);
739 776
740 if (err != MAILIMAP_NO_ERROR) { 777 if (err != MAILIMAP_NO_ERROR) {
741 qDebug("error deleting mail: %s",m_imap->imap_response); 778 qDebug("error deleting mail: %s",m_imap->imap_response);
742 return; 779 return;
743 } 780 }
744 qDebug("deleting mail: %s",m_imap->imap_response); 781 qDebug("deleting mail: %s",m_imap->imap_response);
745 /* should we realy do that at this moment? */ 782 /* should we realy do that at this moment? */
746 err = mailimap_expunge(m_imap); 783 err = mailimap_expunge(m_imap);
747 if (err != MAILIMAP_NO_ERROR) { 784 if (err != MAILIMAP_NO_ERROR) {
748 qDebug("error deleting mail: %s",m_imap->imap_response); 785 qDebug("error deleting mail: %s",m_imap->imap_response);
749 } 786 }
750 qDebug("Delete successfull %s",m_imap->imap_response); 787 qDebug("Delete successfull %s",m_imap->imap_response);
751} 788}
752 789
753void IMAPwrapper::answeredMail(const RecMail&mail) 790void IMAPwrapper::answeredMail(const RecMail&mail)
754{ 791{
755 mailimap_flag_list*flist; 792 mailimap_flag_list*flist;
756 mailimap_set *set; 793 mailimap_set *set;
757 mailimap_store_att_flags * store_flags; 794 mailimap_store_att_flags * store_flags;
758 int err; 795 int err;
759 login(); 796 login();
760 if (!m_imap) { 797 if (!m_imap) {
761 return; 798 return;
762 } 799 }
763 const char *mb = mail.getMbox().latin1(); 800 const char *mb = mail.getMbox().latin1();
764 err = mailimap_select( m_imap, (char*)mb); 801 err = mailimap_select( m_imap, (char*)mb);
765 if ( err != MAILIMAP_NO_ERROR ) { 802 if ( err != MAILIMAP_NO_ERROR ) {
766 qDebug("error selecting mailbox for mark: %s",m_imap->imap_response); 803 qDebug("error selecting mailbox for mark: %s",m_imap->imap_response);
767 return; 804 return;
768 } 805 }
769 flist = mailimap_flag_list_new_empty(); 806 flist = mailimap_flag_list_new_empty();
770 mailimap_flag_list_add(flist,mailimap_flag_new_answered()); 807 mailimap_flag_list_add(flist,mailimap_flag_new_answered());
771 store_flags = mailimap_store_att_flags_new_add_flags(flist); 808 store_flags = mailimap_store_att_flags_new_add_flags(flist);
772 set = mailimap_set_new_single(mail.getNumber()); 809 set = mailimap_set_new_single(mail.getNumber());
773 err = mailimap_store(m_imap,set,store_flags); 810 err = mailimap_store(m_imap,set,store_flags);
774 mailimap_set_free( set ); 811 mailimap_set_free( set );
775 mailimap_store_att_flags_free(store_flags); 812 mailimap_store_att_flags_free(store_flags);
776 813
777 if (err != MAILIMAP_NO_ERROR) { 814 if (err != MAILIMAP_NO_ERROR) {
778 qDebug("error marking mail: %s",m_imap->imap_response); 815 qDebug("error marking mail: %s",m_imap->imap_response);
779 return; 816 return;
780 } 817 }
781} 818}
782 819
783QString IMAPwrapper::fetchTextPart(const RecMail&mail,const QValueList<int>&path,bool internal_call,const QString&enc) 820QString IMAPwrapper::fetchTextPart(const RecMail&mail,const QValueList<int>&path,bool internal_call,const QString&enc)
784{ 821{
785 QString body(""); 822 QString body("");
786 encodedString*res = fetchRawPart(mail,path,internal_call); 823 encodedString*res = fetchRawPart(mail,path,internal_call);
787 encodedString*r = decode_String(res,enc); 824 encodedString*r = decode_String(res,enc);
788 delete res; 825 delete res;
789 if (r) { 826 if (r) {
790 if (r->Length()>0) { 827 if (r->Length()>0) {
791 body = r->Content(); 828 body = r->Content();
792 } 829 }
793 delete r; 830 delete r;
794 } 831 }
795 return body; 832 return body;
796} 833}
797 834
798QString IMAPwrapper::fetchTextPart(const RecMail&mail,const RecPart&part) 835QString IMAPwrapper::fetchTextPart(const RecMail&mail,const RecPart&part)
799{ 836{
800 return fetchTextPart(mail,part.Positionlist(),false,part.Encoding()); 837 return fetchTextPart(mail,part.Positionlist(),false,part.Encoding());
801} 838}
802 839
803encodedString* IMAPwrapper::fetchDecodedPart(const RecMail&mail,const RecPart&part) 840encodedString* IMAPwrapper::fetchDecodedPart(const RecMail&mail,const RecPart&part)
804{ 841{
805 encodedString*res = fetchRawPart(mail,part.Positionlist(),false); 842 encodedString*res = fetchRawPart(mail,part.Positionlist(),false);
806 encodedString*r = decode_String(res,part.Encoding()); 843 encodedString*r = decode_String(res,part.Encoding());
807 delete res; 844 delete res;
808 return r; 845 return r;
809} 846}
810 847
811encodedString* IMAPwrapper::fetchRawPart(const RecMail&mail,const RecPart&part) 848encodedString* IMAPwrapper::fetchRawPart(const RecMail&mail,const RecPart&part)
812{ 849{
813 return fetchRawPart(mail,part.Positionlist(),false); 850 return fetchRawPart(mail,part.Positionlist(),false);
814} 851}
815 852
816int IMAPwrapper::deleteAllMail(const Folder*folder) 853int IMAPwrapper::deleteAllMail(const Folder*folder)
817{ 854{
818 login(); 855 login();
819 if (!m_imap) { 856 if (!m_imap) {
820 return 0; 857 return 0;
821 } 858 }
822 mailimap_flag_list*flist; 859 mailimap_flag_list*flist;
823 mailimap_set *set; 860 mailimap_set *set;
824 mailimap_store_att_flags * store_flags; 861 mailimap_store_att_flags * store_flags;
825 int err = mailimap_select( m_imap, folder->getName().latin1()); 862 int err = mailimap_select( m_imap, folder->getName().latin1());
826 if ( err != MAILIMAP_NO_ERROR ) { 863 if ( err != MAILIMAP_NO_ERROR ) {
827 Global::statusMessage(tr("error selecting mailbox: %1").arg(m_imap->imap_response)); 864 Global::statusMessage(tr("error selecting mailbox: %1").arg(m_imap->imap_response));
828 return 0; 865 return 0;
829 } 866 }
830 int last = m_imap->imap_selection_info->sel_exists; 867 int last = m_imap->imap_selection_info->sel_exists;
831 if (last == 0) { 868 if (last == 0) {
832 Global::statusMessage(tr("Mailbox has no mails!")); 869 Global::statusMessage(tr("Mailbox has no mails!"));
833 return 0; 870 return 0;
834 } 871 }
835 flist = mailimap_flag_list_new_empty(); 872 flist = mailimap_flag_list_new_empty();
836 mailimap_flag_list_add(flist,mailimap_flag_new_deleted()); 873 mailimap_flag_list_add(flist,mailimap_flag_new_deleted());
837 store_flags = mailimap_store_att_flags_new_set_flags(flist); 874 store_flags = mailimap_store_att_flags_new_set_flags(flist);
838 set = mailimap_set_new_interval( 1, last ); 875 set = mailimap_set_new_interval( 1, last );
839 err = mailimap_store(m_imap,set,store_flags); 876 err = mailimap_store(m_imap,set,store_flags);
840 mailimap_set_free( set ); 877 mailimap_set_free( set );
841 mailimap_store_att_flags_free(store_flags); 878 mailimap_store_att_flags_free(store_flags);
842 if (err != MAILIMAP_NO_ERROR) { 879 if (err != MAILIMAP_NO_ERROR) {
843 Global::statusMessage(tr("error deleting mail: %s").arg(m_imap->imap_response)); 880 Global::statusMessage(tr("error deleting mail: %s").arg(m_imap->imap_response));
844 return 0; 881 return 0;
845 } 882 }
846 qDebug("deleting mail: %s",m_imap->imap_response); 883 qDebug("deleting mail: %s",m_imap->imap_response);
847 /* should we realy do that at this moment? */ 884 /* should we realy do that at this moment? */
848 err = mailimap_expunge(m_imap); 885 err = mailimap_expunge(m_imap);
849 if (err != MAILIMAP_NO_ERROR) { 886 if (err != MAILIMAP_NO_ERROR) {
850 Global::statusMessage(tr("error deleting mail: %s").arg(m_imap->imap_response)); 887 Global::statusMessage(tr("error deleting mail: %s").arg(m_imap->imap_response));
851 return 0; 888 return 0;
852 } 889 }
853 qDebug("Delete successfull %s",m_imap->imap_response); 890 qDebug("Delete successfull %s",m_imap->imap_response);
854 return 1; 891 return 1;
855} 892}
856 893
857int IMAPwrapper::createMbox(const QString&folder,const Folder*parentfolder,const QString& delemiter,bool getsubfolder) 894int IMAPwrapper::createMbox(const QString&folder,const Folder*parentfolder,const QString& delemiter,bool getsubfolder)
858{ 895{
859 if (folder.length()==0) return 0; 896 if (folder.length()==0) return 0;
860 login(); 897 login();
861 if (!m_imap) {return 0;} 898 if (!m_imap) {return 0;}
862 QString pre = account->getPrefix(); 899 QString pre = account->getPrefix();
863 if (delemiter.length()>0 && pre.findRev(delemiter)!=pre.length()-1) { 900 if (delemiter.length()>0 && pre.findRev(delemiter)!=pre.length()-1) {
864 pre+=delemiter; 901 pre+=delemiter;
865 } 902 }
866 if (parentfolder) { 903 if (parentfolder) {
867 pre += parentfolder->getDisplayName()+delemiter; 904 pre += parentfolder->getDisplayName()+delemiter;
868 } 905 }
869 pre+=folder; 906 pre+=folder;
870 if (getsubfolder) { 907 if (getsubfolder) {
871 if (delemiter.length()>0) { 908 if (delemiter.length()>0) {
872 pre+=delemiter; 909 pre+=delemiter;
873 } else { 910 } else {
874 Global::statusMessage(tr("Cannot create folder %1 for holding subfolders").arg(pre)); 911 Global::statusMessage(tr("Cannot create folder %1 for holding subfolders").arg(pre));
875 return 0; 912 return 0;
876 } 913 }
877 } 914 }
878 qDebug("Creating %s",pre.latin1()); 915 qDebug("Creating %s",pre.latin1());
879 int res = mailimap_create(m_imap,pre.latin1()); 916 int res = mailimap_create(m_imap,pre.latin1());
880 if (res != MAILIMAP_NO_ERROR) { 917 if (res != MAILIMAP_NO_ERROR) {
881 Global::statusMessage(tr("%1").arg(m_imap->imap_response)); 918 Global::statusMessage(tr("%1").arg(m_imap->imap_response));
882 return 0; 919 return 0;
883 } 920 }
884 return 1; 921 return 1;
885} 922}
886 923
887int IMAPwrapper::deleteMbox(const Folder*folder) 924int IMAPwrapper::deleteMbox(const Folder*folder)
888{ 925{
889 if (!folder) return 0; 926 if (!folder) return 0;
890 login(); 927 login();
891 if (!m_imap) {return 0;} 928 if (!m_imap) {return 0;}
892 int res = mailimap_delete(m_imap,folder->getName()); 929 int res = mailimap_delete(m_imap,folder->getName());
893 if (res != MAILIMAP_NO_ERROR) { 930 if (res != MAILIMAP_NO_ERROR) {
894 Global::statusMessage(tr("%1").arg(m_imap->imap_response)); 931 Global::statusMessage(tr("%1").arg(m_imap->imap_response));
895 return 0; 932 return 0;
896 } 933 }
897 return 1; 934 return 1;
898} 935}
diff --git a/noncore/net/mail/imapwrapper.h b/noncore/net/mail/imapwrapper.h
index e5846f8..7941046 100644
--- a/noncore/net/mail/imapwrapper.h
+++ b/noncore/net/mail/imapwrapper.h
@@ -1,66 +1,67 @@
1#ifndef __IMAPWRAPPER 1#ifndef __IMAPWRAPPER
2#define __IMAPWRAPPER 2#define __IMAPWRAPPER
3 3
4#include <qlist.h> 4#include <qlist.h>
5#include "mailwrapper.h" 5#include "mailwrapper.h"
6#include "abstractmail.h" 6#include "abstractmail.h"
7#include <libetpan/clist.h> 7#include <libetpan/clist.h>
8 8
9struct mailimap; 9struct mailimap;
10struct mailimap_body; 10struct mailimap_body;
11struct mailimap_body_type_1part; 11struct mailimap_body_type_1part;
12struct mailimap_body_type_text; 12struct mailimap_body_type_text;
13struct mailimap_body_type_basic; 13struct mailimap_body_type_basic;
14struct mailimap_body_type_msg; 14struct mailimap_body_type_msg;
15struct mailimap_body_type_mpart; 15struct mailimap_body_type_mpart;
16struct mailimap_body_fields; 16struct mailimap_body_fields;
17struct mailimap_msg_att; 17struct mailimap_msg_att;
18class encodedString; 18class encodedString;
19 19
20class IMAPwrapper : public AbstractMail 20class IMAPwrapper : public AbstractMail
21{ 21{
22 Q_OBJECT 22 Q_OBJECT
23public: 23public:
24 IMAPwrapper( IMAPaccount *a ); 24 IMAPwrapper( IMAPaccount *a );
25 virtual ~IMAPwrapper(); 25 virtual ~IMAPwrapper();
26 virtual QList<Folder>* listFolders(); 26 virtual QList<Folder>* listFolders();
27 virtual void listMessages(const QString & mailbox,QList<RecMail>&target ); 27 virtual void listMessages(const QString & mailbox,QList<RecMail>&target );
28 28
29 virtual void deleteMail(const RecMail&mail); 29 virtual void deleteMail(const RecMail&mail);
30 virtual void answeredMail(const RecMail&mail); 30 virtual void answeredMail(const RecMail&mail);
31 virtual int deleteAllMail(const Folder*folder); 31 virtual int deleteAllMail(const Folder*folder);
32 32
33 virtual RecBody fetchBody(const RecMail&mail); 33 virtual RecBody fetchBody(const RecMail&mail);
34 virtual QString fetchTextPart(const RecMail&mail,const RecPart&part); 34 virtual QString fetchTextPart(const RecMail&mail,const RecPart&part);
35 virtual encodedString* fetchDecodedPart(const RecMail&mail,const RecPart&part); 35 virtual encodedString* fetchDecodedPart(const RecMail&mail,const RecPart&part);
36 virtual encodedString* fetchRawPart(const RecMail&mail,const RecPart&part); 36 virtual encodedString* fetchRawPart(const RecMail&mail,const RecPart&part);
37 37
38 virtual int createMbox(const QString&,const Folder*parentfolder=0,const QString& delemiter="/",bool getsubfolder=false); 38 virtual int createMbox(const QString&,const Folder*parentfolder=0,const QString& delemiter="/",bool getsubfolder=false);
39 virtual int deleteMbox(const Folder*folder); 39 virtual int deleteMbox(const Folder*folder);
40 40
41 static void imap_progress( size_t current, size_t maximum ); 41 static void imap_progress( size_t current, size_t maximum );
42 42
43protected: 43protected:
44 RecMail*parse_list_result(mailimap_msg_att*); 44 RecMail*parse_list_result(mailimap_msg_att*);
45 void login(); 45 void login();
46 void logout(); 46 void logout();
47 47
48 virtual QString fetchTextPart(const RecMail&mail,const QValueList<int>&path,bool internal_call=false,const QString&enc=""); 48 virtual QString fetchTextPart(const RecMail&mail,const QValueList<int>&path,bool internal_call=false,const QString&enc="");
49 virtual encodedString*fetchRawPart(const RecMail&mail,const QValueList<int>&path,bool internal_call); 49 virtual encodedString*fetchRawPart(const RecMail&mail,const QValueList<int>&path,bool internal_call);
50 50
51 void fillSinglePart(RecPart&target_part,mailimap_body_type_1part*Description); 51 void fillSinglePart(RecPart&target_part,mailimap_body_type_1part*Description);
52 void fillSingleTextPart(RecPart&target_part,mailimap_body_type_text*which); 52 void fillSingleTextPart(RecPart&target_part,mailimap_body_type_text*which);
53 void fillSingleBasicPart(RecPart&target_part,mailimap_body_type_basic*which); 53 void fillSingleBasicPart(RecPart&target_part,mailimap_body_type_basic*which);
54 void fillSingleMsgPart(RecPart&target_part,mailimap_body_type_msg*which); 54 void fillSingleMsgPart(RecPart&target_part,mailimap_body_type_msg*which);
55 void traverseBody(const RecMail&mail,mailimap_body*body,RecBody&target_body,int current_recursion,QValueList<int>recList,int current_count=0); 55 void fillMultiPart(RecPart&target_part,mailimap_body_type_mpart*which);
56 void traverseBody(const RecMail&mail,mailimap_body*body,RecBody&target_body,int current_recursion,QValueList<int>recList,int current_count=1);
56 57
57 /* just helpers */ 58 /* just helpers */
58 static void fillBodyFields(RecPart&target_part,mailimap_body_fields*which); 59 static void fillBodyFields(RecPart&target_part,mailimap_body_fields*which);
59 static QStringList address_list_to_stringlist(clist*list); 60 static QStringList address_list_to_stringlist(clist*list);
60 61
61 62
62 IMAPaccount *account; 63 IMAPaccount *account;
63 mailimap *m_imap; 64 mailimap *m_imap;
64}; 65};
65 66
66#endif 67#endif
diff --git a/noncore/net/mail/libmailwrapper/imapwrapper.cpp b/noncore/net/mail/libmailwrapper/imapwrapper.cpp
index f7e93aa..ae196bb 100644
--- a/noncore/net/mail/libmailwrapper/imapwrapper.cpp
+++ b/noncore/net/mail/libmailwrapper/imapwrapper.cpp
@@ -1,898 +1,935 @@
1#include <stdlib.h> 1#include <stdlib.h>
2#include <libetpan/libetpan.h> 2#include <libetpan/libetpan.h>
3#include <qpe/global.h> 3#include <qpe/global.h>
4 4
5#include "imapwrapper.h" 5#include "imapwrapper.h"
6#include "mailtypes.h" 6#include "mailtypes.h"
7#include "logindialog.h" 7#include "logindialog.h"
8 8
9IMAPwrapper::IMAPwrapper( IMAPaccount *a ) 9IMAPwrapper::IMAPwrapper( IMAPaccount *a )
10 : AbstractMail() 10 : AbstractMail()
11{ 11{
12 account = a; 12 account = a;
13 m_imap = 0; 13 m_imap = 0;
14} 14}
15 15
16IMAPwrapper::~IMAPwrapper() 16IMAPwrapper::~IMAPwrapper()
17{ 17{
18 logout(); 18 logout();
19} 19}
20 20
21void IMAPwrapper::imap_progress( size_t current, size_t maximum ) 21void IMAPwrapper::imap_progress( size_t current, size_t maximum )
22{ 22{
23 qDebug( "IMAP: %i of %i", current, maximum ); 23 qDebug( "IMAP: %i of %i", current, maximum );
24} 24}
25 25
26void IMAPwrapper::login() 26void IMAPwrapper::login()
27{ 27{
28 const char *server, *user, *pass; 28 const char *server, *user, *pass;
29 uint16_t port; 29 uint16_t port;
30 int err = MAILIMAP_NO_ERROR; 30 int err = MAILIMAP_NO_ERROR;
31 31
32 /* we are connected this moment */ 32 /* we are connected this moment */
33 /* TODO: setup a timer holding the line or if connection closed - delete the value */ 33 /* TODO: setup a timer holding the line or if connection closed - delete the value */
34 if (m_imap) { 34 if (m_imap) {
35 err = mailimap_noop(m_imap); 35 err = mailimap_noop(m_imap);
36 if (err!=MAILIMAP_NO_ERROR) { 36 if (err!=MAILIMAP_NO_ERROR) {
37 logout(); 37 logout();
38 } else { 38 } else {
39 mailstream_flush(m_imap->imap_stream); 39 mailstream_flush(m_imap->imap_stream);
40 return; 40 return;
41 } 41 }
42 } 42 }
43 server = account->getServer().latin1(); 43 server = account->getServer().latin1();
44 port = account->getPort().toUInt(); 44 port = account->getPort().toUInt();
45 if ( account->getUser().isEmpty() || account->getPassword().isEmpty() ) { 45 if ( account->getUser().isEmpty() || account->getPassword().isEmpty() ) {
46 LoginDialog login( account->getUser(), account->getPassword(), NULL, 0, true ); 46 LoginDialog login( account->getUser(), account->getPassword(), NULL, 0, true );
47 login.show(); 47 login.show();
48 if ( QDialog::Accepted == login.exec() ) { 48 if ( QDialog::Accepted == login.exec() ) {
49 // ok 49 // ok
50 user = strdup( login.getUser().latin1() ); 50 user = strdup( login.getUser().latin1() );
51 pass = strdup( login.getPassword().latin1() ); 51 pass = strdup( login.getPassword().latin1() );
52 } else { 52 } else {
53 // cancel 53 // cancel
54 qDebug( "IMAP: Login canceled" ); 54 qDebug( "IMAP: Login canceled" );
55 return; 55 return;
56 } 56 }
57 } else { 57 } else {
58 user = account->getUser().latin1(); 58 user = account->getUser().latin1();
59 pass = account->getPassword().latin1(); 59 pass = account->getPassword().latin1();
60 } 60 }
61 61
62 m_imap = mailimap_new( 20, &imap_progress ); 62 m_imap = mailimap_new( 20, &imap_progress );
63 63
64 /* connect */ 64 /* connect */
65 if (account->getSSL()) { 65 if (account->getSSL()) {
66 err = mailimap_ssl_connect( m_imap, (char*)server, port ); 66 err = mailimap_ssl_connect( m_imap, (char*)server, port );
67 } else { 67 } else {
68 err = mailimap_socket_connect( m_imap, (char*)server, port ); 68 err = mailimap_socket_connect( m_imap, (char*)server, port );
69 } 69 }
70 70
71 if ( err != MAILIMAP_NO_ERROR && 71 if ( err != MAILIMAP_NO_ERROR &&
72 err != MAILIMAP_NO_ERROR_AUTHENTICATED && 72 err != MAILIMAP_NO_ERROR_AUTHENTICATED &&
73 err != MAILIMAP_NO_ERROR_NON_AUTHENTICATED ) { 73 err != MAILIMAP_NO_ERROR_NON_AUTHENTICATED ) {
74 QString failure = ""; 74 QString failure = "";
75 if (err == MAILIMAP_ERROR_CONNECTION_REFUSED) { 75 if (err == MAILIMAP_ERROR_CONNECTION_REFUSED) {
76 failure="Connection refused"; 76 failure="Connection refused";
77 } else { 77 } else {
78 failure="Unknown failure"; 78 failure="Unknown failure";
79 } 79 }
80 Global::statusMessage(tr("error connecting imap server: %1").arg(failure)); 80 Global::statusMessage(tr("error connecting imap server: %1").arg(failure));
81 mailimap_free( m_imap ); 81 mailimap_free( m_imap );
82 m_imap = 0; 82 m_imap = 0;
83 return; 83 return;
84 } 84 }
85 85
86 /* login */ 86 /* login */
87 err = mailimap_login_simple( m_imap, (char*)user, (char*)pass ); 87 err = mailimap_login_simple( m_imap, (char*)user, (char*)pass );
88 if ( err != MAILIMAP_NO_ERROR ) { 88 if ( err != MAILIMAP_NO_ERROR ) {
89 Global::statusMessage(tr("error logging in imap server: %1").arg(m_imap->imap_response)); 89 Global::statusMessage(tr("error logging in imap server: %1").arg(m_imap->imap_response));
90 err = mailimap_close( m_imap ); 90 err = mailimap_close( m_imap );
91 mailimap_free( m_imap ); 91 mailimap_free( m_imap );
92 m_imap = 0; 92 m_imap = 0;
93 } 93 }
94} 94}
95 95
96void IMAPwrapper::logout() 96void IMAPwrapper::logout()
97{ 97{
98 int err = MAILIMAP_NO_ERROR; 98 int err = MAILIMAP_NO_ERROR;
99 if (!m_imap) return; 99 if (!m_imap) return;
100 err = mailimap_logout( m_imap ); 100 err = mailimap_logout( m_imap );
101 err = mailimap_close( m_imap ); 101 err = mailimap_close( m_imap );
102 mailimap_free( m_imap ); 102 mailimap_free( m_imap );
103 m_imap = 0; 103 m_imap = 0;
104} 104}
105 105
106void IMAPwrapper::listMessages(const QString&mailbox,QList<RecMail> &target ) 106void IMAPwrapper::listMessages(const QString&mailbox,QList<RecMail> &target )
107{ 107{
108 const char *mb = 0; 108 const char *mb = 0;
109 int err = MAILIMAP_NO_ERROR; 109 int err = MAILIMAP_NO_ERROR;
110 clist *result = 0; 110 clist *result = 0;
111 clistcell *current; 111 clistcell *current;
112// mailimap_fetch_att *fetchAtt,*fetchAttFlags,*fetchAttDate,*fetchAttSize; 112// mailimap_fetch_att *fetchAtt,*fetchAttFlags,*fetchAttDate,*fetchAttSize;
113 mailimap_fetch_type *fetchType = 0; 113 mailimap_fetch_type *fetchType = 0;
114 mailimap_set *set = 0; 114 mailimap_set *set = 0;
115 115
116 mb = mailbox.latin1(); 116 mb = mailbox.latin1();
117 login(); 117 login();
118 if (!m_imap) { 118 if (!m_imap) {
119 return; 119 return;
120 } 120 }
121 /* select mailbox READONLY for operations */ 121 /* select mailbox READONLY for operations */
122 err = mailimap_examine( m_imap, (char*)mb); 122 err = mailimap_examine( m_imap, (char*)mb);
123 if ( err != MAILIMAP_NO_ERROR ) { 123 if ( err != MAILIMAP_NO_ERROR ) {
124 Global::statusMessage(tr("error selecting mailbox: %1").arg(m_imap->imap_response)); 124 Global::statusMessage(tr("error selecting mailbox: %1").arg(m_imap->imap_response));
125 return; 125 return;
126 } 126 }
127 127
128 int last = m_imap->imap_selection_info->sel_exists; 128 int last = m_imap->imap_selection_info->sel_exists;
129 129
130 if (last == 0) { 130 if (last == 0) {
131 Global::statusMessage(tr("Mailbox has no mails")); 131 Global::statusMessage(tr("Mailbox has no mails"));
132 return; 132 return;
133 } else { 133 } else {
134 Global::statusMessage(tr("Mailbox has %1 mails").arg(last)); 134 Global::statusMessage(tr("Mailbox has %1 mails").arg(last));
135 } 135 }
136 136
137 /* the range has to start at 1!!! not with 0!!!! */ 137 /* the range has to start at 1!!! not with 0!!!! */
138 set = mailimap_set_new_interval( 1, last ); 138 set = mailimap_set_new_interval( 1, last );
139 fetchType = mailimap_fetch_type_new_fetch_att_list_empty(); 139 fetchType = mailimap_fetch_type_new_fetch_att_list_empty();
140 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_envelope()); 140 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_envelope());
141 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_flags()); 141 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_flags());
142 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_internaldate()); 142 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_internaldate());
143 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_rfc822_size()); 143 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_rfc822_size());
144 144
145 err = mailimap_fetch( m_imap, set, fetchType, &result ); 145 err = mailimap_fetch( m_imap, set, fetchType, &result );
146 mailimap_set_free( set ); 146 mailimap_set_free( set );
147 mailimap_fetch_type_free( fetchType ); 147 mailimap_fetch_type_free( fetchType );
148 148
149 QString date,subject,from; 149 QString date,subject,from;
150 150
151 if ( err == MAILIMAP_NO_ERROR ) { 151 if ( err == MAILIMAP_NO_ERROR ) {
152 mailimap_msg_att * msg_att; 152 mailimap_msg_att * msg_att;
153 int i = 0; 153 int i = 0;
154 for (current = clist_begin(result); current != 0; current=clist_next(current)) { 154 for (current = clist_begin(result); current != 0; current=clist_next(current)) {
155 ++i; 155 ++i;
156 msg_att = (mailimap_msg_att*)current->data; 156 msg_att = (mailimap_msg_att*)current->data;
157 RecMail*m = parse_list_result(msg_att); 157 RecMail*m = parse_list_result(msg_att);
158 if (m) { 158 if (m) {
159 m->setNumber(i); 159 m->setNumber(i);
160 m->setMbox(mailbox); 160 m->setMbox(mailbox);
161 m->setWrapper(this); 161 m->setWrapper(this);
162 target.append(m); 162 target.append(m);
163 } 163 }
164 } 164 }
165 } else { 165 } else {
166 Global::statusMessage(tr("Error fetching headers: %1").arg(m_imap->imap_response)); 166 Global::statusMessage(tr("Error fetching headers: %1").arg(m_imap->imap_response));
167 } 167 }
168 if (result) mailimap_fetch_list_free(result); 168 if (result) mailimap_fetch_list_free(result);
169} 169}
170 170
171QList<Folder>* IMAPwrapper::listFolders() 171QList<Folder>* IMAPwrapper::listFolders()
172{ 172{
173 const char *path, *mask; 173 const char *path, *mask;
174 int err = MAILIMAP_NO_ERROR; 174 int err = MAILIMAP_NO_ERROR;
175 clist *result = 0; 175 clist *result = 0;
176 clistcell *current = 0; 176 clistcell *current = 0;
177 clistcell*cur_flag = 0; 177 clistcell*cur_flag = 0;
178 mailimap_mbx_list_flags*bflags = 0; 178 mailimap_mbx_list_flags*bflags = 0;
179 179
180 QList<Folder> * folders = new QList<Folder>(); 180 QList<Folder> * folders = new QList<Folder>();
181 folders->setAutoDelete( false ); 181 folders->setAutoDelete( false );
182 login(); 182 login();
183 if (!m_imap) { 183 if (!m_imap) {
184 return folders; 184 return folders;
185 } 185 }
186 186
187/* 187/*
188 * First we have to check for INBOX 'cause it sometimes it's not inside the path. 188 * First we have to check for INBOX 'cause it sometimes it's not inside the path.
189 * We must not forget to filter them out in next loop! 189 * We must not forget to filter them out in next loop!
190 * it seems like ugly code. and yes - it is ugly code. but the best way. 190 * it seems like ugly code. and yes - it is ugly code. but the best way.
191 */ 191 */
192 QString temp; 192 QString temp;
193 mask = "INBOX" ; 193 mask = "INBOX" ;
194 mailimap_mailbox_list *list; 194 mailimap_mailbox_list *list;
195 err = mailimap_list( m_imap, (char*)"", (char*)mask, &result ); 195 err = mailimap_list( m_imap, (char*)"", (char*)mask, &result );
196 QString del; 196 QString del;
197 bool selectable = true; 197 bool selectable = true;
198 bool no_inferiors = false; 198 bool no_inferiors = false;
199 if ( err == MAILIMAP_NO_ERROR ) { 199 if ( err == MAILIMAP_NO_ERROR ) {
200 current = result->first; 200 current = result->first;
201 for ( int i = result->count; i > 0; i-- ) { 201 for ( int i = result->count; i > 0; i-- ) {
202 list = (mailimap_mailbox_list *) current->data; 202 list = (mailimap_mailbox_list *) current->data;
203 // it is better use the deep copy mechanism of qt itself 203 // it is better use the deep copy mechanism of qt itself
204 // instead of using strdup! 204 // instead of using strdup!
205 temp = list->mb_name; 205 temp = list->mb_name;
206 del = list->mb_delimiter; 206 del = list->mb_delimiter;
207 current = current->next; 207 current = current->next;
208 if ( (bflags = list->mb_flag) ) { 208 if ( (bflags = list->mb_flag) ) {
209 selectable = !(bflags->mbf_type==MAILIMAP_MBX_LIST_FLAGS_SFLAG&& 209 selectable = !(bflags->mbf_type==MAILIMAP_MBX_LIST_FLAGS_SFLAG&&
210 bflags->mbf_sflag==MAILIMAP_MBX_LIST_SFLAG_NOSELECT); 210 bflags->mbf_sflag==MAILIMAP_MBX_LIST_SFLAG_NOSELECT);
211 for(cur_flag=clist_begin(bflags->mbf_oflags);cur_flag;cur_flag=clist_next(cur_flag)) { 211 for(cur_flag=clist_begin(bflags->mbf_oflags);cur_flag;cur_flag=clist_next(cur_flag)) {
212 if ( ((mailimap_mbx_list_oflag*)cur_flag->data)->of_type==MAILIMAP_MBX_LIST_OFLAG_NOINFERIORS) { 212 if ( ((mailimap_mbx_list_oflag*)cur_flag->data)->of_type==MAILIMAP_MBX_LIST_OFLAG_NOINFERIORS) {
213 no_inferiors = true; 213 no_inferiors = true;
214 } 214 }
215 } 215 }
216 } 216 }
217 folders->append( new IMAPFolder(temp,del,selectable,no_inferiors,account->getPrefix())); 217 folders->append( new IMAPFolder(temp,del,selectable,no_inferiors,account->getPrefix()));
218 } 218 }
219 } else { 219 } else {
220 qDebug("error fetching folders: %s",m_imap->imap_response); 220 qDebug("error fetching folders: %s",m_imap->imap_response);
221 } 221 }
222 mailimap_list_result_free( result ); 222 mailimap_list_result_free( result );
223 223
224/* 224/*
225 * second stage - get the other then inbox folders 225 * second stage - get the other then inbox folders
226 */ 226 */
227 mask = "*" ; 227 mask = "*" ;
228 path = account->getPrefix().latin1(); 228 path = account->getPrefix().latin1();
229 if (!path) path = ""; 229 if (!path) path = "";
230 qDebug(path); 230 qDebug(path);
231 err = mailimap_list( m_imap, (char*)path, (char*)mask, &result ); 231 err = mailimap_list( m_imap, (char*)path, (char*)mask, &result );
232 if ( err == MAILIMAP_NO_ERROR ) { 232 if ( err == MAILIMAP_NO_ERROR ) {
233 current = result->first; 233 current = result->first;
234 for ( current=clist_begin(result);current!=NULL;current=clist_next(current)) { 234 for ( current=clist_begin(result);current!=NULL;current=clist_next(current)) {
235 no_inferiors = false; 235 no_inferiors = false;
236 list = (mailimap_mailbox_list *) current->data; 236 list = (mailimap_mailbox_list *) current->data;
237 // it is better use the deep copy mechanism of qt itself 237 // it is better use the deep copy mechanism of qt itself
238 // instead of using strdup! 238 // instead of using strdup!
239 temp = list->mb_name; 239 temp = list->mb_name;
240 if (temp.lower()=="inbox") 240 if (temp.lower()=="inbox")
241 continue; 241 continue;
242 if (temp.lower()==account->getPrefix().lower()) 242 if (temp.lower()==account->getPrefix().lower())
243 continue; 243 continue;
244 if ( (bflags = list->mb_flag) ) { 244 if ( (bflags = list->mb_flag) ) {
245 selectable = !(bflags->mbf_type==MAILIMAP_MBX_LIST_FLAGS_SFLAG&& 245 selectable = !(bflags->mbf_type==MAILIMAP_MBX_LIST_FLAGS_SFLAG&&
246 bflags->mbf_sflag==MAILIMAP_MBX_LIST_SFLAG_NOSELECT); 246 bflags->mbf_sflag==MAILIMAP_MBX_LIST_SFLAG_NOSELECT);
247 for(cur_flag=clist_begin(bflags->mbf_oflags);cur_flag;cur_flag=clist_next(cur_flag)) { 247 for(cur_flag=clist_begin(bflags->mbf_oflags);cur_flag;cur_flag=clist_next(cur_flag)) {
248 if ( ((mailimap_mbx_list_oflag*)cur_flag->data)->of_type==MAILIMAP_MBX_LIST_OFLAG_NOINFERIORS) { 248 if ( ((mailimap_mbx_list_oflag*)cur_flag->data)->of_type==MAILIMAP_MBX_LIST_OFLAG_NOINFERIORS) {
249 no_inferiors = true; 249 no_inferiors = true;
250 } 250 }
251 } 251 }
252 } 252 }
253 del = list->mb_delimiter; 253 del = list->mb_delimiter;
254 folders->append(new IMAPFolder(temp,del,selectable,no_inferiors,account->getPrefix())); 254 folders->append(new IMAPFolder(temp,del,selectable,no_inferiors,account->getPrefix()));
255 } 255 }
256 } else { 256 } else {
257 qDebug("error fetching folders %s",m_imap->imap_response); 257 qDebug("error fetching folders %s",m_imap->imap_response);
258 } 258 }
259 if (result) mailimap_list_result_free( result ); 259 if (result) mailimap_list_result_free( result );
260 return folders; 260 return folders;
261} 261}
262 262
263RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att) 263RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att)
264{ 264{
265 RecMail * m = 0; 265 RecMail * m = 0;
266 mailimap_msg_att_item *item=0; 266 mailimap_msg_att_item *item=0;
267 clistcell *current,*c,*cf; 267 clistcell *current,*c,*cf;
268 mailimap_msg_att_dynamic*flist; 268 mailimap_msg_att_dynamic*flist;
269 mailimap_flag_fetch*cflag; 269 mailimap_flag_fetch*cflag;
270 int size; 270 int size;
271 QBitArray mFlags(7); 271 QBitArray mFlags(7);
272 QStringList addresslist; 272 QStringList addresslist;
273 273
274 if (!m_att) { 274 if (!m_att) {
275 return m; 275 return m;
276 } 276 }
277 m = new RecMail(); 277 m = new RecMail();
278 for (c = clist_begin(m_att->att_list); c!=NULL;c=clist_next(c) ) { 278 for (c = clist_begin(m_att->att_list); c!=NULL;c=clist_next(c) ) {
279 current = c; 279 current = c;
280 size = 0; 280 size = 0;
281 item = (mailimap_msg_att_item*)current->data; 281 item = (mailimap_msg_att_item*)current->data;
282 if (item->att_type!=MAILIMAP_MSG_ATT_ITEM_STATIC) { 282 if (item->att_type!=MAILIMAP_MSG_ATT_ITEM_STATIC) {
283 flist = (mailimap_msg_att_dynamic*)item->att_data.att_dyn; 283 flist = (mailimap_msg_att_dynamic*)item->att_data.att_dyn;
284 if (!flist->att_list) { 284 if (!flist->att_list) {
285 continue; 285 continue;
286 } 286 }
287 cf = flist->att_list->first; 287 cf = flist->att_list->first;
288 for (cf = clist_begin(flist->att_list); cf!=NULL; cf = clist_next(cf)) { 288 for (cf = clist_begin(flist->att_list); cf!=NULL; cf = clist_next(cf)) {
289 cflag = (mailimap_flag_fetch*)cf->data; 289 cflag = (mailimap_flag_fetch*)cf->data;
290 if (cflag->fl_type==MAILIMAP_FLAG_FETCH_OTHER && cflag->fl_flag!=0) { 290 if (cflag->fl_type==MAILIMAP_FLAG_FETCH_OTHER && cflag->fl_flag!=0) {
291 switch (cflag->fl_flag->fl_type) { 291 switch (cflag->fl_flag->fl_type) {
292 case MAILIMAP_FLAG_ANSWERED: /* \Answered flag */ 292 case MAILIMAP_FLAG_ANSWERED: /* \Answered flag */
293 mFlags.setBit(FLAG_ANSWERED); 293 mFlags.setBit(FLAG_ANSWERED);
294 break; 294 break;
295 case MAILIMAP_FLAG_FLAGGED: /* \Flagged flag */ 295 case MAILIMAP_FLAG_FLAGGED: /* \Flagged flag */
296 mFlags.setBit(FLAG_FLAGGED); 296 mFlags.setBit(FLAG_FLAGGED);
297 break; 297 break;
298 case MAILIMAP_FLAG_DELETED: /* \Deleted flag */ 298 case MAILIMAP_FLAG_DELETED: /* \Deleted flag */
299 mFlags.setBit(FLAG_DELETED); 299 mFlags.setBit(FLAG_DELETED);
300 break; 300 break;
301 case MAILIMAP_FLAG_SEEN: /* \Seen flag */ 301 case MAILIMAP_FLAG_SEEN: /* \Seen flag */
302 mFlags.setBit(FLAG_SEEN); 302 mFlags.setBit(FLAG_SEEN);
303 break; 303 break;
304 case MAILIMAP_FLAG_DRAFT: /* \Draft flag */ 304 case MAILIMAP_FLAG_DRAFT: /* \Draft flag */
305 mFlags.setBit(FLAG_DRAFT); 305 mFlags.setBit(FLAG_DRAFT);
306 break; 306 break;
307 case MAILIMAP_FLAG_KEYWORD: /* keyword flag */ 307 case MAILIMAP_FLAG_KEYWORD: /* keyword flag */
308 break; 308 break;
309 case MAILIMAP_FLAG_EXTENSION: /* \extension flag */ 309 case MAILIMAP_FLAG_EXTENSION: /* \extension flag */
310 break; 310 break;
311 default: 311 default:
312 break; 312 break;
313 } 313 }
314 } else if (cflag->fl_type==MAILIMAP_FLAG_FETCH_RECENT) { 314 } else if (cflag->fl_type==MAILIMAP_FLAG_FETCH_RECENT) {
315 mFlags.setBit(FLAG_RECENT); 315 mFlags.setBit(FLAG_RECENT);
316 } 316 }
317 } 317 }
318 continue; 318 continue;
319 } 319 }
320 if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_ENVELOPE) { 320 if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_ENVELOPE) {
321 mailimap_envelope * head = item->att_data.att_static->att_data.att_env; 321 mailimap_envelope * head = item->att_data.att_static->att_data.att_env;
322 m->setDate(head->env_date); 322 m->setDate(head->env_date);
323 m->setSubject(convert_String((const char*)head->env_subject)); 323 m->setSubject(convert_String((const char*)head->env_subject));
324 //m->setSubject(head->env_subject); 324 //m->setSubject(head->env_subject);
325 if (head->env_from!=NULL) { 325 if (head->env_from!=NULL) {
326 addresslist = address_list_to_stringlist(head->env_from->frm_list); 326 addresslist = address_list_to_stringlist(head->env_from->frm_list);
327 if (addresslist.count()) { 327 if (addresslist.count()) {
328 m->setFrom(addresslist.first()); 328 m->setFrom(addresslist.first());
329 } 329 }
330 } 330 }
331 if (head->env_to!=NULL) { 331 if (head->env_to!=NULL) {
332 addresslist = address_list_to_stringlist(head->env_to->to_list); 332 addresslist = address_list_to_stringlist(head->env_to->to_list);
333 m->setTo(addresslist); 333 m->setTo(addresslist);
334 } 334 }
335 if (head->env_cc!=NULL) { 335 if (head->env_cc!=NULL) {
336 addresslist = address_list_to_stringlist(head->env_cc->cc_list); 336 addresslist = address_list_to_stringlist(head->env_cc->cc_list);
337 m->setCC(addresslist); 337 m->setCC(addresslist);
338 } 338 }
339 if (head->env_bcc!=NULL) { 339 if (head->env_bcc!=NULL) {
340 addresslist = address_list_to_stringlist(head->env_bcc->bcc_list); 340 addresslist = address_list_to_stringlist(head->env_bcc->bcc_list);
341 m->setBcc(addresslist); 341 m->setBcc(addresslist);
342 } 342 }
343 if (head->env_reply_to!=NULL) { 343 if (head->env_reply_to!=NULL) {
344 addresslist = address_list_to_stringlist(head->env_reply_to->rt_list); 344 addresslist = address_list_to_stringlist(head->env_reply_to->rt_list);
345 if (addresslist.count()) { 345 if (addresslist.count()) {
346 m->setReplyto(addresslist.first()); 346 m->setReplyto(addresslist.first());
347 } 347 }
348 } 348 }
349 m->setMsgid(QString(head->env_message_id)); 349 m->setMsgid(QString(head->env_message_id));
350 } else if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_INTERNALDATE) { 350 } else if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_INTERNALDATE) {
351#if 0 351#if 0
352 mailimap_date_time*d = item->att_data.att_static->att_data.att_internal_date; 352 mailimap_date_time*d = item->att_data.att_static->att_data.att_internal_date;
353 QDateTime da(QDate(d->dt_year,d->dt_month,d->dt_day),QTime(d->dt_hour,d->dt_min,d->dt_sec)); 353 QDateTime da(QDate(d->dt_year,d->dt_month,d->dt_day),QTime(d->dt_hour,d->dt_min,d->dt_sec));
354 qDebug("%i %i %i - %i %i %i",d->dt_year,d->dt_month,d->dt_day,d->dt_hour,d->dt_min,d->dt_sec); 354 qDebug("%i %i %i - %i %i %i",d->dt_year,d->dt_month,d->dt_day,d->dt_hour,d->dt_min,d->dt_sec);
355 qDebug(da.toString()); 355 qDebug(da.toString());
356#endif 356#endif
357 } else if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_RFC822_SIZE) { 357 } else if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_RFC822_SIZE) {
358 size = item->att_data.att_static->att_data.att_rfc822_size; 358 size = item->att_data.att_static->att_data.att_rfc822_size;
359 } 359 }
360 } 360 }
361 /* msg is already deleted */ 361 /* msg is already deleted */
362 if (mFlags.testBit(FLAG_DELETED) && m) { 362 if (mFlags.testBit(FLAG_DELETED) && m) {
363 delete m; 363 delete m;
364 m = 0; 364 m = 0;
365 } 365 }
366 if (m) { 366 if (m) {
367 m->setFlags(mFlags); 367 m->setFlags(mFlags);
368 m->setMsgsize(size); 368 m->setMsgsize(size);
369 } 369 }
370 return m; 370 return m;
371} 371}
372 372
373RecBody IMAPwrapper::fetchBody(const RecMail&mail) 373RecBody IMAPwrapper::fetchBody(const RecMail&mail)
374{ 374{
375 RecBody body; 375 RecBody body;
376 const char *mb; 376 const char *mb;
377 int err = MAILIMAP_NO_ERROR; 377 int err = MAILIMAP_NO_ERROR;
378 clist *result = 0; 378 clist *result = 0;
379 clistcell *current; 379 clistcell *current;
380 mailimap_fetch_att *fetchAtt = 0; 380 mailimap_fetch_att *fetchAtt = 0;
381 mailimap_fetch_type *fetchType = 0; 381 mailimap_fetch_type *fetchType = 0;
382 mailimap_set *set = 0; 382 mailimap_set *set = 0;
383 mailimap_body*body_desc = 0; 383 mailimap_body*body_desc = 0;
384 384
385 mb = mail.getMbox().latin1(); 385 mb = mail.getMbox().latin1();
386 386
387 login(); 387 login();
388 if (!m_imap) { 388 if (!m_imap) {
389 return body; 389 return body;
390 } 390 }
391 391
392 err = mailimap_select( m_imap, (char*)mb); 392 err = mailimap_select( m_imap, (char*)mb);
393 if ( err != MAILIMAP_NO_ERROR ) { 393 if ( err != MAILIMAP_NO_ERROR ) {
394 qDebug("error selecting mailbox: %s",m_imap->imap_response); 394 qDebug("error selecting mailbox: %s",m_imap->imap_response);
395 return body; 395 return body;
396 } 396 }
397 397
398 /* the range has to start at 1!!! not with 0!!!! */ 398 /* the range has to start at 1!!! not with 0!!!! */
399 set = mailimap_set_new_interval( mail.getNumber(),mail.getNumber() ); 399 set = mailimap_set_new_interval( mail.getNumber(),mail.getNumber() );
400 fetchAtt = mailimap_fetch_att_new_bodystructure(); 400 fetchAtt = mailimap_fetch_att_new_bodystructure();
401 fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt); 401 fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt);
402 err = mailimap_fetch( m_imap, set, fetchType, &result ); 402 err = mailimap_fetch( m_imap, set, fetchType, &result );
403 mailimap_set_free( set ); 403 mailimap_set_free( set );
404 mailimap_fetch_type_free( fetchType ); 404 mailimap_fetch_type_free( fetchType );
405 405
406 if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) { 406 if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) {
407 mailimap_msg_att * msg_att; 407 mailimap_msg_att * msg_att;
408 msg_att = (mailimap_msg_att*)current->data; 408 msg_att = (mailimap_msg_att*)current->data;
409 mailimap_msg_att_item*item = (mailimap_msg_att_item*)msg_att->att_list->first->data; 409 mailimap_msg_att_item*item = (mailimap_msg_att_item*)msg_att->att_list->first->data;
410 QValueList<int> path; 410 QValueList<int> path;
411 body_desc = item->att_data.att_static->att_data.att_body; 411 body_desc = item->att_data.att_static->att_data.att_body;
412 traverseBody(mail,body_desc,body,0,path); 412 traverseBody(mail,body_desc,body,0,path);
413 } else { 413 } else {
414 qDebug("error fetching body: %s",m_imap->imap_response); 414 qDebug("error fetching body: %s",m_imap->imap_response);
415 } 415 }
416 if (result) mailimap_fetch_list_free(result); 416 if (result) mailimap_fetch_list_free(result);
417 return body; 417 return body;
418} 418}
419 419
420QStringList IMAPwrapper::address_list_to_stringlist(clist*list) 420QStringList IMAPwrapper::address_list_to_stringlist(clist*list)
421{ 421{
422 QStringList l; 422 QStringList l;
423 QString from; 423 QString from;
424 bool named_from; 424 bool named_from;
425 clistcell *current = NULL; 425 clistcell *current = NULL;
426 mailimap_address * current_address=NULL; 426 mailimap_address * current_address=NULL;
427 if (!list) { 427 if (!list) {
428 return l; 428 return l;
429 } 429 }
430 unsigned int count = 0; 430 unsigned int count = 0;
431 for (current=clist_begin(list);current!= NULL;current=clist_next(current)) { 431 for (current=clist_begin(list);current!= NULL;current=clist_next(current)) {
432 from = ""; 432 from = "";
433 named_from = false; 433 named_from = false;
434 current_address=(mailimap_address*)current->data; 434 current_address=(mailimap_address*)current->data;
435 if (current_address->ad_personal_name){ 435 if (current_address->ad_personal_name){
436 from+=convert_String((const char*)current_address->ad_personal_name); 436 from+=convert_String((const char*)current_address->ad_personal_name);
437 from+=" "; 437 from+=" ";
438 named_from = true; 438 named_from = true;
439 } 439 }
440 if (named_from && (current_address->ad_mailbox_name || current_address->ad_host_name)) { 440 if (named_from && (current_address->ad_mailbox_name || current_address->ad_host_name)) {
441 from+="<"; 441 from+="<";
442 } 442 }
443 if (current_address->ad_mailbox_name) { 443 if (current_address->ad_mailbox_name) {
444 from+=QString(current_address->ad_mailbox_name); 444 from+=QString(current_address->ad_mailbox_name);
445 from+="@"; 445 from+="@";
446 } 446 }
447 if (current_address->ad_host_name) { 447 if (current_address->ad_host_name) {
448 from+=QString(current_address->ad_host_name); 448 from+=QString(current_address->ad_host_name);
449 } 449 }
450 if (named_from && (current_address->ad_mailbox_name || current_address->ad_host_name)) { 450 if (named_from && (current_address->ad_mailbox_name || current_address->ad_host_name)) {
451 from+=">"; 451 from+=">";
452 } 452 }
453 l.append(QString(from)); 453 l.append(QString(from));
454 if (++count > 99) { 454 if (++count > 99) {
455 break; 455 break;
456 } 456 }
457 } 457 }
458 return l; 458 return l;
459} 459}
460 460
461encodedString*IMAPwrapper::fetchRawPart(const RecMail&mail,const QValueList<int>&path,bool internal_call) 461encodedString*IMAPwrapper::fetchRawPart(const RecMail&mail,const QValueList<int>&path,bool internal_call)
462{ 462{
463 encodedString*res=new encodedString; 463 encodedString*res=new encodedString;
464 const char*mb; 464 const char*mb;
465 int err; 465 int err;
466 mailimap_fetch_type *fetchType; 466 mailimap_fetch_type *fetchType;
467 mailimap_set *set; 467 mailimap_set *set;
468 clistcell*current,*cur; 468 clistcell*current,*cur;
469 469
470 login(); 470 login();
471 if (!m_imap) { 471 if (!m_imap) {
472 return res; 472 return res;
473 } 473 }
474 if (!internal_call) { 474 if (!internal_call) {
475 mb = mail.getMbox().latin1(); 475 mb = mail.getMbox().latin1();
476 err = mailimap_select( m_imap, (char*)mb); 476 err = mailimap_select( m_imap, (char*)mb);
477 if ( err != MAILIMAP_NO_ERROR ) { 477 if ( err != MAILIMAP_NO_ERROR ) {
478 qDebug("error selecting mailbox: %s",m_imap->imap_response); 478 qDebug("error selecting mailbox: %s",m_imap->imap_response);
479 return res; 479 return res;
480 } 480 }
481 } 481 }
482 set = mailimap_set_new_single(mail.getNumber()); 482 set = mailimap_set_new_single(mail.getNumber());
483 clist*id_list=clist_new(); 483 clist*id_list=clist_new();
484 for (unsigned j=0; j < path.count();++j) { 484 for (unsigned j=0; j < path.count();++j) {
485 uint32_t * p_id = (uint32_t *)malloc(sizeof(*p_id)); 485 uint32_t * p_id = (uint32_t *)malloc(sizeof(*p_id));
486 *p_id = path[j]; 486 *p_id = path[j];
487 clist_append(id_list,p_id); 487 clist_append(id_list,p_id);
488 } 488 }
489 mailimap_section_part * section_part = mailimap_section_part_new(id_list); 489 mailimap_section_part * section_part = mailimap_section_part_new(id_list);
490 mailimap_section_spec * section_spec = mailimap_section_spec_new(MAILIMAP_SECTION_SPEC_SECTION_PART, NULL, section_part, NULL); 490 mailimap_section_spec * section_spec = mailimap_section_spec_new(MAILIMAP_SECTION_SPEC_SECTION_PART, NULL, section_part, NULL);
491 mailimap_section * section = mailimap_section_new(section_spec); 491 mailimap_section * section = mailimap_section_new(section_spec);
492 mailimap_fetch_att * fetch_att = mailimap_fetch_att_new_body_section(section); 492 mailimap_fetch_att * fetch_att = mailimap_fetch_att_new_body_section(section);
493 493
494 fetchType = mailimap_fetch_type_new_fetch_att(fetch_att); 494 fetchType = mailimap_fetch_type_new_fetch_att(fetch_att);
495 495
496 clist*result = 0; 496 clist*result = 0;
497 497
498 err = mailimap_fetch( m_imap, set, fetchType, &result ); 498 err = mailimap_fetch( m_imap, set, fetchType, &result );
499 mailimap_set_free( set ); 499 mailimap_set_free( set );
500 mailimap_fetch_type_free( fetchType ); 500 mailimap_fetch_type_free( fetchType );
501 501
502 if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) { 502 if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) {
503 mailimap_msg_att * msg_att; 503 mailimap_msg_att * msg_att;
504 msg_att = (mailimap_msg_att*)current->data; 504 msg_att = (mailimap_msg_att*)current->data;
505 mailimap_msg_att_item*msg_att_item; 505 mailimap_msg_att_item*msg_att_item;
506 for(cur = clist_begin(msg_att->att_list) ; cur != NULL ; cur = clist_next(cur)) { 506 for(cur = clist_begin(msg_att->att_list) ; cur != NULL ; cur = clist_next(cur)) {
507 msg_att_item = (mailimap_msg_att_item*)clist_content(cur); 507 msg_att_item = (mailimap_msg_att_item*)clist_content(cur);
508 if (msg_att_item->att_type == MAILIMAP_MSG_ATT_ITEM_STATIC) { 508 if (msg_att_item->att_type == MAILIMAP_MSG_ATT_ITEM_STATIC) {
509 if (msg_att_item->att_data.att_static->att_type == MAILIMAP_MSG_ATT_BODY_SECTION) { 509 if (msg_att_item->att_data.att_static->att_type == MAILIMAP_MSG_ATT_BODY_SECTION) {
510 char*text = msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part; 510 char*text = msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part;
511 /* detach - we take over the content */ 511 /* detach - we take over the content */
512 msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part = 0L; 512 msg_att_item->att_data.att_static->att_data.att_body_section->sec_body_part = 0L;
513 res->setContent(text,msg_att_item->att_data.att_static->att_data.att_body_section->sec_length); 513 res->setContent(text,msg_att_item->att_data.att_static->att_data.att_body_section->sec_length);
514 } 514 }
515 } 515 }
516 } 516 }
517 } else { 517 } else {
518 qDebug("error fetching text: %s",m_imap->imap_response); 518 qDebug("error fetching text: %s",m_imap->imap_response);
519 } 519 }
520 if (result) mailimap_fetch_list_free(result); 520 if (result) mailimap_fetch_list_free(result);
521 return res; 521 return res;
522} 522}
523 523
524/* current_recursion is for recursive calls. 524/* current_recursion is for recursive calls.
525 current_count means the position inside the internal loop! */ 525 current_count means the position inside the internal loop! */
526void IMAPwrapper::traverseBody(const RecMail&mail,mailimap_body*body,RecBody&target_body, 526void IMAPwrapper::traverseBody(const RecMail&mail,mailimap_body*body,RecBody&target_body,
527 int current_recursion,QValueList<int>recList,int current_count) 527 int current_recursion,QValueList<int>recList,int current_count)
528{ 528{
529 if (!body || current_recursion>=10) { 529 if (!body || current_recursion>=10) {
530 return; 530 return;
531 } 531 }
532 ++current_count;
533 switch (body->bd_type) { 532 switch (body->bd_type) {
534 case MAILIMAP_BODY_1PART: 533 case MAILIMAP_BODY_1PART:
535 { 534 {
536 QValueList<int>countlist = recList; 535 QValueList<int>countlist = recList;
537 countlist.append(current_count); 536 countlist.append(current_count);
538 RecPart currentPart; 537 RecPart currentPart;
539 mailimap_body_type_1part*part1 = body->bd_data.bd_body_1part; 538 mailimap_body_type_1part*part1 = body->bd_data.bd_body_1part;
540 QString id(""); 539 QString id("");
541 currentPart.setPositionlist(countlist); 540 currentPart.setPositionlist(countlist);
542 for (unsigned int j = 0; j < countlist.count();++j) { 541 for (unsigned int j = 0; j < countlist.count();++j) {
543 id+=(j>0?" ":""); 542 id+=(j>0?" ":"");
544 id+=QString("%1").arg(countlist[j]); 543 id+=QString("%1").arg(countlist[j]);
545 } 544 }
546 qDebug("ID = %s",id.latin1()); 545 qDebug("ID = %s",id.latin1());
547 currentPart.setIdentifier(id); 546 currentPart.setIdentifier(id);
548 fillSinglePart(currentPart,part1); 547 fillSinglePart(currentPart,part1);
549 /* important: Check for is NULL 'cause a body can be empty! 548 /* important: Check for is NULL 'cause a body can be empty!
550 And we put it only into the mail if it is the FIRST part */ 549 And we put it only into the mail if it is the FIRST part */
551 if (part1->bd_type==MAILIMAP_BODY_TYPE_1PART_TEXT && target_body.Bodytext().isNull() && countlist[0]==1) { 550 if (part1->bd_type==MAILIMAP_BODY_TYPE_1PART_TEXT && target_body.Bodytext().isNull() && countlist[0]==1) {
552 QString body_text = fetchTextPart(mail,countlist,true,currentPart.Encoding()); 551 QString body_text = fetchTextPart(mail,countlist,true,currentPart.Encoding());
553 target_body.setDescription(currentPart); 552 target_body.setDescription(currentPart);
554 target_body.setBodytext(body_text); 553 target_body.setBodytext(body_text);
554 if (countlist.count()>1) {
555 target_body.addPart(currentPart);
556 }
555 } else { 557 } else {
556 target_body.addPart(currentPart); 558 target_body.addPart(currentPart);
557 } 559 }
558 if (part1->bd_type==MAILIMAP_BODY_TYPE_1PART_MSG) { 560 if (part1->bd_type==MAILIMAP_BODY_TYPE_1PART_MSG) {
559 traverseBody(mail,part1->bd_data.bd_type_msg->bd_body,target_body,current_recursion+1,countlist); 561 traverseBody(mail,part1->bd_data.bd_type_msg->bd_body,target_body,current_recursion+1,countlist);
560 } 562 }
561 } 563 }
562 break; 564 break;
563 case MAILIMAP_BODY_MPART: 565 case MAILIMAP_BODY_MPART:
564 { 566 {
567 QValueList<int>countlist = recList;
565 clistcell*current=0; 568 clistcell*current=0;
566 mailimap_body*current_body=0; 569 mailimap_body*current_body=0;
567 unsigned int ccount = current_count-1; 570 unsigned int ccount = 1;
568 mailimap_body_type_mpart*mailDescription = body->bd_data.bd_body_mpart; 571 mailimap_body_type_mpart*mailDescription = body->bd_data.bd_body_mpart;
569 for (current=clist_begin(mailDescription->bd_list);current!=0;current=clist_next(current)) { 572 for (current=clist_begin(mailDescription->bd_list);current!=0;current=clist_next(current)) {
570 current_body = (mailimap_body*)current->data; 573 current_body = (mailimap_body*)current->data;
571 traverseBody(mail,current_body,target_body,current_recursion+1,recList,ccount); 574 if (current_body->bd_type==MAILIMAP_BODY_MPART) {
575 RecPart targetPart;
576 targetPart.setType("multipart");
577 fillMultiPart(targetPart,mailDescription);
578 countlist.append(current_count);
579 targetPart.setPositionlist(countlist);
580 target_body.addPart(targetPart);
581 QString id("");
582 for (unsigned int j = 0; j < countlist.count();++j) {
583 id+=(j>0?" ":"");
584 id+=QString("%1").arg(countlist[j]);
585 }
586 qDebug("ID(mpart) = %s",id.latin1());
587 }
588 traverseBody(mail,current_body,target_body,current_recursion+1,countlist,ccount);
589 if (current_body->bd_type==MAILIMAP_BODY_MPART) {
590 countlist = recList;
591 }
572 ++ccount; 592 ++ccount;
573 } 593 }
574 } 594 }
575 break; 595 break;
576 default: 596 default:
577 break; 597 break;
578 } 598 }
579} 599}
580 600
581void IMAPwrapper::fillSinglePart(RecPart&target_part,mailimap_body_type_1part*Description) 601void IMAPwrapper::fillSinglePart(RecPart&target_part,mailimap_body_type_1part*Description)
582{ 602{
583 if (!Description) { 603 if (!Description) {
584 return; 604 return;
585 } 605 }
586 switch (Description->bd_type) { 606 switch (Description->bd_type) {
587 case MAILIMAP_BODY_TYPE_1PART_TEXT: 607 case MAILIMAP_BODY_TYPE_1PART_TEXT:
588 target_part.setType("text"); 608 target_part.setType("text");
589 fillSingleTextPart(target_part,Description->bd_data.bd_type_text); 609 fillSingleTextPart(target_part,Description->bd_data.bd_type_text);
590 break; 610 break;
591 case MAILIMAP_BODY_TYPE_1PART_BASIC: 611 case MAILIMAP_BODY_TYPE_1PART_BASIC:
592 fillSingleBasicPart(target_part,Description->bd_data.bd_type_basic); 612 fillSingleBasicPart(target_part,Description->bd_data.bd_type_basic);
593 break; 613 break;
594 case MAILIMAP_BODY_TYPE_1PART_MSG: 614 case MAILIMAP_BODY_TYPE_1PART_MSG:
595 target_part.setType("message"); 615 target_part.setType("message");
596 fillSingleMsgPart(target_part,Description->bd_data.bd_type_msg); 616 fillSingleMsgPart(target_part,Description->bd_data.bd_type_msg);
597 break; 617 break;
598 default: 618 default:
599 break; 619 break;
600 } 620 }
601} 621}
602 622
603void IMAPwrapper::fillSingleTextPart(RecPart&target_part,mailimap_body_type_text*which) 623void IMAPwrapper::fillSingleTextPart(RecPart&target_part,mailimap_body_type_text*which)
604{ 624{
605 if (!which) { 625 if (!which) {
606 return; 626 return;
607 } 627 }
608 QString sub; 628 QString sub;
609 sub = which->bd_media_text; 629 sub = which->bd_media_text;
630 qDebug("Type= text/%s",which->bd_media_text);
610 target_part.setSubtype(sub.lower()); 631 target_part.setSubtype(sub.lower());
611 target_part.setLines(which->bd_lines); 632 target_part.setLines(which->bd_lines);
612 fillBodyFields(target_part,which->bd_fields); 633 fillBodyFields(target_part,which->bd_fields);
613} 634}
614 635
615void IMAPwrapper::fillSingleMsgPart(RecPart&target_part,mailimap_body_type_msg*which) 636void IMAPwrapper::fillSingleMsgPart(RecPart&target_part,mailimap_body_type_msg*which)
616{ 637{
617 if (!which) { 638 if (!which) {
618 return; 639 return;
619 } 640 }
620 target_part.setSubtype("rfc822"); 641 target_part.setSubtype("rfc822");
621 qDebug("Message part"); 642 qDebug("Message part");
622 /* we set this type to text/plain */ 643 /* we set this type to text/plain */
623 target_part.setLines(which->bd_lines); 644 target_part.setLines(which->bd_lines);
624 fillBodyFields(target_part,which->bd_fields); 645 fillBodyFields(target_part,which->bd_fields);
625} 646}
626 647
648void IMAPwrapper::fillMultiPart(RecPart&target_part,mailimap_body_type_mpart*which)
649{
650 if (!which) return;
651 target_part.setSubtype(which->bd_media_subtype);
652 if (which->bd_ext_mpart && which->bd_ext_mpart->bd_parameter && which->bd_ext_mpart->bd_parameter->pa_list) {
653 clistcell*cur = 0;
654 mailimap_single_body_fld_param*param=0;
655 for (cur = clist_begin(which->bd_ext_mpart->bd_parameter->pa_list);cur!=NULL;cur=clist_next(cur)) {
656 param = (mailimap_single_body_fld_param*)cur->data;
657 if (param) {
658 target_part.addParameter(QString(param->pa_name).lower(),QString(param->pa_value));
659 }
660 }
661 }
662}
663
627void IMAPwrapper::fillSingleBasicPart(RecPart&target_part,mailimap_body_type_basic*which) 664void IMAPwrapper::fillSingleBasicPart(RecPart&target_part,mailimap_body_type_basic*which)
628{ 665{
629 if (!which) { 666 if (!which) {
630 return; 667 return;
631 } 668 }
632 QString type,sub; 669 QString type,sub;
633 switch (which->bd_media_basic->med_type) { 670 switch (which->bd_media_basic->med_type) {
634 case MAILIMAP_MEDIA_BASIC_APPLICATION: 671 case MAILIMAP_MEDIA_BASIC_APPLICATION:
635 type = "application"; 672 type = "application";
636 break; 673 break;
637 case MAILIMAP_MEDIA_BASIC_AUDIO: 674 case MAILIMAP_MEDIA_BASIC_AUDIO:
638 type = "audio"; 675 type = "audio";
639 break; 676 break;
640 case MAILIMAP_MEDIA_BASIC_IMAGE: 677 case MAILIMAP_MEDIA_BASIC_IMAGE:
641 type = "image"; 678 type = "image";
642 break; 679 break;
643 case MAILIMAP_MEDIA_BASIC_MESSAGE: 680 case MAILIMAP_MEDIA_BASIC_MESSAGE:
644 type = "message"; 681 type = "message";
645 break; 682 break;
646 case MAILIMAP_MEDIA_BASIC_VIDEO: 683 case MAILIMAP_MEDIA_BASIC_VIDEO:
647 type = "video"; 684 type = "video";
648 break; 685 break;
649 case MAILIMAP_MEDIA_BASIC_OTHER: 686 case MAILIMAP_MEDIA_BASIC_OTHER:
650 default: 687 default:
651 if (which->bd_media_basic->med_basic_type) { 688 if (which->bd_media_basic->med_basic_type) {
652 type = which->bd_media_basic->med_basic_type; 689 type = which->bd_media_basic->med_basic_type;
653 } else { 690 } else {
654 type = ""; 691 type = "";
655 } 692 }
656 break; 693 break;
657 } 694 }
658 if (which->bd_media_basic->med_subtype) { 695 if (which->bd_media_basic->med_subtype) {
659 sub = which->bd_media_basic->med_subtype; 696 sub = which->bd_media_basic->med_subtype;
660 } else { 697 } else {
661 sub = ""; 698 sub = "";
662 } 699 }
663 qDebug("Type = %s/%s",type.latin1(),sub.latin1()); 700 qDebug("Type = %s/%s",type.latin1(),sub.latin1());
664 target_part.setType(type.lower()); 701 target_part.setType(type.lower());
665 target_part.setSubtype(sub.lower()); 702 target_part.setSubtype(sub.lower());
666 fillBodyFields(target_part,which->bd_fields); 703 fillBodyFields(target_part,which->bd_fields);
667} 704}
668 705
669void IMAPwrapper::fillBodyFields(RecPart&target_part,mailimap_body_fields*which) 706void IMAPwrapper::fillBodyFields(RecPart&target_part,mailimap_body_fields*which)
670{ 707{
671 if (!which) return; 708 if (!which) return;
672 if (which->bd_parameter && which->bd_parameter->pa_list && which->bd_parameter->pa_list->count>0) { 709 if (which->bd_parameter && which->bd_parameter->pa_list && which->bd_parameter->pa_list->count>0) {
673 clistcell*cur; 710 clistcell*cur;
674 mailimap_single_body_fld_param*param=0; 711 mailimap_single_body_fld_param*param=0;
675 for (cur = clist_begin(which->bd_parameter->pa_list);cur!=NULL;cur=clist_next(cur)) { 712 for (cur = clist_begin(which->bd_parameter->pa_list);cur!=NULL;cur=clist_next(cur)) {
676 param = (mailimap_single_body_fld_param*)cur->data; 713 param = (mailimap_single_body_fld_param*)cur->data;
677 if (param) { 714 if (param) {
678 target_part.addParameter(QString(param->pa_name).lower(),QString(param->pa_value)); 715 target_part.addParameter(QString(param->pa_name).lower(),QString(param->pa_value));
679 } 716 }
680 } 717 }
681 } 718 }
682 mailimap_body_fld_enc*enc = which->bd_encoding; 719 mailimap_body_fld_enc*enc = which->bd_encoding;
683 QString encoding(""); 720 QString encoding("");
684 switch (enc->enc_type) { 721 switch (enc->enc_type) {
685 case MAILIMAP_BODY_FLD_ENC_7BIT: 722 case MAILIMAP_BODY_FLD_ENC_7BIT:
686 encoding = "7bit"; 723 encoding = "7bit";
687 break; 724 break;
688 case MAILIMAP_BODY_FLD_ENC_8BIT: 725 case MAILIMAP_BODY_FLD_ENC_8BIT:
689 encoding = "8bit"; 726 encoding = "8bit";
690 break; 727 break;
691 case MAILIMAP_BODY_FLD_ENC_BINARY: 728 case MAILIMAP_BODY_FLD_ENC_BINARY:
692 encoding="binary"; 729 encoding="binary";
693 break; 730 break;
694 case MAILIMAP_BODY_FLD_ENC_BASE64: 731 case MAILIMAP_BODY_FLD_ENC_BASE64:
695 encoding="base64"; 732 encoding="base64";
696 break; 733 break;
697 case MAILIMAP_BODY_FLD_ENC_QUOTED_PRINTABLE: 734 case MAILIMAP_BODY_FLD_ENC_QUOTED_PRINTABLE:
698 encoding="quoted-printable"; 735 encoding="quoted-printable";
699 break; 736 break;
700 case MAILIMAP_BODY_FLD_ENC_OTHER: 737 case MAILIMAP_BODY_FLD_ENC_OTHER:
701 default: 738 default:
702 if (enc->enc_value) { 739 if (enc->enc_value) {
703 char*t=enc->enc_value; 740 char*t=enc->enc_value;
704 encoding=QString(enc->enc_value); 741 encoding=QString(enc->enc_value);
705 enc->enc_value=0L; 742 enc->enc_value=0L;
706 free(t); 743 free(t);
707 } 744 }
708 } 745 }
709 if (which->bd_description) { 746 if (which->bd_description) {
710 target_part.setDescription(QString(which->bd_description)); 747 target_part.setDescription(QString(which->bd_description));
711 } 748 }
712 target_part.setEncoding(encoding); 749 target_part.setEncoding(encoding);
713 target_part.setSize(which->bd_size); 750 target_part.setSize(which->bd_size);
714} 751}
715 752
716void IMAPwrapper::deleteMail(const RecMail&mail) 753void IMAPwrapper::deleteMail(const RecMail&mail)
717{ 754{
718 mailimap_flag_list*flist; 755 mailimap_flag_list*flist;
719 mailimap_set *set; 756 mailimap_set *set;
720 mailimap_store_att_flags * store_flags; 757 mailimap_store_att_flags * store_flags;
721 int err; 758 int err;
722 login(); 759 login();
723 if (!m_imap) { 760 if (!m_imap) {
724 return; 761 return;
725 } 762 }
726 const char *mb = mail.getMbox().latin1(); 763 const char *mb = mail.getMbox().latin1();
727 err = mailimap_select( m_imap, (char*)mb); 764 err = mailimap_select( m_imap, (char*)mb);
728 if ( err != MAILIMAP_NO_ERROR ) { 765 if ( err != MAILIMAP_NO_ERROR ) {
729 qDebug("error selecting mailbox for delete: %s",m_imap->imap_response); 766 qDebug("error selecting mailbox for delete: %s",m_imap->imap_response);
730 return; 767 return;
731 } 768 }
732 flist = mailimap_flag_list_new_empty(); 769 flist = mailimap_flag_list_new_empty();
733 mailimap_flag_list_add(flist,mailimap_flag_new_deleted()); 770 mailimap_flag_list_add(flist,mailimap_flag_new_deleted());
734 store_flags = mailimap_store_att_flags_new_set_flags(flist); 771 store_flags = mailimap_store_att_flags_new_set_flags(flist);
735 set = mailimap_set_new_single(mail.getNumber()); 772 set = mailimap_set_new_single(mail.getNumber());
736 err = mailimap_store(m_imap,set,store_flags); 773 err = mailimap_store(m_imap,set,store_flags);
737 mailimap_set_free( set ); 774 mailimap_set_free( set );
738 mailimap_store_att_flags_free(store_flags); 775 mailimap_store_att_flags_free(store_flags);
739 776
740 if (err != MAILIMAP_NO_ERROR) { 777 if (err != MAILIMAP_NO_ERROR) {
741 qDebug("error deleting mail: %s",m_imap->imap_response); 778 qDebug("error deleting mail: %s",m_imap->imap_response);
742 return; 779 return;
743 } 780 }
744 qDebug("deleting mail: %s",m_imap->imap_response); 781 qDebug("deleting mail: %s",m_imap->imap_response);
745 /* should we realy do that at this moment? */ 782 /* should we realy do that at this moment? */
746 err = mailimap_expunge(m_imap); 783 err = mailimap_expunge(m_imap);
747 if (err != MAILIMAP_NO_ERROR) { 784 if (err != MAILIMAP_NO_ERROR) {
748 qDebug("error deleting mail: %s",m_imap->imap_response); 785 qDebug("error deleting mail: %s",m_imap->imap_response);
749 } 786 }
750 qDebug("Delete successfull %s",m_imap->imap_response); 787 qDebug("Delete successfull %s",m_imap->imap_response);
751} 788}
752 789
753void IMAPwrapper::answeredMail(const RecMail&mail) 790void IMAPwrapper::answeredMail(const RecMail&mail)
754{ 791{
755 mailimap_flag_list*flist; 792 mailimap_flag_list*flist;
756 mailimap_set *set; 793 mailimap_set *set;
757 mailimap_store_att_flags * store_flags; 794 mailimap_store_att_flags * store_flags;
758 int err; 795 int err;
759 login(); 796 login();
760 if (!m_imap) { 797 if (!m_imap) {
761 return; 798 return;
762 } 799 }
763 const char *mb = mail.getMbox().latin1(); 800 const char *mb = mail.getMbox().latin1();
764 err = mailimap_select( m_imap, (char*)mb); 801 err = mailimap_select( m_imap, (char*)mb);
765 if ( err != MAILIMAP_NO_ERROR ) { 802 if ( err != MAILIMAP_NO_ERROR ) {
766 qDebug("error selecting mailbox for mark: %s",m_imap->imap_response); 803 qDebug("error selecting mailbox for mark: %s",m_imap->imap_response);
767 return; 804 return;
768 } 805 }
769 flist = mailimap_flag_list_new_empty(); 806 flist = mailimap_flag_list_new_empty();
770 mailimap_flag_list_add(flist,mailimap_flag_new_answered()); 807 mailimap_flag_list_add(flist,mailimap_flag_new_answered());
771 store_flags = mailimap_store_att_flags_new_add_flags(flist); 808 store_flags = mailimap_store_att_flags_new_add_flags(flist);
772 set = mailimap_set_new_single(mail.getNumber()); 809 set = mailimap_set_new_single(mail.getNumber());
773 err = mailimap_store(m_imap,set,store_flags); 810 err = mailimap_store(m_imap,set,store_flags);
774 mailimap_set_free( set ); 811 mailimap_set_free( set );
775 mailimap_store_att_flags_free(store_flags); 812 mailimap_store_att_flags_free(store_flags);
776 813
777 if (err != MAILIMAP_NO_ERROR) { 814 if (err != MAILIMAP_NO_ERROR) {
778 qDebug("error marking mail: %s",m_imap->imap_response); 815 qDebug("error marking mail: %s",m_imap->imap_response);
779 return; 816 return;
780 } 817 }
781} 818}
782 819
783QString IMAPwrapper::fetchTextPart(const RecMail&mail,const QValueList<int>&path,bool internal_call,const QString&enc) 820QString IMAPwrapper::fetchTextPart(const RecMail&mail,const QValueList<int>&path,bool internal_call,const QString&enc)
784{ 821{
785 QString body(""); 822 QString body("");
786 encodedString*res = fetchRawPart(mail,path,internal_call); 823 encodedString*res = fetchRawPart(mail,path,internal_call);
787 encodedString*r = decode_String(res,enc); 824 encodedString*r = decode_String(res,enc);
788 delete res; 825 delete res;
789 if (r) { 826 if (r) {
790 if (r->Length()>0) { 827 if (r->Length()>0) {
791 body = r->Content(); 828 body = r->Content();
792 } 829 }
793 delete r; 830 delete r;
794 } 831 }
795 return body; 832 return body;
796} 833}
797 834
798QString IMAPwrapper::fetchTextPart(const RecMail&mail,const RecPart&part) 835QString IMAPwrapper::fetchTextPart(const RecMail&mail,const RecPart&part)
799{ 836{
800 return fetchTextPart(mail,part.Positionlist(),false,part.Encoding()); 837 return fetchTextPart(mail,part.Positionlist(),false,part.Encoding());
801} 838}
802 839
803encodedString* IMAPwrapper::fetchDecodedPart(const RecMail&mail,const RecPart&part) 840encodedString* IMAPwrapper::fetchDecodedPart(const RecMail&mail,const RecPart&part)
804{ 841{
805 encodedString*res = fetchRawPart(mail,part.Positionlist(),false); 842 encodedString*res = fetchRawPart(mail,part.Positionlist(),false);
806 encodedString*r = decode_String(res,part.Encoding()); 843 encodedString*r = decode_String(res,part.Encoding());
807 delete res; 844 delete res;
808 return r; 845 return r;
809} 846}
810 847
811encodedString* IMAPwrapper::fetchRawPart(const RecMail&mail,const RecPart&part) 848encodedString* IMAPwrapper::fetchRawPart(const RecMail&mail,const RecPart&part)
812{ 849{
813 return fetchRawPart(mail,part.Positionlist(),false); 850 return fetchRawPart(mail,part.Positionlist(),false);
814} 851}
815 852
816int IMAPwrapper::deleteAllMail(const Folder*folder) 853int IMAPwrapper::deleteAllMail(const Folder*folder)
817{ 854{
818 login(); 855 login();
819 if (!m_imap) { 856 if (!m_imap) {
820 return 0; 857 return 0;
821 } 858 }
822 mailimap_flag_list*flist; 859 mailimap_flag_list*flist;
823 mailimap_set *set; 860 mailimap_set *set;
824 mailimap_store_att_flags * store_flags; 861 mailimap_store_att_flags * store_flags;
825 int err = mailimap_select( m_imap, folder->getName().latin1()); 862 int err = mailimap_select( m_imap, folder->getName().latin1());
826 if ( err != MAILIMAP_NO_ERROR ) { 863 if ( err != MAILIMAP_NO_ERROR ) {
827 Global::statusMessage(tr("error selecting mailbox: %1").arg(m_imap->imap_response)); 864 Global::statusMessage(tr("error selecting mailbox: %1").arg(m_imap->imap_response));
828 return 0; 865 return 0;
829 } 866 }
830 int last = m_imap->imap_selection_info->sel_exists; 867 int last = m_imap->imap_selection_info->sel_exists;
831 if (last == 0) { 868 if (last == 0) {
832 Global::statusMessage(tr("Mailbox has no mails!")); 869 Global::statusMessage(tr("Mailbox has no mails!"));
833 return 0; 870 return 0;
834 } 871 }
835 flist = mailimap_flag_list_new_empty(); 872 flist = mailimap_flag_list_new_empty();
836 mailimap_flag_list_add(flist,mailimap_flag_new_deleted()); 873 mailimap_flag_list_add(flist,mailimap_flag_new_deleted());
837 store_flags = mailimap_store_att_flags_new_set_flags(flist); 874 store_flags = mailimap_store_att_flags_new_set_flags(flist);
838 set = mailimap_set_new_interval( 1, last ); 875 set = mailimap_set_new_interval( 1, last );
839 err = mailimap_store(m_imap,set,store_flags); 876 err = mailimap_store(m_imap,set,store_flags);
840 mailimap_set_free( set ); 877 mailimap_set_free( set );
841 mailimap_store_att_flags_free(store_flags); 878 mailimap_store_att_flags_free(store_flags);
842 if (err != MAILIMAP_NO_ERROR) { 879 if (err != MAILIMAP_NO_ERROR) {
843 Global::statusMessage(tr("error deleting mail: %s").arg(m_imap->imap_response)); 880 Global::statusMessage(tr("error deleting mail: %s").arg(m_imap->imap_response));
844 return 0; 881 return 0;
845 } 882 }
846 qDebug("deleting mail: %s",m_imap->imap_response); 883 qDebug("deleting mail: %s",m_imap->imap_response);
847 /* should we realy do that at this moment? */ 884 /* should we realy do that at this moment? */
848 err = mailimap_expunge(m_imap); 885 err = mailimap_expunge(m_imap);
849 if (err != MAILIMAP_NO_ERROR) { 886 if (err != MAILIMAP_NO_ERROR) {
850 Global::statusMessage(tr("error deleting mail: %s").arg(m_imap->imap_response)); 887 Global::statusMessage(tr("error deleting mail: %s").arg(m_imap->imap_response));
851 return 0; 888 return 0;
852 } 889 }
853 qDebug("Delete successfull %s",m_imap->imap_response); 890 qDebug("Delete successfull %s",m_imap->imap_response);
854 return 1; 891 return 1;
855} 892}
856 893
857int IMAPwrapper::createMbox(const QString&folder,const Folder*parentfolder,const QString& delemiter,bool getsubfolder) 894int IMAPwrapper::createMbox(const QString&folder,const Folder*parentfolder,const QString& delemiter,bool getsubfolder)
858{ 895{
859 if (folder.length()==0) return 0; 896 if (folder.length()==0) return 0;
860 login(); 897 login();
861 if (!m_imap) {return 0;} 898 if (!m_imap) {return 0;}
862 QString pre = account->getPrefix(); 899 QString pre = account->getPrefix();
863 if (delemiter.length()>0 && pre.findRev(delemiter)!=pre.length()-1) { 900 if (delemiter.length()>0 && pre.findRev(delemiter)!=pre.length()-1) {
864 pre+=delemiter; 901 pre+=delemiter;
865 } 902 }
866 if (parentfolder) { 903 if (parentfolder) {
867 pre += parentfolder->getDisplayName()+delemiter; 904 pre += parentfolder->getDisplayName()+delemiter;
868 } 905 }
869 pre+=folder; 906 pre+=folder;
870 if (getsubfolder) { 907 if (getsubfolder) {
871 if (delemiter.length()>0) { 908 if (delemiter.length()>0) {
872 pre+=delemiter; 909 pre+=delemiter;
873 } else { 910 } else {
874 Global::statusMessage(tr("Cannot create folder %1 for holding subfolders").arg(pre)); 911 Global::statusMessage(tr("Cannot create folder %1 for holding subfolders").arg(pre));
875 return 0; 912 return 0;
876 } 913 }
877 } 914 }
878 qDebug("Creating %s",pre.latin1()); 915 qDebug("Creating %s",pre.latin1());
879 int res = mailimap_create(m_imap,pre.latin1()); 916 int res = mailimap_create(m_imap,pre.latin1());
880 if (res != MAILIMAP_NO_ERROR) { 917 if (res != MAILIMAP_NO_ERROR) {
881 Global::statusMessage(tr("%1").arg(m_imap->imap_response)); 918 Global::statusMessage(tr("%1").arg(m_imap->imap_response));
882 return 0; 919 return 0;
883 } 920 }
884 return 1; 921 return 1;
885} 922}
886 923
887int IMAPwrapper::deleteMbox(const Folder*folder) 924int IMAPwrapper::deleteMbox(const Folder*folder)
888{ 925{
889 if (!folder) return 0; 926 if (!folder) return 0;
890 login(); 927 login();
891 if (!m_imap) {return 0;} 928 if (!m_imap) {return 0;}
892 int res = mailimap_delete(m_imap,folder->getName()); 929 int res = mailimap_delete(m_imap,folder->getName());
893 if (res != MAILIMAP_NO_ERROR) { 930 if (res != MAILIMAP_NO_ERROR) {
894 Global::statusMessage(tr("%1").arg(m_imap->imap_response)); 931 Global::statusMessage(tr("%1").arg(m_imap->imap_response));
895 return 0; 932 return 0;
896 } 933 }
897 return 1; 934 return 1;
898} 935}
diff --git a/noncore/net/mail/libmailwrapper/imapwrapper.h b/noncore/net/mail/libmailwrapper/imapwrapper.h
index e5846f8..7941046 100644
--- a/noncore/net/mail/libmailwrapper/imapwrapper.h
+++ b/noncore/net/mail/libmailwrapper/imapwrapper.h
@@ -1,66 +1,67 @@
1#ifndef __IMAPWRAPPER 1#ifndef __IMAPWRAPPER
2#define __IMAPWRAPPER 2#define __IMAPWRAPPER
3 3
4#include <qlist.h> 4#include <qlist.h>
5#include "mailwrapper.h" 5#include "mailwrapper.h"
6#include "abstractmail.h" 6#include "abstractmail.h"
7#include <libetpan/clist.h> 7#include <libetpan/clist.h>
8 8
9struct mailimap; 9struct mailimap;
10struct mailimap_body; 10struct mailimap_body;
11struct mailimap_body_type_1part; 11struct mailimap_body_type_1part;
12struct mailimap_body_type_text; 12struct mailimap_body_type_text;
13struct mailimap_body_type_basic; 13struct mailimap_body_type_basic;
14struct mailimap_body_type_msg; 14struct mailimap_body_type_msg;
15struct mailimap_body_type_mpart; 15struct mailimap_body_type_mpart;
16struct mailimap_body_fields; 16struct mailimap_body_fields;
17struct mailimap_msg_att; 17struct mailimap_msg_att;
18class encodedString; 18class encodedString;
19 19
20class IMAPwrapper : public AbstractMail 20class IMAPwrapper : public AbstractMail
21{ 21{
22 Q_OBJECT 22 Q_OBJECT
23public: 23public:
24 IMAPwrapper( IMAPaccount *a ); 24 IMAPwrapper( IMAPaccount *a );
25 virtual ~IMAPwrapper(); 25 virtual ~IMAPwrapper();
26 virtual QList<Folder>* listFolders(); 26 virtual QList<Folder>* listFolders();
27 virtual void listMessages(const QString & mailbox,QList<RecMail>&target ); 27 virtual void listMessages(const QString & mailbox,QList<RecMail>&target );
28 28
29 virtual void deleteMail(const RecMail&mail); 29 virtual void deleteMail(const RecMail&mail);
30 virtual void answeredMail(const RecMail&mail); 30 virtual void answeredMail(const RecMail&mail);
31 virtual int deleteAllMail(const Folder*folder); 31 virtual int deleteAllMail(const Folder*folder);
32 32
33 virtual RecBody fetchBody(const RecMail&mail); 33 virtual RecBody fetchBody(const RecMail&mail);
34 virtual QString fetchTextPart(const RecMail&mail,const RecPart&part); 34 virtual QString fetchTextPart(const RecMail&mail,const RecPart&part);
35 virtual encodedString* fetchDecodedPart(const RecMail&mail,const RecPart&part); 35 virtual encodedString* fetchDecodedPart(const RecMail&mail,const RecPart&part);
36 virtual encodedString* fetchRawPart(const RecMail&mail,const RecPart&part); 36 virtual encodedString* fetchRawPart(const RecMail&mail,const RecPart&part);
37 37
38 virtual int createMbox(const QString&,const Folder*parentfolder=0,const QString& delemiter="/",bool getsubfolder=false); 38 virtual int createMbox(const QString&,const Folder*parentfolder=0,const QString& delemiter="/",bool getsubfolder=false);
39 virtual int deleteMbox(const Folder*folder); 39 virtual int deleteMbox(const Folder*folder);
40 40
41 static void imap_progress( size_t current, size_t maximum ); 41 static void imap_progress( size_t current, size_t maximum );
42 42
43protected: 43protected:
44 RecMail*parse_list_result(mailimap_msg_att*); 44 RecMail*parse_list_result(mailimap_msg_att*);
45 void login(); 45 void login();
46 void logout(); 46 void logout();
47 47
48 virtual QString fetchTextPart(const RecMail&mail,const QValueList<int>&path,bool internal_call=false,const QString&enc=""); 48 virtual QString fetchTextPart(const RecMail&mail,const QValueList<int>&path,bool internal_call=false,const QString&enc="");
49 virtual encodedString*fetchRawPart(const RecMail&mail,const QValueList<int>&path,bool internal_call); 49 virtual encodedString*fetchRawPart(const RecMail&mail,const QValueList<int>&path,bool internal_call);
50 50
51 void fillSinglePart(RecPart&target_part,mailimap_body_type_1part*Description); 51 void fillSinglePart(RecPart&target_part,mailimap_body_type_1part*Description);
52 void fillSingleTextPart(RecPart&target_part,mailimap_body_type_text*which); 52 void fillSingleTextPart(RecPart&target_part,mailimap_body_type_text*which);
53 void fillSingleBasicPart(RecPart&target_part,mailimap_body_type_basic*which); 53 void fillSingleBasicPart(RecPart&target_part,mailimap_body_type_basic*which);
54 void fillSingleMsgPart(RecPart&target_part,mailimap_body_type_msg*which); 54 void fillSingleMsgPart(RecPart&target_part,mailimap_body_type_msg*which);
55 void traverseBody(const RecMail&mail,mailimap_body*body,RecBody&target_body,int current_recursion,QValueList<int>recList,int current_count=0); 55 void fillMultiPart(RecPart&target_part,mailimap_body_type_mpart*which);
56 void traverseBody(const RecMail&mail,mailimap_body*body,RecBody&target_body,int current_recursion,QValueList<int>recList,int current_count=1);
56 57
57 /* just helpers */ 58 /* just helpers */
58 static void fillBodyFields(RecPart&target_part,mailimap_body_fields*which); 59 static void fillBodyFields(RecPart&target_part,mailimap_body_fields*which);
59 static QStringList address_list_to_stringlist(clist*list); 60 static QStringList address_list_to_stringlist(clist*list);
60 61
61 62
62 IMAPaccount *account; 63 IMAPaccount *account;
63 mailimap *m_imap; 64 mailimap *m_imap;
64}; 65};
65 66
66#endif 67#endif