summaryrefslogtreecommitdiffabout
path: root/kmicromail/libmailwrapper
authorzautrix <zautrix>2004-12-04 22:11:00 (UTC)
committer zautrix <zautrix>2004-12-04 22:11:00 (UTC)
commitac994c86c3037dbe2273e62c46115b942b09fdcc (patch) (unidiff)
tree5c33da571f716ff91f300cf26ebf619d43a03fdc /kmicromail/libmailwrapper
parent9c7f3267a1d7db2dbc3bd6384e75cf8ffea1c3df (diff)
downloadkdepimpi-ac994c86c3037dbe2273e62c46115b942b09fdcc.zip
kdepimpi-ac994c86c3037dbe2273e62c46115b942b09fdcc.tar.gz
kdepimpi-ac994c86c3037dbe2273e62c46115b942b09fdcc.tar.bz2
ompi fix
Diffstat (limited to 'kmicromail/libmailwrapper') (more/less context) (ignore whitespace changes)
-rw-r--r--kmicromail/libmailwrapper/imapwrapper.cpp2
1 files changed, 2 insertions, 0 deletions
diff --git a/kmicromail/libmailwrapper/imapwrapper.cpp b/kmicromail/libmailwrapper/imapwrapper.cpp
index da7065f..b890725 100644
--- a/kmicromail/libmailwrapper/imapwrapper.cpp
+++ b/kmicromail/libmailwrapper/imapwrapper.cpp
@@ -1,561 +1,563 @@
1// CHANGED 2004-09-31 Lutz Rogowski 1// CHANGED 2004-09-31 Lutz Rogowski
2#include <stdlib.h> 2#include <stdlib.h>
3#include <libetpan/libetpan.h> 3#include <libetpan/libetpan.h>
4#include <qpe/global.h> 4#include <qpe/global.h>
5#include <qapplication.h> 5#include <qapplication.h>
6#include "imapwrapper.h" 6#include "imapwrapper.h"
7#include "mailtypes.h" 7#include "mailtypes.h"
8#include "logindialog.h" 8#include "logindialog.h"
9#include <qprogressbar.h> 9#include <qprogressbar.h>
10#include "genericwrapper.h" 10#include "genericwrapper.h"
11#include <kglobal.h> 11#include <kglobal.h>
12 12
13using namespace Opie::Core; 13using namespace Opie::Core;
14int IMAPwrapper::mMax = 0; 14int IMAPwrapper::mMax = 0;
15int IMAPwrapper::mCurrent = 0; 15int IMAPwrapper::mCurrent = 0;
16 16
17IMAPwrapper::IMAPwrapper( IMAPaccount *a ) 17IMAPwrapper::IMAPwrapper( IMAPaccount *a )
18 : AbstractMail() 18 : AbstractMail()
19{ 19{
20 account = a; 20 account = a;
21 m_imap = 0; 21 m_imap = 0;
22 m_Lastmbox = ""; 22 m_Lastmbox = "";
23 mCurrent = 0; 23 mCurrent = 0;
24 mMax = 0; 24 mMax = 0;
25} 25}
26 26
27IMAPwrapper::~IMAPwrapper() 27IMAPwrapper::~IMAPwrapper()
28{ 28{
29 logout(); 29 logout();
30} 30}
31 31
32/* to avoid to often select statements in loops etc. 32/* to avoid to often select statements in loops etc.
33 we trust that we are logged in and connection is established!*/ 33 we trust that we are logged in and connection is established!*/
34int IMAPwrapper::selectMbox(const QString&mbox) 34int IMAPwrapper::selectMbox(const QString&mbox)
35{ 35{
36 if (mbox == m_Lastmbox) { 36 if (mbox == m_Lastmbox) {
37 return MAILIMAP_NO_ERROR; 37 return MAILIMAP_NO_ERROR;
38 } 38 }
39 int err = mailimap_select( m_imap, (char*)mbox.latin1()); 39 int err = mailimap_select( m_imap, (char*)mbox.latin1());
40 if ( err != MAILIMAP_NO_ERROR ) { 40 if ( err != MAILIMAP_NO_ERROR ) {
41 m_Lastmbox = ""; 41 m_Lastmbox = "";
42 return err; 42 return err;
43 } 43 }
44 m_Lastmbox = mbox; 44 m_Lastmbox = mbox;
45 return err; 45 return err;
46} 46}
47 47
48void IMAPwrapper::imap_progress( size_t current, size_t maximum ) 48void IMAPwrapper::imap_progress( size_t current, size_t maximum )
49{ 49{
50 qApp->processEvents();
51 return;
50 //qDebug("imap progress %d of %d ",current,maximum ); 52 //qDebug("imap progress %d of %d ",current,maximum );
51 //Global::statusMessage(i18n("Downloading message %1 of %2").arg( current).arg(maximum)); 53 //Global::statusMessage(i18n("Downloading message %1 of %2").arg( current).arg(maximum));
52 //qApp->processEvents() 54 //qApp->processEvents()
53 static unsigned int last = 0; 55 static unsigned int last = 0;
54 if ( last != current ) 56 if ( last != current )
55 IMAPwrapper::progress(); 57 IMAPwrapper::progress();
56 last = current; 58 last = current;
57} 59}
58void IMAPwrapper::progress( QString m ) 60void IMAPwrapper::progress( QString m )
59{ 61{
60 62
61 static QString mProgrMess; 63 static QString mProgrMess;
62 if ( m != QString::null ) { 64 if ( m != QString::null ) {
63 mProgrMess = m; 65 mProgrMess = m;
64 mCurrent = 1; 66 mCurrent = 1;
65 return; 67 return;
66 } 68 }
67 QString mess; 69 QString mess;
68 //qDebug("progress "); 70 //qDebug("progress ");
69 if ( mMax ) mess = mProgrMess +i18n(" message %1 of %2").arg( mCurrent++).arg(mMax); 71 if ( mMax ) mess = mProgrMess +i18n(" message %1 of %2").arg( mCurrent++).arg(mMax);
70 else mess = mProgrMess +i18n(" message %1").arg( mCurrent++); 72 else mess = mProgrMess +i18n(" message %1").arg( mCurrent++);
71 Global::statusMessage(mess); 73 Global::statusMessage(mess);
72 //qDebug("Progress %s %s", mess.latin1(), m.latin1()); 74 //qDebug("Progress %s %s", mess.latin1(), m.latin1());
73 qApp->processEvents(); 75 qApp->processEvents();
74} 76}
75bool IMAPwrapper::start_tls(bool force_tls) 77bool IMAPwrapper::start_tls(bool force_tls)
76{ 78{
77 int err; 79 int err;
78 bool try_tls = force_tls; 80 bool try_tls = force_tls;
79 mailimap_capability_data * cap_data = 0; 81 mailimap_capability_data * cap_data = 0;
80 82
81 err = mailimap_capability(m_imap,&cap_data); 83 err = mailimap_capability(m_imap,&cap_data);
82 if (err != MAILIMAP_NO_ERROR) { 84 if (err != MAILIMAP_NO_ERROR) {
83 Global::statusMessage("error getting capabilities!"); 85 Global::statusMessage("error getting capabilities!");
84 return false; 86 return false;
85 } 87 }
86 clistiter * cur; 88 clistiter * cur;
87 for(cur = clist_begin(cap_data->cap_list) ; cur != NULL;cur = clist_next(cur)) { 89 for(cur = clist_begin(cap_data->cap_list) ; cur != NULL;cur = clist_next(cur)) {
88 struct mailimap_capability * cap; 90 struct mailimap_capability * cap;
89 cap = (struct mailimap_capability *)clist_content(cur); 91 cap = (struct mailimap_capability *)clist_content(cur);
90 if (cap->cap_type == MAILIMAP_CAPABILITY_NAME) { 92 if (cap->cap_type == MAILIMAP_CAPABILITY_NAME) {
91 if (strcasecmp(cap->cap_data.cap_name, "STARTTLS") == 0) { 93 if (strcasecmp(cap->cap_data.cap_name, "STARTTLS") == 0) {
92 try_tls = true; 94 try_tls = true;
93 break; 95 break;
94 } 96 }
95 } 97 }
96 } 98 }
97 if (cap_data) { 99 if (cap_data) {
98 mailimap_capability_data_free(cap_data); 100 mailimap_capability_data_free(cap_data);
99 } 101 }
100 if (try_tls) { 102 if (try_tls) {
101 err = mailimap_starttls(m_imap); 103 err = mailimap_starttls(m_imap);
102 if (err != MAILIMAP_NO_ERROR && force_tls) { 104 if (err != MAILIMAP_NO_ERROR && force_tls) {
103 Global::statusMessage(i18n("Server has no TLS support!")); 105 Global::statusMessage(i18n("Server has no TLS support!"));
104 try_tls = false; 106 try_tls = false;
105 } else { 107 } else {
106 mailstream_low * low; 108 mailstream_low * low;
107 mailstream_low * new_low; 109 mailstream_low * new_low;
108 low = mailstream_get_low(m_imap->imap_stream); 110 low = mailstream_get_low(m_imap->imap_stream);
109 if (!low) { 111 if (!low) {
110 try_tls = false; 112 try_tls = false;
111 } else { 113 } else {
112 int fd = mailstream_low_get_fd(low); 114 int fd = mailstream_low_get_fd(low);
113 if (fd > -1 && (new_low = mailstream_low_ssl_open(fd))!=0) { 115 if (fd > -1 && (new_low = mailstream_low_ssl_open(fd))!=0) {
114 mailstream_low_free(low); 116 mailstream_low_free(low);
115 mailstream_set_low(m_imap->imap_stream, new_low); 117 mailstream_set_low(m_imap->imap_stream, new_low);
116 } else { 118 } else {
117 try_tls = false; 119 try_tls = false;
118 } 120 }
119 } 121 }
120 } 122 }
121 } 123 }
122 return try_tls; 124 return try_tls;
123} 125}
124 126
125void IMAPwrapper::login() 127void IMAPwrapper::login()
126{ 128{
127 QString server, user, pass; 129 QString server, user, pass;
128 uint16_t port; 130 uint16_t port;
129 int err = MAILIMAP_NO_ERROR; 131 int err = MAILIMAP_NO_ERROR;
130 132
131 if (account->getOffline()) return; 133 if (account->getOffline()) return;
132 /* we are connected this moment */ 134 /* we are connected this moment */
133 /* TODO: setup a timer holding the line or if connection closed - delete the value */ 135 /* TODO: setup a timer holding the line or if connection closed - delete the value */
134 if (m_imap) { 136 if (m_imap) {
135 err = mailimap_noop(m_imap); 137 err = mailimap_noop(m_imap);
136 if (err!=MAILIMAP_NO_ERROR) { 138 if (err!=MAILIMAP_NO_ERROR) {
137 logout(); 139 logout();
138 } else { 140 } else {
139 mailstream_flush(m_imap->imap_stream); 141 mailstream_flush(m_imap->imap_stream);
140 return; 142 return;
141 } 143 }
142 } 144 }
143 server = account->getServer(); 145 server = account->getServer();
144 port = account->getPort().toUInt(); 146 port = account->getPort().toUInt();
145 if ( account->getUser().isEmpty() || account->getPassword().isEmpty() ) { 147 if ( account->getUser().isEmpty() || account->getPassword().isEmpty() ) {
146 LoginDialog login( account->getUser(), account->getPassword(), NULL, 0, true ); 148 LoginDialog login( account->getUser(), account->getPassword(), NULL, 0, true );
147 login.show(); 149 login.show();
148 if ( QDialog::Accepted == login.exec() ) { 150 if ( QDialog::Accepted == login.exec() ) {
149 // ok 151 // ok
150 user = login.getUser(); 152 user = login.getUser();
151 pass = login.getPassword(); 153 pass = login.getPassword();
152 } else { 154 } else {
153 // cancel 155 // cancel
154 return; 156 return;
155 } 157 }
156 } else { 158 } else {
157 user = account->getUser(); 159 user = account->getUser();
158 pass = account->getPassword(); 160 pass = account->getPassword();
159 } 161 }
160 162
161 m_imap = mailimap_new( 20, &imap_progress ); 163 m_imap = mailimap_new( 20, &imap_progress );
162 164
163 /* connect */ 165 /* connect */
164 bool ssl = false; 166 bool ssl = false;
165 bool try_tls = false; 167 bool try_tls = false;
166 bool force_tls = false; 168 bool force_tls = false;
167 169
168 if ( account->ConnectionType() == 2 ) { 170 if ( account->ConnectionType() == 2 ) {
169 ssl = true; 171 ssl = true;
170 } 172 }
171 if (account->ConnectionType()==1) { 173 if (account->ConnectionType()==1) {
172 force_tls = true; 174 force_tls = true;
173 } 175 }
174 176
175 if ( ssl ) { 177 if ( ssl ) {
176 qDebug("using ssl "); 178 qDebug("using ssl ");
177 err = mailimap_ssl_connect( m_imap, (char*)server.latin1(), port ); 179 err = mailimap_ssl_connect( m_imap, (char*)server.latin1(), port );
178 qDebug("back "); 180 qDebug("back ");
179 } else { 181 } else {
180 err = mailimap_socket_connect( m_imap, (char*)server.latin1(), port ); 182 err = mailimap_socket_connect( m_imap, (char*)server.latin1(), port );
181 } 183 }
182 184
183 if ( err != MAILIMAP_NO_ERROR && 185 if ( err != MAILIMAP_NO_ERROR &&
184 err != MAILIMAP_NO_ERROR_AUTHENTICATED && 186 err != MAILIMAP_NO_ERROR_AUTHENTICATED &&
185 err != MAILIMAP_NO_ERROR_NON_AUTHENTICATED ) { 187 err != MAILIMAP_NO_ERROR_NON_AUTHENTICATED ) {
186 QString failure = ""; 188 QString failure = "";
187 if (err == MAILIMAP_ERROR_CONNECTION_REFUSED) { 189 if (err == MAILIMAP_ERROR_CONNECTION_REFUSED) {
188 failure="Connection refused"; 190 failure="Connection refused";
189 } else { 191 } else {
190 failure="Unknown failure"; 192 failure="Unknown failure";
191 } 193 }
192 Global::statusMessage(i18n("error connecting imap server: %1").arg(failure)); 194 Global::statusMessage(i18n("error connecting imap server: %1").arg(failure));
193 mailimap_free( m_imap ); 195 mailimap_free( m_imap );
194 m_imap = 0; 196 m_imap = 0;
195 return; 197 return;
196 } 198 }
197 199
198 if (!ssl) { 200 if (!ssl) {
199 try_tls = start_tls(force_tls); 201 try_tls = start_tls(force_tls);
200 } 202 }
201 203
202 bool ok = true; 204 bool ok = true;
203 if (force_tls && !try_tls) { 205 if (force_tls && !try_tls) {
204 Global::statusMessage(i18n("Server has no TLS support!")); 206 Global::statusMessage(i18n("Server has no TLS support!"));
205 ok = false; 207 ok = false;
206 } 208 }
207 209
208 210
209 /* login */ 211 /* login */
210 212
211 if (ok) { 213 if (ok) {
212 err = mailimap_login_simple( m_imap, (char*)user.latin1(), (char*)pass.latin1() ); 214 err = mailimap_login_simple( m_imap, (char*)user.latin1(), (char*)pass.latin1() );
213 if ( err != MAILIMAP_NO_ERROR ) { 215 if ( err != MAILIMAP_NO_ERROR ) {
214 Global::statusMessage(i18n("error logging in imap server: %1").arg(m_imap->imap_response)); 216 Global::statusMessage(i18n("error logging in imap server: %1").arg(m_imap->imap_response));
215 ok = false; 217 ok = false;
216 } 218 }
217 } 219 }
218 if (!ok) { 220 if (!ok) {
219 err = mailimap_close( m_imap ); 221 err = mailimap_close( m_imap );
220 mailimap_free( m_imap ); 222 mailimap_free( m_imap );
221 m_imap = 0; 223 m_imap = 0;
222 } 224 }
223} 225}
224 226
225void IMAPwrapper::logout() 227void IMAPwrapper::logout()
226{ 228{
227 int err = MAILIMAP_NO_ERROR; 229 int err = MAILIMAP_NO_ERROR;
228 if (!m_imap) return; 230 if (!m_imap) return;
229 err = mailimap_logout( m_imap ); 231 err = mailimap_logout( m_imap );
230 err = mailimap_close( m_imap ); 232 err = mailimap_close( m_imap );
231 mailimap_free( m_imap ); 233 mailimap_free( m_imap );
232 m_imap = 0; 234 m_imap = 0;
233 m_Lastmbox = ""; 235 m_Lastmbox = "";
234} 236}
235 237
236void IMAPwrapper::listMessages(const QString&mailbox,QValueList<Opie::Core::OSmartPointer<RecMail> > &target , int maxSizeInKb) 238void IMAPwrapper::listMessages(const QString&mailbox,QValueList<Opie::Core::OSmartPointer<RecMail> > &target , int maxSizeInKb)
237{ 239{
238 240
239 int tryAgain = 1; 241 int tryAgain = 1;
240 while ( tryAgain >= 0 ) { 242 while ( tryAgain >= 0 ) {
241 int err = MAILIMAP_NO_ERROR; 243 int err = MAILIMAP_NO_ERROR;
242 clist *result = 0; 244 clist *result = 0;
243 clistcell *current; 245 clistcell *current;
244 mailimap_fetch_type *fetchType = 0; 246 mailimap_fetch_type *fetchType = 0;
245 mailimap_set *set = 0; 247 mailimap_set *set = 0;
246 248
247 login(); 249 login();
248 if (!m_imap) { 250 if (!m_imap) {
249 return; 251 return;
250 } 252 }
251 /* select mailbox READONLY for operations */ 253 /* select mailbox READONLY for operations */
252 err = selectMbox(mailbox); 254 err = selectMbox(mailbox);
253 if ( err != MAILIMAP_NO_ERROR ) { 255 if ( err != MAILIMAP_NO_ERROR ) {
254 return; 256 return;
255 } 257 }
256 258
257 int last = m_imap->imap_selection_info->sel_exists; 259 int last = m_imap->imap_selection_info->sel_exists;
258 260
259 if (last == 0) { 261 if (last == 0) {
260 Global::statusMessage(i18n("Mailbox has no mails")); 262 Global::statusMessage(i18n("Mailbox has no mails"));
261 return; 263 return;
262 } else { 264 } else {
263 } 265 }
264 progress( i18n("Fetch ")); 266 progress( i18n("Fetch "));
265 mMax = last; 267 mMax = last;
266 //qDebug("last %d ", last); 268 //qDebug("last %d ", last);
267 Global::statusMessage(i18n("Fetching header list")); 269 Global::statusMessage(i18n("Fetching header list"));
268 qApp->processEvents(); 270 qApp->processEvents();
269 /* the range has to start at 1!!! not with 0!!!! */ 271 /* the range has to start at 1!!! not with 0!!!! */
270 //LR the access to web.de imap server is no working with value 1 272 //LR the access to web.de imap server is no working with value 1
271 //qDebug("interval %d - %d ", tryAgain, last-1+tryAgain ); 273 //qDebug("interval %d - %d ", tryAgain, last-1+tryAgain );
272 set = mailimap_set_new_interval( tryAgain, last ); 274 set = mailimap_set_new_interval( tryAgain, last );
273 fetchType = mailimap_fetch_type_new_fetch_att_list_empty(); 275 fetchType = mailimap_fetch_type_new_fetch_att_list_empty();
274 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_envelope()); 276 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_envelope());
275 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_flags()); 277 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_flags());
276 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_internaldate()); 278 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_internaldate());
277 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_rfc822_size()); 279 mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_rfc822_size());
278 280
279 err = mailimap_fetch( m_imap, set, fetchType, &result ); 281 err = mailimap_fetch( m_imap, set, fetchType, &result );
280 mailimap_set_free( set ); 282 mailimap_set_free( set );
281 mailimap_fetch_type_free( fetchType ); 283 mailimap_fetch_type_free( fetchType );
282 284
283 QString date,subject,from; 285 QString date,subject,from;
284 286
285 if ( err == MAILIMAP_NO_ERROR ) { 287 if ( err == MAILIMAP_NO_ERROR ) {
286 tryAgain = -1; 288 tryAgain = -1;
287 mailimap_msg_att * msg_att; 289 mailimap_msg_att * msg_att;
288 int i = 0; 290 int i = 0;
289 for (current = clist_begin(result); current != 0; current=clist_next(current)) { 291 for (current = clist_begin(result); current != 0; current=clist_next(current)) {
290 ++i; 292 ++i;
291 //qDebug("iii %d ",i); 293 //qDebug("iii %d ",i);
292 msg_att = (mailimap_msg_att*)current->data; 294 msg_att = (mailimap_msg_att*)current->data;
293 RecMail*m = parse_list_result(msg_att); 295 RecMail*m = parse_list_result(msg_att);
294 if (m) { 296 if (m) {
295 if ( maxSizeInKb == 0 || m->Msgsize()<=(unsigned int ) maxSizeInKb*1024 ) { 297 if ( maxSizeInKb == 0 || m->Msgsize()<=(unsigned int ) maxSizeInKb*1024 ) {
296 m->setNumber(i); 298 m->setNumber(i);
297 m->setMbox(mailbox); 299 m->setMbox(mailbox);
298 m->setWrapper(this); 300 m->setWrapper(this);
299 target.append(m); 301 target.append(m);
300 } 302 }
301 } 303 }
302 } 304 }
303 Global::statusMessage(i18n("Mailbox has %1 mails").arg(target.count())); 305 Global::statusMessage(i18n("Mailbox has %1 mails").arg(target.count()));
304 } else { 306 } else {
305 --tryAgain; 307 --tryAgain;
306 --tryAgain;//disabled tryagain by adding this line 308 --tryAgain;//disabled tryagain by adding this line
307 if ( tryAgain < 0 ) 309 if ( tryAgain < 0 )
308 Global::statusMessage(i18n("Error fetching headers: %1").arg(m_imap->imap_response)); 310 Global::statusMessage(i18n("Error fetching headers: %1").arg(m_imap->imap_response));
309 else 311 else
310 qDebug("try again... "); 312 qDebug("try again... ");
311 } 313 }
312 314
313 if (result) mailimap_fetch_list_free(result); 315 if (result) mailimap_fetch_list_free(result);
314 } 316 }
315} 317}
316 318
317QValueList<Opie::Core::OSmartPointer<Folder> >* IMAPwrapper::listFolders() 319QValueList<Opie::Core::OSmartPointer<Folder> >* IMAPwrapper::listFolders()
318{ 320{
319 const char *path, *mask; 321 const char *path, *mask;
320 int err = MAILIMAP_NO_ERROR; 322 int err = MAILIMAP_NO_ERROR;
321 clist *result = 0; 323 clist *result = 0;
322 clistcell *current = 0; 324 clistcell *current = 0;
323 clistcell*cur_flag = 0; 325 clistcell*cur_flag = 0;
324 mailimap_mbx_list_flags*bflags = 0; 326 mailimap_mbx_list_flags*bflags = 0;
325 327
326 QValueList<FolderP>* folders = new QValueList<FolderP>(); 328 QValueList<FolderP>* folders = new QValueList<FolderP>();
327 login(); 329 login();
328 if (!m_imap) { 330 if (!m_imap) {
329 return folders; 331 return folders;
330 } 332 }
331 333
332/* 334/*
333 * First we have to check for INBOX 'cause it sometimes it's not inside the path. 335 * First we have to check for INBOX 'cause it sometimes it's not inside the path.
334 * We must not forget to filter them out in next loop! 336 * We must not forget to filter them out in next loop!
335 * it seems like ugly code. and yes - it is ugly code. but the best way. 337 * it seems like ugly code. and yes - it is ugly code. but the best way.
336 */ 338 */
337 Global::statusMessage(i18n("Fetching folder list")); 339 Global::statusMessage(i18n("Fetching folder list"));
338 qApp->processEvents(); 340 qApp->processEvents();
339 QString temp; 341 QString temp;
340 mask = "INBOX" ; 342 mask = "INBOX" ;
341 mailimap_mailbox_list *list; 343 mailimap_mailbox_list *list;
342 err = mailimap_list( m_imap, (char*)"", (char*)mask, &result ); 344 err = mailimap_list( m_imap, (char*)"", (char*)mask, &result );
343 QString del; 345 QString del;
344 bool selectable = true; 346 bool selectable = true;
345 bool no_inferiors = false; 347 bool no_inferiors = false;
346 if ( err == MAILIMAP_NO_ERROR ) { 348 if ( err == MAILIMAP_NO_ERROR ) {
347 current = result->first; 349 current = result->first;
348 for ( int i = result->count; i > 0; i-- ) { 350 for ( int i = result->count; i > 0; i-- ) {
349 list = (mailimap_mailbox_list *) current->data; 351 list = (mailimap_mailbox_list *) current->data;
350 // it is better use the deep copy mechanism of qt itself 352 // it is better use the deep copy mechanism of qt itself
351 // instead of using strdup! 353 // instead of using strdup!
352 temp = list->mb_name; 354 temp = list->mb_name;
353 del = list->mb_delimiter; 355 del = list->mb_delimiter;
354 current = current->next; 356 current = current->next;
355 if ( (bflags = list->mb_flag) ) { 357 if ( (bflags = list->mb_flag) ) {
356 selectable = !(bflags->mbf_type==MAILIMAP_MBX_LIST_FLAGS_SFLAG&& 358 selectable = !(bflags->mbf_type==MAILIMAP_MBX_LIST_FLAGS_SFLAG&&
357 bflags->mbf_sflag==MAILIMAP_MBX_LIST_SFLAG_NOSELECT); 359 bflags->mbf_sflag==MAILIMAP_MBX_LIST_SFLAG_NOSELECT);
358 for(cur_flag=clist_begin(bflags->mbf_oflags);cur_flag;cur_flag=clist_next(cur_flag)) { 360 for(cur_flag=clist_begin(bflags->mbf_oflags);cur_flag;cur_flag=clist_next(cur_flag)) {
359 if ( ((mailimap_mbx_list_oflag*)cur_flag->data)->of_type==MAILIMAP_MBX_LIST_OFLAG_NOINFERIORS) { 361 if ( ((mailimap_mbx_list_oflag*)cur_flag->data)->of_type==MAILIMAP_MBX_LIST_OFLAG_NOINFERIORS) {
360 no_inferiors = true; 362 no_inferiors = true;
361 } 363 }
362 } 364 }
363 } 365 }
364 folders->append( new IMAPFolder(temp,del,selectable,no_inferiors,account->getPrefix())); 366 folders->append( new IMAPFolder(temp,del,selectable,no_inferiors,account->getPrefix()));
365 } 367 }
366 } else { 368 } else {
367 qDebug("error fetching folders: "); 369 qDebug("error fetching folders: ");
368 370
369 } 371 }
370 mailimap_list_result_free( result ); 372 mailimap_list_result_free( result );
371 373
372/* 374/*
373 * second stage - get the other then inbox folders 375 * second stage - get the other then inbox folders
374 */ 376 */
375 mask = "*" ; 377 mask = "*" ;
376 path = account->getPrefix().latin1(); 378 path = account->getPrefix().latin1();
377 if (!path) path = ""; 379 if (!path) path = "";
378 err = mailimap_list( m_imap, (char*)path, (char*)mask, &result ); 380 err = mailimap_list( m_imap, (char*)path, (char*)mask, &result );
379 if ( err == MAILIMAP_NO_ERROR ) { 381 if ( err == MAILIMAP_NO_ERROR ) {
380 current = result->first; 382 current = result->first;
381 for ( current=clist_begin(result);current!=NULL;current=clist_next(current)) { 383 for ( current=clist_begin(result);current!=NULL;current=clist_next(current)) {
382 no_inferiors = false; 384 no_inferiors = false;
383 list = (mailimap_mailbox_list *) current->data; 385 list = (mailimap_mailbox_list *) current->data;
384 // it is better use the deep copy mechanism of qt itself 386 // it is better use the deep copy mechanism of qt itself
385 // instead of using strdup! 387 // instead of using strdup!
386 temp = list->mb_name; 388 temp = list->mb_name;
387 if (temp.lower()=="inbox") 389 if (temp.lower()=="inbox")
388 continue; 390 continue;
389 if (temp.lower()==account->getPrefix().lower()) 391 if (temp.lower()==account->getPrefix().lower())
390 continue; 392 continue;
391 if ( (bflags = list->mb_flag) ) { 393 if ( (bflags = list->mb_flag) ) {
392 selectable = !(bflags->mbf_type==MAILIMAP_MBX_LIST_FLAGS_SFLAG&& 394 selectable = !(bflags->mbf_type==MAILIMAP_MBX_LIST_FLAGS_SFLAG&&
393 bflags->mbf_sflag==MAILIMAP_MBX_LIST_SFLAG_NOSELECT); 395 bflags->mbf_sflag==MAILIMAP_MBX_LIST_SFLAG_NOSELECT);
394 for(cur_flag=clist_begin(bflags->mbf_oflags);cur_flag;cur_flag=clist_next(cur_flag)) { 396 for(cur_flag=clist_begin(bflags->mbf_oflags);cur_flag;cur_flag=clist_next(cur_flag)) {
395 if ( ((mailimap_mbx_list_oflag*)cur_flag->data)->of_type==MAILIMAP_MBX_LIST_OFLAG_NOINFERIORS) { 397 if ( ((mailimap_mbx_list_oflag*)cur_flag->data)->of_type==MAILIMAP_MBX_LIST_OFLAG_NOINFERIORS) {
396 no_inferiors = true; 398 no_inferiors = true;
397 } 399 }
398 } 400 }
399 } 401 }
400 del = list->mb_delimiter; 402 del = list->mb_delimiter;
401 folders->append(new IMAPFolder(temp,del,selectable,no_inferiors,account->getPrefix())); 403 folders->append(new IMAPFolder(temp,del,selectable,no_inferiors,account->getPrefix()));
402 } 404 }
403 } else { 405 } else {
404 qDebug("error fetching folders "); 406 qDebug("error fetching folders ");
405 407
406 } 408 }
407 if (result) mailimap_list_result_free( result ); 409 if (result) mailimap_list_result_free( result );
408 return folders; 410 return folders;
409} 411}
410 412
411RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att) 413RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att)
412{ 414{
413 RecMail * m = 0; 415 RecMail * m = 0;
414 mailimap_msg_att_item *item=0; 416 mailimap_msg_att_item *item=0;
415 clistcell *current,*c,*cf; 417 clistcell *current,*c,*cf;
416 mailimap_msg_att_dynamic*flist; 418 mailimap_msg_att_dynamic*flist;
417 mailimap_flag_fetch*cflag; 419 mailimap_flag_fetch*cflag;
418 int size = 0; 420 int size = 0;
419 QBitArray mFlags(7); 421 QBitArray mFlags(7);
420 QStringList addresslist; 422 QStringList addresslist;
421 423
422 if (!m_att) { 424 if (!m_att) {
423 return m; 425 return m;
424 } 426 }
425 m = new RecMail(); 427 m = new RecMail();
426 for (c = clist_begin(m_att->att_list); c!=NULL;c=clist_next(c) ) { 428 for (c = clist_begin(m_att->att_list); c!=NULL;c=clist_next(c) ) {
427 current = c; 429 current = c;
428 size = 0; 430 size = 0;
429 item = (mailimap_msg_att_item*)current->data; 431 item = (mailimap_msg_att_item*)current->data;
430 if ( !item ) 432 if ( !item )
431 continue; 433 continue;
432 if (item->att_type!=MAILIMAP_MSG_ATT_ITEM_STATIC) { 434 if (item->att_type!=MAILIMAP_MSG_ATT_ITEM_STATIC) {
433 flist = (mailimap_msg_att_dynamic*)item->att_data.att_dyn; 435 flist = (mailimap_msg_att_dynamic*)item->att_data.att_dyn;
434 if (!flist || !flist->att_list) { 436 if (!flist || !flist->att_list) {
435 continue; 437 continue;
436 } 438 }
437 cf = flist->att_list->first; 439 cf = flist->att_list->first;
438 if( ! cf ) 440 if( ! cf )
439 for (cf = clist_begin(flist->att_list); cf!=NULL; cf = clist_next(cf)) { 441 for (cf = clist_begin(flist->att_list); cf!=NULL; cf = clist_next(cf)) {
440 cflag = (mailimap_flag_fetch*)cf->data; 442 cflag = (mailimap_flag_fetch*)cf->data;
441 if( ! cflag ) 443 if( ! cflag )
442 qDebug("imap:not cflag "); 444 qDebug("imap:not cflag ");
443 if (cflag->fl_type==MAILIMAP_FLAG_FETCH_OTHER && cflag->fl_flag!=0) { 445 if (cflag->fl_type==MAILIMAP_FLAG_FETCH_OTHER && cflag->fl_flag!=0) {
444 switch (cflag->fl_flag->fl_type) { 446 switch (cflag->fl_flag->fl_type) {
445 case MAILIMAP_FLAG_ANSWERED: /* \Answered flag */ 447 case MAILIMAP_FLAG_ANSWERED: /* \Answered flag */
446 mFlags.setBit(FLAG_ANSWERED); 448 mFlags.setBit(FLAG_ANSWERED);
447 break; 449 break;
448 case MAILIMAP_FLAG_FLAGGED: /* \Flagged flag */ 450 case MAILIMAP_FLAG_FLAGGED: /* \Flagged flag */
449 mFlags.setBit(FLAG_FLAGGED); 451 mFlags.setBit(FLAG_FLAGGED);
450 break; 452 break;
451 case MAILIMAP_FLAG_DELETED: /* \Deleted flag */ 453 case MAILIMAP_FLAG_DELETED: /* \Deleted flag */
452 mFlags.setBit(FLAG_DELETED); 454 mFlags.setBit(FLAG_DELETED);
453 break; 455 break;
454 case MAILIMAP_FLAG_SEEN: /* \Seen flag */ 456 case MAILIMAP_FLAG_SEEN: /* \Seen flag */
455 mFlags.setBit(FLAG_SEEN); 457 mFlags.setBit(FLAG_SEEN);
456 break; 458 break;
457 case MAILIMAP_FLAG_DRAFT: /* \Draft flag */ 459 case MAILIMAP_FLAG_DRAFT: /* \Draft flag */
458 mFlags.setBit(FLAG_DRAFT); 460 mFlags.setBit(FLAG_DRAFT);
459 break; 461 break;
460 case MAILIMAP_FLAG_KEYWORD: /* keyword flag */ 462 case MAILIMAP_FLAG_KEYWORD: /* keyword flag */
461 break; 463 break;
462 case MAILIMAP_FLAG_EXTENSION: /* \extension flag */ 464 case MAILIMAP_FLAG_EXTENSION: /* \extension flag */
463 break; 465 break;
464 default: 466 default:
465 break; 467 break;
466 } 468 }
467 } else if (cflag->fl_type==MAILIMAP_FLAG_FETCH_RECENT) { 469 } else if (cflag->fl_type==MAILIMAP_FLAG_FETCH_RECENT) {
468 mFlags.setBit(FLAG_RECENT); 470 mFlags.setBit(FLAG_RECENT);
469 } 471 }
470 } 472 }
471 continue; 473 continue;
472 } 474 }
473 if ( item->att_data.att_static == NULL ) 475 if ( item->att_data.att_static == NULL )
474 continue; 476 continue;
475 if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_ENVELOPE) { 477 if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_ENVELOPE) {
476 mailimap_envelope * head = item->att_data.att_static->att_data.att_env; 478 mailimap_envelope * head = item->att_data.att_static->att_data.att_env;
477 if ( head == NULL ) 479 if ( head == NULL )
478 continue; 480 continue;
479 if ( head->env_date != NULL ) { 481 if ( head->env_date != NULL ) {
480 m->setDate(head->env_date); 482 m->setDate(head->env_date);
481 //struct mailimf_date_time result; 483 //struct mailimf_date_time result;
482 struct mailimf_date_time* date;// = &result; 484 struct mailimf_date_time* date;// = &result;
483 struct mailimf_date_time **re = &date; 485 struct mailimf_date_time **re = &date;
484 size_t length = m->getDate().length(); 486 size_t length = m->getDate().length();
485 size_t index = 0; 487 size_t index = 0;
486 if ( mailimf_date_time_parse(head->env_date, length,&index, re ) == MAILIMF_NO_ERROR ) { 488 if ( mailimf_date_time_parse(head->env_date, length,&index, re ) == MAILIMF_NO_ERROR ) {
487 QDateTime dt = Genericwrapper::parseDateTime( date ); 489 QDateTime dt = Genericwrapper::parseDateTime( date );
488 QString ret; 490 QString ret;
489 if ( dt.date() == QDate::currentDate () ) 491 if ( dt.date() == QDate::currentDate () )
490 ret = KGlobal::locale()->formatTime( dt.time(),true); 492 ret = KGlobal::locale()->formatTime( dt.time(),true);
491 else { 493 else {
492 ret = KGlobal::locale()->formatDateTime( dt,true,true); 494 ret = KGlobal::locale()->formatDateTime( dt,true,true);
493 } 495 }
494 m->setDate( ret ); 496 m->setDate( ret );
495 char tmp[20]; 497 char tmp[20];
496 snprintf( tmp, 20, "%04i-%02i-%02i %02i:%02i:%02i", 498 snprintf( tmp, 20, "%04i-%02i-%02i %02i:%02i:%02i",
497 dt.date().year(),dt.date().month(), dt.date().day(), dt.time().hour(), dt.time().minute(), dt.time().second() ); 499 dt.date().year(),dt.date().month(), dt.date().day(), dt.time().hour(), dt.time().minute(), dt.time().second() );
498 //qDebug("%d iso %s %s ", date->dt_zone, tmp, head->env_date); 500 //qDebug("%d iso %s %s ", date->dt_zone, tmp, head->env_date);
499 m->setIsoDate( QString( tmp ) ); 501 m->setIsoDate( QString( tmp ) );
500 mailimf_date_time_free ( date ); 502 mailimf_date_time_free ( date );
501 } else { 503 } else {
502 m->setIsoDate(head->env_date); 504 m->setIsoDate(head->env_date);
503 } 505 }
504 } 506 }
505 if ( head->env_subject != NULL ) 507 if ( head->env_subject != NULL )
506 m->setSubject(convert_String((const char*)head->env_subject)); 508 m->setSubject(convert_String((const char*)head->env_subject));
507 //m->setSubject(head->env_subject); 509 //m->setSubject(head->env_subject);
508 if (head->env_from!=NULL) { 510 if (head->env_from!=NULL) {
509 addresslist = address_list_to_stringlist(head->env_from->frm_list); 511 addresslist = address_list_to_stringlist(head->env_from->frm_list);
510 if (addresslist.count()) { 512 if (addresslist.count()) {
511 m->setFrom(addresslist.first()); 513 m->setFrom(addresslist.first());
512 } 514 }
513 } 515 }
514 if (head->env_to!=NULL) { 516 if (head->env_to!=NULL) {
515 addresslist = address_list_to_stringlist(head->env_to->to_list); 517 addresslist = address_list_to_stringlist(head->env_to->to_list);
516 m->setTo(addresslist); 518 m->setTo(addresslist);
517 } 519 }
518 if (head->env_cc!=NULL) { 520 if (head->env_cc!=NULL) {
519 addresslist = address_list_to_stringlist(head->env_cc->cc_list); 521 addresslist = address_list_to_stringlist(head->env_cc->cc_list);
520 m->setCC(addresslist); 522 m->setCC(addresslist);
521 } 523 }
522 if (head->env_bcc!=NULL) { 524 if (head->env_bcc!=NULL) {
523 addresslist = address_list_to_stringlist(head->env_bcc->bcc_list); 525 addresslist = address_list_to_stringlist(head->env_bcc->bcc_list);
524 m->setBcc(addresslist); 526 m->setBcc(addresslist);
525 } 527 }
526 /* reply to address, eg. email. */ 528 /* reply to address, eg. email. */
527 if (head->env_reply_to!=NULL) { 529 if (head->env_reply_to!=NULL) {
528 addresslist = address_list_to_stringlist(head->env_reply_to->rt_list); 530 addresslist = address_list_to_stringlist(head->env_reply_to->rt_list);
529 if (addresslist.count()) { 531 if (addresslist.count()) {
530 m->setReplyto(addresslist.first()); 532 m->setReplyto(addresslist.first());
531 } 533 }
532 } 534 }
533 if (head->env_in_reply_to!=NULL) { 535 if (head->env_in_reply_to!=NULL) {
534 QString h(head->env_in_reply_to); 536 QString h(head->env_in_reply_to);
535 while (h.length()>0 && h[0]=='<') { 537 while (h.length()>0 && h[0]=='<') {
536 h.remove(0,1); 538 h.remove(0,1);
537 } 539 }
538 while (h.length()>0 && h[h.length()-1]=='>') { 540 while (h.length()>0 && h[h.length()-1]=='>') {
539 h.remove(h.length()-1,1); 541 h.remove(h.length()-1,1);
540 } 542 }
541 if (h.length()>0) { 543 if (h.length()>0) {
542 m->setInreply(QStringList(h)); 544 m->setInreply(QStringList(h));
543 } 545 }
544 } 546 }
545 if (head->env_message_id != NULL) { 547 if (head->env_message_id != NULL) {
546 m->setMsgid(QString(head->env_message_id)); 548 m->setMsgid(QString(head->env_message_id));
547 } 549 }
548 } else if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_INTERNALDATE) { 550 } else if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_INTERNALDATE) {
549#if 0 551#if 0
550 mailimap_date_time*d = item->att_data.att_static->att_data.att_internal_date; 552 mailimap_date_time*d = item->att_data.att_static->att_data.att_internal_date;
551 QDateTime da(QDate(d->dt_year,d->dt_month,d->dt_day),QTime(d->dt_hour,d->dt_min,d->dt_sec)); 553 QDateTime da(QDate(d->dt_year,d->dt_month,d->dt_day),QTime(d->dt_hour,d->dt_min,d->dt_sec));
552 qDebug("time %s ",da.toString().latin1() ); 554 qDebug("time %s ",da.toString().latin1() );
553#endif 555#endif
554 } else if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_RFC822_SIZE) { 556 } else if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_RFC822_SIZE) {
555 size = item->att_data.att_static->att_data.att_rfc822_size; 557 size = item->att_data.att_static->att_data.att_rfc822_size;
556 } 558 }
557 } 559 }
558 /* msg is already deleted */ 560 /* msg is already deleted */
559 if (mFlags.testBit(FLAG_DELETED) && m) { 561 if (mFlags.testBit(FLAG_DELETED) && m) {
560 delete m; 562 delete m;
561 m = 0; 563 m = 0;