summaryrefslogtreecommitdiff
authoralwin <alwin>2003-12-09 01:30:26 (UTC)
committer alwin <alwin>2003-12-09 01:30:26 (UTC)
commitb3fe63b45c7c7dd1d77a9c3a12bb42ce6561bb5a (patch) (unidiff)
tree425529f528eb7718e371523c079b8763b9ec6bb8
parent6142ad15ac50090b95bb5d80116c1750ffc515de (diff)
downloadopie-b3fe63b45c7c7dd1d77a9c3a12bb42ce6561bb5a.zip
opie-b3fe63b45c7c7dd1d77a9c3a12bb42ce6561bb5a.tar.gz
opie-b3fe63b45c7c7dd1d77a9c3a12bb42ce6561bb5a.tar.bz2
- interface change for imapwrapper
- beginning of parsing the body-structure of mails not just simple return the whole body (this moment commented out 'cause it's only working for text/plain type mails)
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/net/mail/accountview.cpp2
-rw-r--r--noncore/net/mail/imapwrapper.cpp302
-rw-r--r--noncore/net/mail/imapwrapper.h14
-rw-r--r--noncore/net/mail/libmailwrapper/imapwrapper.cpp302
-rw-r--r--noncore/net/mail/libmailwrapper/imapwrapper.h14
-rw-r--r--noncore/net/mail/libmailwrapper/mailwrapper.cpp2
-rw-r--r--noncore/net/mail/libmailwrapper/mailwrapper.h17
-rw-r--r--noncore/net/mail/mailwrapper.cpp2
-rw-r--r--noncore/net/mail/mailwrapper.h17
9 files changed, 427 insertions, 245 deletions
diff --git a/noncore/net/mail/accountview.cpp b/noncore/net/mail/accountview.cpp
index a531976..1bde886 100644
--- a/noncore/net/mail/accountview.cpp
+++ b/noncore/net/mail/accountview.cpp
@@ -58,13 +58,13 @@ void IMAPfolderItem::refresh(Maillist&target)
58{ 58{
59 imap->getWrapper()->listMessages( folder->getName(),target ); 59 imap->getWrapper()->listMessages( folder->getName(),target );
60} 60}
61 61
62QString IMAPfolderItem::fetchBody(const RecMail&aMail) 62QString IMAPfolderItem::fetchBody(const RecMail&aMail)
63{ 63{
64 return imap->getWrapper()->fetchBody(folder->getName(),aMail); 64 return imap->getWrapper()->fetchBody(aMail);
65} 65}
66 66
67AccountView::AccountView( QWidget *parent, const char *name, WFlags flags ) 67AccountView::AccountView( QWidget *parent, const char *name, WFlags flags )
68 : QListView( parent, name, flags ) 68 : QListView( parent, name, flags )
69{ 69{
70 connect( this, SIGNAL( clicked( QListViewItem * ) ), 70 connect( this, SIGNAL( clicked( QListViewItem * ) ),
diff --git a/noncore/net/mail/imapwrapper.cpp b/noncore/net/mail/imapwrapper.cpp
index 7b78499..1acc036 100644
--- a/noncore/net/mail/imapwrapper.cpp
+++ b/noncore/net/mail/imapwrapper.cpp
@@ -1,84 +1,103 @@
1 1
2#include <stdlib.h> 2#include <stdlib.h>
3 3
4#include "imapwrapper.h" 4#include "imapwrapper.h"
5 5#include <libetpan/mailimap.h>
6 6
7IMAPwrapper::IMAPwrapper( IMAPaccount *a ) 7IMAPwrapper::IMAPwrapper( IMAPaccount *a )
8{ 8{
9 account = a; 9 account = a;
10 m_imap = 0;
10} 11}
11 12
12void imap_progress( size_t current, size_t maximum ) 13IMAPwrapper::~IMAPwrapper()
14{
15 logout();
16}
17
18void IMAPwrapper::imap_progress( size_t current, size_t maximum )
13{ 19{
14 qDebug( "IMAP: %i of %i", current, maximum ); 20 qDebug( "IMAP: %i of %i", current, maximum );
15} 21}
16 22
17void IMAPwrapper::listMessages(const QString&mailbox,Maillist&target ) 23void IMAPwrapper::login()
18{ 24{
19 const char *server, *user, *pass, *mb; 25 logout();
26 const char *server, *user, *pass;
20 uint16_t port; 27 uint16_t port;
21 int err = MAILIMAP_NO_ERROR; 28 int err = MAILIMAP_NO_ERROR;
22 clist *result;
23 clistcell *current;
24 mailimap_fetch_att *fetchAtt,*fetchAttFlags,*fetchAttDate;
25 mailimap_fetch_type *fetchType;
26 mailimap_set *set;
27 29
28 mb = mailbox.latin1();
29 server = account->getServer().latin1(); 30 server = account->getServer().latin1();
30 port = account->getPort().toUInt(); 31 port = account->getPort().toUInt();
31 user = account->getUser().latin1(); 32 user = account->getUser().latin1();
32 pass = account->getPassword().latin1(); 33 pass = account->getPassword().latin1();
33 34
34 mailimap *imap = mailimap_new( 20, &imap_progress ); 35 m_imap = mailimap_new( 20, &imap_progress );
35 if ( imap == NULL ) {
36 qDebug("IMAP Memory error");
37 return;
38 }
39
40 /* connect */ 36 /* connect */
41 err = mailimap_socket_connect( imap, (char*)server, port ); 37 err = mailimap_socket_connect( m_imap, (char*)server, port );
42 if ( err != MAILIMAP_NO_ERROR && 38 if ( err != MAILIMAP_NO_ERROR &&
43 err != MAILIMAP_NO_ERROR_AUTHENTICATED && 39 err != MAILIMAP_NO_ERROR_AUTHENTICATED &&
44 err != MAILIMAP_NO_ERROR_NON_AUTHENTICATED ) { 40 err != MAILIMAP_NO_ERROR_NON_AUTHENTICATED ) {
45 qDebug("error connecting server: %s",imap->response); 41 qDebug("error connecting server: %s",m_imap->response);
46 mailimap_free( imap ); 42 mailimap_free( m_imap );
43 m_imap = 0;
47 return; 44 return;
48 } 45 }
49 46
50 /* login */ 47 /* login */
51 err = mailimap_login_simple( imap, (char*)user, (char*)pass ); 48 err = mailimap_login_simple( m_imap, (char*)user, (char*)pass );
52 if ( err != MAILIMAP_NO_ERROR ) { 49 if ( err != MAILIMAP_NO_ERROR ) {
53 qDebug("error logging in imap: %s",imap->response); 50 qDebug("error logging in imap: %s",m_imap->response);
54 err = mailimap_close( imap ); 51 err = mailimap_close( m_imap );
55 mailimap_free( imap ); 52 mailimap_free( m_imap );
56 return; 53 m_imap = 0;
57 } 54 }
55}
56
57void IMAPwrapper::logout()
58{
59 int err = MAILIMAP_NO_ERROR;
60 if (!m_imap) return;
61 err = mailimap_logout( m_imap );
62 err = mailimap_close( m_imap );
63 mailimap_free( m_imap );
64 m_imap = 0;
65}
66
67void IMAPwrapper::listMessages(const QString&mailbox,Maillist&target )
68{
69 const char *mb;
70 int err = MAILIMAP_NO_ERROR;
71 clist *result;
72 clistcell *current;
73 mailimap_fetch_att *fetchAtt,*fetchAttFlags,*fetchAttDate;
74 mailimap_fetch_type *fetchType;
75 mailimap_set *set;
58 76
77 mb = mailbox.latin1();
78 login();
79 if (!m_imap) {
80 return;
81 }
59 /* select mailbox READONLY for operations */ 82 /* select mailbox READONLY for operations */
60 err = mailimap_examine( imap, (char*)mb); 83 err = mailimap_examine( m_imap, (char*)mb);
61 if ( err != MAILIMAP_NO_ERROR ) { 84 if ( err != MAILIMAP_NO_ERROR ) {
62 qDebug("error selecting mailbox: %s",imap->response); 85 qDebug("error selecting mailbox: %s",m_imap->response);
63 err = mailimap_logout( imap ); 86 logout();
64 err = mailimap_close( imap );
65 mailimap_free( imap );
66 return; 87 return;
67 } 88 }
68 89
69 int last = imap->selection_info->exists; 90 int last = m_imap->selection_info->exists;
91
70 if (last == 0) { 92 if (last == 0) {
71 qDebug("mailbox has no mails"); 93 qDebug("mailbox has no mails");
72 err = mailimap_logout( imap ); 94 logout();
73 err = mailimap_close( imap );
74 mailimap_free( imap );
75 return; 95 return;
76 } 96 }
77 97
78
79 result = clist_new(); 98 result = clist_new();
80 /* the range has to start at 1!!! not with 0!!!! */ 99 /* the range has to start at 1!!! not with 0!!!! */
81 set = mailimap_set_new_interval( 1, last ); 100 set = mailimap_set_new_interval( 1, last );
82 fetchAtt = mailimap_fetch_att_new_envelope(); 101 fetchAtt = mailimap_fetch_att_new_envelope();
83 fetchAttFlags = mailimap_fetch_att_new_flags(); 102 fetchAttFlags = mailimap_fetch_att_new_flags();
84 fetchAttDate = mailimap_fetch_att_new_internaldate(); 103 fetchAttDate = mailimap_fetch_att_new_internaldate();
@@ -86,13 +105,13 @@ void IMAPwrapper::listMessages(const QString&mailbox,Maillist&target )
86 //fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt); 105 //fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt);
87 fetchType = mailimap_fetch_type_new_fetch_att_list_empty(); 106 fetchType = mailimap_fetch_type_new_fetch_att_list_empty();
88 mailimap_fetch_type_new_fetch_att_list_add(fetchType,fetchAtt); 107 mailimap_fetch_type_new_fetch_att_list_add(fetchType,fetchAtt);
89 mailimap_fetch_type_new_fetch_att_list_add(fetchType,fetchAttFlags); 108 mailimap_fetch_type_new_fetch_att_list_add(fetchType,fetchAttFlags);
90 mailimap_fetch_type_new_fetch_att_list_add(fetchType,fetchAttDate); 109 mailimap_fetch_type_new_fetch_att_list_add(fetchType,fetchAttDate);
91 110
92 err = mailimap_fetch( imap, set, fetchType, &result ); 111 err = mailimap_fetch( m_imap, set, fetchType, &result );
93 mailimap_set_free( set ); 112 mailimap_set_free( set );
94 /* cleans up the fetch_att's too! */ 113 /* cleans up the fetch_att's too! */
95 mailimap_fetch_type_free( fetchType ); 114 mailimap_fetch_type_free( fetchType );
96 115
97 QString date,subject,from; 116 QString date,subject,from;
98 117
@@ -103,95 +122,71 @@ void IMAPwrapper::listMessages(const QString&mailbox,Maillist&target )
103 while ( current != 0 ) { 122 while ( current != 0 ) {
104 ++i; 123 ++i;
105 msg_att = (mailimap_msg_att*)current->data; 124 msg_att = (mailimap_msg_att*)current->data;
106 RecMail*m = parse_list_result(msg_att); 125 RecMail*m = parse_list_result(msg_att);
107 if (m) { 126 if (m) {
108 m->setNumber(i); 127 m->setNumber(i);
128 m->setMbox(mailbox);
109 target.append(m); 129 target.append(m);
110 } 130 }
111 current = current->next; 131 current = current->next;
112 } 132 }
113 } else { 133 } else {
114 qDebug("Error fetching headers: %s",imap->response); 134 qDebug("Error fetching headers: %s",m_imap->response);
115 } 135 }
116 136 logout();
117 err = mailimap_logout( imap );
118 err = mailimap_close( imap );
119 clist_free(result); 137 clist_free(result);
120 mailimap_free( imap );
121} 138}
122 139
123QList<IMAPFolder>* IMAPwrapper::listFolders() 140QList<IMAPFolder>* IMAPwrapper::listFolders()
124{ 141{
125 const char *server, *user, *pass, *path, *mask; 142 const char *path, *mask;
126 uint16_t port;
127 int err = MAILIMAP_NO_ERROR; 143 int err = MAILIMAP_NO_ERROR;
128 clist *result; 144 clist *result;
129 clistcell *current; 145 clistcell *current;
130 146
131 QList<IMAPFolder> * folders = new QList<IMAPFolder>(); 147 QList<IMAPFolder> * folders = new QList<IMAPFolder>();
132 folders->setAutoDelete( true ); 148 folders->setAutoDelete( true );
133 149 login();
134 server = account->getServer().latin1(); 150 if (!m_imap) {
135 port = account->getPort().toUInt();
136 user = account->getUser().latin1();
137 pass = account->getPassword().latin1();
138 path = account->getPrefix().latin1();
139
140 mailimap *imap = mailimap_new( 20, &imap_progress );
141 if ( imap == NULL ) {
142 qDebug("error mailimap_new");
143 return folders; 151 return folders;
144 } 152 }
145
146 err = mailimap_socket_connect( imap, (char*)server, port );
147 if ( err != MAILIMAP_NO_ERROR &&
148 err != MAILIMAP_NO_ERROR_AUTHENTICATED &&
149 err != MAILIMAP_NO_ERROR_NON_AUTHENTICATED ) {
150 mailimap_free(imap);
151 qDebug("error imap_socket_connect: %s",imap->response);
152 return folders;
153 }
154 153
155 err = mailimap_login_simple( imap, (char*)user, (char*)pass );
156 if ( err != MAILIMAP_NO_ERROR ) {
157 mailimap_free(imap);
158 qDebug("error logging in: %s",imap->response);
159 return folders;
160 }
161/* 154/*
162 * First we have to check for INBOX 'cause it sometimes it's not inside the path. 155 * First we have to check for INBOX 'cause it sometimes it's not inside the path.
163 * We must not forget to filter them out in next loop! 156 * We must not forget to filter them out in next loop!
164 * it seems like ugly code. and yes - it is ugly code. but the best way. 157 * it seems like ugly code. and yes - it is ugly code. but the best way.
165 */ 158 */
166 QString temp; 159 QString temp;
167 mask = "INBOX" ; 160 mask = "INBOX" ;
168 result = clist_new(); 161 result = clist_new();
169 mailimap_mailbox_list *list; 162 mailimap_mailbox_list *list;
170 err = mailimap_list( imap, (char*)"", (char*)mask, &result ); 163 err = mailimap_list( m_imap, (char*)"", (char*)mask, &result );
171 if ( err == MAILIMAP_NO_ERROR ) { 164 if ( err == MAILIMAP_NO_ERROR ) {
172 current = result->first; 165 current = result->first;
173 for ( int i = result->count; i > 0; i-- ) { 166 for ( int i = result->count; i > 0; i-- ) {
174 list = (mailimap_mailbox_list *) current->data; 167 list = (mailimap_mailbox_list *) current->data;
175 // it is better use the deep copy mechanism of qt itself 168 // it is better use the deep copy mechanism of qt itself
176 // instead of using strdup! 169 // instead of using strdup!
177 temp = list->mb; 170 temp = list->mb;
178 folders->append( new IMAPFolder(temp)); 171 folders->append( new IMAPFolder(temp));
179 current = current->next; 172 current = current->next;
180 } 173 }
181 } else { 174 } else {
182 qDebug("error fetching folders: %s",imap->response); 175 qDebug("error fetching folders: %s",m_imap->response);
183 } 176 }
184 mailimap_list_result_free( result ); 177 mailimap_list_result_free( result );
185 178
186/* 179/*
187 * second stage - get the other then inbox folders 180 * second stage - get the other then inbox folders
188 */ 181 */
189 mask = "*" ; 182 mask = "*" ;
183 path = account->getPrefix().latin1();
190 result = clist_new(); 184 result = clist_new();
191 err = mailimap_list( imap, (char*)path, (char*)mask, &result ); 185 qDebug(path);
186 err = mailimap_list( m_imap, (char*)path, (char*)mask, &result );
192 if ( err == MAILIMAP_NO_ERROR ) { 187 if ( err == MAILIMAP_NO_ERROR ) {
193 current = result->first; 188 current = result->first;
194 for ( int i = result->count; i > 0; i-- ) { 189 for ( int i = result->count; i > 0; i-- ) {
195 list = (mailimap_mailbox_list *) current->data; 190 list = (mailimap_mailbox_list *) current->data;
196 // it is better use the deep copy mechanism of qt itself 191 // it is better use the deep copy mechanism of qt itself
197 // instead of using strdup! 192 // instead of using strdup!
@@ -200,18 +195,15 @@ QList<IMAPFolder>* IMAPwrapper::listFolders()
200 if (temp.lower()=="inbox") 195 if (temp.lower()=="inbox")
201 continue; 196 continue;
202 folders->append(new IMAPFolder(temp)); 197 folders->append(new IMAPFolder(temp));
203 198
204 } 199 }
205 } else { 200 } else {
206 qDebug("error fetching folders"); 201 qDebug("error fetching folders %s",m_imap->response);
207 } 202 }
208 mailimap_list_result_free( result ); 203 mailimap_list_result_free( result );
209 err = mailimap_logout( imap );
210 err = mailimap_close( imap );
211 mailimap_free( imap );
212 return folders; 204 return folders;
213} 205}
214 206
215RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att) 207RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att)
216{ 208{
217 RecMail * m = 0; 209 RecMail * m = 0;
@@ -270,13 +262,12 @@ RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att)
270 default: 262 default:
271 break; 263 break;
272 } 264 }
273 } else if (cflag->type==MAILIMAP_FLAG_FETCH_RECENT) { 265 } else if (cflag->type==MAILIMAP_FLAG_FETCH_RECENT) {
274 mFlags.setBit(FLAG_RECENT); 266 mFlags.setBit(FLAG_RECENT);
275 } 267 }
276
277 cf = cf->next; 268 cf = cf->next;
278 } 269 }
279 continue; 270 continue;
280 } 271 }
281 if ( item->msg_att_static->type == MAILIMAP_MSG_ATT_RFC822_HEADER ) { 272 if ( item->msg_att_static->type == MAILIMAP_MSG_ATT_RFC822_HEADER ) {
282 qDebug( "header: \n%s", item->msg_att_static->rfc822_header ); 273 qDebug( "header: \n%s", item->msg_att_static->rfc822_header );
@@ -334,87 +325,166 @@ RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att)
334 if (m) { 325 if (m) {
335 m->setFlags(mFlags); 326 m->setFlags(mFlags);
336 } 327 }
337 return m; 328 return m;
338} 329}
339 330
340QString IMAPwrapper::fetchBody(const QString & mailbox,const RecMail&mail) 331#if 1
332QString IMAPwrapper::fetchBody(const RecMail&mail)
341{ 333{
342 QString body = ""; 334 QString body = "";
343 const char *server, *user, *pass, *mb; 335 const char *mb;
344 uint16_t port;
345 int err = MAILIMAP_NO_ERROR; 336 int err = MAILIMAP_NO_ERROR;
346 clist *result; 337 clist *result;
347 clistcell *current; 338 clistcell *current;
348 mailimap_fetch_att *fetchAtt; 339 mailimap_fetch_att *fetchAtt;
349 mailimap_fetch_type *fetchType; 340 mailimap_fetch_type *fetchType;
350 mailimap_set *set; 341 mailimap_set *set;
351 342
352 mb = mailbox.latin1(); 343 mb = mail.getMbox().latin1();
353 server = account->getServer().latin1();
354 port = account->getPort().toUInt();
355 user = account->getUser().latin1();
356 pass = account->getPassword().latin1();
357 344
358 mailimap *imap = mailimap_new( 20, &imap_progress ); 345 login();
359 if ( imap == NULL ) { 346 if (!m_imap) {
360 qDebug("IMAP Memory error"); 347 return body;
348 }
349 /* select mailbox READONLY for operations */
350 err = mailimap_examine( m_imap, (char*)mb);
351 if ( err != MAILIMAP_NO_ERROR ) {
352 qDebug("error selecting mailbox: %s",m_imap->response);
353 logout();
361 return body; 354 return body;
362 } 355 }
356 result = clist_new();
357 /* the range has to start at 1!!! not with 0!!!! */
358 set = mailimap_set_new_interval( mail.getNumber(),mail.getNumber() );
359 fetchAtt = mailimap_fetch_att_new_rfc822_text();
360 fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt);
361 err = mailimap_fetch( m_imap, set, fetchType, &result );
362 mailimap_set_free( set );
363 mailimap_fetch_type_free( fetchType );
364
365 if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) {
366 mailimap_msg_att * msg_att;
367 msg_att = (mailimap_msg_att*)current->data;
368 mailimap_msg_att_item*item = (mailimap_msg_att_item*)msg_att->list->first->data;
363 369
364 /* connect */ 370 if (item->msg_att_static && item->msg_att_static->rfc822_text) {
365 err = mailimap_socket_connect( imap, (char*)server, port ); 371 body = item->msg_att_static->rfc822_text;
366 if ( err != MAILIMAP_NO_ERROR && 372 }
367 err != MAILIMAP_NO_ERROR_AUTHENTICATED && 373 } else {
368 err != MAILIMAP_NO_ERROR_NON_AUTHENTICATED ) { 374 qDebug("error fetching text: %s",m_imap->response);
369 qDebug("error connecting server: %s",imap->response);
370 mailimap_free( imap );
371 return body;
372 } 375 }
373 376
374 /* login */ 377 clist_free(result);
375 err = mailimap_login_simple( imap, (char*)user, (char*)pass ); 378 logout();
376 if ( err != MAILIMAP_NO_ERROR ) { 379 return body;
377 qDebug("error logging in imap: %s",imap->response); 380}
378 err = mailimap_close( imap ); 381
379 mailimap_free( imap ); 382#else
383QString IMAPwrapper::fetchBody(const RecMail&mail)
384{
385 QString body = "";
386 const char *mb;
387 int err = MAILIMAP_NO_ERROR;
388 clist *result;
389 clistcell *current;
390 mailimap_fetch_att *fetchAtt;
391 mailimap_fetch_type *fetchType;
392 mailimap_set *set;
393 mailimap_body*body_desc;
394
395 mb = mail.getMbox().latin1();
396
397 login();
398 if (!m_imap) {
380 return body; 399 return body;
381 } 400 }
382
383 /* select mailbox READONLY for operations */ 401 /* select mailbox READONLY for operations */
384 err = mailimap_examine( imap, (char*)mb); 402 err = mailimap_examine( m_imap, (char*)mb);
385 if ( err != MAILIMAP_NO_ERROR ) { 403 if ( err != MAILIMAP_NO_ERROR ) {
386 qDebug("error selecting mailbox: %s",imap->response); 404 qDebug("error selecting mailbox: %s",m_imap->response);
387 err = mailimap_logout( imap ); 405 logout();
388 err = mailimap_close( imap ); 406 return body;
389 mailimap_free( imap ); 407 }
408 result = clist_new();
409 /* the range has to start at 1!!! not with 0!!!! */
410 set = mailimap_set_new_interval( mail.getNumber(),mail.getNumber() );
411 fetchAtt = mailimap_fetch_att_new_body();
412 fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt);
413 err = mailimap_fetch( m_imap, set, fetchType, &result );
414 mailimap_set_free( set );
415 mailimap_fetch_type_free( fetchType );
416
417 if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) {
418 mailimap_msg_att * msg_att;
419 msg_att = (mailimap_msg_att*)current->data;
420 mailimap_msg_att_item*item = (mailimap_msg_att_item*)msg_att->list->first->data;
421 body_desc = item->msg_att_static->body;
422 if (body_desc->type==MAILIMAP_BODY_1PART) {
423 body = searchBodyText(mail,body_desc->body_1part);
424 } else {
425 }
426
427 } else {
428 qDebug("error fetching body: %s",m_imap->response);
429 }
430
431 clist_free(result);
432 logout();
433 return body;
434}
435#endif
436
437QString IMAPwrapper::searchBodyText(const RecMail&mail,mailimap_body_type_1part*mailDescription)
438{
439 QString Body="";
440 if (!mailDescription) {
441 return Body;
442 }
443 switch (mailDescription->type) {
444 case MAILIMAP_BODY_TYPE_1PART_TEXT:
445 return getPlainBody(mail);
446 break;
447 default:
448 break;
449 }
450 return Body;
451}
452
453QString IMAPwrapper::getPlainBody(const RecMail&mail)
454{
455 QString body = "";
456 const char *mb;
457 int err = MAILIMAP_NO_ERROR;
458 clist *result;
459 clistcell *current;
460 mailimap_fetch_att *fetchAtt;
461 mailimap_fetch_type *fetchType;
462 mailimap_set *set;
463
464 mb = mail.getMbox().latin1();
465
466 if (!m_imap) {
390 return body; 467 return body;
391 } 468 }
392 result = clist_new(); 469 result = clist_new();
393 /* the range has to start at 1!!! not with 0!!!! */ 470 /* the range has to start at 1!!! not with 0!!!! */
394 set = mailimap_set_new_interval( mail.getNumber(),mail.getNumber() ); 471 set = mailimap_set_new_interval( mail.getNumber(),mail.getNumber() );
395 fetchAtt = mailimap_fetch_att_new_rfc822_text(); 472 fetchAtt = mailimap_fetch_att_new_rfc822_text();
396 fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt); 473 fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt);
397 err = mailimap_fetch( imap, set, fetchType, &result ); 474 err = mailimap_fetch( m_imap, set, fetchType, &result );
398 mailimap_set_free( set ); 475 mailimap_set_free( set );
399 mailimap_fetch_type_free( fetchType ); 476 mailimap_fetch_type_free( fetchType );
400 477
401 if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) { 478 if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) {
402 mailimap_msg_att * msg_att; 479 mailimap_msg_att * msg_att;
403 msg_att = (mailimap_msg_att*)current->data; 480 msg_att = (mailimap_msg_att*)current->data;
404 mailimap_msg_att_item*item = (mailimap_msg_att_item*)msg_att->list->first->data; 481 mailimap_msg_att_item*item = (mailimap_msg_att_item*)msg_att->list->first->data;
405
406 if (item->msg_att_static && item->msg_att_static->rfc822_text) { 482 if (item->msg_att_static && item->msg_att_static->rfc822_text) {
407 body = item->msg_att_static->rfc822_text; 483 body = item->msg_att_static->rfc822_text;
408 } 484 }
409 } else { 485 } else {
410 qDebug("error fetching text: %s",imap->response); 486 qDebug("error fetching text: %s",m_imap->response);
411 } 487 }
412
413 err = mailimap_logout( imap );
414 err = mailimap_close( imap );
415 mailimap_free( imap );
416 clist_free(result); 488 clist_free(result);
417
418 return body; 489 return body;
419} 490}
420
diff --git a/noncore/net/mail/imapwrapper.h b/noncore/net/mail/imapwrapper.h
index 65c36e0..b02d26d 100644
--- a/noncore/net/mail/imapwrapper.h
+++ b/noncore/net/mail/imapwrapper.h
@@ -1,25 +1,33 @@
1#ifndef __IMAPWRAPPER 1#ifndef __IMAPWRAPPER
2#define __IMAPWRAPPER 2#define __IMAPWRAPPER
3 3
4#include "mailwrapper.h" 4#include "mailwrapper.h"
5#include <libetpan/mailimap.h> 5
6struct mailimap;
7struct mailimap_body_type_1part;
6 8
7class IMAPwrapper : public QObject 9class IMAPwrapper : public QObject
8{ 10{
9 Q_OBJECT 11 Q_OBJECT
10 12
11public: 13public:
12 IMAPwrapper( IMAPaccount *a ); 14 IMAPwrapper( IMAPaccount *a );
15 virtual ~IMAPwrapper();
13 QList<IMAPFolder>* listFolders(); 16 QList<IMAPFolder>* listFolders();
14 void listMessages(const QString & mailbox,Maillist&target ); 17 void listMessages(const QString & mailbox,Maillist&target );
15 QString fetchBody(const QString & mailbox,const RecMail&mail); 18 QString fetchBody(const RecMail&mail);
19 static void imap_progress( size_t current, size_t maximum );
16 20
17protected: 21protected:
18 RecMail*parse_list_result(mailimap_msg_att*); 22 RecMail*parse_list_result(mailimap_msg_att*);
23 void login();
24 void logout();
25 QString searchBodyText(const RecMail&mail,mailimap_body_type_1part*mailDescription);
26 QString getPlainBody(const RecMail&mail);
19 27
20private: 28private:
21 IMAPaccount *account; 29 IMAPaccount *account;
22 30 mailimap *m_imap;
23}; 31};
24 32
25#endif 33#endif
diff --git a/noncore/net/mail/libmailwrapper/imapwrapper.cpp b/noncore/net/mail/libmailwrapper/imapwrapper.cpp
index 7b78499..1acc036 100644
--- a/noncore/net/mail/libmailwrapper/imapwrapper.cpp
+++ b/noncore/net/mail/libmailwrapper/imapwrapper.cpp
@@ -1,84 +1,103 @@
1 1
2#include <stdlib.h> 2#include <stdlib.h>
3 3
4#include "imapwrapper.h" 4#include "imapwrapper.h"
5 5#include <libetpan/mailimap.h>
6 6
7IMAPwrapper::IMAPwrapper( IMAPaccount *a ) 7IMAPwrapper::IMAPwrapper( IMAPaccount *a )
8{ 8{
9 account = a; 9 account = a;
10 m_imap = 0;
10} 11}
11 12
12void imap_progress( size_t current, size_t maximum ) 13IMAPwrapper::~IMAPwrapper()
14{
15 logout();
16}
17
18void IMAPwrapper::imap_progress( size_t current, size_t maximum )
13{ 19{
14 qDebug( "IMAP: %i of %i", current, maximum ); 20 qDebug( "IMAP: %i of %i", current, maximum );
15} 21}
16 22
17void IMAPwrapper::listMessages(const QString&mailbox,Maillist&target ) 23void IMAPwrapper::login()
18{ 24{
19 const char *server, *user, *pass, *mb; 25 logout();
26 const char *server, *user, *pass;
20 uint16_t port; 27 uint16_t port;
21 int err = MAILIMAP_NO_ERROR; 28 int err = MAILIMAP_NO_ERROR;
22 clist *result;
23 clistcell *current;
24 mailimap_fetch_att *fetchAtt,*fetchAttFlags,*fetchAttDate;
25 mailimap_fetch_type *fetchType;
26 mailimap_set *set;
27 29
28 mb = mailbox.latin1();
29 server = account->getServer().latin1(); 30 server = account->getServer().latin1();
30 port = account->getPort().toUInt(); 31 port = account->getPort().toUInt();
31 user = account->getUser().latin1(); 32 user = account->getUser().latin1();
32 pass = account->getPassword().latin1(); 33 pass = account->getPassword().latin1();
33 34
34 mailimap *imap = mailimap_new( 20, &imap_progress ); 35 m_imap = mailimap_new( 20, &imap_progress );
35 if ( imap == NULL ) {
36 qDebug("IMAP Memory error");
37 return;
38 }
39
40 /* connect */ 36 /* connect */
41 err = mailimap_socket_connect( imap, (char*)server, port ); 37 err = mailimap_socket_connect( m_imap, (char*)server, port );
42 if ( err != MAILIMAP_NO_ERROR && 38 if ( err != MAILIMAP_NO_ERROR &&
43 err != MAILIMAP_NO_ERROR_AUTHENTICATED && 39 err != MAILIMAP_NO_ERROR_AUTHENTICATED &&
44 err != MAILIMAP_NO_ERROR_NON_AUTHENTICATED ) { 40 err != MAILIMAP_NO_ERROR_NON_AUTHENTICATED ) {
45 qDebug("error connecting server: %s",imap->response); 41 qDebug("error connecting server: %s",m_imap->response);
46 mailimap_free( imap ); 42 mailimap_free( m_imap );
43 m_imap = 0;
47 return; 44 return;
48 } 45 }
49 46
50 /* login */ 47 /* login */
51 err = mailimap_login_simple( imap, (char*)user, (char*)pass ); 48 err = mailimap_login_simple( m_imap, (char*)user, (char*)pass );
52 if ( err != MAILIMAP_NO_ERROR ) { 49 if ( err != MAILIMAP_NO_ERROR ) {
53 qDebug("error logging in imap: %s",imap->response); 50 qDebug("error logging in imap: %s",m_imap->response);
54 err = mailimap_close( imap ); 51 err = mailimap_close( m_imap );
55 mailimap_free( imap ); 52 mailimap_free( m_imap );
56 return; 53 m_imap = 0;
57 } 54 }
55}
56
57void IMAPwrapper::logout()
58{
59 int err = MAILIMAP_NO_ERROR;
60 if (!m_imap) return;
61 err = mailimap_logout( m_imap );
62 err = mailimap_close( m_imap );
63 mailimap_free( m_imap );
64 m_imap = 0;
65}
66
67void IMAPwrapper::listMessages(const QString&mailbox,Maillist&target )
68{
69 const char *mb;
70 int err = MAILIMAP_NO_ERROR;
71 clist *result;
72 clistcell *current;
73 mailimap_fetch_att *fetchAtt,*fetchAttFlags,*fetchAttDate;
74 mailimap_fetch_type *fetchType;
75 mailimap_set *set;
58 76
77 mb = mailbox.latin1();
78 login();
79 if (!m_imap) {
80 return;
81 }
59 /* select mailbox READONLY for operations */ 82 /* select mailbox READONLY for operations */
60 err = mailimap_examine( imap, (char*)mb); 83 err = mailimap_examine( m_imap, (char*)mb);
61 if ( err != MAILIMAP_NO_ERROR ) { 84 if ( err != MAILIMAP_NO_ERROR ) {
62 qDebug("error selecting mailbox: %s",imap->response); 85 qDebug("error selecting mailbox: %s",m_imap->response);
63 err = mailimap_logout( imap ); 86 logout();
64 err = mailimap_close( imap );
65 mailimap_free( imap );
66 return; 87 return;
67 } 88 }
68 89
69 int last = imap->selection_info->exists; 90 int last = m_imap->selection_info->exists;
91
70 if (last == 0) { 92 if (last == 0) {
71 qDebug("mailbox has no mails"); 93 qDebug("mailbox has no mails");
72 err = mailimap_logout( imap ); 94 logout();
73 err = mailimap_close( imap );
74 mailimap_free( imap );
75 return; 95 return;
76 } 96 }
77 97
78
79 result = clist_new(); 98 result = clist_new();
80 /* the range has to start at 1!!! not with 0!!!! */ 99 /* the range has to start at 1!!! not with 0!!!! */
81 set = mailimap_set_new_interval( 1, last ); 100 set = mailimap_set_new_interval( 1, last );
82 fetchAtt = mailimap_fetch_att_new_envelope(); 101 fetchAtt = mailimap_fetch_att_new_envelope();
83 fetchAttFlags = mailimap_fetch_att_new_flags(); 102 fetchAttFlags = mailimap_fetch_att_new_flags();
84 fetchAttDate = mailimap_fetch_att_new_internaldate(); 103 fetchAttDate = mailimap_fetch_att_new_internaldate();
@@ -86,13 +105,13 @@ void IMAPwrapper::listMessages(const QString&mailbox,Maillist&target )
86 //fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt); 105 //fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt);
87 fetchType = mailimap_fetch_type_new_fetch_att_list_empty(); 106 fetchType = mailimap_fetch_type_new_fetch_att_list_empty();
88 mailimap_fetch_type_new_fetch_att_list_add(fetchType,fetchAtt); 107 mailimap_fetch_type_new_fetch_att_list_add(fetchType,fetchAtt);
89 mailimap_fetch_type_new_fetch_att_list_add(fetchType,fetchAttFlags); 108 mailimap_fetch_type_new_fetch_att_list_add(fetchType,fetchAttFlags);
90 mailimap_fetch_type_new_fetch_att_list_add(fetchType,fetchAttDate); 109 mailimap_fetch_type_new_fetch_att_list_add(fetchType,fetchAttDate);
91 110
92 err = mailimap_fetch( imap, set, fetchType, &result ); 111 err = mailimap_fetch( m_imap, set, fetchType, &result );
93 mailimap_set_free( set ); 112 mailimap_set_free( set );
94 /* cleans up the fetch_att's too! */ 113 /* cleans up the fetch_att's too! */
95 mailimap_fetch_type_free( fetchType ); 114 mailimap_fetch_type_free( fetchType );
96 115
97 QString date,subject,from; 116 QString date,subject,from;
98 117
@@ -103,95 +122,71 @@ void IMAPwrapper::listMessages(const QString&mailbox,Maillist&target )
103 while ( current != 0 ) { 122 while ( current != 0 ) {
104 ++i; 123 ++i;
105 msg_att = (mailimap_msg_att*)current->data; 124 msg_att = (mailimap_msg_att*)current->data;
106 RecMail*m = parse_list_result(msg_att); 125 RecMail*m = parse_list_result(msg_att);
107 if (m) { 126 if (m) {
108 m->setNumber(i); 127 m->setNumber(i);
128 m->setMbox(mailbox);
109 target.append(m); 129 target.append(m);
110 } 130 }
111 current = current->next; 131 current = current->next;
112 } 132 }
113 } else { 133 } else {
114 qDebug("Error fetching headers: %s",imap->response); 134 qDebug("Error fetching headers: %s",m_imap->response);
115 } 135 }
116 136 logout();
117 err = mailimap_logout( imap );
118 err = mailimap_close( imap );
119 clist_free(result); 137 clist_free(result);
120 mailimap_free( imap );
121} 138}
122 139
123QList<IMAPFolder>* IMAPwrapper::listFolders() 140QList<IMAPFolder>* IMAPwrapper::listFolders()
124{ 141{
125 const char *server, *user, *pass, *path, *mask; 142 const char *path, *mask;
126 uint16_t port;
127 int err = MAILIMAP_NO_ERROR; 143 int err = MAILIMAP_NO_ERROR;
128 clist *result; 144 clist *result;
129 clistcell *current; 145 clistcell *current;
130 146
131 QList<IMAPFolder> * folders = new QList<IMAPFolder>(); 147 QList<IMAPFolder> * folders = new QList<IMAPFolder>();
132 folders->setAutoDelete( true ); 148 folders->setAutoDelete( true );
133 149 login();
134 server = account->getServer().latin1(); 150 if (!m_imap) {
135 port = account->getPort().toUInt();
136 user = account->getUser().latin1();
137 pass = account->getPassword().latin1();
138 path = account->getPrefix().latin1();
139
140 mailimap *imap = mailimap_new( 20, &imap_progress );
141 if ( imap == NULL ) {
142 qDebug("error mailimap_new");
143 return folders; 151 return folders;
144 } 152 }
145
146 err = mailimap_socket_connect( imap, (char*)server, port );
147 if ( err != MAILIMAP_NO_ERROR &&
148 err != MAILIMAP_NO_ERROR_AUTHENTICATED &&
149 err != MAILIMAP_NO_ERROR_NON_AUTHENTICATED ) {
150 mailimap_free(imap);
151 qDebug("error imap_socket_connect: %s",imap->response);
152 return folders;
153 }
154 153
155 err = mailimap_login_simple( imap, (char*)user, (char*)pass );
156 if ( err != MAILIMAP_NO_ERROR ) {
157 mailimap_free(imap);
158 qDebug("error logging in: %s",imap->response);
159 return folders;
160 }
161/* 154/*
162 * First we have to check for INBOX 'cause it sometimes it's not inside the path. 155 * First we have to check for INBOX 'cause it sometimes it's not inside the path.
163 * We must not forget to filter them out in next loop! 156 * We must not forget to filter them out in next loop!
164 * it seems like ugly code. and yes - it is ugly code. but the best way. 157 * it seems like ugly code. and yes - it is ugly code. but the best way.
165 */ 158 */
166 QString temp; 159 QString temp;
167 mask = "INBOX" ; 160 mask = "INBOX" ;
168 result = clist_new(); 161 result = clist_new();
169 mailimap_mailbox_list *list; 162 mailimap_mailbox_list *list;
170 err = mailimap_list( imap, (char*)"", (char*)mask, &result ); 163 err = mailimap_list( m_imap, (char*)"", (char*)mask, &result );
171 if ( err == MAILIMAP_NO_ERROR ) { 164 if ( err == MAILIMAP_NO_ERROR ) {
172 current = result->first; 165 current = result->first;
173 for ( int i = result->count; i > 0; i-- ) { 166 for ( int i = result->count; i > 0; i-- ) {
174 list = (mailimap_mailbox_list *) current->data; 167 list = (mailimap_mailbox_list *) current->data;
175 // it is better use the deep copy mechanism of qt itself 168 // it is better use the deep copy mechanism of qt itself
176 // instead of using strdup! 169 // instead of using strdup!
177 temp = list->mb; 170 temp = list->mb;
178 folders->append( new IMAPFolder(temp)); 171 folders->append( new IMAPFolder(temp));
179 current = current->next; 172 current = current->next;
180 } 173 }
181 } else { 174 } else {
182 qDebug("error fetching folders: %s",imap->response); 175 qDebug("error fetching folders: %s",m_imap->response);
183 } 176 }
184 mailimap_list_result_free( result ); 177 mailimap_list_result_free( result );
185 178
186/* 179/*
187 * second stage - get the other then inbox folders 180 * second stage - get the other then inbox folders
188 */ 181 */
189 mask = "*" ; 182 mask = "*" ;
183 path = account->getPrefix().latin1();
190 result = clist_new(); 184 result = clist_new();
191 err = mailimap_list( imap, (char*)path, (char*)mask, &result ); 185 qDebug(path);
186 err = mailimap_list( m_imap, (char*)path, (char*)mask, &result );
192 if ( err == MAILIMAP_NO_ERROR ) { 187 if ( err == MAILIMAP_NO_ERROR ) {
193 current = result->first; 188 current = result->first;
194 for ( int i = result->count; i > 0; i-- ) { 189 for ( int i = result->count; i > 0; i-- ) {
195 list = (mailimap_mailbox_list *) current->data; 190 list = (mailimap_mailbox_list *) current->data;
196 // it is better use the deep copy mechanism of qt itself 191 // it is better use the deep copy mechanism of qt itself
197 // instead of using strdup! 192 // instead of using strdup!
@@ -200,18 +195,15 @@ QList<IMAPFolder>* IMAPwrapper::listFolders()
200 if (temp.lower()=="inbox") 195 if (temp.lower()=="inbox")
201 continue; 196 continue;
202 folders->append(new IMAPFolder(temp)); 197 folders->append(new IMAPFolder(temp));
203 198
204 } 199 }
205 } else { 200 } else {
206 qDebug("error fetching folders"); 201 qDebug("error fetching folders %s",m_imap->response);
207 } 202 }
208 mailimap_list_result_free( result ); 203 mailimap_list_result_free( result );
209 err = mailimap_logout( imap );
210 err = mailimap_close( imap );
211 mailimap_free( imap );
212 return folders; 204 return folders;
213} 205}
214 206
215RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att) 207RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att)
216{ 208{
217 RecMail * m = 0; 209 RecMail * m = 0;
@@ -270,13 +262,12 @@ RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att)
270 default: 262 default:
271 break; 263 break;
272 } 264 }
273 } else if (cflag->type==MAILIMAP_FLAG_FETCH_RECENT) { 265 } else if (cflag->type==MAILIMAP_FLAG_FETCH_RECENT) {
274 mFlags.setBit(FLAG_RECENT); 266 mFlags.setBit(FLAG_RECENT);
275 } 267 }
276
277 cf = cf->next; 268 cf = cf->next;
278 } 269 }
279 continue; 270 continue;
280 } 271 }
281 if ( item->msg_att_static->type == MAILIMAP_MSG_ATT_RFC822_HEADER ) { 272 if ( item->msg_att_static->type == MAILIMAP_MSG_ATT_RFC822_HEADER ) {
282 qDebug( "header: \n%s", item->msg_att_static->rfc822_header ); 273 qDebug( "header: \n%s", item->msg_att_static->rfc822_header );
@@ -334,87 +325,166 @@ RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att)
334 if (m) { 325 if (m) {
335 m->setFlags(mFlags); 326 m->setFlags(mFlags);
336 } 327 }
337 return m; 328 return m;
338} 329}
339 330
340QString IMAPwrapper::fetchBody(const QString & mailbox,const RecMail&mail) 331#if 1
332QString IMAPwrapper::fetchBody(const RecMail&mail)
341{ 333{
342 QString body = ""; 334 QString body = "";
343 const char *server, *user, *pass, *mb; 335 const char *mb;
344 uint16_t port;
345 int err = MAILIMAP_NO_ERROR; 336 int err = MAILIMAP_NO_ERROR;
346 clist *result; 337 clist *result;
347 clistcell *current; 338 clistcell *current;
348 mailimap_fetch_att *fetchAtt; 339 mailimap_fetch_att *fetchAtt;
349 mailimap_fetch_type *fetchType; 340 mailimap_fetch_type *fetchType;
350 mailimap_set *set; 341 mailimap_set *set;
351 342
352 mb = mailbox.latin1(); 343 mb = mail.getMbox().latin1();
353 server = account->getServer().latin1();
354 port = account->getPort().toUInt();
355 user = account->getUser().latin1();
356 pass = account->getPassword().latin1();
357 344
358 mailimap *imap = mailimap_new( 20, &imap_progress ); 345 login();
359 if ( imap == NULL ) { 346 if (!m_imap) {
360 qDebug("IMAP Memory error"); 347 return body;
348 }
349 /* select mailbox READONLY for operations */
350 err = mailimap_examine( m_imap, (char*)mb);
351 if ( err != MAILIMAP_NO_ERROR ) {
352 qDebug("error selecting mailbox: %s",m_imap->response);
353 logout();
361 return body; 354 return body;
362 } 355 }
356 result = clist_new();
357 /* the range has to start at 1!!! not with 0!!!! */
358 set = mailimap_set_new_interval( mail.getNumber(),mail.getNumber() );
359 fetchAtt = mailimap_fetch_att_new_rfc822_text();
360 fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt);
361 err = mailimap_fetch( m_imap, set, fetchType, &result );
362 mailimap_set_free( set );
363 mailimap_fetch_type_free( fetchType );
364
365 if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) {
366 mailimap_msg_att * msg_att;
367 msg_att = (mailimap_msg_att*)current->data;
368 mailimap_msg_att_item*item = (mailimap_msg_att_item*)msg_att->list->first->data;
363 369
364 /* connect */ 370 if (item->msg_att_static && item->msg_att_static->rfc822_text) {
365 err = mailimap_socket_connect( imap, (char*)server, port ); 371 body = item->msg_att_static->rfc822_text;
366 if ( err != MAILIMAP_NO_ERROR && 372 }
367 err != MAILIMAP_NO_ERROR_AUTHENTICATED && 373 } else {
368 err != MAILIMAP_NO_ERROR_NON_AUTHENTICATED ) { 374 qDebug("error fetching text: %s",m_imap->response);
369 qDebug("error connecting server: %s",imap->response);
370 mailimap_free( imap );
371 return body;
372 } 375 }
373 376
374 /* login */ 377 clist_free(result);
375 err = mailimap_login_simple( imap, (char*)user, (char*)pass ); 378 logout();
376 if ( err != MAILIMAP_NO_ERROR ) { 379 return body;
377 qDebug("error logging in imap: %s",imap->response); 380}
378 err = mailimap_close( imap ); 381
379 mailimap_free( imap ); 382#else
383QString IMAPwrapper::fetchBody(const RecMail&mail)
384{
385 QString body = "";
386 const char *mb;
387 int err = MAILIMAP_NO_ERROR;
388 clist *result;
389 clistcell *current;
390 mailimap_fetch_att *fetchAtt;
391 mailimap_fetch_type *fetchType;
392 mailimap_set *set;
393 mailimap_body*body_desc;
394
395 mb = mail.getMbox().latin1();
396
397 login();
398 if (!m_imap) {
380 return body; 399 return body;
381 } 400 }
382
383 /* select mailbox READONLY for operations */ 401 /* select mailbox READONLY for operations */
384 err = mailimap_examine( imap, (char*)mb); 402 err = mailimap_examine( m_imap, (char*)mb);
385 if ( err != MAILIMAP_NO_ERROR ) { 403 if ( err != MAILIMAP_NO_ERROR ) {
386 qDebug("error selecting mailbox: %s",imap->response); 404 qDebug("error selecting mailbox: %s",m_imap->response);
387 err = mailimap_logout( imap ); 405 logout();
388 err = mailimap_close( imap ); 406 return body;
389 mailimap_free( imap ); 407 }
408 result = clist_new();
409 /* the range has to start at 1!!! not with 0!!!! */
410 set = mailimap_set_new_interval( mail.getNumber(),mail.getNumber() );
411 fetchAtt = mailimap_fetch_att_new_body();
412 fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt);
413 err = mailimap_fetch( m_imap, set, fetchType, &result );
414 mailimap_set_free( set );
415 mailimap_fetch_type_free( fetchType );
416
417 if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) {
418 mailimap_msg_att * msg_att;
419 msg_att = (mailimap_msg_att*)current->data;
420 mailimap_msg_att_item*item = (mailimap_msg_att_item*)msg_att->list->first->data;
421 body_desc = item->msg_att_static->body;
422 if (body_desc->type==MAILIMAP_BODY_1PART) {
423 body = searchBodyText(mail,body_desc->body_1part);
424 } else {
425 }
426
427 } else {
428 qDebug("error fetching body: %s",m_imap->response);
429 }
430
431 clist_free(result);
432 logout();
433 return body;
434}
435#endif
436
437QString IMAPwrapper::searchBodyText(const RecMail&mail,mailimap_body_type_1part*mailDescription)
438{
439 QString Body="";
440 if (!mailDescription) {
441 return Body;
442 }
443 switch (mailDescription->type) {
444 case MAILIMAP_BODY_TYPE_1PART_TEXT:
445 return getPlainBody(mail);
446 break;
447 default:
448 break;
449 }
450 return Body;
451}
452
453QString IMAPwrapper::getPlainBody(const RecMail&mail)
454{
455 QString body = "";
456 const char *mb;
457 int err = MAILIMAP_NO_ERROR;
458 clist *result;
459 clistcell *current;
460 mailimap_fetch_att *fetchAtt;
461 mailimap_fetch_type *fetchType;
462 mailimap_set *set;
463
464 mb = mail.getMbox().latin1();
465
466 if (!m_imap) {
390 return body; 467 return body;
391 } 468 }
392 result = clist_new(); 469 result = clist_new();
393 /* the range has to start at 1!!! not with 0!!!! */ 470 /* the range has to start at 1!!! not with 0!!!! */
394 set = mailimap_set_new_interval( mail.getNumber(),mail.getNumber() ); 471 set = mailimap_set_new_interval( mail.getNumber(),mail.getNumber() );
395 fetchAtt = mailimap_fetch_att_new_rfc822_text(); 472 fetchAtt = mailimap_fetch_att_new_rfc822_text();
396 fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt); 473 fetchType = mailimap_fetch_type_new_fetch_att(fetchAtt);
397 err = mailimap_fetch( imap, set, fetchType, &result ); 474 err = mailimap_fetch( m_imap, set, fetchType, &result );
398 mailimap_set_free( set ); 475 mailimap_set_free( set );
399 mailimap_fetch_type_free( fetchType ); 476 mailimap_fetch_type_free( fetchType );
400 477
401 if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) { 478 if (err == MAILIMAP_NO_ERROR && (current=clist_begin(result)) ) {
402 mailimap_msg_att * msg_att; 479 mailimap_msg_att * msg_att;
403 msg_att = (mailimap_msg_att*)current->data; 480 msg_att = (mailimap_msg_att*)current->data;
404 mailimap_msg_att_item*item = (mailimap_msg_att_item*)msg_att->list->first->data; 481 mailimap_msg_att_item*item = (mailimap_msg_att_item*)msg_att->list->first->data;
405
406 if (item->msg_att_static && item->msg_att_static->rfc822_text) { 482 if (item->msg_att_static && item->msg_att_static->rfc822_text) {
407 body = item->msg_att_static->rfc822_text; 483 body = item->msg_att_static->rfc822_text;
408 } 484 }
409 } else { 485 } else {
410 qDebug("error fetching text: %s",imap->response); 486 qDebug("error fetching text: %s",m_imap->response);
411 } 487 }
412
413 err = mailimap_logout( imap );
414 err = mailimap_close( imap );
415 mailimap_free( imap );
416 clist_free(result); 488 clist_free(result);
417
418 return body; 489 return body;
419} 490}
420
diff --git a/noncore/net/mail/libmailwrapper/imapwrapper.h b/noncore/net/mail/libmailwrapper/imapwrapper.h
index 65c36e0..b02d26d 100644
--- a/noncore/net/mail/libmailwrapper/imapwrapper.h
+++ b/noncore/net/mail/libmailwrapper/imapwrapper.h
@@ -1,25 +1,33 @@
1#ifndef __IMAPWRAPPER 1#ifndef __IMAPWRAPPER
2#define __IMAPWRAPPER 2#define __IMAPWRAPPER
3 3
4#include "mailwrapper.h" 4#include "mailwrapper.h"
5#include <libetpan/mailimap.h> 5
6struct mailimap;
7struct mailimap_body_type_1part;
6 8
7class IMAPwrapper : public QObject 9class IMAPwrapper : public QObject
8{ 10{
9 Q_OBJECT 11 Q_OBJECT
10 12
11public: 13public:
12 IMAPwrapper( IMAPaccount *a ); 14 IMAPwrapper( IMAPaccount *a );
15 virtual ~IMAPwrapper();
13 QList<IMAPFolder>* listFolders(); 16 QList<IMAPFolder>* listFolders();
14 void listMessages(const QString & mailbox,Maillist&target ); 17 void listMessages(const QString & mailbox,Maillist&target );
15 QString fetchBody(const QString & mailbox,const RecMail&mail); 18 QString fetchBody(const RecMail&mail);
19 static void imap_progress( size_t current, size_t maximum );
16 20
17protected: 21protected:
18 RecMail*parse_list_result(mailimap_msg_att*); 22 RecMail*parse_list_result(mailimap_msg_att*);
23 void login();
24 void logout();
25 QString searchBodyText(const RecMail&mail,mailimap_body_type_1part*mailDescription);
26 QString getPlainBody(const RecMail&mail);
19 27
20private: 28private:
21 IMAPaccount *account; 29 IMAPaccount *account;
22 30 mailimap *m_imap;
23}; 31};
24 32
25#endif 33#endif
diff --git a/noncore/net/mail/libmailwrapper/mailwrapper.cpp b/noncore/net/mail/libmailwrapper/mailwrapper.cpp
index ea9e7b2..7f67cd8 100644
--- a/noncore/net/mail/libmailwrapper/mailwrapper.cpp
+++ b/noncore/net/mail/libmailwrapper/mailwrapper.cpp
@@ -626,13 +626,13 @@ void MailWrapper::sendMail( Mail mail )
626Mail::Mail() 626Mail::Mail()
627 :name(""), mail(""), to(""), cc(""), bcc(""), reply(""), subject(""), message("") 627 :name(""), mail(""), to(""), cc(""), bcc(""), reply(""), subject(""), message("")
628{ 628{
629} 629}
630 630
631RecMail::RecMail() 631RecMail::RecMail()
632 :subject(""),date(""),msg_number(0),msg_flags(7) 632 :subject(""),date(""),mbox(""),msg_number(0),msg_flags(7)
633{ 633{
634} 634}
635 635
636#if 0 636#if 0
637void RecMail::setDate(const QString&aDate) 637void RecMail::setDate(const QString&aDate)
638{ 638{
diff --git a/noncore/net/mail/libmailwrapper/mailwrapper.h b/noncore/net/mail/libmailwrapper/mailwrapper.h
index 955a8e2..332034f 100644
--- a/noncore/net/mail/libmailwrapper/mailwrapper.h
+++ b/noncore/net/mail/libmailwrapper/mailwrapper.h
@@ -36,12 +36,23 @@ protected:
36#define FLAG_DELETED 2 36#define FLAG_DELETED 2
37#define FLAG_SEEN 3 37#define FLAG_SEEN 3
38#define FLAG_DRAFT 4 38#define FLAG_DRAFT 4
39#define FLAG_RECENT 5 39#define FLAG_RECENT 5
40 40
41/* a class to describe mails in a mailbox */ 41/* a class to describe mails in a mailbox */
42/* Attention!
43 From programmers point of view it would make sense to
44 store the mail body into this class, too.
45 But: not from the point of view of the device.
46 Mailbodies can be real large. So we request them when
47 needed from the mail-wrapper class direct from the server itself
48 (imap) or from a file-based cache (pop3?)
49 So there is no interface "const QString&body()" but you should
50 make a request to the mailwrapper with this class as parameter to
51 get the body. Same words for the attachments.
52*/
42class RecMail 53class RecMail
43{ 54{
44public: 55public:
45 RecMail(); 56 RecMail();
46 virtual ~RecMail(){} 57 virtual ~RecMail(){}
47 58
@@ -50,22 +61,24 @@ public:
50 const QString&getDate()const{ return date; } 61 const QString&getDate()const{ return date; }
51 void setDate( const QString&a ) { date = a; } 62 void setDate( const QString&a ) { date = a; }
52 const QString&getFrom()const{ return from; } 63 const QString&getFrom()const{ return from; }
53 void setFrom( const QString&a ) { from = a; } 64 void setFrom( const QString&a ) { from = a; }
54 const QString&getSubject()const { return subject; } 65 const QString&getSubject()const { return subject; }
55 void setSubject( const QString&s ) { subject = s; } 66 void setSubject( const QString&s ) { subject = s; }
56 void setFlags(const QBitArray&flags){msg_flags = flags;} 67 const QString&getMbox()const{return mbox;}
68 void setMbox(const QString&box){mbox = box;}
57 const QBitArray&getFlags()const{return msg_flags;} 69 const QBitArray&getFlags()const{return msg_flags;}
70 void setFlags(const QBitArray&flags){msg_flags = flags;}
58 71
59#if 0 72#if 0
60 void setDate(const QString&dstring); 73 void setDate(const QString&dstring);
61 void setDate(const QDateTime&date){mDate = date;} 74 void setDate(const QDateTime&date){mDate = date;}
62 QString getDate()const{return mDate.toString();} 75 QString getDate()const{return mDate.toString();}
63#endif 76#endif
64protected: 77protected:
65 QString subject,date,from; 78 QString subject,date,from,mbox;
66 int msg_number; 79 int msg_number;
67 QBitArray msg_flags; 80 QBitArray msg_flags;
68#if 0 81#if 0
69 QDateTime mDate; 82 QDateTime mDate;
70#endif 83#endif
71}; 84};
diff --git a/noncore/net/mail/mailwrapper.cpp b/noncore/net/mail/mailwrapper.cpp
index ea9e7b2..7f67cd8 100644
--- a/noncore/net/mail/mailwrapper.cpp
+++ b/noncore/net/mail/mailwrapper.cpp
@@ -626,13 +626,13 @@ void MailWrapper::sendMail( Mail mail )
626Mail::Mail() 626Mail::Mail()
627 :name(""), mail(""), to(""), cc(""), bcc(""), reply(""), subject(""), message("") 627 :name(""), mail(""), to(""), cc(""), bcc(""), reply(""), subject(""), message("")
628{ 628{
629} 629}
630 630
631RecMail::RecMail() 631RecMail::RecMail()
632 :subject(""),date(""),msg_number(0),msg_flags(7) 632 :subject(""),date(""),mbox(""),msg_number(0),msg_flags(7)
633{ 633{
634} 634}
635 635
636#if 0 636#if 0
637void RecMail::setDate(const QString&aDate) 637void RecMail::setDate(const QString&aDate)
638{ 638{
diff --git a/noncore/net/mail/mailwrapper.h b/noncore/net/mail/mailwrapper.h
index 955a8e2..332034f 100644
--- a/noncore/net/mail/mailwrapper.h
+++ b/noncore/net/mail/mailwrapper.h
@@ -36,12 +36,23 @@ protected:
36#define FLAG_DELETED 2 36#define FLAG_DELETED 2
37#define FLAG_SEEN 3 37#define FLAG_SEEN 3
38#define FLAG_DRAFT 4 38#define FLAG_DRAFT 4
39#define FLAG_RECENT 5 39#define FLAG_RECENT 5
40 40
41/* a class to describe mails in a mailbox */ 41/* a class to describe mails in a mailbox */
42/* Attention!
43 From programmers point of view it would make sense to
44 store the mail body into this class, too.
45 But: not from the point of view of the device.
46 Mailbodies can be real large. So we request them when
47 needed from the mail-wrapper class direct from the server itself
48 (imap) or from a file-based cache (pop3?)
49 So there is no interface "const QString&body()" but you should
50 make a request to the mailwrapper with this class as parameter to
51 get the body. Same words for the attachments.
52*/
42class RecMail 53class RecMail
43{ 54{
44public: 55public:
45 RecMail(); 56 RecMail();
46 virtual ~RecMail(){} 57 virtual ~RecMail(){}
47 58
@@ -50,22 +61,24 @@ public:
50 const QString&getDate()const{ return date; } 61 const QString&getDate()const{ return date; }
51 void setDate( const QString&a ) { date = a; } 62 void setDate( const QString&a ) { date = a; }
52 const QString&getFrom()const{ return from; } 63 const QString&getFrom()const{ return from; }
53 void setFrom( const QString&a ) { from = a; } 64 void setFrom( const QString&a ) { from = a; }
54 const QString&getSubject()const { return subject; } 65 const QString&getSubject()const { return subject; }
55 void setSubject( const QString&s ) { subject = s; } 66 void setSubject( const QString&s ) { subject = s; }
56 void setFlags(const QBitArray&flags){msg_flags = flags;} 67 const QString&getMbox()const{return mbox;}
68 void setMbox(const QString&box){mbox = box;}
57 const QBitArray&getFlags()const{return msg_flags;} 69 const QBitArray&getFlags()const{return msg_flags;}
70 void setFlags(const QBitArray&flags){msg_flags = flags;}
58 71
59#if 0 72#if 0
60 void setDate(const QString&dstring); 73 void setDate(const QString&dstring);
61 void setDate(const QDateTime&date){mDate = date;} 74 void setDate(const QDateTime&date){mDate = date;}
62 QString getDate()const{return mDate.toString();} 75 QString getDate()const{return mDate.toString();}
63#endif 76#endif
64protected: 77protected:
65 QString subject,date,from; 78 QString subject,date,from,mbox;
66 int msg_number; 79 int msg_number;
67 QBitArray msg_flags; 80 QBitArray msg_flags;
68#if 0 81#if 0
69 QDateTime mDate; 82 QDateTime mDate;
70#endif 83#endif
71}; 84};