author | jgf <jgf> | 2003-12-18 16:02:47 (UTC) |
---|---|---|
committer | jgf <jgf> | 2003-12-18 16:02:47 (UTC) |
commit | 5b88f5d05b2f3f5d106b58b07bc7018f757cfc03 (patch) (unidiff) | |
tree | 27f8a7ccb9dd659ea8484cb12c0e3dc3c3c99252 | |
parent | 5cb08b0c69ffc7216405b552e17ff0541578bda0 (diff) | |
download | opie-5b88f5d05b2f3f5d106b58b07bc7018f757cfc03.zip opie-5b88f5d05b2f3f5d106b58b07bc7018f757cfc03.tar.gz opie-5b88f5d05b2f3f5d106b58b07bc7018f757cfc03.tar.bz2 |
ask for user/password if field is empty
-rw-r--r-- | noncore/net/mail/imapwrapper.cpp | 19 | ||||
-rw-r--r-- | noncore/net/mail/libmailwrapper/imapwrapper.cpp | 19 | ||||
-rw-r--r-- | noncore/net/mail/libmailwrapper/pop3wrapper.cpp | 20 | ||||
-rw-r--r-- | noncore/net/mail/pop3wrapper.cpp | 20 |
4 files changed, 70 insertions, 8 deletions
diff --git a/noncore/net/mail/imapwrapper.cpp b/noncore/net/mail/imapwrapper.cpp index 838300a..cce3d34 100644 --- a/noncore/net/mail/imapwrapper.cpp +++ b/noncore/net/mail/imapwrapper.cpp | |||
@@ -1,296 +1,311 @@ | |||
1 | 1 | ||
2 | #include <stdlib.h> | 2 | #include <stdlib.h> |
3 | 3 | ||
4 | #include "imapwrapper.h" | 4 | #include "imapwrapper.h" |
5 | #include "mailtypes.h" | 5 | #include "mailtypes.h" |
6 | #include "logindialog.h" | ||
6 | #include <libetpan/mailimap.h> | 7 | #include <libetpan/mailimap.h> |
7 | 8 | ||
8 | IMAPwrapper::IMAPwrapper( IMAPaccount *a ) | 9 | IMAPwrapper::IMAPwrapper( IMAPaccount *a ) |
9 | : AbstractMail() | 10 | : AbstractMail() |
10 | { | 11 | { |
11 | account = a; | 12 | account = a; |
12 | m_imap = 0; | 13 | m_imap = 0; |
13 | } | 14 | } |
14 | 15 | ||
15 | IMAPwrapper::~IMAPwrapper() | 16 | IMAPwrapper::~IMAPwrapper() |
16 | { | 17 | { |
17 | logout(); | 18 | logout(); |
18 | } | 19 | } |
19 | 20 | ||
20 | void IMAPwrapper::imap_progress( size_t current, size_t maximum ) | 21 | void IMAPwrapper::imap_progress( size_t current, size_t maximum ) |
21 | { | 22 | { |
22 | qDebug( "IMAP: %i of %i", current, maximum ); | 23 | qDebug( "IMAP: %i of %i", current, maximum ); |
23 | } | 24 | } |
24 | 25 | ||
25 | void IMAPwrapper::login() | 26 | void IMAPwrapper::login() |
26 | { | 27 | { |
27 | const char *server, *user, *pass; | 28 | const char *server, *user, *pass; |
28 | uint16_t port; | 29 | uint16_t port; |
29 | int err = MAILIMAP_NO_ERROR; | 30 | int err = MAILIMAP_NO_ERROR; |
30 | 31 | ||
31 | /* we are connected this moment */ | 32 | /* we are connected this moment */ |
32 | /* 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 */ |
33 | if (m_imap) { | 34 | if (m_imap) { |
34 | mailstream_flush(m_imap->imap_stream); | 35 | mailstream_flush(m_imap->imap_stream); |
35 | return; | 36 | return; |
36 | } | 37 | } |
37 | server = account->getServer().latin1(); | 38 | server = account->getServer().latin1(); |
38 | port = account->getPort().toUInt(); | 39 | port = account->getPort().toUInt(); |
39 | user = account->getUser().latin1(); | 40 | if ( account->getUser().isEmpty() || account->getPassword().isEmpty() ) { |
40 | pass = account->getPassword().latin1(); | 41 | LoginDialog login( account->getUser(), account->getPassword(), NULL, 0, true ); |
42 | login.show(); | ||
43 | if ( QDialog::Accepted == login.exec() ) { | ||
44 | // ok | ||
45 | user = strdup( login.getUser().latin1() ); | ||
46 | pass = strdup( login.getPassword().latin1() ); | ||
47 | } else { | ||
48 | // cancel | ||
49 | qDebug( "IMAP: Login canceled" ); | ||
50 | return; | ||
51 | } | ||
52 | } else { | ||
53 | user = account->getUser().latin1(); | ||
54 | pass = account->getPassword().latin1(); | ||
55 | } | ||
41 | 56 | ||
42 | m_imap = mailimap_new( 20, &imap_progress ); | 57 | m_imap = mailimap_new( 20, &imap_progress ); |
43 | /* connect */ | 58 | /* connect */ |
44 | if (account->getSSL()) { | 59 | if (account->getSSL()) { |
45 | err = mailimap_ssl_connect( m_imap, (char*)server, port ); | 60 | err = mailimap_ssl_connect( m_imap, (char*)server, port ); |
46 | } else { | 61 | } else { |
47 | err = mailimap_socket_connect( m_imap, (char*)server, port ); | 62 | err = mailimap_socket_connect( m_imap, (char*)server, port ); |
48 | } | 63 | } |
49 | 64 | ||
50 | if ( err != MAILIMAP_NO_ERROR && | 65 | if ( err != MAILIMAP_NO_ERROR && |
51 | err != MAILIMAP_NO_ERROR_AUTHENTICATED && | 66 | err != MAILIMAP_NO_ERROR_AUTHENTICATED && |
52 | err != MAILIMAP_NO_ERROR_NON_AUTHENTICATED ) { | 67 | err != MAILIMAP_NO_ERROR_NON_AUTHENTICATED ) { |
53 | qDebug("error connecting server: %s",m_imap->imap_response); | 68 | qDebug("error connecting server: %s",m_imap->imap_response); |
54 | mailimap_free( m_imap ); | 69 | mailimap_free( m_imap ); |
55 | m_imap = 0; | 70 | m_imap = 0; |
56 | return; | 71 | return; |
57 | } | 72 | } |
58 | 73 | ||
59 | /* login */ | 74 | /* login */ |
60 | err = mailimap_login_simple( m_imap, (char*)user, (char*)pass ); | 75 | err = mailimap_login_simple( m_imap, (char*)user, (char*)pass ); |
61 | if ( err != MAILIMAP_NO_ERROR ) { | 76 | if ( err != MAILIMAP_NO_ERROR ) { |
62 | qDebug("error logging in imap: %s",m_imap->imap_response); | 77 | qDebug("error logging in imap: %s",m_imap->imap_response); |
63 | err = mailimap_close( m_imap ); | 78 | err = mailimap_close( m_imap ); |
64 | mailimap_free( m_imap ); | 79 | mailimap_free( m_imap ); |
65 | m_imap = 0; | 80 | m_imap = 0; |
66 | } | 81 | } |
67 | } | 82 | } |
68 | 83 | ||
69 | void IMAPwrapper::logout() | 84 | void IMAPwrapper::logout() |
70 | { | 85 | { |
71 | int err = MAILIMAP_NO_ERROR; | 86 | int err = MAILIMAP_NO_ERROR; |
72 | if (!m_imap) return; | 87 | if (!m_imap) return; |
73 | err = mailimap_logout( m_imap ); | 88 | err = mailimap_logout( m_imap ); |
74 | err = mailimap_close( m_imap ); | 89 | err = mailimap_close( m_imap ); |
75 | mailimap_free( m_imap ); | 90 | mailimap_free( m_imap ); |
76 | m_imap = 0; | 91 | m_imap = 0; |
77 | } | 92 | } |
78 | 93 | ||
79 | void IMAPwrapper::listMessages(const QString&mailbox,QList<RecMail> &target ) | 94 | void IMAPwrapper::listMessages(const QString&mailbox,QList<RecMail> &target ) |
80 | { | 95 | { |
81 | const char *mb; | 96 | const char *mb; |
82 | int err = MAILIMAP_NO_ERROR; | 97 | int err = MAILIMAP_NO_ERROR; |
83 | clist *result; | 98 | clist *result; |
84 | clistcell *current; | 99 | clistcell *current; |
85 | // mailimap_fetch_att *fetchAtt,*fetchAttFlags,*fetchAttDate,*fetchAttSize; | 100 | // mailimap_fetch_att *fetchAtt,*fetchAttFlags,*fetchAttDate,*fetchAttSize; |
86 | mailimap_fetch_type *fetchType; | 101 | mailimap_fetch_type *fetchType; |
87 | mailimap_set *set; | 102 | mailimap_set *set; |
88 | 103 | ||
89 | mb = mailbox.latin1(); | 104 | mb = mailbox.latin1(); |
90 | login(); | 105 | login(); |
91 | if (!m_imap) { | 106 | if (!m_imap) { |
92 | return; | 107 | return; |
93 | } | 108 | } |
94 | /* select mailbox READONLY for operations */ | 109 | /* select mailbox READONLY for operations */ |
95 | err = mailimap_examine( m_imap, (char*)mb); | 110 | err = mailimap_examine( m_imap, (char*)mb); |
96 | if ( err != MAILIMAP_NO_ERROR ) { | 111 | if ( err != MAILIMAP_NO_ERROR ) { |
97 | qDebug("error selecting mailbox: %s",m_imap->imap_response); | 112 | qDebug("error selecting mailbox: %s",m_imap->imap_response); |
98 | return; | 113 | return; |
99 | } | 114 | } |
100 | 115 | ||
101 | int last = m_imap->imap_selection_info->sel_exists; | 116 | int last = m_imap->imap_selection_info->sel_exists; |
102 | 117 | ||
103 | if (last == 0) { | 118 | if (last == 0) { |
104 | qDebug("mailbox has no mails"); | 119 | qDebug("mailbox has no mails"); |
105 | return; | 120 | return; |
106 | } | 121 | } |
107 | 122 | ||
108 | result = clist_new(); | 123 | result = clist_new(); |
109 | /* the range has to start at 1!!! not with 0!!!! */ | 124 | /* the range has to start at 1!!! not with 0!!!! */ |
110 | set = mailimap_set_new_interval( 1, last ); | 125 | set = mailimap_set_new_interval( 1, last ); |
111 | fetchType = mailimap_fetch_type_new_fetch_att_list_empty(); | 126 | fetchType = mailimap_fetch_type_new_fetch_att_list_empty(); |
112 | mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_envelope()); | 127 | mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_envelope()); |
113 | mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_flags()); | 128 | mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_flags()); |
114 | mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_internaldate()); | 129 | mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_internaldate()); |
115 | mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_rfc822_size()); | 130 | mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_rfc822_size()); |
116 | 131 | ||
117 | err = mailimap_fetch( m_imap, set, fetchType, &result ); | 132 | err = mailimap_fetch( m_imap, set, fetchType, &result ); |
118 | mailimap_set_free( set ); | 133 | mailimap_set_free( set ); |
119 | mailimap_fetch_type_free( fetchType ); | 134 | mailimap_fetch_type_free( fetchType ); |
120 | 135 | ||
121 | QString date,subject,from; | 136 | QString date,subject,from; |
122 | 137 | ||
123 | if ( err == MAILIMAP_NO_ERROR ) { | 138 | if ( err == MAILIMAP_NO_ERROR ) { |
124 | 139 | ||
125 | mailimap_msg_att * msg_att; | 140 | mailimap_msg_att * msg_att; |
126 | int i = 0; | 141 | int i = 0; |
127 | for (current = clist_begin(result); current != 0; current=clist_next(current)) { | 142 | for (current = clist_begin(result); current != 0; current=clist_next(current)) { |
128 | ++i; | 143 | ++i; |
129 | msg_att = (mailimap_msg_att*)current->data; | 144 | msg_att = (mailimap_msg_att*)current->data; |
130 | RecMail*m = parse_list_result(msg_att); | 145 | RecMail*m = parse_list_result(msg_att); |
131 | if (m) { | 146 | if (m) { |
132 | m->setNumber(i); | 147 | m->setNumber(i); |
133 | m->setMbox(mailbox); | 148 | m->setMbox(mailbox); |
134 | m->setWrapper(this); | 149 | m->setWrapper(this); |
135 | target.append(m); | 150 | target.append(m); |
136 | } | 151 | } |
137 | } | 152 | } |
138 | } else { | 153 | } else { |
139 | qDebug("Error fetching headers: %s",m_imap->imap_response); | 154 | qDebug("Error fetching headers: %s",m_imap->imap_response); |
140 | } | 155 | } |
141 | mailimap_fetch_list_free(result); | 156 | mailimap_fetch_list_free(result); |
142 | } | 157 | } |
143 | 158 | ||
144 | QList<Folder>* IMAPwrapper::listFolders() | 159 | QList<Folder>* IMAPwrapper::listFolders() |
145 | { | 160 | { |
146 | const char *path, *mask; | 161 | const char *path, *mask; |
147 | int err = MAILIMAP_NO_ERROR; | 162 | int err = MAILIMAP_NO_ERROR; |
148 | clist *result; | 163 | clist *result; |
149 | clistcell *current; | 164 | clistcell *current; |
150 | 165 | ||
151 | QList<Folder> * folders = new QList<Folder>(); | 166 | QList<Folder> * folders = new QList<Folder>(); |
152 | folders->setAutoDelete( false ); | 167 | folders->setAutoDelete( false ); |
153 | login(); | 168 | login(); |
154 | if (!m_imap) { | 169 | if (!m_imap) { |
155 | return folders; | 170 | return folders; |
156 | } | 171 | } |
157 | 172 | ||
158 | /* | 173 | /* |
159 | * First we have to check for INBOX 'cause it sometimes it's not inside the path. | 174 | * First we have to check for INBOX 'cause it sometimes it's not inside the path. |
160 | * We must not forget to filter them out in next loop! | 175 | * We must not forget to filter them out in next loop! |
161 | * it seems like ugly code. and yes - it is ugly code. but the best way. | 176 | * it seems like ugly code. and yes - it is ugly code. but the best way. |
162 | */ | 177 | */ |
163 | QString temp; | 178 | QString temp; |
164 | mask = "INBOX" ; | 179 | mask = "INBOX" ; |
165 | result = clist_new(); | 180 | result = clist_new(); |
166 | mailimap_mailbox_list *list; | 181 | mailimap_mailbox_list *list; |
167 | err = mailimap_list( m_imap, (char*)"", (char*)mask, &result ); | 182 | err = mailimap_list( m_imap, (char*)"", (char*)mask, &result ); |
168 | QString del; | 183 | QString del; |
169 | if ( err == MAILIMAP_NO_ERROR ) { | 184 | if ( err == MAILIMAP_NO_ERROR ) { |
170 | current = result->first; | 185 | current = result->first; |
171 | for ( int i = result->count; i > 0; i-- ) { | 186 | for ( int i = result->count; i > 0; i-- ) { |
172 | list = (mailimap_mailbox_list *) current->data; | 187 | list = (mailimap_mailbox_list *) current->data; |
173 | // it is better use the deep copy mechanism of qt itself | 188 | // it is better use the deep copy mechanism of qt itself |
174 | // instead of using strdup! | 189 | // instead of using strdup! |
175 | temp = list->mb_name; | 190 | temp = list->mb_name; |
176 | del = list->mb_delimiter; | 191 | del = list->mb_delimiter; |
177 | folders->append( new IMAPFolder(temp,del,true,account->getPrefix())); | 192 | folders->append( new IMAPFolder(temp,del,true,account->getPrefix())); |
178 | current = current->next; | 193 | current = current->next; |
179 | } | 194 | } |
180 | } else { | 195 | } else { |
181 | qDebug("error fetching folders: %s",m_imap->imap_response); | 196 | qDebug("error fetching folders: %s",m_imap->imap_response); |
182 | } | 197 | } |
183 | mailimap_list_result_free( result ); | 198 | mailimap_list_result_free( result ); |
184 | 199 | ||
185 | /* | 200 | /* |
186 | * second stage - get the other then inbox folders | 201 | * second stage - get the other then inbox folders |
187 | */ | 202 | */ |
188 | mask = "*" ; | 203 | mask = "*" ; |
189 | path = account->getPrefix().latin1(); | 204 | path = account->getPrefix().latin1(); |
190 | if (!path) path = ""; | 205 | if (!path) path = ""; |
191 | result = clist_new(); | 206 | result = clist_new(); |
192 | qDebug(path); | 207 | qDebug(path); |
193 | bool selectable = true; | 208 | bool selectable = true; |
194 | mailimap_mbx_list_flags*bflags; | 209 | mailimap_mbx_list_flags*bflags; |
195 | err = mailimap_list( m_imap, (char*)path, (char*)mask, &result ); | 210 | err = mailimap_list( m_imap, (char*)path, (char*)mask, &result ); |
196 | if ( err == MAILIMAP_NO_ERROR ) { | 211 | if ( err == MAILIMAP_NO_ERROR ) { |
197 | current = result->first; | 212 | current = result->first; |
198 | for ( current=clist_begin(result);current!=NULL;current=clist_next(current)) { | 213 | for ( current=clist_begin(result);current!=NULL;current=clist_next(current)) { |
199 | list = (mailimap_mailbox_list *) current->data; | 214 | list = (mailimap_mailbox_list *) current->data; |
200 | // it is better use the deep copy mechanism of qt itself | 215 | // it is better use the deep copy mechanism of qt itself |
201 | // instead of using strdup! | 216 | // instead of using strdup! |
202 | temp = list->mb_name; | 217 | temp = list->mb_name; |
203 | if (temp.lower()=="inbox") | 218 | if (temp.lower()=="inbox") |
204 | continue; | 219 | continue; |
205 | if (temp.lower()==account->getPrefix().lower()) | 220 | if (temp.lower()==account->getPrefix().lower()) |
206 | continue; | 221 | continue; |
207 | if ( (bflags = list->mb_flag) ) { | 222 | if ( (bflags = list->mb_flag) ) { |
208 | selectable = !(bflags->mbf_type==MAILIMAP_MBX_LIST_FLAGS_SFLAG&& | 223 | selectable = !(bflags->mbf_type==MAILIMAP_MBX_LIST_FLAGS_SFLAG&& |
209 | bflags->mbf_sflag==MAILIMAP_MBX_LIST_SFLAG_NOSELECT); | 224 | bflags->mbf_sflag==MAILIMAP_MBX_LIST_SFLAG_NOSELECT); |
210 | } | 225 | } |
211 | del = list->mb_delimiter; | 226 | del = list->mb_delimiter; |
212 | folders->append(new IMAPFolder(temp,del,selectable,account->getPrefix())); | 227 | folders->append(new IMAPFolder(temp,del,selectable,account->getPrefix())); |
213 | } | 228 | } |
214 | } else { | 229 | } else { |
215 | qDebug("error fetching folders %s",m_imap->imap_response); | 230 | qDebug("error fetching folders %s",m_imap->imap_response); |
216 | } | 231 | } |
217 | mailimap_list_result_free( result ); | 232 | mailimap_list_result_free( result ); |
218 | return folders; | 233 | return folders; |
219 | } | 234 | } |
220 | 235 | ||
221 | RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att) | 236 | RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att) |
222 | { | 237 | { |
223 | RecMail * m = 0; | 238 | RecMail * m = 0; |
224 | mailimap_msg_att_item *item=0; | 239 | mailimap_msg_att_item *item=0; |
225 | clistcell *current,*c,*cf; | 240 | clistcell *current,*c,*cf; |
226 | mailimap_msg_att_dynamic*flist; | 241 | mailimap_msg_att_dynamic*flist; |
227 | mailimap_flag_fetch*cflag; | 242 | mailimap_flag_fetch*cflag; |
228 | int size; | 243 | int size; |
229 | QBitArray mFlags(7); | 244 | QBitArray mFlags(7); |
230 | QStringList addresslist; | 245 | QStringList addresslist; |
231 | 246 | ||
232 | if (!m_att) { | 247 | if (!m_att) { |
233 | return m; | 248 | return m; |
234 | } | 249 | } |
235 | m = new RecMail(); | 250 | m = new RecMail(); |
236 | for (c = clist_begin(m_att->att_list); c!=NULL;c=clist_next(c) ) { | 251 | for (c = clist_begin(m_att->att_list); c!=NULL;c=clist_next(c) ) { |
237 | current = c; | 252 | current = c; |
238 | size = 0; | 253 | size = 0; |
239 | item = (mailimap_msg_att_item*)current->data; | 254 | item = (mailimap_msg_att_item*)current->data; |
240 | if (item->att_type!=MAILIMAP_MSG_ATT_ITEM_STATIC) { | 255 | if (item->att_type!=MAILIMAP_MSG_ATT_ITEM_STATIC) { |
241 | flist = (mailimap_msg_att_dynamic*)item->att_data.att_dyn; | 256 | flist = (mailimap_msg_att_dynamic*)item->att_data.att_dyn; |
242 | if (!flist->att_list) { | 257 | if (!flist->att_list) { |
243 | continue; | 258 | continue; |
244 | } | 259 | } |
245 | cf = flist->att_list->first; | 260 | cf = flist->att_list->first; |
246 | for (cf = clist_begin(flist->att_list); cf!=NULL; cf = clist_next(cf)) { | 261 | for (cf = clist_begin(flist->att_list); cf!=NULL; cf = clist_next(cf)) { |
247 | cflag = (mailimap_flag_fetch*)cf->data; | 262 | cflag = (mailimap_flag_fetch*)cf->data; |
248 | if (cflag->fl_type==MAILIMAP_FLAG_FETCH_OTHER && cflag->fl_flag!=0) { | 263 | if (cflag->fl_type==MAILIMAP_FLAG_FETCH_OTHER && cflag->fl_flag!=0) { |
249 | switch (cflag->fl_flag->fl_type) { | 264 | switch (cflag->fl_flag->fl_type) { |
250 | case MAILIMAP_FLAG_ANSWERED: /* \Answered flag */ | 265 | case MAILIMAP_FLAG_ANSWERED: /* \Answered flag */ |
251 | mFlags.setBit(FLAG_ANSWERED); | 266 | mFlags.setBit(FLAG_ANSWERED); |
252 | break; | 267 | break; |
253 | case MAILIMAP_FLAG_FLAGGED: /* \Flagged flag */ | 268 | case MAILIMAP_FLAG_FLAGGED: /* \Flagged flag */ |
254 | mFlags.setBit(FLAG_FLAGGED); | 269 | mFlags.setBit(FLAG_FLAGGED); |
255 | break; | 270 | break; |
256 | case MAILIMAP_FLAG_DELETED: /* \Deleted flag */ | 271 | case MAILIMAP_FLAG_DELETED: /* \Deleted flag */ |
257 | mFlags.setBit(FLAG_DELETED); | 272 | mFlags.setBit(FLAG_DELETED); |
258 | break; | 273 | break; |
259 | case MAILIMAP_FLAG_SEEN: /* \Seen flag */ | 274 | case MAILIMAP_FLAG_SEEN: /* \Seen flag */ |
260 | mFlags.setBit(FLAG_SEEN); | 275 | mFlags.setBit(FLAG_SEEN); |
261 | break; | 276 | break; |
262 | case MAILIMAP_FLAG_DRAFT: /* \Draft flag */ | 277 | case MAILIMAP_FLAG_DRAFT: /* \Draft flag */ |
263 | mFlags.setBit(FLAG_DRAFT); | 278 | mFlags.setBit(FLAG_DRAFT); |
264 | break; | 279 | break; |
265 | case MAILIMAP_FLAG_KEYWORD: /* keyword flag */ | 280 | case MAILIMAP_FLAG_KEYWORD: /* keyword flag */ |
266 | break; | 281 | break; |
267 | case MAILIMAP_FLAG_EXTENSION: /* \extension flag */ | 282 | case MAILIMAP_FLAG_EXTENSION: /* \extension flag */ |
268 | break; | 283 | break; |
269 | default: | 284 | default: |
270 | break; | 285 | break; |
271 | } | 286 | } |
272 | } else if (cflag->fl_type==MAILIMAP_FLAG_FETCH_RECENT) { | 287 | } else if (cflag->fl_type==MAILIMAP_FLAG_FETCH_RECENT) { |
273 | mFlags.setBit(FLAG_RECENT); | 288 | mFlags.setBit(FLAG_RECENT); |
274 | } | 289 | } |
275 | } | 290 | } |
276 | continue; | 291 | continue; |
277 | } | 292 | } |
278 | if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_ENVELOPE) { | 293 | if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_ENVELOPE) { |
279 | mailimap_envelope * head = item->att_data.att_static->att_data.att_env; | 294 | mailimap_envelope * head = item->att_data.att_static->att_data.att_env; |
280 | m->setDate(head->env_date); | 295 | m->setDate(head->env_date); |
281 | m->setSubject(convert_String((const char*)head->env_subject)); | 296 | m->setSubject(convert_String((const char*)head->env_subject)); |
282 | //m->setSubject(head->env_subject); | 297 | //m->setSubject(head->env_subject); |
283 | if (head->env_from!=NULL) { | 298 | if (head->env_from!=NULL) { |
284 | addresslist = address_list_to_stringlist(head->env_from->frm_list); | 299 | addresslist = address_list_to_stringlist(head->env_from->frm_list); |
285 | if (addresslist.count()) { | 300 | if (addresslist.count()) { |
286 | m->setFrom(addresslist.first()); | 301 | m->setFrom(addresslist.first()); |
287 | } | 302 | } |
288 | } | 303 | } |
289 | if (head->env_to!=NULL) { | 304 | if (head->env_to!=NULL) { |
290 | addresslist = address_list_to_stringlist(head->env_to->to_list); | 305 | addresslist = address_list_to_stringlist(head->env_to->to_list); |
291 | m->setTo(addresslist); | 306 | m->setTo(addresslist); |
292 | } | 307 | } |
293 | if (head->env_cc!=NULL) { | 308 | if (head->env_cc!=NULL) { |
294 | addresslist = address_list_to_stringlist(head->env_cc->cc_list); | 309 | addresslist = address_list_to_stringlist(head->env_cc->cc_list); |
295 | m->setCC(addresslist); | 310 | m->setCC(addresslist); |
296 | } | 311 | } |
diff --git a/noncore/net/mail/libmailwrapper/imapwrapper.cpp b/noncore/net/mail/libmailwrapper/imapwrapper.cpp index 838300a..cce3d34 100644 --- a/noncore/net/mail/libmailwrapper/imapwrapper.cpp +++ b/noncore/net/mail/libmailwrapper/imapwrapper.cpp | |||
@@ -1,296 +1,311 @@ | |||
1 | 1 | ||
2 | #include <stdlib.h> | 2 | #include <stdlib.h> |
3 | 3 | ||
4 | #include "imapwrapper.h" | 4 | #include "imapwrapper.h" |
5 | #include "mailtypes.h" | 5 | #include "mailtypes.h" |
6 | #include "logindialog.h" | ||
6 | #include <libetpan/mailimap.h> | 7 | #include <libetpan/mailimap.h> |
7 | 8 | ||
8 | IMAPwrapper::IMAPwrapper( IMAPaccount *a ) | 9 | IMAPwrapper::IMAPwrapper( IMAPaccount *a ) |
9 | : AbstractMail() | 10 | : AbstractMail() |
10 | { | 11 | { |
11 | account = a; | 12 | account = a; |
12 | m_imap = 0; | 13 | m_imap = 0; |
13 | } | 14 | } |
14 | 15 | ||
15 | IMAPwrapper::~IMAPwrapper() | 16 | IMAPwrapper::~IMAPwrapper() |
16 | { | 17 | { |
17 | logout(); | 18 | logout(); |
18 | } | 19 | } |
19 | 20 | ||
20 | void IMAPwrapper::imap_progress( size_t current, size_t maximum ) | 21 | void IMAPwrapper::imap_progress( size_t current, size_t maximum ) |
21 | { | 22 | { |
22 | qDebug( "IMAP: %i of %i", current, maximum ); | 23 | qDebug( "IMAP: %i of %i", current, maximum ); |
23 | } | 24 | } |
24 | 25 | ||
25 | void IMAPwrapper::login() | 26 | void IMAPwrapper::login() |
26 | { | 27 | { |
27 | const char *server, *user, *pass; | 28 | const char *server, *user, *pass; |
28 | uint16_t port; | 29 | uint16_t port; |
29 | int err = MAILIMAP_NO_ERROR; | 30 | int err = MAILIMAP_NO_ERROR; |
30 | 31 | ||
31 | /* we are connected this moment */ | 32 | /* we are connected this moment */ |
32 | /* 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 */ |
33 | if (m_imap) { | 34 | if (m_imap) { |
34 | mailstream_flush(m_imap->imap_stream); | 35 | mailstream_flush(m_imap->imap_stream); |
35 | return; | 36 | return; |
36 | } | 37 | } |
37 | server = account->getServer().latin1(); | 38 | server = account->getServer().latin1(); |
38 | port = account->getPort().toUInt(); | 39 | port = account->getPort().toUInt(); |
39 | user = account->getUser().latin1(); | 40 | if ( account->getUser().isEmpty() || account->getPassword().isEmpty() ) { |
40 | pass = account->getPassword().latin1(); | 41 | LoginDialog login( account->getUser(), account->getPassword(), NULL, 0, true ); |
42 | login.show(); | ||
43 | if ( QDialog::Accepted == login.exec() ) { | ||
44 | // ok | ||
45 | user = strdup( login.getUser().latin1() ); | ||
46 | pass = strdup( login.getPassword().latin1() ); | ||
47 | } else { | ||
48 | // cancel | ||
49 | qDebug( "IMAP: Login canceled" ); | ||
50 | return; | ||
51 | } | ||
52 | } else { | ||
53 | user = account->getUser().latin1(); | ||
54 | pass = account->getPassword().latin1(); | ||
55 | } | ||
41 | 56 | ||
42 | m_imap = mailimap_new( 20, &imap_progress ); | 57 | m_imap = mailimap_new( 20, &imap_progress ); |
43 | /* connect */ | 58 | /* connect */ |
44 | if (account->getSSL()) { | 59 | if (account->getSSL()) { |
45 | err = mailimap_ssl_connect( m_imap, (char*)server, port ); | 60 | err = mailimap_ssl_connect( m_imap, (char*)server, port ); |
46 | } else { | 61 | } else { |
47 | err = mailimap_socket_connect( m_imap, (char*)server, port ); | 62 | err = mailimap_socket_connect( m_imap, (char*)server, port ); |
48 | } | 63 | } |
49 | 64 | ||
50 | if ( err != MAILIMAP_NO_ERROR && | 65 | if ( err != MAILIMAP_NO_ERROR && |
51 | err != MAILIMAP_NO_ERROR_AUTHENTICATED && | 66 | err != MAILIMAP_NO_ERROR_AUTHENTICATED && |
52 | err != MAILIMAP_NO_ERROR_NON_AUTHENTICATED ) { | 67 | err != MAILIMAP_NO_ERROR_NON_AUTHENTICATED ) { |
53 | qDebug("error connecting server: %s",m_imap->imap_response); | 68 | qDebug("error connecting server: %s",m_imap->imap_response); |
54 | mailimap_free( m_imap ); | 69 | mailimap_free( m_imap ); |
55 | m_imap = 0; | 70 | m_imap = 0; |
56 | return; | 71 | return; |
57 | } | 72 | } |
58 | 73 | ||
59 | /* login */ | 74 | /* login */ |
60 | err = mailimap_login_simple( m_imap, (char*)user, (char*)pass ); | 75 | err = mailimap_login_simple( m_imap, (char*)user, (char*)pass ); |
61 | if ( err != MAILIMAP_NO_ERROR ) { | 76 | if ( err != MAILIMAP_NO_ERROR ) { |
62 | qDebug("error logging in imap: %s",m_imap->imap_response); | 77 | qDebug("error logging in imap: %s",m_imap->imap_response); |
63 | err = mailimap_close( m_imap ); | 78 | err = mailimap_close( m_imap ); |
64 | mailimap_free( m_imap ); | 79 | mailimap_free( m_imap ); |
65 | m_imap = 0; | 80 | m_imap = 0; |
66 | } | 81 | } |
67 | } | 82 | } |
68 | 83 | ||
69 | void IMAPwrapper::logout() | 84 | void IMAPwrapper::logout() |
70 | { | 85 | { |
71 | int err = MAILIMAP_NO_ERROR; | 86 | int err = MAILIMAP_NO_ERROR; |
72 | if (!m_imap) return; | 87 | if (!m_imap) return; |
73 | err = mailimap_logout( m_imap ); | 88 | err = mailimap_logout( m_imap ); |
74 | err = mailimap_close( m_imap ); | 89 | err = mailimap_close( m_imap ); |
75 | mailimap_free( m_imap ); | 90 | mailimap_free( m_imap ); |
76 | m_imap = 0; | 91 | m_imap = 0; |
77 | } | 92 | } |
78 | 93 | ||
79 | void IMAPwrapper::listMessages(const QString&mailbox,QList<RecMail> &target ) | 94 | void IMAPwrapper::listMessages(const QString&mailbox,QList<RecMail> &target ) |
80 | { | 95 | { |
81 | const char *mb; | 96 | const char *mb; |
82 | int err = MAILIMAP_NO_ERROR; | 97 | int err = MAILIMAP_NO_ERROR; |
83 | clist *result; | 98 | clist *result; |
84 | clistcell *current; | 99 | clistcell *current; |
85 | // mailimap_fetch_att *fetchAtt,*fetchAttFlags,*fetchAttDate,*fetchAttSize; | 100 | // mailimap_fetch_att *fetchAtt,*fetchAttFlags,*fetchAttDate,*fetchAttSize; |
86 | mailimap_fetch_type *fetchType; | 101 | mailimap_fetch_type *fetchType; |
87 | mailimap_set *set; | 102 | mailimap_set *set; |
88 | 103 | ||
89 | mb = mailbox.latin1(); | 104 | mb = mailbox.latin1(); |
90 | login(); | 105 | login(); |
91 | if (!m_imap) { | 106 | if (!m_imap) { |
92 | return; | 107 | return; |
93 | } | 108 | } |
94 | /* select mailbox READONLY for operations */ | 109 | /* select mailbox READONLY for operations */ |
95 | err = mailimap_examine( m_imap, (char*)mb); | 110 | err = mailimap_examine( m_imap, (char*)mb); |
96 | if ( err != MAILIMAP_NO_ERROR ) { | 111 | if ( err != MAILIMAP_NO_ERROR ) { |
97 | qDebug("error selecting mailbox: %s",m_imap->imap_response); | 112 | qDebug("error selecting mailbox: %s",m_imap->imap_response); |
98 | return; | 113 | return; |
99 | } | 114 | } |
100 | 115 | ||
101 | int last = m_imap->imap_selection_info->sel_exists; | 116 | int last = m_imap->imap_selection_info->sel_exists; |
102 | 117 | ||
103 | if (last == 0) { | 118 | if (last == 0) { |
104 | qDebug("mailbox has no mails"); | 119 | qDebug("mailbox has no mails"); |
105 | return; | 120 | return; |
106 | } | 121 | } |
107 | 122 | ||
108 | result = clist_new(); | 123 | result = clist_new(); |
109 | /* the range has to start at 1!!! not with 0!!!! */ | 124 | /* the range has to start at 1!!! not with 0!!!! */ |
110 | set = mailimap_set_new_interval( 1, last ); | 125 | set = mailimap_set_new_interval( 1, last ); |
111 | fetchType = mailimap_fetch_type_new_fetch_att_list_empty(); | 126 | fetchType = mailimap_fetch_type_new_fetch_att_list_empty(); |
112 | mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_envelope()); | 127 | mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_envelope()); |
113 | mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_flags()); | 128 | mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_flags()); |
114 | mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_internaldate()); | 129 | mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_internaldate()); |
115 | mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_rfc822_size()); | 130 | mailimap_fetch_type_new_fetch_att_list_add(fetchType,mailimap_fetch_att_new_rfc822_size()); |
116 | 131 | ||
117 | err = mailimap_fetch( m_imap, set, fetchType, &result ); | 132 | err = mailimap_fetch( m_imap, set, fetchType, &result ); |
118 | mailimap_set_free( set ); | 133 | mailimap_set_free( set ); |
119 | mailimap_fetch_type_free( fetchType ); | 134 | mailimap_fetch_type_free( fetchType ); |
120 | 135 | ||
121 | QString date,subject,from; | 136 | QString date,subject,from; |
122 | 137 | ||
123 | if ( err == MAILIMAP_NO_ERROR ) { | 138 | if ( err == MAILIMAP_NO_ERROR ) { |
124 | 139 | ||
125 | mailimap_msg_att * msg_att; | 140 | mailimap_msg_att * msg_att; |
126 | int i = 0; | 141 | int i = 0; |
127 | for (current = clist_begin(result); current != 0; current=clist_next(current)) { | 142 | for (current = clist_begin(result); current != 0; current=clist_next(current)) { |
128 | ++i; | 143 | ++i; |
129 | msg_att = (mailimap_msg_att*)current->data; | 144 | msg_att = (mailimap_msg_att*)current->data; |
130 | RecMail*m = parse_list_result(msg_att); | 145 | RecMail*m = parse_list_result(msg_att); |
131 | if (m) { | 146 | if (m) { |
132 | m->setNumber(i); | 147 | m->setNumber(i); |
133 | m->setMbox(mailbox); | 148 | m->setMbox(mailbox); |
134 | m->setWrapper(this); | 149 | m->setWrapper(this); |
135 | target.append(m); | 150 | target.append(m); |
136 | } | 151 | } |
137 | } | 152 | } |
138 | } else { | 153 | } else { |
139 | qDebug("Error fetching headers: %s",m_imap->imap_response); | 154 | qDebug("Error fetching headers: %s",m_imap->imap_response); |
140 | } | 155 | } |
141 | mailimap_fetch_list_free(result); | 156 | mailimap_fetch_list_free(result); |
142 | } | 157 | } |
143 | 158 | ||
144 | QList<Folder>* IMAPwrapper::listFolders() | 159 | QList<Folder>* IMAPwrapper::listFolders() |
145 | { | 160 | { |
146 | const char *path, *mask; | 161 | const char *path, *mask; |
147 | int err = MAILIMAP_NO_ERROR; | 162 | int err = MAILIMAP_NO_ERROR; |
148 | clist *result; | 163 | clist *result; |
149 | clistcell *current; | 164 | clistcell *current; |
150 | 165 | ||
151 | QList<Folder> * folders = new QList<Folder>(); | 166 | QList<Folder> * folders = new QList<Folder>(); |
152 | folders->setAutoDelete( false ); | 167 | folders->setAutoDelete( false ); |
153 | login(); | 168 | login(); |
154 | if (!m_imap) { | 169 | if (!m_imap) { |
155 | return folders; | 170 | return folders; |
156 | } | 171 | } |
157 | 172 | ||
158 | /* | 173 | /* |
159 | * First we have to check for INBOX 'cause it sometimes it's not inside the path. | 174 | * First we have to check for INBOX 'cause it sometimes it's not inside the path. |
160 | * We must not forget to filter them out in next loop! | 175 | * We must not forget to filter them out in next loop! |
161 | * it seems like ugly code. and yes - it is ugly code. but the best way. | 176 | * it seems like ugly code. and yes - it is ugly code. but the best way. |
162 | */ | 177 | */ |
163 | QString temp; | 178 | QString temp; |
164 | mask = "INBOX" ; | 179 | mask = "INBOX" ; |
165 | result = clist_new(); | 180 | result = clist_new(); |
166 | mailimap_mailbox_list *list; | 181 | mailimap_mailbox_list *list; |
167 | err = mailimap_list( m_imap, (char*)"", (char*)mask, &result ); | 182 | err = mailimap_list( m_imap, (char*)"", (char*)mask, &result ); |
168 | QString del; | 183 | QString del; |
169 | if ( err == MAILIMAP_NO_ERROR ) { | 184 | if ( err == MAILIMAP_NO_ERROR ) { |
170 | current = result->first; | 185 | current = result->first; |
171 | for ( int i = result->count; i > 0; i-- ) { | 186 | for ( int i = result->count; i > 0; i-- ) { |
172 | list = (mailimap_mailbox_list *) current->data; | 187 | list = (mailimap_mailbox_list *) current->data; |
173 | // it is better use the deep copy mechanism of qt itself | 188 | // it is better use the deep copy mechanism of qt itself |
174 | // instead of using strdup! | 189 | // instead of using strdup! |
175 | temp = list->mb_name; | 190 | temp = list->mb_name; |
176 | del = list->mb_delimiter; | 191 | del = list->mb_delimiter; |
177 | folders->append( new IMAPFolder(temp,del,true,account->getPrefix())); | 192 | folders->append( new IMAPFolder(temp,del,true,account->getPrefix())); |
178 | current = current->next; | 193 | current = current->next; |
179 | } | 194 | } |
180 | } else { | 195 | } else { |
181 | qDebug("error fetching folders: %s",m_imap->imap_response); | 196 | qDebug("error fetching folders: %s",m_imap->imap_response); |
182 | } | 197 | } |
183 | mailimap_list_result_free( result ); | 198 | mailimap_list_result_free( result ); |
184 | 199 | ||
185 | /* | 200 | /* |
186 | * second stage - get the other then inbox folders | 201 | * second stage - get the other then inbox folders |
187 | */ | 202 | */ |
188 | mask = "*" ; | 203 | mask = "*" ; |
189 | path = account->getPrefix().latin1(); | 204 | path = account->getPrefix().latin1(); |
190 | if (!path) path = ""; | 205 | if (!path) path = ""; |
191 | result = clist_new(); | 206 | result = clist_new(); |
192 | qDebug(path); | 207 | qDebug(path); |
193 | bool selectable = true; | 208 | bool selectable = true; |
194 | mailimap_mbx_list_flags*bflags; | 209 | mailimap_mbx_list_flags*bflags; |
195 | err = mailimap_list( m_imap, (char*)path, (char*)mask, &result ); | 210 | err = mailimap_list( m_imap, (char*)path, (char*)mask, &result ); |
196 | if ( err == MAILIMAP_NO_ERROR ) { | 211 | if ( err == MAILIMAP_NO_ERROR ) { |
197 | current = result->first; | 212 | current = result->first; |
198 | for ( current=clist_begin(result);current!=NULL;current=clist_next(current)) { | 213 | for ( current=clist_begin(result);current!=NULL;current=clist_next(current)) { |
199 | list = (mailimap_mailbox_list *) current->data; | 214 | list = (mailimap_mailbox_list *) current->data; |
200 | // it is better use the deep copy mechanism of qt itself | 215 | // it is better use the deep copy mechanism of qt itself |
201 | // instead of using strdup! | 216 | // instead of using strdup! |
202 | temp = list->mb_name; | 217 | temp = list->mb_name; |
203 | if (temp.lower()=="inbox") | 218 | if (temp.lower()=="inbox") |
204 | continue; | 219 | continue; |
205 | if (temp.lower()==account->getPrefix().lower()) | 220 | if (temp.lower()==account->getPrefix().lower()) |
206 | continue; | 221 | continue; |
207 | if ( (bflags = list->mb_flag) ) { | 222 | if ( (bflags = list->mb_flag) ) { |
208 | selectable = !(bflags->mbf_type==MAILIMAP_MBX_LIST_FLAGS_SFLAG&& | 223 | selectable = !(bflags->mbf_type==MAILIMAP_MBX_LIST_FLAGS_SFLAG&& |
209 | bflags->mbf_sflag==MAILIMAP_MBX_LIST_SFLAG_NOSELECT); | 224 | bflags->mbf_sflag==MAILIMAP_MBX_LIST_SFLAG_NOSELECT); |
210 | } | 225 | } |
211 | del = list->mb_delimiter; | 226 | del = list->mb_delimiter; |
212 | folders->append(new IMAPFolder(temp,del,selectable,account->getPrefix())); | 227 | folders->append(new IMAPFolder(temp,del,selectable,account->getPrefix())); |
213 | } | 228 | } |
214 | } else { | 229 | } else { |
215 | qDebug("error fetching folders %s",m_imap->imap_response); | 230 | qDebug("error fetching folders %s",m_imap->imap_response); |
216 | } | 231 | } |
217 | mailimap_list_result_free( result ); | 232 | mailimap_list_result_free( result ); |
218 | return folders; | 233 | return folders; |
219 | } | 234 | } |
220 | 235 | ||
221 | RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att) | 236 | RecMail*IMAPwrapper::parse_list_result(mailimap_msg_att* m_att) |
222 | { | 237 | { |
223 | RecMail * m = 0; | 238 | RecMail * m = 0; |
224 | mailimap_msg_att_item *item=0; | 239 | mailimap_msg_att_item *item=0; |
225 | clistcell *current,*c,*cf; | 240 | clistcell *current,*c,*cf; |
226 | mailimap_msg_att_dynamic*flist; | 241 | mailimap_msg_att_dynamic*flist; |
227 | mailimap_flag_fetch*cflag; | 242 | mailimap_flag_fetch*cflag; |
228 | int size; | 243 | int size; |
229 | QBitArray mFlags(7); | 244 | QBitArray mFlags(7); |
230 | QStringList addresslist; | 245 | QStringList addresslist; |
231 | 246 | ||
232 | if (!m_att) { | 247 | if (!m_att) { |
233 | return m; | 248 | return m; |
234 | } | 249 | } |
235 | m = new RecMail(); | 250 | m = new RecMail(); |
236 | for (c = clist_begin(m_att->att_list); c!=NULL;c=clist_next(c) ) { | 251 | for (c = clist_begin(m_att->att_list); c!=NULL;c=clist_next(c) ) { |
237 | current = c; | 252 | current = c; |
238 | size = 0; | 253 | size = 0; |
239 | item = (mailimap_msg_att_item*)current->data; | 254 | item = (mailimap_msg_att_item*)current->data; |
240 | if (item->att_type!=MAILIMAP_MSG_ATT_ITEM_STATIC) { | 255 | if (item->att_type!=MAILIMAP_MSG_ATT_ITEM_STATIC) { |
241 | flist = (mailimap_msg_att_dynamic*)item->att_data.att_dyn; | 256 | flist = (mailimap_msg_att_dynamic*)item->att_data.att_dyn; |
242 | if (!flist->att_list) { | 257 | if (!flist->att_list) { |
243 | continue; | 258 | continue; |
244 | } | 259 | } |
245 | cf = flist->att_list->first; | 260 | cf = flist->att_list->first; |
246 | for (cf = clist_begin(flist->att_list); cf!=NULL; cf = clist_next(cf)) { | 261 | for (cf = clist_begin(flist->att_list); cf!=NULL; cf = clist_next(cf)) { |
247 | cflag = (mailimap_flag_fetch*)cf->data; | 262 | cflag = (mailimap_flag_fetch*)cf->data; |
248 | if (cflag->fl_type==MAILIMAP_FLAG_FETCH_OTHER && cflag->fl_flag!=0) { | 263 | if (cflag->fl_type==MAILIMAP_FLAG_FETCH_OTHER && cflag->fl_flag!=0) { |
249 | switch (cflag->fl_flag->fl_type) { | 264 | switch (cflag->fl_flag->fl_type) { |
250 | case MAILIMAP_FLAG_ANSWERED: /* \Answered flag */ | 265 | case MAILIMAP_FLAG_ANSWERED: /* \Answered flag */ |
251 | mFlags.setBit(FLAG_ANSWERED); | 266 | mFlags.setBit(FLAG_ANSWERED); |
252 | break; | 267 | break; |
253 | case MAILIMAP_FLAG_FLAGGED: /* \Flagged flag */ | 268 | case MAILIMAP_FLAG_FLAGGED: /* \Flagged flag */ |
254 | mFlags.setBit(FLAG_FLAGGED); | 269 | mFlags.setBit(FLAG_FLAGGED); |
255 | break; | 270 | break; |
256 | case MAILIMAP_FLAG_DELETED: /* \Deleted flag */ | 271 | case MAILIMAP_FLAG_DELETED: /* \Deleted flag */ |
257 | mFlags.setBit(FLAG_DELETED); | 272 | mFlags.setBit(FLAG_DELETED); |
258 | break; | 273 | break; |
259 | case MAILIMAP_FLAG_SEEN: /* \Seen flag */ | 274 | case MAILIMAP_FLAG_SEEN: /* \Seen flag */ |
260 | mFlags.setBit(FLAG_SEEN); | 275 | mFlags.setBit(FLAG_SEEN); |
261 | break; | 276 | break; |
262 | case MAILIMAP_FLAG_DRAFT: /* \Draft flag */ | 277 | case MAILIMAP_FLAG_DRAFT: /* \Draft flag */ |
263 | mFlags.setBit(FLAG_DRAFT); | 278 | mFlags.setBit(FLAG_DRAFT); |
264 | break; | 279 | break; |
265 | case MAILIMAP_FLAG_KEYWORD: /* keyword flag */ | 280 | case MAILIMAP_FLAG_KEYWORD: /* keyword flag */ |
266 | break; | 281 | break; |
267 | case MAILIMAP_FLAG_EXTENSION: /* \extension flag */ | 282 | case MAILIMAP_FLAG_EXTENSION: /* \extension flag */ |
268 | break; | 283 | break; |
269 | default: | 284 | default: |
270 | break; | 285 | break; |
271 | } | 286 | } |
272 | } else if (cflag->fl_type==MAILIMAP_FLAG_FETCH_RECENT) { | 287 | } else if (cflag->fl_type==MAILIMAP_FLAG_FETCH_RECENT) { |
273 | mFlags.setBit(FLAG_RECENT); | 288 | mFlags.setBit(FLAG_RECENT); |
274 | } | 289 | } |
275 | } | 290 | } |
276 | continue; | 291 | continue; |
277 | } | 292 | } |
278 | if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_ENVELOPE) { | 293 | if (item->att_data.att_static->att_type==MAILIMAP_MSG_ATT_ENVELOPE) { |
279 | mailimap_envelope * head = item->att_data.att_static->att_data.att_env; | 294 | mailimap_envelope * head = item->att_data.att_static->att_data.att_env; |
280 | m->setDate(head->env_date); | 295 | m->setDate(head->env_date); |
281 | m->setSubject(convert_String((const char*)head->env_subject)); | 296 | m->setSubject(convert_String((const char*)head->env_subject)); |
282 | //m->setSubject(head->env_subject); | 297 | //m->setSubject(head->env_subject); |
283 | if (head->env_from!=NULL) { | 298 | if (head->env_from!=NULL) { |
284 | addresslist = address_list_to_stringlist(head->env_from->frm_list); | 299 | addresslist = address_list_to_stringlist(head->env_from->frm_list); |
285 | if (addresslist.count()) { | 300 | if (addresslist.count()) { |
286 | m->setFrom(addresslist.first()); | 301 | m->setFrom(addresslist.first()); |
287 | } | 302 | } |
288 | } | 303 | } |
289 | if (head->env_to!=NULL) { | 304 | if (head->env_to!=NULL) { |
290 | addresslist = address_list_to_stringlist(head->env_to->to_list); | 305 | addresslist = address_list_to_stringlist(head->env_to->to_list); |
291 | m->setTo(addresslist); | 306 | m->setTo(addresslist); |
292 | } | 307 | } |
293 | if (head->env_cc!=NULL) { | 308 | if (head->env_cc!=NULL) { |
294 | addresslist = address_list_to_stringlist(head->env_cc->cc_list); | 309 | addresslist = address_list_to_stringlist(head->env_cc->cc_list); |
295 | m->setCC(addresslist); | 310 | m->setCC(addresslist); |
296 | } | 311 | } |
diff --git a/noncore/net/mail/libmailwrapper/pop3wrapper.cpp b/noncore/net/mail/libmailwrapper/pop3wrapper.cpp index 22a4c70..b0b985c 100644 --- a/noncore/net/mail/libmailwrapper/pop3wrapper.cpp +++ b/noncore/net/mail/libmailwrapper/pop3wrapper.cpp | |||
@@ -1,442 +1,458 @@ | |||
1 | #include <stdlib.h> | 1 | #include <stdlib.h> |
2 | #include "pop3wrapper.h" | 2 | #include "pop3wrapper.h" |
3 | #include "mailtypes.h" | 3 | #include "mailtypes.h" |
4 | #include "logindialog.h" | ||
4 | #include <libetpan/mailpop3.h> | 5 | #include <libetpan/mailpop3.h> |
5 | #include <libetpan/mailmime.h> | 6 | #include <libetpan/mailmime.h> |
6 | #include <libetpan/data_message_driver.h> | 7 | #include <libetpan/data_message_driver.h> |
7 | #include <qfile.h> | 8 | #include <qfile.h> |
8 | 9 | ||
9 | /* we don't fetch messages larger than 5 MB */ | 10 | /* we don't fetch messages larger than 5 MB */ |
10 | #define HARD_MSG_SIZE_LIMIT 5242880 | 11 | #define HARD_MSG_SIZE_LIMIT 5242880 |
11 | 12 | ||
12 | POP3wrapper::POP3wrapper( POP3account *a ) | 13 | POP3wrapper::POP3wrapper( POP3account *a ) |
13 | { | 14 | { |
14 | account = a; | 15 | account = a; |
15 | m_pop3 = NULL; | 16 | m_pop3 = NULL; |
16 | msgTempName = a->getFileName()+"_msg_cache"; | 17 | msgTempName = a->getFileName()+"_msg_cache"; |
17 | last_msg_id = 0; | 18 | last_msg_id = 0; |
18 | } | 19 | } |
19 | 20 | ||
20 | POP3wrapper::~POP3wrapper() | 21 | POP3wrapper::~POP3wrapper() |
21 | { | 22 | { |
22 | logout(); | 23 | logout(); |
23 | QFile msg_cache(msgTempName); | 24 | QFile msg_cache(msgTempName); |
24 | if (msg_cache.exists()) { | 25 | if (msg_cache.exists()) { |
25 | msg_cache.remove(); | 26 | msg_cache.remove(); |
26 | } | 27 | } |
27 | } | 28 | } |
28 | 29 | ||
29 | void POP3wrapper::pop3_progress( size_t current, size_t maximum ) | 30 | void POP3wrapper::pop3_progress( size_t current, size_t maximum ) |
30 | { | 31 | { |
31 | //qDebug( "POP3: %i of %i", current, maximum ); | 32 | //qDebug( "POP3: %i of %i", current, maximum ); |
32 | } | 33 | } |
33 | 34 | ||
34 | RecBody POP3wrapper::fetchBody( const RecMail &mail ) | 35 | RecBody POP3wrapper::fetchBody( const RecMail &mail ) |
35 | { | 36 | { |
36 | int err = MAILPOP3_NO_ERROR; | 37 | int err = MAILPOP3_NO_ERROR; |
37 | char *message; | 38 | char *message; |
38 | size_t length = 0; | 39 | size_t length = 0; |
39 | 40 | ||
40 | login(); | 41 | login(); |
41 | if ( !m_pop3 ) { | 42 | if ( !m_pop3 ) { |
42 | return RecBody(); | 43 | return RecBody(); |
43 | } | 44 | } |
44 | 45 | ||
45 | RecBody body; | 46 | RecBody body; |
46 | 47 | ||
47 | QFile msg_cache(msgTempName); | 48 | QFile msg_cache(msgTempName); |
48 | 49 | ||
49 | if (mail.Msgsize()>HARD_MSG_SIZE_LIMIT) { | 50 | if (mail.Msgsize()>HARD_MSG_SIZE_LIMIT) { |
50 | qDebug("Message to large: %i",mail.Msgsize()); | 51 | qDebug("Message to large: %i",mail.Msgsize()); |
51 | return body; | 52 | return body; |
52 | } | 53 | } |
53 | if (mail.getNumber()!=last_msg_id) { | 54 | if (mail.getNumber()!=last_msg_id) { |
54 | if (msg_cache.exists()) { | 55 | if (msg_cache.exists()) { |
55 | msg_cache.remove(); | 56 | msg_cache.remove(); |
56 | } | 57 | } |
57 | msg_cache.open(IO_ReadWrite|IO_Truncate); | 58 | msg_cache.open(IO_ReadWrite|IO_Truncate); |
58 | last_msg_id = mail.getNumber(); | 59 | last_msg_id = mail.getNumber(); |
59 | err = mailpop3_retr( m_pop3, mail.getNumber(), &message, &length ); | 60 | err = mailpop3_retr( m_pop3, mail.getNumber(), &message, &length ); |
60 | if ( err != MAILPOP3_NO_ERROR ) { | 61 | if ( err != MAILPOP3_NO_ERROR ) { |
61 | qDebug( "POP3: error retrieving body with index %i", mail.getNumber() ); | 62 | qDebug( "POP3: error retrieving body with index %i", mail.getNumber() ); |
62 | last_msg_id = 0; | 63 | last_msg_id = 0; |
63 | return RecBody(); | 64 | return RecBody(); |
64 | } | 65 | } |
65 | msg_cache.writeBlock(message,length); | 66 | msg_cache.writeBlock(message,length); |
66 | } else { | 67 | } else { |
67 | QString msg=""; | 68 | QString msg=""; |
68 | msg_cache.open(IO_ReadOnly); | 69 | msg_cache.open(IO_ReadOnly); |
69 | message = new char[4096]; | 70 | message = new char[4096]; |
70 | memset(message,0,4096); | 71 | memset(message,0,4096); |
71 | while (msg_cache.readBlock(message,4095)>0) { | 72 | while (msg_cache.readBlock(message,4095)>0) { |
72 | msg+=message; | 73 | msg+=message; |
73 | memset(message,0,4096); | 74 | memset(message,0,4096); |
74 | } | 75 | } |
75 | delete message; | 76 | delete message; |
76 | message = (char*)malloc(msg.length()+1*sizeof(char)); | 77 | message = (char*)malloc(msg.length()+1*sizeof(char)); |
77 | memset(message,0,msg.length()+1); | 78 | memset(message,0,msg.length()+1); |
78 | memcpy(message,msg.latin1(),msg.length()); | 79 | memcpy(message,msg.latin1(),msg.length()); |
79 | } | 80 | } |
80 | body = parseMail(message); | 81 | body = parseMail(message); |
81 | free(message); | 82 | free(message); |
82 | return body; | 83 | return body; |
83 | } | 84 | } |
84 | 85 | ||
85 | RecBody POP3wrapper::parseMail( char *message ) | 86 | RecBody POP3wrapper::parseMail( char *message ) |
86 | { | 87 | { |
87 | int err = MAILIMF_NO_ERROR; | 88 | int err = MAILIMF_NO_ERROR; |
88 | /* these vars are used recurcive! set it to 0!!!!!!!!!!!!!!!!! */ | 89 | /* these vars are used recurcive! set it to 0!!!!!!!!!!!!!!!!! */ |
89 | size_t curTok = 0; | 90 | size_t curTok = 0; |
90 | mailimf_message *result = 0; | 91 | mailimf_message *result = 0; |
91 | mailmessage * msg=0; | 92 | mailmessage * msg=0; |
92 | struct mailmime * mime=0; | 93 | struct mailmime * mime=0; |
93 | struct mailmime_single_fields fields; | 94 | struct mailmime_single_fields fields; |
94 | 95 | ||
95 | RecBody body; | 96 | RecBody body; |
96 | 97 | ||
97 | 98 | ||
98 | err = mailimf_message_parse( (char *) message, strlen( message ), &curTok, &result ); | 99 | err = mailimf_message_parse( (char *) message, strlen( message ), &curTok, &result ); |
99 | if ( err != MAILIMF_NO_ERROR ) { | 100 | if ( err != MAILIMF_NO_ERROR ) { |
100 | if (result) mailimf_message_free(result); | 101 | if (result) mailimf_message_free(result); |
101 | return body; | 102 | return body; |
102 | } | 103 | } |
103 | 104 | ||
104 | #if 0 | 105 | #if 0 |
105 | char*body_msg = message; | 106 | char*body_msg = message; |
106 | if ( result && result->msg_body && result->msg_body->bd_text ) { | 107 | if ( result && result->msg_body && result->msg_body->bd_text ) { |
107 | body_msg = (char*)result->msg_body->bd_text; | 108 | body_msg = (char*)result->msg_body->bd_text; |
108 | result->msg_body->bd_text = 0; | 109 | result->msg_body->bd_text = 0; |
109 | } | 110 | } |
110 | 111 | ||
111 | msg = mailmessage_new(); | 112 | msg = mailmessage_new(); |
112 | mailmessage_init(msg, NULL, data_message_driver, 0, strlen(body_msg)); | 113 | mailmessage_init(msg, NULL, data_message_driver, 0, strlen(body_msg)); |
113 | generic_message_t * msg_data; | 114 | generic_message_t * msg_data; |
114 | msg_data = (generic_message_t *)msg->msg_data; | 115 | msg_data = (generic_message_t *)msg->msg_data; |
115 | msg_data->msg_fetched = 1; | 116 | msg_data->msg_fetched = 1; |
116 | msg_data->msg_message = body_msg; | 117 | msg_data->msg_message = body_msg; |
117 | msg_data->msg_length = strlen(body_msg); | 118 | msg_data->msg_length = strlen(body_msg); |
118 | memset(&fields, 0, sizeof(struct mailmime_single_fields)); | 119 | memset(&fields, 0, sizeof(struct mailmime_single_fields)); |
119 | err = mailmessage_get_bodystructure(msg,&mime); | 120 | err = mailmessage_get_bodystructure(msg,&mime); |
120 | 121 | ||
121 | if (mime->mm_mime_fields != NULL) { | 122 | if (mime->mm_mime_fields != NULL) { |
122 | mailmime_single_fields_init(&fields, mime->mm_mime_fields, | 123 | mailmime_single_fields_init(&fields, mime->mm_mime_fields, |
123 | mime->mm_content_type); | 124 | mime->mm_content_type); |
124 | } | 125 | } |
125 | #endif | 126 | #endif |
126 | 127 | ||
127 | #if 1 | 128 | #if 1 |
128 | if ( result && result->msg_body && result->msg_body->bd_text ) { | 129 | if ( result && result->msg_body && result->msg_body->bd_text ) { |
129 | qDebug( "POP3: bodytext found" ); | 130 | qDebug( "POP3: bodytext found" ); |
130 | // when curTok isn't set to 0 this line will fault! 'cause upper line faults! | 131 | // when curTok isn't set to 0 this line will fault! 'cause upper line faults! |
131 | body.setBodytext( QString( result->msg_body->bd_text ) ); | 132 | body.setBodytext( QString( result->msg_body->bd_text ) ); |
132 | #if 0 | 133 | #if 0 |
133 | curTok = 0; | 134 | curTok = 0; |
134 | mailmime_content*mresult = 0; | 135 | mailmime_content*mresult = 0; |
135 | size_t index = 0; | 136 | size_t index = 0; |
136 | mailmime_content_parse(result->msg_body->bd_text, | 137 | mailmime_content_parse(result->msg_body->bd_text, |
137 | strlen(result->msg_body->bd_text),&index,&mresult); | 138 | strlen(result->msg_body->bd_text),&index,&mresult); |
138 | if (mresult) { | 139 | if (mresult) { |
139 | mailmime_content_free(mresult); | 140 | mailmime_content_free(mresult); |
140 | } | 141 | } |
141 | #endif | 142 | #endif |
142 | mailimf_message_free(result); | 143 | mailimf_message_free(result); |
143 | } | 144 | } |
144 | #endif | 145 | #endif |
145 | return body; | 146 | return body; |
146 | } | 147 | } |
147 | 148 | ||
148 | void POP3wrapper::listMessages(const QString &, QList<RecMail> &target ) | 149 | void POP3wrapper::listMessages(const QString &, QList<RecMail> &target ) |
149 | { | 150 | { |
150 | int err = MAILPOP3_NO_ERROR; | 151 | int err = MAILPOP3_NO_ERROR; |
151 | char * header = 0; | 152 | char * header = 0; |
152 | /* these vars are used recurcive! set it to 0!!!!!!!!!!!!!!!!! */ | 153 | /* these vars are used recurcive! set it to 0!!!!!!!!!!!!!!!!! */ |
153 | size_t length = 0; | 154 | size_t length = 0; |
154 | carray * messages = 0; | 155 | carray * messages = 0; |
155 | 156 | ||
156 | login(); | 157 | login(); |
157 | if (!m_pop3) return; | 158 | if (!m_pop3) return; |
158 | mailpop3_list( m_pop3, &messages ); | 159 | mailpop3_list( m_pop3, &messages ); |
159 | 160 | ||
160 | for (unsigned int i = 0; i < carray_count(messages);++i) { | 161 | for (unsigned int i = 0; i < carray_count(messages);++i) { |
161 | mailpop3_msg_info *info; | 162 | mailpop3_msg_info *info; |
162 | err = mailpop3_get_msg_info(m_pop3,i+1,&info); | 163 | err = mailpop3_get_msg_info(m_pop3,i+1,&info); |
163 | if (info->msg_deleted) | 164 | if (info->msg_deleted) |
164 | continue; | 165 | continue; |
165 | err = mailpop3_header( m_pop3, info->msg_index, &header, &length ); | 166 | err = mailpop3_header( m_pop3, info->msg_index, &header, &length ); |
166 | if ( err != MAILPOP3_NO_ERROR ) { | 167 | if ( err != MAILPOP3_NO_ERROR ) { |
167 | qDebug( "POP3: error retrieving header msgid: %i", info->msg_index ); | 168 | qDebug( "POP3: error retrieving header msgid: %i", info->msg_index ); |
168 | free(header); | 169 | free(header); |
169 | return; | 170 | return; |
170 | } | 171 | } |
171 | RecMail *mail = parseHeader( header ); | 172 | RecMail *mail = parseHeader( header ); |
172 | mail->setNumber( info->msg_index ); | 173 | mail->setNumber( info->msg_index ); |
173 | mail->setWrapper(this); | 174 | mail->setWrapper(this); |
174 | mail->setMsgsize(info->msg_size); | 175 | mail->setMsgsize(info->msg_size); |
175 | target.append( mail ); | 176 | target.append( mail ); |
176 | free(header); | 177 | free(header); |
177 | } | 178 | } |
178 | } | 179 | } |
179 | 180 | ||
180 | RecMail *POP3wrapper::parseHeader( const char *header ) | 181 | RecMail *POP3wrapper::parseHeader( const char *header ) |
181 | { | 182 | { |
182 | int err = MAILIMF_NO_ERROR; | 183 | int err = MAILIMF_NO_ERROR; |
183 | size_t curTok = 0; | 184 | size_t curTok = 0; |
184 | RecMail *mail = new RecMail(); | 185 | RecMail *mail = new RecMail(); |
185 | mailimf_fields *fields; | 186 | mailimf_fields *fields; |
186 | mailimf_references * refs; | 187 | mailimf_references * refs; |
187 | mailimf_keywords*keys; | 188 | mailimf_keywords*keys; |
188 | QString status; | 189 | QString status; |
189 | QString value; | 190 | QString value; |
190 | QBitArray mFlags(7); | 191 | QBitArray mFlags(7); |
191 | 192 | ||
192 | err = mailimf_fields_parse( (char *) header, strlen( header ), &curTok, &fields ); | 193 | err = mailimf_fields_parse( (char *) header, strlen( header ), &curTok, &fields ); |
193 | for ( clistiter *current = clist_begin( fields->fld_list ); current != NULL; current = current->next ) { | 194 | for ( clistiter *current = clist_begin( fields->fld_list ); current != NULL; current = current->next ) { |
194 | mailimf_field *field = (mailimf_field *) current->data; | 195 | mailimf_field *field = (mailimf_field *) current->data; |
195 | switch ( field->fld_type ) { | 196 | switch ( field->fld_type ) { |
196 | case MAILIMF_FIELD_FROM: | 197 | case MAILIMF_FIELD_FROM: |
197 | mail->setFrom( parseMailboxList( field->fld_data.fld_from->frm_mb_list ) ); | 198 | mail->setFrom( parseMailboxList( field->fld_data.fld_from->frm_mb_list ) ); |
198 | break; | 199 | break; |
199 | case MAILIMF_FIELD_TO: | 200 | case MAILIMF_FIELD_TO: |
200 | mail->setTo( parseAddressList( field->fld_data.fld_to->to_addr_list ) ); | 201 | mail->setTo( parseAddressList( field->fld_data.fld_to->to_addr_list ) ); |
201 | break; | 202 | break; |
202 | case MAILIMF_FIELD_CC: | 203 | case MAILIMF_FIELD_CC: |
203 | mail->setCC( parseAddressList( field->fld_data.fld_cc->cc_addr_list ) ); | 204 | mail->setCC( parseAddressList( field->fld_data.fld_cc->cc_addr_list ) ); |
204 | break; | 205 | break; |
205 | case MAILIMF_FIELD_BCC: | 206 | case MAILIMF_FIELD_BCC: |
206 | mail->setBcc( parseAddressList( field->fld_data.fld_bcc->bcc_addr_list ) ); | 207 | mail->setBcc( parseAddressList( field->fld_data.fld_bcc->bcc_addr_list ) ); |
207 | break; | 208 | break; |
208 | case MAILIMF_FIELD_SUBJECT: | 209 | case MAILIMF_FIELD_SUBJECT: |
209 | mail->setSubject(convert_String( field->fld_data.fld_subject->sbj_value ) ); | 210 | mail->setSubject(convert_String( field->fld_data.fld_subject->sbj_value ) ); |
210 | break; | 211 | break; |
211 | case MAILIMF_FIELD_ORIG_DATE: | 212 | case MAILIMF_FIELD_ORIG_DATE: |
212 | mail->setDate( parseDateTime( field->fld_data.fld_orig_date->dt_date_time ) ); | 213 | mail->setDate( parseDateTime( field->fld_data.fld_orig_date->dt_date_time ) ); |
213 | break; | 214 | break; |
214 | case MAILIMF_FIELD_MESSAGE_ID: | 215 | case MAILIMF_FIELD_MESSAGE_ID: |
215 | mail->setMsgid(QString(field->fld_data.fld_message_id->mid_value)); | 216 | mail->setMsgid(QString(field->fld_data.fld_message_id->mid_value)); |
216 | break; | 217 | break; |
217 | case MAILIMF_FIELD_REFERENCES: | 218 | case MAILIMF_FIELD_REFERENCES: |
218 | refs = field->fld_data.fld_references; | 219 | refs = field->fld_data.fld_references; |
219 | if (refs && refs->mid_list && clist_count(refs->mid_list)) { | 220 | if (refs && refs->mid_list && clist_count(refs->mid_list)) { |
220 | char * text = (char*)refs->mid_list->first->data; | 221 | char * text = (char*)refs->mid_list->first->data; |
221 | mail->setReplyto(QString(text)); | 222 | mail->setReplyto(QString(text)); |
222 | } | 223 | } |
223 | break; | 224 | break; |
224 | case MAILIMF_FIELD_KEYWORDS: | 225 | case MAILIMF_FIELD_KEYWORDS: |
225 | keys = field->fld_data.fld_keywords; | 226 | keys = field->fld_data.fld_keywords; |
226 | for (clistcell*cur = clist_begin(keys->kw_list);cur!=0;cur=clist_next(cur)) { | 227 | for (clistcell*cur = clist_begin(keys->kw_list);cur!=0;cur=clist_next(cur)) { |
227 | qDebug("Keyword: %s",(char*)cur->data); | 228 | qDebug("Keyword: %s",(char*)cur->data); |
228 | } | 229 | } |
229 | break; | 230 | break; |
230 | case MAILIMF_FIELD_OPTIONAL_FIELD: | 231 | case MAILIMF_FIELD_OPTIONAL_FIELD: |
231 | status = field->fld_data.fld_optional_field->fld_name; | 232 | status = field->fld_data.fld_optional_field->fld_name; |
232 | value = field->fld_data.fld_optional_field->fld_value; | 233 | value = field->fld_data.fld_optional_field->fld_value; |
233 | if (status.lower()=="status") { | 234 | if (status.lower()=="status") { |
234 | if (value.lower()=="ro") { | 235 | if (value.lower()=="ro") { |
235 | mFlags.setBit(FLAG_SEEN); | 236 | mFlags.setBit(FLAG_SEEN); |
236 | } | 237 | } |
237 | } else if (status.lower()=="x-status") { | 238 | } else if (status.lower()=="x-status") { |
238 | qDebug("X-Status: %s",value.latin1()); | 239 | qDebug("X-Status: %s",value.latin1()); |
239 | if (value.lower()=="a") { | 240 | if (value.lower()=="a") { |
240 | mFlags.setBit(FLAG_ANSWERED); | 241 | mFlags.setBit(FLAG_ANSWERED); |
241 | } | 242 | } |
242 | } else { | 243 | } else { |
243 | // qDebug("Optionales feld: %s -> %s)",field->fld_data.fld_optional_field->fld_name, | 244 | // qDebug("Optionales feld: %s -> %s)",field->fld_data.fld_optional_field->fld_name, |
244 | // field->fld_data.fld_optional_field->fld_value); | 245 | // field->fld_data.fld_optional_field->fld_value); |
245 | } | 246 | } |
246 | break; | 247 | break; |
247 | default: | 248 | default: |
248 | qDebug("Non parsed field"); | 249 | qDebug("Non parsed field"); |
249 | break; | 250 | break; |
250 | } | 251 | } |
251 | } | 252 | } |
252 | if (fields) mailimf_fields_free(fields); | 253 | if (fields) mailimf_fields_free(fields); |
253 | mail->setFlags(mFlags); | 254 | mail->setFlags(mFlags); |
254 | return mail; | 255 | return mail; |
255 | } | 256 | } |
256 | 257 | ||
257 | QString POP3wrapper::parseDateTime( mailimf_date_time *date ) | 258 | QString POP3wrapper::parseDateTime( mailimf_date_time *date ) |
258 | { | 259 | { |
259 | char tmp[23]; | 260 | char tmp[23]; |
260 | 261 | ||
261 | snprintf( tmp, 23, "%02i.%02i.%04i %02i:%02i:%02i %+05i", | 262 | snprintf( tmp, 23, "%02i.%02i.%04i %02i:%02i:%02i %+05i", |
262 | date->dt_day, date->dt_month, date->dt_year, date->dt_hour, date->dt_min, date->dt_sec, date->dt_zone ); | 263 | date->dt_day, date->dt_month, date->dt_year, date->dt_hour, date->dt_min, date->dt_sec, date->dt_zone ); |
263 | 264 | ||
264 | return QString( tmp ); | 265 | return QString( tmp ); |
265 | } | 266 | } |
266 | 267 | ||
267 | QString POP3wrapper::parseAddressList( mailimf_address_list *list ) | 268 | QString POP3wrapper::parseAddressList( mailimf_address_list *list ) |
268 | { | 269 | { |
269 | QString result( "" ); | 270 | QString result( "" ); |
270 | 271 | ||
271 | bool first = true; | 272 | bool first = true; |
272 | for ( clistiter *current = clist_begin( list->ad_list ); current != NULL; current = current->next ) { | 273 | for ( clistiter *current = clist_begin( list->ad_list ); current != NULL; current = current->next ) { |
273 | mailimf_address *addr = (mailimf_address *) current->data; | 274 | mailimf_address *addr = (mailimf_address *) current->data; |
274 | 275 | ||
275 | if ( !first ) { | 276 | if ( !first ) { |
276 | result.append( "," ); | 277 | result.append( "," ); |
277 | } else { | 278 | } else { |
278 | first = false; | 279 | first = false; |
279 | } | 280 | } |
280 | 281 | ||
281 | switch ( addr->ad_type ) { | 282 | switch ( addr->ad_type ) { |
282 | case MAILIMF_ADDRESS_MAILBOX: | 283 | case MAILIMF_ADDRESS_MAILBOX: |
283 | result.append( parseMailbox( addr->ad_data.ad_mailbox ) ); | 284 | result.append( parseMailbox( addr->ad_data.ad_mailbox ) ); |
284 | break; | 285 | break; |
285 | case MAILIMF_ADDRESS_GROUP: | 286 | case MAILIMF_ADDRESS_GROUP: |
286 | result.append( parseGroup( addr->ad_data.ad_group ) ); | 287 | result.append( parseGroup( addr->ad_data.ad_group ) ); |
287 | break; | 288 | break; |
288 | default: | 289 | default: |
289 | qDebug( "POP3: unkown mailimf address type" ); | 290 | qDebug( "POP3: unkown mailimf address type" ); |
290 | break; | 291 | break; |
291 | } | 292 | } |
292 | } | 293 | } |
293 | 294 | ||
294 | return result; | 295 | return result; |
295 | } | 296 | } |
296 | 297 | ||
297 | QString POP3wrapper::parseGroup( mailimf_group *group ) | 298 | QString POP3wrapper::parseGroup( mailimf_group *group ) |
298 | { | 299 | { |
299 | QString result( "" ); | 300 | QString result( "" ); |
300 | 301 | ||
301 | result.append( group->grp_display_name ); | 302 | result.append( group->grp_display_name ); |
302 | result.append( ": " ); | 303 | result.append( ": " ); |
303 | 304 | ||
304 | if ( group->grp_mb_list != NULL ) { | 305 | if ( group->grp_mb_list != NULL ) { |
305 | result.append( parseMailboxList( group->grp_mb_list ) ); | 306 | result.append( parseMailboxList( group->grp_mb_list ) ); |
306 | } | 307 | } |
307 | 308 | ||
308 | result.append( ";" ); | 309 | result.append( ";" ); |
309 | 310 | ||
310 | return result; | 311 | return result; |
311 | } | 312 | } |
312 | 313 | ||
313 | QString POP3wrapper::parseMailbox( mailimf_mailbox *box ) | 314 | QString POP3wrapper::parseMailbox( mailimf_mailbox *box ) |
314 | { | 315 | { |
315 | QString result( "" ); | 316 | QString result( "" ); |
316 | 317 | ||
317 | if ( box->mb_display_name == NULL ) { | 318 | if ( box->mb_display_name == NULL ) { |
318 | result.append( box->mb_addr_spec ); | 319 | result.append( box->mb_addr_spec ); |
319 | } else { | 320 | } else { |
320 | result.append( convert_String(box->mb_display_name).latin1() ); | 321 | result.append( convert_String(box->mb_display_name).latin1() ); |
321 | result.append( " <" ); | 322 | result.append( " <" ); |
322 | result.append( box->mb_addr_spec ); | 323 | result.append( box->mb_addr_spec ); |
323 | result.append( ">" ); | 324 | result.append( ">" ); |
324 | } | 325 | } |
325 | 326 | ||
326 | return result; | 327 | return result; |
327 | } | 328 | } |
328 | 329 | ||
329 | QString POP3wrapper::parseMailboxList( mailimf_mailbox_list *list ) | 330 | QString POP3wrapper::parseMailboxList( mailimf_mailbox_list *list ) |
330 | { | 331 | { |
331 | QString result( "" ); | 332 | QString result( "" ); |
332 | 333 | ||
333 | bool first = true; | 334 | bool first = true; |
334 | for ( clistiter *current = clist_begin( list->mb_list ); current != NULL; current = current->next ) { | 335 | for ( clistiter *current = clist_begin( list->mb_list ); current != NULL; current = current->next ) { |
335 | mailimf_mailbox *box = (mailimf_mailbox *) current->data; | 336 | mailimf_mailbox *box = (mailimf_mailbox *) current->data; |
336 | 337 | ||
337 | if ( !first ) { | 338 | if ( !first ) { |
338 | result.append( "," ); | 339 | result.append( "," ); |
339 | } else { | 340 | } else { |
340 | first = false; | 341 | first = false; |
341 | } | 342 | } |
342 | 343 | ||
343 | result.append( parseMailbox( box ) ); | 344 | result.append( parseMailbox( box ) ); |
344 | } | 345 | } |
345 | 346 | ||
346 | return result; | 347 | return result; |
347 | } | 348 | } |
348 | 349 | ||
349 | void POP3wrapper::login() | 350 | void POP3wrapper::login() |
350 | { | 351 | { |
351 | /* we'll hold the line */ | 352 | /* we'll hold the line */ |
352 | if ( m_pop3 != NULL ) return; | 353 | if ( m_pop3 != NULL ) return; |
353 | 354 | ||
354 | const char *server, *user, *pass; | 355 | const char *server, *user, *pass; |
355 | uint16_t port; | 356 | uint16_t port; |
356 | int err = MAILPOP3_NO_ERROR; | 357 | int err = MAILPOP3_NO_ERROR; |
357 | 358 | ||
358 | server = account->getServer().latin1(); | 359 | server = account->getServer().latin1(); |
359 | port = account->getPort().toUInt(); | 360 | port = account->getPort().toUInt(); |
360 | user = account->getUser().latin1(); | 361 | |
361 | pass = account->getPassword().latin1(); | 362 | if ( account->getUser().isEmpty() || account->getPassword().isEmpty() ) { |
363 | LoginDialog login( account->getUser(), account->getPassword(), NULL, 0, true ); | ||
364 | login.show(); | ||
365 | if ( QDialog::Accepted == login.exec() ) { | ||
366 | // ok | ||
367 | user = strdup( login.getUser().latin1() ); | ||
368 | pass = strdup( login.getPassword().latin1() ); | ||
369 | } else { | ||
370 | // cancel | ||
371 | qDebug( "POP3: Login canceled" ); | ||
372 | return; | ||
373 | } | ||
374 | } else { | ||
375 | user = account->getUser().latin1(); | ||
376 | pass = account->getPassword().latin1(); | ||
377 | } | ||
362 | 378 | ||
363 | m_pop3 = mailpop3_new( 200, &pop3_progress ); | 379 | m_pop3 = mailpop3_new( 200, &pop3_progress ); |
364 | 380 | ||
365 | // connect | 381 | // connect |
366 | if (account->getSSL()) { | 382 | if (account->getSSL()) { |
367 | err = mailpop3_ssl_connect( m_pop3, (char*)server, port ); | 383 | err = mailpop3_ssl_connect( m_pop3, (char*)server, port ); |
368 | } else { | 384 | } else { |
369 | err = mailpop3_socket_connect( m_pop3, (char*)server, port ); | 385 | err = mailpop3_socket_connect( m_pop3, (char*)server, port ); |
370 | } | 386 | } |
371 | 387 | ||
372 | if ( err != MAILPOP3_NO_ERROR ) { | 388 | if ( err != MAILPOP3_NO_ERROR ) { |
373 | qDebug( "pop3: error connecting to %s\n reason: %s", server, | 389 | qDebug( "pop3: error connecting to %s\n reason: %s", server, |
374 | m_pop3->pop3_response ); | 390 | m_pop3->pop3_response ); |
375 | mailpop3_free( m_pop3 ); | 391 | mailpop3_free( m_pop3 ); |
376 | m_pop3 = NULL; | 392 | m_pop3 = NULL; |
377 | return; | 393 | return; |
378 | } | 394 | } |
379 | qDebug( "POP3: connected!" ); | 395 | qDebug( "POP3: connected!" ); |
380 | 396 | ||
381 | // login | 397 | // login |
382 | // TODO: decide if apop or plain login should be used | 398 | // TODO: decide if apop or plain login should be used |
383 | err = mailpop3_login( m_pop3, (char *) user, (char *) pass ); | 399 | err = mailpop3_login( m_pop3, (char *) user, (char *) pass ); |
384 | if ( err != MAILPOP3_NO_ERROR ) { | 400 | if ( err != MAILPOP3_NO_ERROR ) { |
385 | qDebug( "pop3: error logging in: %s", m_pop3->pop3_response ); | 401 | qDebug( "pop3: error logging in: %s", m_pop3->pop3_response ); |
386 | logout(); | 402 | logout(); |
387 | return; | 403 | return; |
388 | } | 404 | } |
389 | 405 | ||
390 | qDebug( "POP3: logged in!" ); | 406 | qDebug( "POP3: logged in!" ); |
391 | } | 407 | } |
392 | 408 | ||
393 | void POP3wrapper::logout() | 409 | void POP3wrapper::logout() |
394 | { | 410 | { |
395 | int err = MAILPOP3_NO_ERROR; | 411 | int err = MAILPOP3_NO_ERROR; |
396 | if ( m_pop3 == NULL ) return; | 412 | if ( m_pop3 == NULL ) return; |
397 | err = mailpop3_quit( m_pop3 ); | 413 | err = mailpop3_quit( m_pop3 ); |
398 | mailpop3_free( m_pop3 ); | 414 | mailpop3_free( m_pop3 ); |
399 | m_pop3 = NULL; | 415 | m_pop3 = NULL; |
400 | } | 416 | } |
401 | 417 | ||
402 | 418 | ||
403 | QList<Folder>* POP3wrapper::listFolders() | 419 | QList<Folder>* POP3wrapper::listFolders() |
404 | { | 420 | { |
405 | /* TODO: integrate MH directories | 421 | /* TODO: integrate MH directories |
406 | but not before version 0.1 ;) | 422 | but not before version 0.1 ;) |
407 | */ | 423 | */ |
408 | QList<Folder> * folders = new QList<Folder>(); | 424 | QList<Folder> * folders = new QList<Folder>(); |
409 | folders->setAutoDelete( false ); | 425 | folders->setAutoDelete( false ); |
410 | Folder*inb=new Folder("INBOX","/"); | 426 | Folder*inb=new Folder("INBOX","/"); |
411 | folders->append(inb); | 427 | folders->append(inb); |
412 | return folders; | 428 | return folders; |
413 | } | 429 | } |
414 | 430 | ||
415 | QString POP3wrapper::fetchTextPart(const RecMail&,const RecPart&) | 431 | QString POP3wrapper::fetchTextPart(const RecMail&,const RecPart&) |
416 | { | 432 | { |
417 | return ""; | 433 | return ""; |
418 | } | 434 | } |
419 | 435 | ||
420 | void POP3wrapper::deleteMail(const RecMail&mail) | 436 | void POP3wrapper::deleteMail(const RecMail&mail) |
421 | { | 437 | { |
422 | login(); | 438 | login(); |
423 | if (!m_pop3) return; | 439 | if (!m_pop3) return; |
424 | int err = mailpop3_dele(m_pop3,mail.getNumber()); | 440 | int err = mailpop3_dele(m_pop3,mail.getNumber()); |
425 | if (err != MAILPOP3_NO_ERROR) { | 441 | if (err != MAILPOP3_NO_ERROR) { |
426 | qDebug("error deleting mail"); | 442 | qDebug("error deleting mail"); |
427 | } | 443 | } |
428 | } | 444 | } |
429 | 445 | ||
430 | void POP3wrapper::answeredMail(const RecMail&) | 446 | void POP3wrapper::answeredMail(const RecMail&) |
431 | { | 447 | { |
432 | } | 448 | } |
433 | 449 | ||
434 | encodedString* POP3wrapper::fetchDecodedPart(const RecMail&,const RecPart&) | 450 | encodedString* POP3wrapper::fetchDecodedPart(const RecMail&,const RecPart&) |
435 | { | 451 | { |
436 | return new encodedString(); | 452 | return new encodedString(); |
437 | } | 453 | } |
438 | 454 | ||
439 | encodedString* POP3wrapper::fetchRawPart(const RecMail&,const RecPart&) | 455 | encodedString* POP3wrapper::fetchRawPart(const RecMail&,const RecPart&) |
440 | { | 456 | { |
441 | return new encodedString(); | 457 | return new encodedString(); |
442 | } | 458 | } |
diff --git a/noncore/net/mail/pop3wrapper.cpp b/noncore/net/mail/pop3wrapper.cpp index 22a4c70..b0b985c 100644 --- a/noncore/net/mail/pop3wrapper.cpp +++ b/noncore/net/mail/pop3wrapper.cpp | |||
@@ -1,442 +1,458 @@ | |||
1 | #include <stdlib.h> | 1 | #include <stdlib.h> |
2 | #include "pop3wrapper.h" | 2 | #include "pop3wrapper.h" |
3 | #include "mailtypes.h" | 3 | #include "mailtypes.h" |
4 | #include "logindialog.h" | ||
4 | #include <libetpan/mailpop3.h> | 5 | #include <libetpan/mailpop3.h> |
5 | #include <libetpan/mailmime.h> | 6 | #include <libetpan/mailmime.h> |
6 | #include <libetpan/data_message_driver.h> | 7 | #include <libetpan/data_message_driver.h> |
7 | #include <qfile.h> | 8 | #include <qfile.h> |
8 | 9 | ||
9 | /* we don't fetch messages larger than 5 MB */ | 10 | /* we don't fetch messages larger than 5 MB */ |
10 | #define HARD_MSG_SIZE_LIMIT 5242880 | 11 | #define HARD_MSG_SIZE_LIMIT 5242880 |
11 | 12 | ||
12 | POP3wrapper::POP3wrapper( POP3account *a ) | 13 | POP3wrapper::POP3wrapper( POP3account *a ) |
13 | { | 14 | { |
14 | account = a; | 15 | account = a; |
15 | m_pop3 = NULL; | 16 | m_pop3 = NULL; |
16 | msgTempName = a->getFileName()+"_msg_cache"; | 17 | msgTempName = a->getFileName()+"_msg_cache"; |
17 | last_msg_id = 0; | 18 | last_msg_id = 0; |
18 | } | 19 | } |
19 | 20 | ||
20 | POP3wrapper::~POP3wrapper() | 21 | POP3wrapper::~POP3wrapper() |
21 | { | 22 | { |
22 | logout(); | 23 | logout(); |
23 | QFile msg_cache(msgTempName); | 24 | QFile msg_cache(msgTempName); |
24 | if (msg_cache.exists()) { | 25 | if (msg_cache.exists()) { |
25 | msg_cache.remove(); | 26 | msg_cache.remove(); |
26 | } | 27 | } |
27 | } | 28 | } |
28 | 29 | ||
29 | void POP3wrapper::pop3_progress( size_t current, size_t maximum ) | 30 | void POP3wrapper::pop3_progress( size_t current, size_t maximum ) |
30 | { | 31 | { |
31 | //qDebug( "POP3: %i of %i", current, maximum ); | 32 | //qDebug( "POP3: %i of %i", current, maximum ); |
32 | } | 33 | } |
33 | 34 | ||
34 | RecBody POP3wrapper::fetchBody( const RecMail &mail ) | 35 | RecBody POP3wrapper::fetchBody( const RecMail &mail ) |
35 | { | 36 | { |
36 | int err = MAILPOP3_NO_ERROR; | 37 | int err = MAILPOP3_NO_ERROR; |
37 | char *message; | 38 | char *message; |
38 | size_t length = 0; | 39 | size_t length = 0; |
39 | 40 | ||
40 | login(); | 41 | login(); |
41 | if ( !m_pop3 ) { | 42 | if ( !m_pop3 ) { |
42 | return RecBody(); | 43 | return RecBody(); |
43 | } | 44 | } |
44 | 45 | ||
45 | RecBody body; | 46 | RecBody body; |
46 | 47 | ||
47 | QFile msg_cache(msgTempName); | 48 | QFile msg_cache(msgTempName); |
48 | 49 | ||
49 | if (mail.Msgsize()>HARD_MSG_SIZE_LIMIT) { | 50 | if (mail.Msgsize()>HARD_MSG_SIZE_LIMIT) { |
50 | qDebug("Message to large: %i",mail.Msgsize()); | 51 | qDebug("Message to large: %i",mail.Msgsize()); |
51 | return body; | 52 | return body; |
52 | } | 53 | } |
53 | if (mail.getNumber()!=last_msg_id) { | 54 | if (mail.getNumber()!=last_msg_id) { |
54 | if (msg_cache.exists()) { | 55 | if (msg_cache.exists()) { |
55 | msg_cache.remove(); | 56 | msg_cache.remove(); |
56 | } | 57 | } |
57 | msg_cache.open(IO_ReadWrite|IO_Truncate); | 58 | msg_cache.open(IO_ReadWrite|IO_Truncate); |
58 | last_msg_id = mail.getNumber(); | 59 | last_msg_id = mail.getNumber(); |
59 | err = mailpop3_retr( m_pop3, mail.getNumber(), &message, &length ); | 60 | err = mailpop3_retr( m_pop3, mail.getNumber(), &message, &length ); |
60 | if ( err != MAILPOP3_NO_ERROR ) { | 61 | if ( err != MAILPOP3_NO_ERROR ) { |
61 | qDebug( "POP3: error retrieving body with index %i", mail.getNumber() ); | 62 | qDebug( "POP3: error retrieving body with index %i", mail.getNumber() ); |
62 | last_msg_id = 0; | 63 | last_msg_id = 0; |
63 | return RecBody(); | 64 | return RecBody(); |
64 | } | 65 | } |
65 | msg_cache.writeBlock(message,length); | 66 | msg_cache.writeBlock(message,length); |
66 | } else { | 67 | } else { |
67 | QString msg=""; | 68 | QString msg=""; |
68 | msg_cache.open(IO_ReadOnly); | 69 | msg_cache.open(IO_ReadOnly); |
69 | message = new char[4096]; | 70 | message = new char[4096]; |
70 | memset(message,0,4096); | 71 | memset(message,0,4096); |
71 | while (msg_cache.readBlock(message,4095)>0) { | 72 | while (msg_cache.readBlock(message,4095)>0) { |
72 | msg+=message; | 73 | msg+=message; |
73 | memset(message,0,4096); | 74 | memset(message,0,4096); |
74 | } | 75 | } |
75 | delete message; | 76 | delete message; |
76 | message = (char*)malloc(msg.length()+1*sizeof(char)); | 77 | message = (char*)malloc(msg.length()+1*sizeof(char)); |
77 | memset(message,0,msg.length()+1); | 78 | memset(message,0,msg.length()+1); |
78 | memcpy(message,msg.latin1(),msg.length()); | 79 | memcpy(message,msg.latin1(),msg.length()); |
79 | } | 80 | } |
80 | body = parseMail(message); | 81 | body = parseMail(message); |
81 | free(message); | 82 | free(message); |
82 | return body; | 83 | return body; |
83 | } | 84 | } |
84 | 85 | ||
85 | RecBody POP3wrapper::parseMail( char *message ) | 86 | RecBody POP3wrapper::parseMail( char *message ) |
86 | { | 87 | { |
87 | int err = MAILIMF_NO_ERROR; | 88 | int err = MAILIMF_NO_ERROR; |
88 | /* these vars are used recurcive! set it to 0!!!!!!!!!!!!!!!!! */ | 89 | /* these vars are used recurcive! set it to 0!!!!!!!!!!!!!!!!! */ |
89 | size_t curTok = 0; | 90 | size_t curTok = 0; |
90 | mailimf_message *result = 0; | 91 | mailimf_message *result = 0; |
91 | mailmessage * msg=0; | 92 | mailmessage * msg=0; |
92 | struct mailmime * mime=0; | 93 | struct mailmime * mime=0; |
93 | struct mailmime_single_fields fields; | 94 | struct mailmime_single_fields fields; |
94 | 95 | ||
95 | RecBody body; | 96 | RecBody body; |
96 | 97 | ||
97 | 98 | ||
98 | err = mailimf_message_parse( (char *) message, strlen( message ), &curTok, &result ); | 99 | err = mailimf_message_parse( (char *) message, strlen( message ), &curTok, &result ); |
99 | if ( err != MAILIMF_NO_ERROR ) { | 100 | if ( err != MAILIMF_NO_ERROR ) { |
100 | if (result) mailimf_message_free(result); | 101 | if (result) mailimf_message_free(result); |
101 | return body; | 102 | return body; |
102 | } | 103 | } |
103 | 104 | ||
104 | #if 0 | 105 | #if 0 |
105 | char*body_msg = message; | 106 | char*body_msg = message; |
106 | if ( result && result->msg_body && result->msg_body->bd_text ) { | 107 | if ( result && result->msg_body && result->msg_body->bd_text ) { |
107 | body_msg = (char*)result->msg_body->bd_text; | 108 | body_msg = (char*)result->msg_body->bd_text; |
108 | result->msg_body->bd_text = 0; | 109 | result->msg_body->bd_text = 0; |
109 | } | 110 | } |
110 | 111 | ||
111 | msg = mailmessage_new(); | 112 | msg = mailmessage_new(); |
112 | mailmessage_init(msg, NULL, data_message_driver, 0, strlen(body_msg)); | 113 | mailmessage_init(msg, NULL, data_message_driver, 0, strlen(body_msg)); |
113 | generic_message_t * msg_data; | 114 | generic_message_t * msg_data; |
114 | msg_data = (generic_message_t *)msg->msg_data; | 115 | msg_data = (generic_message_t *)msg->msg_data; |
115 | msg_data->msg_fetched = 1; | 116 | msg_data->msg_fetched = 1; |
116 | msg_data->msg_message = body_msg; | 117 | msg_data->msg_message = body_msg; |
117 | msg_data->msg_length = strlen(body_msg); | 118 | msg_data->msg_length = strlen(body_msg); |
118 | memset(&fields, 0, sizeof(struct mailmime_single_fields)); | 119 | memset(&fields, 0, sizeof(struct mailmime_single_fields)); |
119 | err = mailmessage_get_bodystructure(msg,&mime); | 120 | err = mailmessage_get_bodystructure(msg,&mime); |
120 | 121 | ||
121 | if (mime->mm_mime_fields != NULL) { | 122 | if (mime->mm_mime_fields != NULL) { |
122 | mailmime_single_fields_init(&fields, mime->mm_mime_fields, | 123 | mailmime_single_fields_init(&fields, mime->mm_mime_fields, |
123 | mime->mm_content_type); | 124 | mime->mm_content_type); |
124 | } | 125 | } |
125 | #endif | 126 | #endif |
126 | 127 | ||
127 | #if 1 | 128 | #if 1 |
128 | if ( result && result->msg_body && result->msg_body->bd_text ) { | 129 | if ( result && result->msg_body && result->msg_body->bd_text ) { |
129 | qDebug( "POP3: bodytext found" ); | 130 | qDebug( "POP3: bodytext found" ); |
130 | // when curTok isn't set to 0 this line will fault! 'cause upper line faults! | 131 | // when curTok isn't set to 0 this line will fault! 'cause upper line faults! |
131 | body.setBodytext( QString( result->msg_body->bd_text ) ); | 132 | body.setBodytext( QString( result->msg_body->bd_text ) ); |
132 | #if 0 | 133 | #if 0 |
133 | curTok = 0; | 134 | curTok = 0; |
134 | mailmime_content*mresult = 0; | 135 | mailmime_content*mresult = 0; |
135 | size_t index = 0; | 136 | size_t index = 0; |
136 | mailmime_content_parse(result->msg_body->bd_text, | 137 | mailmime_content_parse(result->msg_body->bd_text, |
137 | strlen(result->msg_body->bd_text),&index,&mresult); | 138 | strlen(result->msg_body->bd_text),&index,&mresult); |
138 | if (mresult) { | 139 | if (mresult) { |
139 | mailmime_content_free(mresult); | 140 | mailmime_content_free(mresult); |
140 | } | 141 | } |
141 | #endif | 142 | #endif |
142 | mailimf_message_free(result); | 143 | mailimf_message_free(result); |
143 | } | 144 | } |
144 | #endif | 145 | #endif |
145 | return body; | 146 | return body; |
146 | } | 147 | } |
147 | 148 | ||
148 | void POP3wrapper::listMessages(const QString &, QList<RecMail> &target ) | 149 | void POP3wrapper::listMessages(const QString &, QList<RecMail> &target ) |
149 | { | 150 | { |
150 | int err = MAILPOP3_NO_ERROR; | 151 | int err = MAILPOP3_NO_ERROR; |
151 | char * header = 0; | 152 | char * header = 0; |
152 | /* these vars are used recurcive! set it to 0!!!!!!!!!!!!!!!!! */ | 153 | /* these vars are used recurcive! set it to 0!!!!!!!!!!!!!!!!! */ |
153 | size_t length = 0; | 154 | size_t length = 0; |
154 | carray * messages = 0; | 155 | carray * messages = 0; |
155 | 156 | ||
156 | login(); | 157 | login(); |
157 | if (!m_pop3) return; | 158 | if (!m_pop3) return; |
158 | mailpop3_list( m_pop3, &messages ); | 159 | mailpop3_list( m_pop3, &messages ); |
159 | 160 | ||
160 | for (unsigned int i = 0; i < carray_count(messages);++i) { | 161 | for (unsigned int i = 0; i < carray_count(messages);++i) { |
161 | mailpop3_msg_info *info; | 162 | mailpop3_msg_info *info; |
162 | err = mailpop3_get_msg_info(m_pop3,i+1,&info); | 163 | err = mailpop3_get_msg_info(m_pop3,i+1,&info); |
163 | if (info->msg_deleted) | 164 | if (info->msg_deleted) |
164 | continue; | 165 | continue; |
165 | err = mailpop3_header( m_pop3, info->msg_index, &header, &length ); | 166 | err = mailpop3_header( m_pop3, info->msg_index, &header, &length ); |
166 | if ( err != MAILPOP3_NO_ERROR ) { | 167 | if ( err != MAILPOP3_NO_ERROR ) { |
167 | qDebug( "POP3: error retrieving header msgid: %i", info->msg_index ); | 168 | qDebug( "POP3: error retrieving header msgid: %i", info->msg_index ); |
168 | free(header); | 169 | free(header); |
169 | return; | 170 | return; |
170 | } | 171 | } |
171 | RecMail *mail = parseHeader( header ); | 172 | RecMail *mail = parseHeader( header ); |
172 | mail->setNumber( info->msg_index ); | 173 | mail->setNumber( info->msg_index ); |
173 | mail->setWrapper(this); | 174 | mail->setWrapper(this); |
174 | mail->setMsgsize(info->msg_size); | 175 | mail->setMsgsize(info->msg_size); |
175 | target.append( mail ); | 176 | target.append( mail ); |
176 | free(header); | 177 | free(header); |
177 | } | 178 | } |
178 | } | 179 | } |
179 | 180 | ||
180 | RecMail *POP3wrapper::parseHeader( const char *header ) | 181 | RecMail *POP3wrapper::parseHeader( const char *header ) |
181 | { | 182 | { |
182 | int err = MAILIMF_NO_ERROR; | 183 | int err = MAILIMF_NO_ERROR; |
183 | size_t curTok = 0; | 184 | size_t curTok = 0; |
184 | RecMail *mail = new RecMail(); | 185 | RecMail *mail = new RecMail(); |
185 | mailimf_fields *fields; | 186 | mailimf_fields *fields; |
186 | mailimf_references * refs; | 187 | mailimf_references * refs; |
187 | mailimf_keywords*keys; | 188 | mailimf_keywords*keys; |
188 | QString status; | 189 | QString status; |
189 | QString value; | 190 | QString value; |
190 | QBitArray mFlags(7); | 191 | QBitArray mFlags(7); |
191 | 192 | ||
192 | err = mailimf_fields_parse( (char *) header, strlen( header ), &curTok, &fields ); | 193 | err = mailimf_fields_parse( (char *) header, strlen( header ), &curTok, &fields ); |
193 | for ( clistiter *current = clist_begin( fields->fld_list ); current != NULL; current = current->next ) { | 194 | for ( clistiter *current = clist_begin( fields->fld_list ); current != NULL; current = current->next ) { |
194 | mailimf_field *field = (mailimf_field *) current->data; | 195 | mailimf_field *field = (mailimf_field *) current->data; |
195 | switch ( field->fld_type ) { | 196 | switch ( field->fld_type ) { |
196 | case MAILIMF_FIELD_FROM: | 197 | case MAILIMF_FIELD_FROM: |
197 | mail->setFrom( parseMailboxList( field->fld_data.fld_from->frm_mb_list ) ); | 198 | mail->setFrom( parseMailboxList( field->fld_data.fld_from->frm_mb_list ) ); |
198 | break; | 199 | break; |
199 | case MAILIMF_FIELD_TO: | 200 | case MAILIMF_FIELD_TO: |
200 | mail->setTo( parseAddressList( field->fld_data.fld_to->to_addr_list ) ); | 201 | mail->setTo( parseAddressList( field->fld_data.fld_to->to_addr_list ) ); |
201 | break; | 202 | break; |
202 | case MAILIMF_FIELD_CC: | 203 | case MAILIMF_FIELD_CC: |
203 | mail->setCC( parseAddressList( field->fld_data.fld_cc->cc_addr_list ) ); | 204 | mail->setCC( parseAddressList( field->fld_data.fld_cc->cc_addr_list ) ); |
204 | break; | 205 | break; |
205 | case MAILIMF_FIELD_BCC: | 206 | case MAILIMF_FIELD_BCC: |
206 | mail->setBcc( parseAddressList( field->fld_data.fld_bcc->bcc_addr_list ) ); | 207 | mail->setBcc( parseAddressList( field->fld_data.fld_bcc->bcc_addr_list ) ); |
207 | break; | 208 | break; |
208 | case MAILIMF_FIELD_SUBJECT: | 209 | case MAILIMF_FIELD_SUBJECT: |
209 | mail->setSubject(convert_String( field->fld_data.fld_subject->sbj_value ) ); | 210 | mail->setSubject(convert_String( field->fld_data.fld_subject->sbj_value ) ); |
210 | break; | 211 | break; |
211 | case MAILIMF_FIELD_ORIG_DATE: | 212 | case MAILIMF_FIELD_ORIG_DATE: |
212 | mail->setDate( parseDateTime( field->fld_data.fld_orig_date->dt_date_time ) ); | 213 | mail->setDate( parseDateTime( field->fld_data.fld_orig_date->dt_date_time ) ); |
213 | break; | 214 | break; |
214 | case MAILIMF_FIELD_MESSAGE_ID: | 215 | case MAILIMF_FIELD_MESSAGE_ID: |
215 | mail->setMsgid(QString(field->fld_data.fld_message_id->mid_value)); | 216 | mail->setMsgid(QString(field->fld_data.fld_message_id->mid_value)); |
216 | break; | 217 | break; |
217 | case MAILIMF_FIELD_REFERENCES: | 218 | case MAILIMF_FIELD_REFERENCES: |
218 | refs = field->fld_data.fld_references; | 219 | refs = field->fld_data.fld_references; |
219 | if (refs && refs->mid_list && clist_count(refs->mid_list)) { | 220 | if (refs && refs->mid_list && clist_count(refs->mid_list)) { |
220 | char * text = (char*)refs->mid_list->first->data; | 221 | char * text = (char*)refs->mid_list->first->data; |
221 | mail->setReplyto(QString(text)); | 222 | mail->setReplyto(QString(text)); |
222 | } | 223 | } |
223 | break; | 224 | break; |
224 | case MAILIMF_FIELD_KEYWORDS: | 225 | case MAILIMF_FIELD_KEYWORDS: |
225 | keys = field->fld_data.fld_keywords; | 226 | keys = field->fld_data.fld_keywords; |
226 | for (clistcell*cur = clist_begin(keys->kw_list);cur!=0;cur=clist_next(cur)) { | 227 | for (clistcell*cur = clist_begin(keys->kw_list);cur!=0;cur=clist_next(cur)) { |
227 | qDebug("Keyword: %s",(char*)cur->data); | 228 | qDebug("Keyword: %s",(char*)cur->data); |
228 | } | 229 | } |
229 | break; | 230 | break; |
230 | case MAILIMF_FIELD_OPTIONAL_FIELD: | 231 | case MAILIMF_FIELD_OPTIONAL_FIELD: |
231 | status = field->fld_data.fld_optional_field->fld_name; | 232 | status = field->fld_data.fld_optional_field->fld_name; |
232 | value = field->fld_data.fld_optional_field->fld_value; | 233 | value = field->fld_data.fld_optional_field->fld_value; |
233 | if (status.lower()=="status") { | 234 | if (status.lower()=="status") { |
234 | if (value.lower()=="ro") { | 235 | if (value.lower()=="ro") { |
235 | mFlags.setBit(FLAG_SEEN); | 236 | mFlags.setBit(FLAG_SEEN); |
236 | } | 237 | } |
237 | } else if (status.lower()=="x-status") { | 238 | } else if (status.lower()=="x-status") { |
238 | qDebug("X-Status: %s",value.latin1()); | 239 | qDebug("X-Status: %s",value.latin1()); |
239 | if (value.lower()=="a") { | 240 | if (value.lower()=="a") { |
240 | mFlags.setBit(FLAG_ANSWERED); | 241 | mFlags.setBit(FLAG_ANSWERED); |
241 | } | 242 | } |
242 | } else { | 243 | } else { |
243 | // qDebug("Optionales feld: %s -> %s)",field->fld_data.fld_optional_field->fld_name, | 244 | // qDebug("Optionales feld: %s -> %s)",field->fld_data.fld_optional_field->fld_name, |
244 | // field->fld_data.fld_optional_field->fld_value); | 245 | // field->fld_data.fld_optional_field->fld_value); |
245 | } | 246 | } |
246 | break; | 247 | break; |
247 | default: | 248 | default: |
248 | qDebug("Non parsed field"); | 249 | qDebug("Non parsed field"); |
249 | break; | 250 | break; |
250 | } | 251 | } |
251 | } | 252 | } |
252 | if (fields) mailimf_fields_free(fields); | 253 | if (fields) mailimf_fields_free(fields); |
253 | mail->setFlags(mFlags); | 254 | mail->setFlags(mFlags); |
254 | return mail; | 255 | return mail; |
255 | } | 256 | } |
256 | 257 | ||
257 | QString POP3wrapper::parseDateTime( mailimf_date_time *date ) | 258 | QString POP3wrapper::parseDateTime( mailimf_date_time *date ) |
258 | { | 259 | { |
259 | char tmp[23]; | 260 | char tmp[23]; |
260 | 261 | ||
261 | snprintf( tmp, 23, "%02i.%02i.%04i %02i:%02i:%02i %+05i", | 262 | snprintf( tmp, 23, "%02i.%02i.%04i %02i:%02i:%02i %+05i", |
262 | date->dt_day, date->dt_month, date->dt_year, date->dt_hour, date->dt_min, date->dt_sec, date->dt_zone ); | 263 | date->dt_day, date->dt_month, date->dt_year, date->dt_hour, date->dt_min, date->dt_sec, date->dt_zone ); |
263 | 264 | ||
264 | return QString( tmp ); | 265 | return QString( tmp ); |
265 | } | 266 | } |
266 | 267 | ||
267 | QString POP3wrapper::parseAddressList( mailimf_address_list *list ) | 268 | QString POP3wrapper::parseAddressList( mailimf_address_list *list ) |
268 | { | 269 | { |
269 | QString result( "" ); | 270 | QString result( "" ); |
270 | 271 | ||
271 | bool first = true; | 272 | bool first = true; |
272 | for ( clistiter *current = clist_begin( list->ad_list ); current != NULL; current = current->next ) { | 273 | for ( clistiter *current = clist_begin( list->ad_list ); current != NULL; current = current->next ) { |
273 | mailimf_address *addr = (mailimf_address *) current->data; | 274 | mailimf_address *addr = (mailimf_address *) current->data; |
274 | 275 | ||
275 | if ( !first ) { | 276 | if ( !first ) { |
276 | result.append( "," ); | 277 | result.append( "," ); |
277 | } else { | 278 | } else { |
278 | first = false; | 279 | first = false; |
279 | } | 280 | } |
280 | 281 | ||
281 | switch ( addr->ad_type ) { | 282 | switch ( addr->ad_type ) { |
282 | case MAILIMF_ADDRESS_MAILBOX: | 283 | case MAILIMF_ADDRESS_MAILBOX: |
283 | result.append( parseMailbox( addr->ad_data.ad_mailbox ) ); | 284 | result.append( parseMailbox( addr->ad_data.ad_mailbox ) ); |
284 | break; | 285 | break; |
285 | case MAILIMF_ADDRESS_GROUP: | 286 | case MAILIMF_ADDRESS_GROUP: |
286 | result.append( parseGroup( addr->ad_data.ad_group ) ); | 287 | result.append( parseGroup( addr->ad_data.ad_group ) ); |
287 | break; | 288 | break; |
288 | default: | 289 | default: |
289 | qDebug( "POP3: unkown mailimf address type" ); | 290 | qDebug( "POP3: unkown mailimf address type" ); |
290 | break; | 291 | break; |
291 | } | 292 | } |
292 | } | 293 | } |
293 | 294 | ||
294 | return result; | 295 | return result; |
295 | } | 296 | } |
296 | 297 | ||
297 | QString POP3wrapper::parseGroup( mailimf_group *group ) | 298 | QString POP3wrapper::parseGroup( mailimf_group *group ) |
298 | { | 299 | { |
299 | QString result( "" ); | 300 | QString result( "" ); |
300 | 301 | ||
301 | result.append( group->grp_display_name ); | 302 | result.append( group->grp_display_name ); |
302 | result.append( ": " ); | 303 | result.append( ": " ); |
303 | 304 | ||
304 | if ( group->grp_mb_list != NULL ) { | 305 | if ( group->grp_mb_list != NULL ) { |
305 | result.append( parseMailboxList( group->grp_mb_list ) ); | 306 | result.append( parseMailboxList( group->grp_mb_list ) ); |
306 | } | 307 | } |
307 | 308 | ||
308 | result.append( ";" ); | 309 | result.append( ";" ); |
309 | 310 | ||
310 | return result; | 311 | return result; |
311 | } | 312 | } |
312 | 313 | ||
313 | QString POP3wrapper::parseMailbox( mailimf_mailbox *box ) | 314 | QString POP3wrapper::parseMailbox( mailimf_mailbox *box ) |
314 | { | 315 | { |
315 | QString result( "" ); | 316 | QString result( "" ); |
316 | 317 | ||
317 | if ( box->mb_display_name == NULL ) { | 318 | if ( box->mb_display_name == NULL ) { |
318 | result.append( box->mb_addr_spec ); | 319 | result.append( box->mb_addr_spec ); |
319 | } else { | 320 | } else { |
320 | result.append( convert_String(box->mb_display_name).latin1() ); | 321 | result.append( convert_String(box->mb_display_name).latin1() ); |
321 | result.append( " <" ); | 322 | result.append( " <" ); |
322 | result.append( box->mb_addr_spec ); | 323 | result.append( box->mb_addr_spec ); |
323 | result.append( ">" ); | 324 | result.append( ">" ); |
324 | } | 325 | } |
325 | 326 | ||
326 | return result; | 327 | return result; |
327 | } | 328 | } |
328 | 329 | ||
329 | QString POP3wrapper::parseMailboxList( mailimf_mailbox_list *list ) | 330 | QString POP3wrapper::parseMailboxList( mailimf_mailbox_list *list ) |
330 | { | 331 | { |
331 | QString result( "" ); | 332 | QString result( "" ); |
332 | 333 | ||
333 | bool first = true; | 334 | bool first = true; |
334 | for ( clistiter *current = clist_begin( list->mb_list ); current != NULL; current = current->next ) { | 335 | for ( clistiter *current = clist_begin( list->mb_list ); current != NULL; current = current->next ) { |
335 | mailimf_mailbox *box = (mailimf_mailbox *) current->data; | 336 | mailimf_mailbox *box = (mailimf_mailbox *) current->data; |
336 | 337 | ||
337 | if ( !first ) { | 338 | if ( !first ) { |
338 | result.append( "," ); | 339 | result.append( "," ); |
339 | } else { | 340 | } else { |
340 | first = false; | 341 | first = false; |
341 | } | 342 | } |
342 | 343 | ||
343 | result.append( parseMailbox( box ) ); | 344 | result.append( parseMailbox( box ) ); |
344 | } | 345 | } |
345 | 346 | ||
346 | return result; | 347 | return result; |
347 | } | 348 | } |
348 | 349 | ||
349 | void POP3wrapper::login() | 350 | void POP3wrapper::login() |
350 | { | 351 | { |
351 | /* we'll hold the line */ | 352 | /* we'll hold the line */ |
352 | if ( m_pop3 != NULL ) return; | 353 | if ( m_pop3 != NULL ) return; |
353 | 354 | ||
354 | const char *server, *user, *pass; | 355 | const char *server, *user, *pass; |
355 | uint16_t port; | 356 | uint16_t port; |
356 | int err = MAILPOP3_NO_ERROR; | 357 | int err = MAILPOP3_NO_ERROR; |
357 | 358 | ||
358 | server = account->getServer().latin1(); | 359 | server = account->getServer().latin1(); |
359 | port = account->getPort().toUInt(); | 360 | port = account->getPort().toUInt(); |
360 | user = account->getUser().latin1(); | 361 | |
361 | pass = account->getPassword().latin1(); | 362 | if ( account->getUser().isEmpty() || account->getPassword().isEmpty() ) { |
363 | LoginDialog login( account->getUser(), account->getPassword(), NULL, 0, true ); | ||
364 | login.show(); | ||
365 | if ( QDialog::Accepted == login.exec() ) { | ||
366 | // ok | ||
367 | user = strdup( login.getUser().latin1() ); | ||
368 | pass = strdup( login.getPassword().latin1() ); | ||
369 | } else { | ||
370 | // cancel | ||
371 | qDebug( "POP3: Login canceled" ); | ||
372 | return; | ||
373 | } | ||
374 | } else { | ||
375 | user = account->getUser().latin1(); | ||
376 | pass = account->getPassword().latin1(); | ||
377 | } | ||
362 | 378 | ||
363 | m_pop3 = mailpop3_new( 200, &pop3_progress ); | 379 | m_pop3 = mailpop3_new( 200, &pop3_progress ); |
364 | 380 | ||
365 | // connect | 381 | // connect |
366 | if (account->getSSL()) { | 382 | if (account->getSSL()) { |
367 | err = mailpop3_ssl_connect( m_pop3, (char*)server, port ); | 383 | err = mailpop3_ssl_connect( m_pop3, (char*)server, port ); |
368 | } else { | 384 | } else { |
369 | err = mailpop3_socket_connect( m_pop3, (char*)server, port ); | 385 | err = mailpop3_socket_connect( m_pop3, (char*)server, port ); |
370 | } | 386 | } |
371 | 387 | ||
372 | if ( err != MAILPOP3_NO_ERROR ) { | 388 | if ( err != MAILPOP3_NO_ERROR ) { |
373 | qDebug( "pop3: error connecting to %s\n reason: %s", server, | 389 | qDebug( "pop3: error connecting to %s\n reason: %s", server, |
374 | m_pop3->pop3_response ); | 390 | m_pop3->pop3_response ); |
375 | mailpop3_free( m_pop3 ); | 391 | mailpop3_free( m_pop3 ); |
376 | m_pop3 = NULL; | 392 | m_pop3 = NULL; |
377 | return; | 393 | return; |
378 | } | 394 | } |
379 | qDebug( "POP3: connected!" ); | 395 | qDebug( "POP3: connected!" ); |
380 | 396 | ||
381 | // login | 397 | // login |
382 | // TODO: decide if apop or plain login should be used | 398 | // TODO: decide if apop or plain login should be used |
383 | err = mailpop3_login( m_pop3, (char *) user, (char *) pass ); | 399 | err = mailpop3_login( m_pop3, (char *) user, (char *) pass ); |
384 | if ( err != MAILPOP3_NO_ERROR ) { | 400 | if ( err != MAILPOP3_NO_ERROR ) { |
385 | qDebug( "pop3: error logging in: %s", m_pop3->pop3_response ); | 401 | qDebug( "pop3: error logging in: %s", m_pop3->pop3_response ); |
386 | logout(); | 402 | logout(); |
387 | return; | 403 | return; |
388 | } | 404 | } |
389 | 405 | ||
390 | qDebug( "POP3: logged in!" ); | 406 | qDebug( "POP3: logged in!" ); |
391 | } | 407 | } |
392 | 408 | ||
393 | void POP3wrapper::logout() | 409 | void POP3wrapper::logout() |
394 | { | 410 | { |
395 | int err = MAILPOP3_NO_ERROR; | 411 | int err = MAILPOP3_NO_ERROR; |
396 | if ( m_pop3 == NULL ) return; | 412 | if ( m_pop3 == NULL ) return; |
397 | err = mailpop3_quit( m_pop3 ); | 413 | err = mailpop3_quit( m_pop3 ); |
398 | mailpop3_free( m_pop3 ); | 414 | mailpop3_free( m_pop3 ); |
399 | m_pop3 = NULL; | 415 | m_pop3 = NULL; |
400 | } | 416 | } |
401 | 417 | ||
402 | 418 | ||
403 | QList<Folder>* POP3wrapper::listFolders() | 419 | QList<Folder>* POP3wrapper::listFolders() |
404 | { | 420 | { |
405 | /* TODO: integrate MH directories | 421 | /* TODO: integrate MH directories |
406 | but not before version 0.1 ;) | 422 | but not before version 0.1 ;) |
407 | */ | 423 | */ |
408 | QList<Folder> * folders = new QList<Folder>(); | 424 | QList<Folder> * folders = new QList<Folder>(); |
409 | folders->setAutoDelete( false ); | 425 | folders->setAutoDelete( false ); |
410 | Folder*inb=new Folder("INBOX","/"); | 426 | Folder*inb=new Folder("INBOX","/"); |
411 | folders->append(inb); | 427 | folders->append(inb); |
412 | return folders; | 428 | return folders; |
413 | } | 429 | } |
414 | 430 | ||
415 | QString POP3wrapper::fetchTextPart(const RecMail&,const RecPart&) | 431 | QString POP3wrapper::fetchTextPart(const RecMail&,const RecPart&) |
416 | { | 432 | { |
417 | return ""; | 433 | return ""; |
418 | } | 434 | } |
419 | 435 | ||
420 | void POP3wrapper::deleteMail(const RecMail&mail) | 436 | void POP3wrapper::deleteMail(const RecMail&mail) |
421 | { | 437 | { |
422 | login(); | 438 | login(); |
423 | if (!m_pop3) return; | 439 | if (!m_pop3) return; |
424 | int err = mailpop3_dele(m_pop3,mail.getNumber()); | 440 | int err = mailpop3_dele(m_pop3,mail.getNumber()); |
425 | if (err != MAILPOP3_NO_ERROR) { | 441 | if (err != MAILPOP3_NO_ERROR) { |
426 | qDebug("error deleting mail"); | 442 | qDebug("error deleting mail"); |
427 | } | 443 | } |
428 | } | 444 | } |
429 | 445 | ||
430 | void POP3wrapper::answeredMail(const RecMail&) | 446 | void POP3wrapper::answeredMail(const RecMail&) |
431 | { | 447 | { |
432 | } | 448 | } |
433 | 449 | ||
434 | encodedString* POP3wrapper::fetchDecodedPart(const RecMail&,const RecPart&) | 450 | encodedString* POP3wrapper::fetchDecodedPart(const RecMail&,const RecPart&) |
435 | { | 451 | { |
436 | return new encodedString(); | 452 | return new encodedString(); |
437 | } | 453 | } |
438 | 454 | ||
439 | encodedString* POP3wrapper::fetchRawPart(const RecMail&,const RecPart&) | 455 | encodedString* POP3wrapper::fetchRawPart(const RecMail&,const RecPart&) |
440 | { | 456 | { |
441 | return new encodedString(); | 457 | return new encodedString(); |
442 | } | 458 | } |