summaryrefslogtreecommitdiff
authoralwin <alwin>2003-12-19 19:30:47 (UTC)
committer alwin <alwin>2003-12-19 19:30:47 (UTC)
commit00a0c8cf03fe746c1e3ba608bf298c8e66d065f9 (patch) (unidiff)
tree15cd3d961b3f974945f63e86dd314a12eb183575
parentb66e2d718769a3ac1ae6bc1fc135c04f532bdbf3 (diff)
downloadopie-00a0c8cf03fe746c1e3ba608bf298c8e66d065f9.zip
opie-00a0c8cf03fe746c1e3ba608bf298c8e66d065f9.tar.gz
opie-00a0c8cf03fe746c1e3ba608bf298c8e66d065f9.tar.bz2
receiving and splitting a mail finished
next step: setup unique ids for attachmenst if not given an cache them. Note: this could can used later for MH access, too. Means, pop3 and MH wrapper should get a baseclass for the parsing funs.
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/net/mail/libmailwrapper/pop3wrapper.cpp33
-rw-r--r--noncore/net/mail/libmailwrapper/pop3wrapper.h1
-rw-r--r--noncore/net/mail/pop3wrapper.cpp33
-rw-r--r--noncore/net/mail/pop3wrapper.h1
4 files changed, 52 insertions, 16 deletions
diff --git a/noncore/net/mail/libmailwrapper/pop3wrapper.cpp b/noncore/net/mail/libmailwrapper/pop3wrapper.cpp
index 2c2a42a..65cd4ba 100644
--- a/noncore/net/mail/libmailwrapper/pop3wrapper.cpp
+++ b/noncore/net/mail/libmailwrapper/pop3wrapper.cpp
@@ -65,513 +65,530 @@ RecBody POP3wrapper::fetchBody( const RecMail &mail )
65 } 65 }
66 msg_cache.writeBlock(message,length); 66 msg_cache.writeBlock(message,length);
67 } else { 67 } else {
68 QString msg=""; 68 QString msg="";
69 msg_cache.open(IO_ReadOnly); 69 msg_cache.open(IO_ReadOnly);
70 message = new char[4096]; 70 message = new char[4096];
71 memset(message,0,4096); 71 memset(message,0,4096);
72 while (msg_cache.readBlock(message,4095)>0) { 72 while (msg_cache.readBlock(message,4095)>0) {
73 msg+=message; 73 msg+=message;
74 memset(message,0,4096); 74 memset(message,0,4096);
75 } 75 }
76 delete message; 76 delete message;
77 message = (char*)malloc(msg.length()+1*sizeof(char)); 77 message = (char*)malloc(msg.length()+1*sizeof(char));
78 memset(message,0,msg.length()+1); 78 memset(message,0,msg.length()+1);
79 memcpy(message,msg.latin1(),msg.length()); 79 memcpy(message,msg.latin1(),msg.length());
80 } 80 }
81 body = parseMail(message); 81 body = parseMail(message);
82 free(message); 82 free(message);
83 return body; 83 return body;
84} 84}
85 85
86RecBody POP3wrapper::parseMail( char *message ) 86RecBody POP3wrapper::parseMail( char *message )
87{ 87{
88 int err = MAILIMF_NO_ERROR; 88 int err = MAILIMF_NO_ERROR;
89 /* these vars are used recurcive! set it to 0!!!!!!!!!!!!!!!!! */ 89 /* these vars are used recurcive! set it to 0!!!!!!!!!!!!!!!!! */
90 size_t curTok = 0; 90 size_t curTok = 0;
91 mailimf_message *result = 0; 91 mailimf_message *result = 0;
92 mailmessage * msg=0; 92 mailmessage * msg=0;
93 mailmime_single_fields fields; 93 mailmime_single_fields fields;
94 94
95 /* is bound to msg and will be freed there */ 95 /* is bound to msg and will be freed there */
96 struct mailmime * mime=0; 96 struct mailmime * mime=0;
97 97
98 RecBody body; 98 RecBody body;
99 99
100 100
101 err = mailimf_message_parse( (char *) message, strlen( message ), &curTok, &result ); 101 err = mailimf_message_parse( (char *) message, strlen( message ), &curTok, &result );
102 if ( err != MAILIMF_NO_ERROR ) { 102 if ( err != MAILIMF_NO_ERROR ) {
103 if (result) mailimf_message_free(result); 103 if (result) mailimf_message_free(result);
104 return body; 104 return body;
105 } 105 }
106 106
107 char*body_msg = message; 107 char*body_msg = message;
108 msg = mailmessage_new(); 108 msg = mailmessage_new();
109 mailmessage_init(msg, NULL, data_message_driver, 0, strlen(body_msg)); 109 mailmessage_init(msg, NULL, data_message_driver, 0, strlen(body_msg));
110 generic_message_t * msg_data; 110 generic_message_t * msg_data;
111 msg_data = (generic_message_t *)msg->msg_data; 111 msg_data = (generic_message_t *)msg->msg_data;
112 msg_data->msg_fetched = 1; 112 msg_data->msg_fetched = 1;
113 msg_data->msg_message = body_msg; 113 msg_data->msg_message = body_msg;
114 msg_data->msg_length = strlen(body_msg); 114 msg_data->msg_length = strlen(body_msg);
115 115
116 116
117 memset(&fields, 0, sizeof(struct mailmime_single_fields)); 117 memset(&fields, 0, sizeof(struct mailmime_single_fields));
118 err = mailmessage_get_bodystructure(msg,&mime); 118 err = mailmessage_get_bodystructure(msg,&mime);
119 traverseBody(body,msg,mime); 119 traverseBody(body,msg,mime);
120 120
121 mailmessage_free(msg); 121 mailmessage_free(msg);
122 122
123 return body; 123 return body;
124} 124}
125 125
126void POP3wrapper::listMessages(const QString &, QList<RecMail> &target ) 126void POP3wrapper::listMessages(const QString &, QList<RecMail> &target )
127{ 127{
128 int err = MAILPOP3_NO_ERROR; 128 int err = MAILPOP3_NO_ERROR;
129 char * header = 0; 129 char * header = 0;
130 /* these vars are used recurcive! set it to 0!!!!!!!!!!!!!!!!! */ 130 /* these vars are used recurcive! set it to 0!!!!!!!!!!!!!!!!! */
131 size_t length = 0; 131 size_t length = 0;
132 carray * messages = 0; 132 carray * messages = 0;
133 133
134 login(); 134 login();
135 if (!m_pop3) return; 135 if (!m_pop3) return;
136 mailpop3_list( m_pop3, &messages ); 136 mailpop3_list( m_pop3, &messages );
137 137
138 for (unsigned int i = 0; i < carray_count(messages);++i) { 138 for (unsigned int i = 0; i < carray_count(messages);++i) {
139 mailpop3_msg_info *info; 139 mailpop3_msg_info *info;
140 err = mailpop3_get_msg_info(m_pop3,i+1,&info); 140 err = mailpop3_get_msg_info(m_pop3,i+1,&info);
141 if (info->msg_deleted) 141 if (info->msg_deleted)
142 continue; 142 continue;
143 err = mailpop3_header( m_pop3, info->msg_index, &header, &length ); 143 err = mailpop3_header( m_pop3, info->msg_index, &header, &length );
144 if ( err != MAILPOP3_NO_ERROR ) { 144 if ( err != MAILPOP3_NO_ERROR ) {
145 qDebug( "POP3: error retrieving header msgid: %i", info->msg_index ); 145 qDebug( "POP3: error retrieving header msgid: %i", info->msg_index );
146 free(header); 146 free(header);
147 return; 147 return;
148 } 148 }
149 RecMail *mail = parseHeader( header ); 149 RecMail *mail = parseHeader( header );
150 mail->setNumber( info->msg_index ); 150 mail->setNumber( info->msg_index );
151 mail->setWrapper(this); 151 mail->setWrapper(this);
152 mail->setMsgsize(info->msg_size); 152 mail->setMsgsize(info->msg_size);
153 target.append( mail ); 153 target.append( mail );
154 free(header); 154 free(header);
155 } 155 }
156} 156}
157 157
158RecMail *POP3wrapper::parseHeader( const char *header ) 158RecMail *POP3wrapper::parseHeader( const char *header )
159{ 159{
160 int err = MAILIMF_NO_ERROR; 160 int err = MAILIMF_NO_ERROR;
161 size_t curTok = 0; 161 size_t curTok = 0;
162 RecMail *mail = new RecMail(); 162 RecMail *mail = new RecMail();
163 mailimf_fields *fields; 163 mailimf_fields *fields;
164 mailimf_references * refs; 164 mailimf_references * refs;
165 mailimf_keywords*keys; 165 mailimf_keywords*keys;
166 QString status; 166 QString status;
167 QString value; 167 QString value;
168 QBitArray mFlags(7); 168 QBitArray mFlags(7);
169 169
170 err = mailimf_fields_parse( (char *) header, strlen( header ), &curTok, &fields ); 170 err = mailimf_fields_parse( (char *) header, strlen( header ), &curTok, &fields );
171 for ( clistiter *current = clist_begin( fields->fld_list ); current != NULL; current = current->next ) { 171 for ( clistiter *current = clist_begin( fields->fld_list ); current != NULL; current = current->next ) {
172 mailimf_field *field = (mailimf_field *) current->data; 172 mailimf_field *field = (mailimf_field *) current->data;
173 switch ( field->fld_type ) { 173 switch ( field->fld_type ) {
174 case MAILIMF_FIELD_FROM: 174 case MAILIMF_FIELD_FROM:
175 mail->setFrom( parseMailboxList( field->fld_data.fld_from->frm_mb_list ) ); 175 mail->setFrom( parseMailboxList( field->fld_data.fld_from->frm_mb_list ) );
176 break; 176 break;
177 case MAILIMF_FIELD_TO: 177 case MAILIMF_FIELD_TO:
178 mail->setTo( parseAddressList( field->fld_data.fld_to->to_addr_list ) ); 178 mail->setTo( parseAddressList( field->fld_data.fld_to->to_addr_list ) );
179 break; 179 break;
180 case MAILIMF_FIELD_CC: 180 case MAILIMF_FIELD_CC:
181 mail->setCC( parseAddressList( field->fld_data.fld_cc->cc_addr_list ) ); 181 mail->setCC( parseAddressList( field->fld_data.fld_cc->cc_addr_list ) );
182 break; 182 break;
183 case MAILIMF_FIELD_BCC: 183 case MAILIMF_FIELD_BCC:
184 mail->setBcc( parseAddressList( field->fld_data.fld_bcc->bcc_addr_list ) ); 184 mail->setBcc( parseAddressList( field->fld_data.fld_bcc->bcc_addr_list ) );
185 break; 185 break;
186 case MAILIMF_FIELD_SUBJECT: 186 case MAILIMF_FIELD_SUBJECT:
187 mail->setSubject(convert_String( field->fld_data.fld_subject->sbj_value ) ); 187 mail->setSubject(convert_String( field->fld_data.fld_subject->sbj_value ) );
188 break; 188 break;
189 case MAILIMF_FIELD_ORIG_DATE: 189 case MAILIMF_FIELD_ORIG_DATE:
190 mail->setDate( parseDateTime( field->fld_data.fld_orig_date->dt_date_time ) ); 190 mail->setDate( parseDateTime( field->fld_data.fld_orig_date->dt_date_time ) );
191 break; 191 break;
192 case MAILIMF_FIELD_MESSAGE_ID: 192 case MAILIMF_FIELD_MESSAGE_ID:
193 mail->setMsgid(QString(field->fld_data.fld_message_id->mid_value)); 193 mail->setMsgid(QString(field->fld_data.fld_message_id->mid_value));
194 break; 194 break;
195 case MAILIMF_FIELD_REFERENCES: 195 case MAILIMF_FIELD_REFERENCES:
196 refs = field->fld_data.fld_references; 196 refs = field->fld_data.fld_references;
197 if (refs && refs->mid_list && clist_count(refs->mid_list)) { 197 if (refs && refs->mid_list && clist_count(refs->mid_list)) {
198 char * text = (char*)refs->mid_list->first->data; 198 char * text = (char*)refs->mid_list->first->data;
199 mail->setReplyto(QString(text)); 199 mail->setReplyto(QString(text));
200 } 200 }
201 break; 201 break;
202 case MAILIMF_FIELD_KEYWORDS: 202 case MAILIMF_FIELD_KEYWORDS:
203 keys = field->fld_data.fld_keywords; 203 keys = field->fld_data.fld_keywords;
204 for (clistcell*cur = clist_begin(keys->kw_list);cur!=0;cur=clist_next(cur)) { 204 for (clistcell*cur = clist_begin(keys->kw_list);cur!=0;cur=clist_next(cur)) {
205 qDebug("Keyword: %s",(char*)cur->data); 205 qDebug("Keyword: %s",(char*)cur->data);
206 } 206 }
207 break; 207 break;
208 case MAILIMF_FIELD_OPTIONAL_FIELD: 208 case MAILIMF_FIELD_OPTIONAL_FIELD:
209 status = field->fld_data.fld_optional_field->fld_name; 209 status = field->fld_data.fld_optional_field->fld_name;
210 value = field->fld_data.fld_optional_field->fld_value; 210 value = field->fld_data.fld_optional_field->fld_value;
211 if (status.lower()=="status") { 211 if (status.lower()=="status") {
212 if (value.lower()=="ro") { 212 if (value.lower()=="ro") {
213 mFlags.setBit(FLAG_SEEN); 213 mFlags.setBit(FLAG_SEEN);
214 } 214 }
215 } else if (status.lower()=="x-status") { 215 } else if (status.lower()=="x-status") {
216 qDebug("X-Status: %s",value.latin1()); 216 qDebug("X-Status: %s",value.latin1());
217 if (value.lower()=="a") { 217 if (value.lower()=="a") {
218 mFlags.setBit(FLAG_ANSWERED); 218 mFlags.setBit(FLAG_ANSWERED);
219 } 219 }
220 } else { 220 } else {
221// qDebug("Optionales feld: %s -> %s)",field->fld_data.fld_optional_field->fld_name, 221// qDebug("Optionales feld: %s -> %s)",field->fld_data.fld_optional_field->fld_name,
222// field->fld_data.fld_optional_field->fld_value); 222// field->fld_data.fld_optional_field->fld_value);
223 } 223 }
224 break; 224 break;
225 default: 225 default:
226 qDebug("Non parsed field"); 226 qDebug("Non parsed field");
227 break; 227 break;
228 } 228 }
229 } 229 }
230 if (fields) mailimf_fields_free(fields); 230 if (fields) mailimf_fields_free(fields);
231 mail->setFlags(mFlags); 231 mail->setFlags(mFlags);
232 return mail; 232 return mail;
233} 233}
234 234
235QString POP3wrapper::parseDateTime( mailimf_date_time *date ) 235QString POP3wrapper::parseDateTime( mailimf_date_time *date )
236{ 236{
237 char tmp[23]; 237 char tmp[23];
238 238
239 snprintf( tmp, 23, "%02i.%02i.%04i %02i:%02i:%02i %+05i", 239 snprintf( tmp, 23, "%02i.%02i.%04i %02i:%02i:%02i %+05i",
240 date->dt_day, date->dt_month, date->dt_year, date->dt_hour, date->dt_min, date->dt_sec, date->dt_zone ); 240 date->dt_day, date->dt_month, date->dt_year, date->dt_hour, date->dt_min, date->dt_sec, date->dt_zone );
241 241
242 return QString( tmp ); 242 return QString( tmp );
243} 243}
244 244
245QString POP3wrapper::parseAddressList( mailimf_address_list *list ) 245QString POP3wrapper::parseAddressList( mailimf_address_list *list )
246{ 246{
247 QString result( "" ); 247 QString result( "" );
248 248
249 bool first = true; 249 bool first = true;
250 for ( clistiter *current = clist_begin( list->ad_list ); current != NULL; current = current->next ) { 250 for ( clistiter *current = clist_begin( list->ad_list ); current != NULL; current = current->next ) {
251 mailimf_address *addr = (mailimf_address *) current->data; 251 mailimf_address *addr = (mailimf_address *) current->data;
252 252
253 if ( !first ) { 253 if ( !first ) {
254 result.append( "," ); 254 result.append( "," );
255 } else { 255 } else {
256 first = false; 256 first = false;
257 } 257 }
258 258
259 switch ( addr->ad_type ) { 259 switch ( addr->ad_type ) {
260 case MAILIMF_ADDRESS_MAILBOX: 260 case MAILIMF_ADDRESS_MAILBOX:
261 result.append( parseMailbox( addr->ad_data.ad_mailbox ) ); 261 result.append( parseMailbox( addr->ad_data.ad_mailbox ) );
262 break; 262 break;
263 case MAILIMF_ADDRESS_GROUP: 263 case MAILIMF_ADDRESS_GROUP:
264 result.append( parseGroup( addr->ad_data.ad_group ) ); 264 result.append( parseGroup( addr->ad_data.ad_group ) );
265 break; 265 break;
266 default: 266 default:
267 qDebug( "POP3: unkown mailimf address type" ); 267 qDebug( "POP3: unkown mailimf address type" );
268 break; 268 break;
269 } 269 }
270 } 270 }
271 271
272 return result; 272 return result;
273} 273}
274 274
275QString POP3wrapper::parseGroup( mailimf_group *group ) 275QString POP3wrapper::parseGroup( mailimf_group *group )
276{ 276{
277 QString result( "" ); 277 QString result( "" );
278 278
279 result.append( group->grp_display_name ); 279 result.append( group->grp_display_name );
280 result.append( ": " ); 280 result.append( ": " );
281 281
282 if ( group->grp_mb_list != NULL ) { 282 if ( group->grp_mb_list != NULL ) {
283 result.append( parseMailboxList( group->grp_mb_list ) ); 283 result.append( parseMailboxList( group->grp_mb_list ) );
284 } 284 }
285 285
286 result.append( ";" ); 286 result.append( ";" );
287 287
288 return result; 288 return result;
289} 289}
290 290
291QString POP3wrapper::parseMailbox( mailimf_mailbox *box ) 291QString POP3wrapper::parseMailbox( mailimf_mailbox *box )
292{ 292{
293 QString result( "" ); 293 QString result( "" );
294 294
295 if ( box->mb_display_name == NULL ) { 295 if ( box->mb_display_name == NULL ) {
296 result.append( box->mb_addr_spec ); 296 result.append( box->mb_addr_spec );
297 } else { 297 } else {
298 result.append( convert_String(box->mb_display_name).latin1() ); 298 result.append( convert_String(box->mb_display_name).latin1() );
299 result.append( " <" ); 299 result.append( " <" );
300 result.append( box->mb_addr_spec ); 300 result.append( box->mb_addr_spec );
301 result.append( ">" ); 301 result.append( ">" );
302 } 302 }
303 303
304 return result; 304 return result;
305} 305}
306 306
307QString POP3wrapper::parseMailboxList( mailimf_mailbox_list *list ) 307QString POP3wrapper::parseMailboxList( mailimf_mailbox_list *list )
308{ 308{
309 QString result( "" ); 309 QString result( "" );
310 310
311 bool first = true; 311 bool first = true;
312 for ( clistiter *current = clist_begin( list->mb_list ); current != NULL; current = current->next ) { 312 for ( clistiter *current = clist_begin( list->mb_list ); current != NULL; current = current->next ) {
313 mailimf_mailbox *box = (mailimf_mailbox *) current->data; 313 mailimf_mailbox *box = (mailimf_mailbox *) current->data;
314 314
315 if ( !first ) { 315 if ( !first ) {
316 result.append( "," ); 316 result.append( "," );
317 } else { 317 } else {
318 first = false; 318 first = false;
319 } 319 }
320 320
321 result.append( parseMailbox( box ) ); 321 result.append( parseMailbox( box ) );
322 } 322 }
323 323
324 return result; 324 return result;
325} 325}
326 326
327void POP3wrapper::login() 327void POP3wrapper::login()
328{ 328{
329 /* we'll hold the line */ 329 /* we'll hold the line */
330 if ( m_pop3 != NULL ) return; 330 if ( m_pop3 != NULL ) return;
331 331
332 const char *server, *user, *pass; 332 const char *server, *user, *pass;
333 uint16_t port; 333 uint16_t port;
334 int err = MAILPOP3_NO_ERROR; 334 int err = MAILPOP3_NO_ERROR;
335 335
336 server = account->getServer().latin1(); 336 server = account->getServer().latin1();
337 port = account->getPort().toUInt(); 337 port = account->getPort().toUInt();
338 338
339 if ( account->getUser().isEmpty() || account->getPassword().isEmpty() ) { 339 if ( account->getUser().isEmpty() || account->getPassword().isEmpty() ) {
340 LoginDialog login( account->getUser(), account->getPassword(), NULL, 0, true ); 340 LoginDialog login( account->getUser(), account->getPassword(), NULL, 0, true );
341 login.show(); 341 login.show();
342 if ( QDialog::Accepted == login.exec() ) { 342 if ( QDialog::Accepted == login.exec() ) {
343 // ok 343 // ok
344 user = strdup( login.getUser().latin1() ); 344 user = strdup( login.getUser().latin1() );
345 pass = strdup( login.getPassword().latin1() ); 345 pass = strdup( login.getPassword().latin1() );
346 } else { 346 } else {
347 // cancel 347 // cancel
348 qDebug( "POP3: Login canceled" ); 348 qDebug( "POP3: Login canceled" );
349 return; 349 return;
350 } 350 }
351 } else { 351 } else {
352 user = account->getUser().latin1(); 352 user = account->getUser().latin1();
353 pass = account->getPassword().latin1(); 353 pass = account->getPassword().latin1();
354 } 354 }
355 355
356 m_pop3 = mailpop3_new( 200, &pop3_progress ); 356 m_pop3 = mailpop3_new( 200, &pop3_progress );
357 357
358 // connect 358 // connect
359 if (account->getSSL()) { 359 if (account->getSSL()) {
360 err = mailpop3_ssl_connect( m_pop3, (char*)server, port ); 360 err = mailpop3_ssl_connect( m_pop3, (char*)server, port );
361 } else { 361 } else {
362 err = mailpop3_socket_connect( m_pop3, (char*)server, port ); 362 err = mailpop3_socket_connect( m_pop3, (char*)server, port );
363 } 363 }
364 364
365 if ( err != MAILPOP3_NO_ERROR ) { 365 if ( err != MAILPOP3_NO_ERROR ) {
366 qDebug( "pop3: error connecting to %s\n reason: %s", server, 366 qDebug( "pop3: error connecting to %s\n reason: %s", server,
367 m_pop3->pop3_response ); 367 m_pop3->pop3_response );
368 mailpop3_free( m_pop3 ); 368 mailpop3_free( m_pop3 );
369 m_pop3 = NULL; 369 m_pop3 = NULL;
370 return; 370 return;
371 } 371 }
372 qDebug( "POP3: connected!" ); 372 qDebug( "POP3: connected!" );
373 373
374 // login 374 // login
375 // TODO: decide if apop or plain login should be used 375 // TODO: decide if apop or plain login should be used
376 err = mailpop3_login( m_pop3, (char *) user, (char *) pass ); 376 err = mailpop3_login( m_pop3, (char *) user, (char *) pass );
377 if ( err != MAILPOP3_NO_ERROR ) { 377 if ( err != MAILPOP3_NO_ERROR ) {
378 qDebug( "pop3: error logging in: %s", m_pop3->pop3_response ); 378 qDebug( "pop3: error logging in: %s", m_pop3->pop3_response );
379 logout(); 379 logout();
380 return; 380 return;
381 } 381 }
382 382
383 qDebug( "POP3: logged in!" ); 383 qDebug( "POP3: logged in!" );
384} 384}
385 385
386void POP3wrapper::logout() 386void POP3wrapper::logout()
387{ 387{
388 int err = MAILPOP3_NO_ERROR; 388 int err = MAILPOP3_NO_ERROR;
389 if ( m_pop3 == NULL ) return; 389 if ( m_pop3 == NULL ) return;
390 err = mailpop3_quit( m_pop3 ); 390 err = mailpop3_quit( m_pop3 );
391 mailpop3_free( m_pop3 ); 391 mailpop3_free( m_pop3 );
392 m_pop3 = NULL; 392 m_pop3 = NULL;
393} 393}
394 394
395 395
396QList<Folder>* POP3wrapper::listFolders() 396QList<Folder>* POP3wrapper::listFolders()
397{ 397{
398 /* TODO: integrate MH directories 398 /* TODO: integrate MH directories
399 but not before version 0.1 ;) 399 but not before version 0.1 ;)
400 */ 400 */
401 QList<Folder> * folders = new QList<Folder>(); 401 QList<Folder> * folders = new QList<Folder>();
402 folders->setAutoDelete( false ); 402 folders->setAutoDelete( false );
403 Folder*inb=new Folder("INBOX","/"); 403 Folder*inb=new Folder("INBOX","/");
404 folders->append(inb); 404 folders->append(inb);
405 return folders; 405 return folders;
406} 406}
407 407
408QString POP3wrapper::fetchTextPart(const RecMail&,const RecPart&) 408QString POP3wrapper::fetchTextPart(const RecMail&,const RecPart&)
409{ 409{
410 return ""; 410 return "";
411} 411}
412 412
413void POP3wrapper::deleteMail(const RecMail&mail) 413void POP3wrapper::deleteMail(const RecMail&mail)
414{ 414{
415 login(); 415 login();
416 if (!m_pop3) return; 416 if (!m_pop3) return;
417 int err = mailpop3_dele(m_pop3,mail.getNumber()); 417 int err = mailpop3_dele(m_pop3,mail.getNumber());
418 if (err != MAILPOP3_NO_ERROR) { 418 if (err != MAILPOP3_NO_ERROR) {
419 qDebug("error deleting mail"); 419 qDebug("error deleting mail");
420 } 420 }
421} 421}
422 422
423void POP3wrapper::answeredMail(const RecMail&) 423void POP3wrapper::answeredMail(const RecMail&)
424{ 424{
425} 425}
426 426
427encodedString* POP3wrapper::fetchDecodedPart(const RecMail&,const RecPart&) 427encodedString* POP3wrapper::fetchDecodedPart(const RecMail&,const RecPart&)
428{ 428{
429 return new encodedString(); 429 return new encodedString();
430} 430}
431 431
432encodedString* POP3wrapper::fetchRawPart(const RecMail&,const RecPart&) 432encodedString* POP3wrapper::fetchRawPart(const RecMail&,const RecPart&)
433{ 433{
434 return new encodedString(); 434 return new encodedString();
435} 435}
436 436
437void POP3wrapper::traverseBody(RecBody&target,mailmessage*message,mailmime*mime,unsigned int current_rec) 437void POP3wrapper::traverseBody(RecBody&target,mailmessage*message,mailmime*mime,unsigned int current_rec)
438{ 438{
439 if (current_rec >= 10) { 439 if (current_rec >= 10) {
440 qDebug("too deep recursion!"); 440 qDebug("too deep recursion!");
441 } 441 }
442 if (!message || !mime) { 442 if (!message || !mime) {
443 return; 443 return;
444 } 444 }
445 int r; 445 int r;
446 char*data = 0; 446 char*data = 0;
447 size_t len; 447 size_t len;
448 clistiter * cur = 0; 448 clistiter * cur = 0;
449 mailmime_single_fields fields;
450 int res; 449 int res;
451 QString b; 450 QString b;
452 memset(&fields, 0, sizeof(struct mailmime_single_fields));
453 RecPart part; 451 RecPart part;
454 452
455 if (mime->mm_mime_fields != NULL) {
456 mailmime_single_fields_init(&fields, mime->mm_mime_fields,
457 mime->mm_content_type);
458 }
459 switch (mime->mm_type) { 453 switch (mime->mm_type) {
460 case MAILMIME_SINGLE: 454 case MAILMIME_SINGLE:
461 r = mailmessage_fetch_section(message,mime,&data,&len); 455 r = mailmessage_fetch_section(message,mime,&data,&len);
456 part.setSize(len);
462 fillSingleBody(part,message,mime); 457 fillSingleBody(part,message,mime);
463 if (part.Type()=="text" && target.Bodytext().isNull()) { 458 if (part.Type()=="text" && target.Bodytext().isNull()) {
464 encodedString*r = new encodedString(); 459 encodedString*r = new encodedString();
465 r->setContent(data,len); 460 r->setContent(data,len);
466 encodedString*res = decode_String(r,part.Encoding()); 461 encodedString*res = decode_String(r,part.Encoding());
467 b = QString(res->Content()); 462 b = QString(res->Content());
468 delete r; 463 delete r;
469 delete res; 464 delete res;
470 target.setBodytext(b); 465 target.setBodytext(b);
471 target.setDescription(part); 466 target.setDescription(part);
472 } else { 467 } else {
473 /* TODO: Add the content to a list and store it for later use */ 468 /* TODO: Add the content to a list and store it for later use */
474 if (data) free(data); 469 if (data) free(data);
475 target.addPart(part); 470 target.addPart(part);
476 } 471 }
477 break; 472 break;
478 case MAILMIME_MULTIPLE: 473 case MAILMIME_MULTIPLE:
479 for (cur = clist_begin(mime->mm_data.mm_multipart.mm_mp_list) ; cur != NULL ; cur = clist_next(cur)) { 474 for (cur = clist_begin(mime->mm_data.mm_multipart.mm_mp_list) ; cur != NULL ; cur = clist_next(cur)) {
480 traverseBody(target,message, (mailmime*)clist_content(cur),current_rec+1); 475 traverseBody(target,message, (mailmime*)clist_content(cur),current_rec+1);
481 } 476 }
482 break; 477 break;
483 case MAILMIME_MESSAGE: 478 case MAILMIME_MESSAGE:
484 if (mime->mm_data.mm_message.mm_msg_mime != NULL) { 479 if (mime->mm_data.mm_message.mm_msg_mime != NULL) {
485 traverseBody(target,message,mime->mm_data.mm_message.mm_msg_mime,current_rec+1); 480 traverseBody(target,message,mime->mm_data.mm_message.mm_msg_mime,current_rec+1);
486 } 481 }
487 break; 482 break;
488 } 483 }
489} 484}
490 485
491QString POP3wrapper::getencoding(mailmime_mechanism*aEnc) 486QString POP3wrapper::getencoding(mailmime_mechanism*aEnc)
492{ 487{
493 QString enc="7bit"; 488 QString enc="7bit";
494 if (!aEnc) return enc; 489 if (!aEnc) return enc;
495 switch(aEnc->enc_type) { 490 switch(aEnc->enc_type) {
496 case MAILMIME_MECHANISM_7BIT: 491 case MAILMIME_MECHANISM_7BIT:
497 enc = "7bit"; 492 enc = "7bit";
498 break; 493 break;
499 case MAILMIME_MECHANISM_8BIT: 494 case MAILMIME_MECHANISM_8BIT:
500 enc = "8bit"; 495 enc = "8bit";
501 break; 496 break;
502 case MAILMIME_MECHANISM_BINARY: 497 case MAILMIME_MECHANISM_BINARY:
503 enc = "binary"; 498 enc = "binary";
504 break; 499 break;
505 case MAILMIME_MECHANISM_QUOTED_PRINTABLE: 500 case MAILMIME_MECHANISM_QUOTED_PRINTABLE:
506 enc = "quoted-printable"; 501 enc = "quoted-printable";
507 break; 502 break;
508 case MAILMIME_MECHANISM_BASE64: 503 case MAILMIME_MECHANISM_BASE64:
509 enc = "base64"; 504 enc = "base64";
510 break; 505 break;
511 case MAILMIME_MECHANISM_TOKEN: 506 case MAILMIME_MECHANISM_TOKEN:
512 default: 507 default:
513 if (aEnc->enc_token) { 508 if (aEnc->enc_token) {
514 enc = QString(aEnc->enc_token); 509 enc = QString(aEnc->enc_token);
515 } 510 }
516 break; 511 break;
517 } 512 }
518 return enc; 513 return enc;
519} 514}
520 515
521void POP3wrapper::fillSingleBody(RecPart&target,mailmessage*,mailmime*mime) 516void POP3wrapper::fillSingleBody(RecPart&target,mailmessage*,mailmime*mime)
522{ 517{
523 if (!mime) { 518 if (!mime) {
524 return; 519 return;
525 } 520 }
526 mailmime_content*type = mime->mm_content_type;
527 mailmime_field*field = 0; 521 mailmime_field*field = 0;
522 mailmime_single_fields fields;
523 memset(&fields, 0, sizeof(struct mailmime_single_fields));
524 if (mime->mm_mime_fields != NULL) {
525 mailmime_single_fields_init(&fields, mime->mm_mime_fields,
526 mime->mm_content_type);
527 }
528
529 mailmime_content*type = fields.fld_content;
528 clistcell*current; 530 clistcell*current;
529 if (!type) { 531 if (!type) {
530 target.setType("text"); 532 target.setType("text");
531 target.setSubtype("plain"); 533 target.setSubtype("plain");
532 } else { 534 } else {
533 target.setSubtype(type->ct_subtype); 535 target.setSubtype(type->ct_subtype);
534 switch(type->ct_type->tp_data.tp_discrete_type->dt_type) { 536 switch(type->ct_type->tp_data.tp_discrete_type->dt_type) {
535 case MAILMIME_DISCRETE_TYPE_TEXT: 537 case MAILMIME_DISCRETE_TYPE_TEXT:
536 target.setType("text"); 538 target.setType("text");
537 break; 539 break;
538 case MAILMIME_DISCRETE_TYPE_IMAGE: 540 case MAILMIME_DISCRETE_TYPE_IMAGE:
539 target.setType("image"); 541 target.setType("image");
540 break; 542 break;
541 case MAILMIME_DISCRETE_TYPE_AUDIO: 543 case MAILMIME_DISCRETE_TYPE_AUDIO:
542 target.setType("audio"); 544 target.setType("audio");
543 break; 545 break;
544 case MAILMIME_DISCRETE_TYPE_VIDEO: 546 case MAILMIME_DISCRETE_TYPE_VIDEO:
545 target.setType("video"); 547 target.setType("video");
546 break; 548 break;
547 case MAILMIME_DISCRETE_TYPE_APPLICATION: 549 case MAILMIME_DISCRETE_TYPE_APPLICATION:
548 target.setType("application"); 550 target.setType("application");
549 break; 551 break;
550 case MAILMIME_DISCRETE_TYPE_EXTENSION: 552 case MAILMIME_DISCRETE_TYPE_EXTENSION:
551 default: 553 default:
552 if (type->ct_type->tp_data.tp_discrete_type->dt_extension) { 554 if (type->ct_type->tp_data.tp_discrete_type->dt_extension) {
553 target.setType(type->ct_type->tp_data.tp_discrete_type->dt_extension); 555 target.setType(type->ct_type->tp_data.tp_discrete_type->dt_extension);
554 } 556 }
555 break; 557 break;
556 } 558 }
559 if (type->ct_parameters) {
560 fillParameters(target,type->ct_parameters);
561 }
557 } 562 }
558 if (mime->mm_mime_fields && mime->mm_mime_fields->fld_list) { 563 if (mime->mm_mime_fields && mime->mm_mime_fields->fld_list) {
559 for (current=clist_begin(mime->mm_mime_fields->fld_list);current!=0;current=clist_next(current)) { 564 for (current=clist_begin(mime->mm_mime_fields->fld_list);current!=0;current=clist_next(current)) {
560 field = (mailmime_field*)current->data; 565 field = (mailmime_field*)current->data;
561 switch(field->fld_type) { 566 switch(field->fld_type) {
562 case MAILMIME_FIELD_TRANSFER_ENCODING: 567 case MAILMIME_FIELD_TRANSFER_ENCODING:
563 target.setEncoding(getencoding(field->fld_data.fld_encoding)); 568 target.setEncoding(getencoding(field->fld_data.fld_encoding));
564 break; 569 break;
565 case MAILMIME_FIELD_ID: 570 case MAILMIME_FIELD_ID:
566 target.setIdentifier(field->fld_data.fld_id); 571 target.setIdentifier(field->fld_data.fld_id);
567 break; 572 break;
568 case MAILMIME_FIELD_DESCRIPTION: 573 case MAILMIME_FIELD_DESCRIPTION:
569 target.setDescription(field->fld_data.fld_description); 574 target.setDescription(field->fld_data.fld_description);
570 break; 575 break;
571 default: 576 default:
572 break; 577 break;
573 } 578 }
574 } 579 }
575 } 580 }
576 // TODO search the parameter list for unique id and so on 581}
582
583void POP3wrapper::fillParameters(RecPart&target,clist*parameters)
584{
585 if (!parameters) {return;}
586 clistcell*current=0;
587 mailmime_parameter*param;
588 for (current=clist_begin(parameters);current!=0;current=clist_next(current)) {
589 param = (mailmime_parameter*)current->data;
590 if (param) {
591 target.addParameter(QString(param->pa_name).lower(),QString(param->pa_value));
592 }
593 }
577} 594}
diff --git a/noncore/net/mail/libmailwrapper/pop3wrapper.h b/noncore/net/mail/libmailwrapper/pop3wrapper.h
index 4171a76..b17928e 100644
--- a/noncore/net/mail/libmailwrapper/pop3wrapper.h
+++ b/noncore/net/mail/libmailwrapper/pop3wrapper.h
@@ -1,57 +1,58 @@
1#ifndef __POP3WRAPPER 1#ifndef __POP3WRAPPER
2#define __POP3WRAPPER 2#define __POP3WRAPPER
3 3
4#include "mailwrapper.h" 4#include "mailwrapper.h"
5#include "abstractmail.h" 5#include "abstractmail.h"
6 6
7class RecMail; 7class RecMail;
8class RecBody; 8class RecBody;
9class encodedString; 9class encodedString;
10struct mailpop3; 10struct mailpop3;
11struct mailmessage; 11struct mailmessage;
12struct mailmime; 12struct mailmime;
13struct mailmime_mechanism; 13struct mailmime_mechanism;
14 14
15class POP3wrapper : public AbstractMail 15class POP3wrapper : public AbstractMail
16{ 16{
17 Q_OBJECT 17 Q_OBJECT
18 18
19public: 19public:
20 POP3wrapper( POP3account *a ); 20 POP3wrapper( POP3account *a );
21 virtual ~POP3wrapper(); 21 virtual ~POP3wrapper();
22 /* mailbox will be ignored */ 22 /* mailbox will be ignored */
23 virtual void listMessages(const QString & mailbox, QList<RecMail> &target ); 23 virtual void listMessages(const QString & mailbox, QList<RecMail> &target );
24 virtual QList<Folder>* listFolders(); 24 virtual QList<Folder>* listFolders();
25 virtual QString fetchTextPart(const RecMail&mail,const RecPart&part); 25 virtual QString fetchTextPart(const RecMail&mail,const RecPart&part);
26 virtual encodedString* fetchDecodedPart(const RecMail&mail,const RecPart&part); 26 virtual encodedString* fetchDecodedPart(const RecMail&mail,const RecPart&part);
27 virtual encodedString* fetchRawPart(const RecMail&mail,const RecPart&part); 27 virtual encodedString* fetchRawPart(const RecMail&mail,const RecPart&part);
28 28
29 virtual void deleteMail(const RecMail&mail); 29 virtual void deleteMail(const RecMail&mail);
30 virtual void answeredMail(const RecMail&mail); 30 virtual void answeredMail(const RecMail&mail);
31 31
32 RecBody fetchBody( const RecMail &mail ); 32 RecBody fetchBody( const RecMail &mail );
33 static void pop3_progress( size_t current, size_t maximum ); 33 static void pop3_progress( size_t current, size_t maximum );
34 34
35protected: 35protected:
36 void login(); 36 void login();
37 void logout(); 37 void logout();
38 38
39 RecMail *parseHeader( const char *header ); 39 RecMail *parseHeader( const char *header );
40 RecBody parseMail( char *message ); 40 RecBody parseMail( char *message );
41 QString parseMailboxList( mailimf_mailbox_list *list ); 41 QString parseMailboxList( mailimf_mailbox_list *list );
42 QString parseMailbox( mailimf_mailbox *box ); 42 QString parseMailbox( mailimf_mailbox *box );
43 QString parseGroup( mailimf_group *group ); 43 QString parseGroup( mailimf_group *group );
44 QString parseAddressList( mailimf_address_list *list ); 44 QString parseAddressList( mailimf_address_list *list );
45 QString parseDateTime( mailimf_date_time *date ); 45 QString parseDateTime( mailimf_date_time *date );
46 46
47 static void traverseBody(RecBody&target,mailmessage*message,mailmime*mime,unsigned int current_rek=0); 47 static void traverseBody(RecBody&target,mailmessage*message,mailmime*mime,unsigned int current_rek=0);
48 static void fillSingleBody(RecPart&target,mailmessage*message,mailmime*mime); 48 static void fillSingleBody(RecPart&target,mailmessage*message,mailmime*mime);
49 static void fillParameters(RecPart&target,clist*parameters);
49 static QString POP3wrapper::getencoding(mailmime_mechanism*aEnc); 50 static QString POP3wrapper::getencoding(mailmime_mechanism*aEnc);
50 51
51 POP3account *account; 52 POP3account *account;
52 mailpop3 *m_pop3; 53 mailpop3 *m_pop3;
53 QString msgTempName; 54 QString msgTempName;
54 unsigned int last_msg_id; 55 unsigned int last_msg_id;
55}; 56};
56 57
57#endif 58#endif
diff --git a/noncore/net/mail/pop3wrapper.cpp b/noncore/net/mail/pop3wrapper.cpp
index 2c2a42a..65cd4ba 100644
--- a/noncore/net/mail/pop3wrapper.cpp
+++ b/noncore/net/mail/pop3wrapper.cpp
@@ -65,513 +65,530 @@ RecBody POP3wrapper::fetchBody( const RecMail &mail )
65 } 65 }
66 msg_cache.writeBlock(message,length); 66 msg_cache.writeBlock(message,length);
67 } else { 67 } else {
68 QString msg=""; 68 QString msg="";
69 msg_cache.open(IO_ReadOnly); 69 msg_cache.open(IO_ReadOnly);
70 message = new char[4096]; 70 message = new char[4096];
71 memset(message,0,4096); 71 memset(message,0,4096);
72 while (msg_cache.readBlock(message,4095)>0) { 72 while (msg_cache.readBlock(message,4095)>0) {
73 msg+=message; 73 msg+=message;
74 memset(message,0,4096); 74 memset(message,0,4096);
75 } 75 }
76 delete message; 76 delete message;
77 message = (char*)malloc(msg.length()+1*sizeof(char)); 77 message = (char*)malloc(msg.length()+1*sizeof(char));
78 memset(message,0,msg.length()+1); 78 memset(message,0,msg.length()+1);
79 memcpy(message,msg.latin1(),msg.length()); 79 memcpy(message,msg.latin1(),msg.length());
80 } 80 }
81 body = parseMail(message); 81 body = parseMail(message);
82 free(message); 82 free(message);
83 return body; 83 return body;
84} 84}
85 85
86RecBody POP3wrapper::parseMail( char *message ) 86RecBody POP3wrapper::parseMail( char *message )
87{ 87{
88 int err = MAILIMF_NO_ERROR; 88 int err = MAILIMF_NO_ERROR;
89 /* these vars are used recurcive! set it to 0!!!!!!!!!!!!!!!!! */ 89 /* these vars are used recurcive! set it to 0!!!!!!!!!!!!!!!!! */
90 size_t curTok = 0; 90 size_t curTok = 0;
91 mailimf_message *result = 0; 91 mailimf_message *result = 0;
92 mailmessage * msg=0; 92 mailmessage * msg=0;
93 mailmime_single_fields fields; 93 mailmime_single_fields fields;
94 94
95 /* is bound to msg and will be freed there */ 95 /* is bound to msg and will be freed there */
96 struct mailmime * mime=0; 96 struct mailmime * mime=0;
97 97
98 RecBody body; 98 RecBody body;
99 99
100 100
101 err = mailimf_message_parse( (char *) message, strlen( message ), &curTok, &result ); 101 err = mailimf_message_parse( (char *) message, strlen( message ), &curTok, &result );
102 if ( err != MAILIMF_NO_ERROR ) { 102 if ( err != MAILIMF_NO_ERROR ) {
103 if (result) mailimf_message_free(result); 103 if (result) mailimf_message_free(result);
104 return body; 104 return body;
105 } 105 }
106 106
107 char*body_msg = message; 107 char*body_msg = message;
108 msg = mailmessage_new(); 108 msg = mailmessage_new();
109 mailmessage_init(msg, NULL, data_message_driver, 0, strlen(body_msg)); 109 mailmessage_init(msg, NULL, data_message_driver, 0, strlen(body_msg));
110 generic_message_t * msg_data; 110 generic_message_t * msg_data;
111 msg_data = (generic_message_t *)msg->msg_data; 111 msg_data = (generic_message_t *)msg->msg_data;
112 msg_data->msg_fetched = 1; 112 msg_data->msg_fetched = 1;
113 msg_data->msg_message = body_msg; 113 msg_data->msg_message = body_msg;
114 msg_data->msg_length = strlen(body_msg); 114 msg_data->msg_length = strlen(body_msg);
115 115
116 116
117 memset(&fields, 0, sizeof(struct mailmime_single_fields)); 117 memset(&fields, 0, sizeof(struct mailmime_single_fields));
118 err = mailmessage_get_bodystructure(msg,&mime); 118 err = mailmessage_get_bodystructure(msg,&mime);
119 traverseBody(body,msg,mime); 119 traverseBody(body,msg,mime);
120 120
121 mailmessage_free(msg); 121 mailmessage_free(msg);
122 122
123 return body; 123 return body;
124} 124}
125 125
126void POP3wrapper::listMessages(const QString &, QList<RecMail> &target ) 126void POP3wrapper::listMessages(const QString &, QList<RecMail> &target )
127{ 127{
128 int err = MAILPOP3_NO_ERROR; 128 int err = MAILPOP3_NO_ERROR;
129 char * header = 0; 129 char * header = 0;
130 /* these vars are used recurcive! set it to 0!!!!!!!!!!!!!!!!! */ 130 /* these vars are used recurcive! set it to 0!!!!!!!!!!!!!!!!! */
131 size_t length = 0; 131 size_t length = 0;
132 carray * messages = 0; 132 carray * messages = 0;
133 133
134 login(); 134 login();
135 if (!m_pop3) return; 135 if (!m_pop3) return;
136 mailpop3_list( m_pop3, &messages ); 136 mailpop3_list( m_pop3, &messages );
137 137
138 for (unsigned int i = 0; i < carray_count(messages);++i) { 138 for (unsigned int i = 0; i < carray_count(messages);++i) {
139 mailpop3_msg_info *info; 139 mailpop3_msg_info *info;
140 err = mailpop3_get_msg_info(m_pop3,i+1,&info); 140 err = mailpop3_get_msg_info(m_pop3,i+1,&info);
141 if (info->msg_deleted) 141 if (info->msg_deleted)
142 continue; 142 continue;
143 err = mailpop3_header( m_pop3, info->msg_index, &header, &length ); 143 err = mailpop3_header( m_pop3, info->msg_index, &header, &length );
144 if ( err != MAILPOP3_NO_ERROR ) { 144 if ( err != MAILPOP3_NO_ERROR ) {
145 qDebug( "POP3: error retrieving header msgid: %i", info->msg_index ); 145 qDebug( "POP3: error retrieving header msgid: %i", info->msg_index );
146 free(header); 146 free(header);
147 return; 147 return;
148 } 148 }
149 RecMail *mail = parseHeader( header ); 149 RecMail *mail = parseHeader( header );
150 mail->setNumber( info->msg_index ); 150 mail->setNumber( info->msg_index );
151 mail->setWrapper(this); 151 mail->setWrapper(this);
152 mail->setMsgsize(info->msg_size); 152 mail->setMsgsize(info->msg_size);
153 target.append( mail ); 153 target.append( mail );
154 free(header); 154 free(header);
155 } 155 }
156} 156}
157 157
158RecMail *POP3wrapper::parseHeader( const char *header ) 158RecMail *POP3wrapper::parseHeader( const char *header )
159{ 159{
160 int err = MAILIMF_NO_ERROR; 160 int err = MAILIMF_NO_ERROR;
161 size_t curTok = 0; 161 size_t curTok = 0;
162 RecMail *mail = new RecMail(); 162 RecMail *mail = new RecMail();
163 mailimf_fields *fields; 163 mailimf_fields *fields;
164 mailimf_references * refs; 164 mailimf_references * refs;
165 mailimf_keywords*keys; 165 mailimf_keywords*keys;
166 QString status; 166 QString status;
167 QString value; 167 QString value;
168 QBitArray mFlags(7); 168 QBitArray mFlags(7);
169 169
170 err = mailimf_fields_parse( (char *) header, strlen( header ), &curTok, &fields ); 170 err = mailimf_fields_parse( (char *) header, strlen( header ), &curTok, &fields );
171 for ( clistiter *current = clist_begin( fields->fld_list ); current != NULL; current = current->next ) { 171 for ( clistiter *current = clist_begin( fields->fld_list ); current != NULL; current = current->next ) {
172 mailimf_field *field = (mailimf_field *) current->data; 172 mailimf_field *field = (mailimf_field *) current->data;
173 switch ( field->fld_type ) { 173 switch ( field->fld_type ) {
174 case MAILIMF_FIELD_FROM: 174 case MAILIMF_FIELD_FROM:
175 mail->setFrom( parseMailboxList( field->fld_data.fld_from->frm_mb_list ) ); 175 mail->setFrom( parseMailboxList( field->fld_data.fld_from->frm_mb_list ) );
176 break; 176 break;
177 case MAILIMF_FIELD_TO: 177 case MAILIMF_FIELD_TO:
178 mail->setTo( parseAddressList( field->fld_data.fld_to->to_addr_list ) ); 178 mail->setTo( parseAddressList( field->fld_data.fld_to->to_addr_list ) );
179 break; 179 break;
180 case MAILIMF_FIELD_CC: 180 case MAILIMF_FIELD_CC:
181 mail->setCC( parseAddressList( field->fld_data.fld_cc->cc_addr_list ) ); 181 mail->setCC( parseAddressList( field->fld_data.fld_cc->cc_addr_list ) );
182 break; 182 break;
183 case MAILIMF_FIELD_BCC: 183 case MAILIMF_FIELD_BCC:
184 mail->setBcc( parseAddressList( field->fld_data.fld_bcc->bcc_addr_list ) ); 184 mail->setBcc( parseAddressList( field->fld_data.fld_bcc->bcc_addr_list ) );
185 break; 185 break;
186 case MAILIMF_FIELD_SUBJECT: 186 case MAILIMF_FIELD_SUBJECT:
187 mail->setSubject(convert_String( field->fld_data.fld_subject->sbj_value ) ); 187 mail->setSubject(convert_String( field->fld_data.fld_subject->sbj_value ) );
188 break; 188 break;
189 case MAILIMF_FIELD_ORIG_DATE: 189 case MAILIMF_FIELD_ORIG_DATE:
190 mail->setDate( parseDateTime( field->fld_data.fld_orig_date->dt_date_time ) ); 190 mail->setDate( parseDateTime( field->fld_data.fld_orig_date->dt_date_time ) );
191 break; 191 break;
192 case MAILIMF_FIELD_MESSAGE_ID: 192 case MAILIMF_FIELD_MESSAGE_ID:
193 mail->setMsgid(QString(field->fld_data.fld_message_id->mid_value)); 193 mail->setMsgid(QString(field->fld_data.fld_message_id->mid_value));
194 break; 194 break;
195 case MAILIMF_FIELD_REFERENCES: 195 case MAILIMF_FIELD_REFERENCES:
196 refs = field->fld_data.fld_references; 196 refs = field->fld_data.fld_references;
197 if (refs && refs->mid_list && clist_count(refs->mid_list)) { 197 if (refs && refs->mid_list && clist_count(refs->mid_list)) {
198 char * text = (char*)refs->mid_list->first->data; 198 char * text = (char*)refs->mid_list->first->data;
199 mail->setReplyto(QString(text)); 199 mail->setReplyto(QString(text));
200 } 200 }
201 break; 201 break;
202 case MAILIMF_FIELD_KEYWORDS: 202 case MAILIMF_FIELD_KEYWORDS:
203 keys = field->fld_data.fld_keywords; 203 keys = field->fld_data.fld_keywords;
204 for (clistcell*cur = clist_begin(keys->kw_list);cur!=0;cur=clist_next(cur)) { 204 for (clistcell*cur = clist_begin(keys->kw_list);cur!=0;cur=clist_next(cur)) {
205 qDebug("Keyword: %s",(char*)cur->data); 205 qDebug("Keyword: %s",(char*)cur->data);
206 } 206 }
207 break; 207 break;
208 case MAILIMF_FIELD_OPTIONAL_FIELD: 208 case MAILIMF_FIELD_OPTIONAL_FIELD:
209 status = field->fld_data.fld_optional_field->fld_name; 209 status = field->fld_data.fld_optional_field->fld_name;
210 value = field->fld_data.fld_optional_field->fld_value; 210 value = field->fld_data.fld_optional_field->fld_value;
211 if (status.lower()=="status") { 211 if (status.lower()=="status") {
212 if (value.lower()=="ro") { 212 if (value.lower()=="ro") {
213 mFlags.setBit(FLAG_SEEN); 213 mFlags.setBit(FLAG_SEEN);
214 } 214 }
215 } else if (status.lower()=="x-status") { 215 } else if (status.lower()=="x-status") {
216 qDebug("X-Status: %s",value.latin1()); 216 qDebug("X-Status: %s",value.latin1());
217 if (value.lower()=="a") { 217 if (value.lower()=="a") {
218 mFlags.setBit(FLAG_ANSWERED); 218 mFlags.setBit(FLAG_ANSWERED);
219 } 219 }
220 } else { 220 } else {
221// qDebug("Optionales feld: %s -> %s)",field->fld_data.fld_optional_field->fld_name, 221// qDebug("Optionales feld: %s -> %s)",field->fld_data.fld_optional_field->fld_name,
222// field->fld_data.fld_optional_field->fld_value); 222// field->fld_data.fld_optional_field->fld_value);
223 } 223 }
224 break; 224 break;
225 default: 225 default:
226 qDebug("Non parsed field"); 226 qDebug("Non parsed field");
227 break; 227 break;
228 } 228 }
229 } 229 }
230 if (fields) mailimf_fields_free(fields); 230 if (fields) mailimf_fields_free(fields);
231 mail->setFlags(mFlags); 231 mail->setFlags(mFlags);
232 return mail; 232 return mail;
233} 233}
234 234
235QString POP3wrapper::parseDateTime( mailimf_date_time *date ) 235QString POP3wrapper::parseDateTime( mailimf_date_time *date )
236{ 236{
237 char tmp[23]; 237 char tmp[23];
238 238
239 snprintf( tmp, 23, "%02i.%02i.%04i %02i:%02i:%02i %+05i", 239 snprintf( tmp, 23, "%02i.%02i.%04i %02i:%02i:%02i %+05i",
240 date->dt_day, date->dt_month, date->dt_year, date->dt_hour, date->dt_min, date->dt_sec, date->dt_zone ); 240 date->dt_day, date->dt_month, date->dt_year, date->dt_hour, date->dt_min, date->dt_sec, date->dt_zone );
241 241
242 return QString( tmp ); 242 return QString( tmp );
243} 243}
244 244
245QString POP3wrapper::parseAddressList( mailimf_address_list *list ) 245QString POP3wrapper::parseAddressList( mailimf_address_list *list )
246{ 246{
247 QString result( "" ); 247 QString result( "" );
248 248
249 bool first = true; 249 bool first = true;
250 for ( clistiter *current = clist_begin( list->ad_list ); current != NULL; current = current->next ) { 250 for ( clistiter *current = clist_begin( list->ad_list ); current != NULL; current = current->next ) {
251 mailimf_address *addr = (mailimf_address *) current->data; 251 mailimf_address *addr = (mailimf_address *) current->data;
252 252
253 if ( !first ) { 253 if ( !first ) {
254 result.append( "," ); 254 result.append( "," );
255 } else { 255 } else {
256 first = false; 256 first = false;
257 } 257 }
258 258
259 switch ( addr->ad_type ) { 259 switch ( addr->ad_type ) {
260 case MAILIMF_ADDRESS_MAILBOX: 260 case MAILIMF_ADDRESS_MAILBOX:
261 result.append( parseMailbox( addr->ad_data.ad_mailbox ) ); 261 result.append( parseMailbox( addr->ad_data.ad_mailbox ) );
262 break; 262 break;
263 case MAILIMF_ADDRESS_GROUP: 263 case MAILIMF_ADDRESS_GROUP:
264 result.append( parseGroup( addr->ad_data.ad_group ) ); 264 result.append( parseGroup( addr->ad_data.ad_group ) );
265 break; 265 break;
266 default: 266 default:
267 qDebug( "POP3: unkown mailimf address type" ); 267 qDebug( "POP3: unkown mailimf address type" );
268 break; 268 break;
269 } 269 }
270 } 270 }
271 271
272 return result; 272 return result;
273} 273}
274 274
275QString POP3wrapper::parseGroup( mailimf_group *group ) 275QString POP3wrapper::parseGroup( mailimf_group *group )
276{ 276{
277 QString result( "" ); 277 QString result( "" );
278 278
279 result.append( group->grp_display_name ); 279 result.append( group->grp_display_name );
280 result.append( ": " ); 280 result.append( ": " );
281 281
282 if ( group->grp_mb_list != NULL ) { 282 if ( group->grp_mb_list != NULL ) {
283 result.append( parseMailboxList( group->grp_mb_list ) ); 283 result.append( parseMailboxList( group->grp_mb_list ) );
284 } 284 }
285 285
286 result.append( ";" ); 286 result.append( ";" );
287 287
288 return result; 288 return result;
289} 289}
290 290
291QString POP3wrapper::parseMailbox( mailimf_mailbox *box ) 291QString POP3wrapper::parseMailbox( mailimf_mailbox *box )
292{ 292{
293 QString result( "" ); 293 QString result( "" );
294 294
295 if ( box->mb_display_name == NULL ) { 295 if ( box->mb_display_name == NULL ) {
296 result.append( box->mb_addr_spec ); 296 result.append( box->mb_addr_spec );
297 } else { 297 } else {
298 result.append( convert_String(box->mb_display_name).latin1() ); 298 result.append( convert_String(box->mb_display_name).latin1() );
299 result.append( " <" ); 299 result.append( " <" );
300 result.append( box->mb_addr_spec ); 300 result.append( box->mb_addr_spec );
301 result.append( ">" ); 301 result.append( ">" );
302 } 302 }
303 303
304 return result; 304 return result;
305} 305}
306 306
307QString POP3wrapper::parseMailboxList( mailimf_mailbox_list *list ) 307QString POP3wrapper::parseMailboxList( mailimf_mailbox_list *list )
308{ 308{
309 QString result( "" ); 309 QString result( "" );
310 310
311 bool first = true; 311 bool first = true;
312 for ( clistiter *current = clist_begin( list->mb_list ); current != NULL; current = current->next ) { 312 for ( clistiter *current = clist_begin( list->mb_list ); current != NULL; current = current->next ) {
313 mailimf_mailbox *box = (mailimf_mailbox *) current->data; 313 mailimf_mailbox *box = (mailimf_mailbox *) current->data;
314 314
315 if ( !first ) { 315 if ( !first ) {
316 result.append( "," ); 316 result.append( "," );
317 } else { 317 } else {
318 first = false; 318 first = false;
319 } 319 }
320 320
321 result.append( parseMailbox( box ) ); 321 result.append( parseMailbox( box ) );
322 } 322 }
323 323
324 return result; 324 return result;
325} 325}
326 326
327void POP3wrapper::login() 327void POP3wrapper::login()
328{ 328{
329 /* we'll hold the line */ 329 /* we'll hold the line */
330 if ( m_pop3 != NULL ) return; 330 if ( m_pop3 != NULL ) return;
331 331
332 const char *server, *user, *pass; 332 const char *server, *user, *pass;
333 uint16_t port; 333 uint16_t port;
334 int err = MAILPOP3_NO_ERROR; 334 int err = MAILPOP3_NO_ERROR;
335 335
336 server = account->getServer().latin1(); 336 server = account->getServer().latin1();
337 port = account->getPort().toUInt(); 337 port = account->getPort().toUInt();
338 338
339 if ( account->getUser().isEmpty() || account->getPassword().isEmpty() ) { 339 if ( account->getUser().isEmpty() || account->getPassword().isEmpty() ) {
340 LoginDialog login( account->getUser(), account->getPassword(), NULL, 0, true ); 340 LoginDialog login( account->getUser(), account->getPassword(), NULL, 0, true );
341 login.show(); 341 login.show();
342 if ( QDialog::Accepted == login.exec() ) { 342 if ( QDialog::Accepted == login.exec() ) {
343 // ok 343 // ok
344 user = strdup( login.getUser().latin1() ); 344 user = strdup( login.getUser().latin1() );
345 pass = strdup( login.getPassword().latin1() ); 345 pass = strdup( login.getPassword().latin1() );
346 } else { 346 } else {
347 // cancel 347 // cancel
348 qDebug( "POP3: Login canceled" ); 348 qDebug( "POP3: Login canceled" );
349 return; 349 return;
350 } 350 }
351 } else { 351 } else {
352 user = account->getUser().latin1(); 352 user = account->getUser().latin1();
353 pass = account->getPassword().latin1(); 353 pass = account->getPassword().latin1();
354 } 354 }
355 355
356 m_pop3 = mailpop3_new( 200, &pop3_progress ); 356 m_pop3 = mailpop3_new( 200, &pop3_progress );
357 357
358 // connect 358 // connect
359 if (account->getSSL()) { 359 if (account->getSSL()) {
360 err = mailpop3_ssl_connect( m_pop3, (char*)server, port ); 360 err = mailpop3_ssl_connect( m_pop3, (char*)server, port );
361 } else { 361 } else {
362 err = mailpop3_socket_connect( m_pop3, (char*)server, port ); 362 err = mailpop3_socket_connect( m_pop3, (char*)server, port );
363 } 363 }
364 364
365 if ( err != MAILPOP3_NO_ERROR ) { 365 if ( err != MAILPOP3_NO_ERROR ) {
366 qDebug( "pop3: error connecting to %s\n reason: %s", server, 366 qDebug( "pop3: error connecting to %s\n reason: %s", server,
367 m_pop3->pop3_response ); 367 m_pop3->pop3_response );
368 mailpop3_free( m_pop3 ); 368 mailpop3_free( m_pop3 );
369 m_pop3 = NULL; 369 m_pop3 = NULL;
370 return; 370 return;
371 } 371 }
372 qDebug( "POP3: connected!" ); 372 qDebug( "POP3: connected!" );
373 373
374 // login 374 // login
375 // TODO: decide if apop or plain login should be used 375 // TODO: decide if apop or plain login should be used
376 err = mailpop3_login( m_pop3, (char *) user, (char *) pass ); 376 err = mailpop3_login( m_pop3, (char *) user, (char *) pass );
377 if ( err != MAILPOP3_NO_ERROR ) { 377 if ( err != MAILPOP3_NO_ERROR ) {
378 qDebug( "pop3: error logging in: %s", m_pop3->pop3_response ); 378 qDebug( "pop3: error logging in: %s", m_pop3->pop3_response );
379 logout(); 379 logout();
380 return; 380 return;
381 } 381 }
382 382
383 qDebug( "POP3: logged in!" ); 383 qDebug( "POP3: logged in!" );
384} 384}
385 385
386void POP3wrapper::logout() 386void POP3wrapper::logout()
387{ 387{
388 int err = MAILPOP3_NO_ERROR; 388 int err = MAILPOP3_NO_ERROR;
389 if ( m_pop3 == NULL ) return; 389 if ( m_pop3 == NULL ) return;
390 err = mailpop3_quit( m_pop3 ); 390 err = mailpop3_quit( m_pop3 );
391 mailpop3_free( m_pop3 ); 391 mailpop3_free( m_pop3 );
392 m_pop3 = NULL; 392 m_pop3 = NULL;
393} 393}
394 394
395 395
396QList<Folder>* POP3wrapper::listFolders() 396QList<Folder>* POP3wrapper::listFolders()
397{ 397{
398 /* TODO: integrate MH directories 398 /* TODO: integrate MH directories
399 but not before version 0.1 ;) 399 but not before version 0.1 ;)
400 */ 400 */
401 QList<Folder> * folders = new QList<Folder>(); 401 QList<Folder> * folders = new QList<Folder>();
402 folders->setAutoDelete( false ); 402 folders->setAutoDelete( false );
403 Folder*inb=new Folder("INBOX","/"); 403 Folder*inb=new Folder("INBOX","/");
404 folders->append(inb); 404 folders->append(inb);
405 return folders; 405 return folders;
406} 406}
407 407
408QString POP3wrapper::fetchTextPart(const RecMail&,const RecPart&) 408QString POP3wrapper::fetchTextPart(const RecMail&,const RecPart&)
409{ 409{
410 return ""; 410 return "";
411} 411}
412 412
413void POP3wrapper::deleteMail(const RecMail&mail) 413void POP3wrapper::deleteMail(const RecMail&mail)
414{ 414{
415 login(); 415 login();
416 if (!m_pop3) return; 416 if (!m_pop3) return;
417 int err = mailpop3_dele(m_pop3,mail.getNumber()); 417 int err = mailpop3_dele(m_pop3,mail.getNumber());
418 if (err != MAILPOP3_NO_ERROR) { 418 if (err != MAILPOP3_NO_ERROR) {
419 qDebug("error deleting mail"); 419 qDebug("error deleting mail");
420 } 420 }
421} 421}
422 422
423void POP3wrapper::answeredMail(const RecMail&) 423void POP3wrapper::answeredMail(const RecMail&)
424{ 424{
425} 425}
426 426
427encodedString* POP3wrapper::fetchDecodedPart(const RecMail&,const RecPart&) 427encodedString* POP3wrapper::fetchDecodedPart(const RecMail&,const RecPart&)
428{ 428{
429 return new encodedString(); 429 return new encodedString();
430} 430}
431 431
432encodedString* POP3wrapper::fetchRawPart(const RecMail&,const RecPart&) 432encodedString* POP3wrapper::fetchRawPart(const RecMail&,const RecPart&)
433{ 433{
434 return new encodedString(); 434 return new encodedString();
435} 435}
436 436
437void POP3wrapper::traverseBody(RecBody&target,mailmessage*message,mailmime*mime,unsigned int current_rec) 437void POP3wrapper::traverseBody(RecBody&target,mailmessage*message,mailmime*mime,unsigned int current_rec)
438{ 438{
439 if (current_rec >= 10) { 439 if (current_rec >= 10) {
440 qDebug("too deep recursion!"); 440 qDebug("too deep recursion!");
441 } 441 }
442 if (!message || !mime) { 442 if (!message || !mime) {
443 return; 443 return;
444 } 444 }
445 int r; 445 int r;
446 char*data = 0; 446 char*data = 0;
447 size_t len; 447 size_t len;
448 clistiter * cur = 0; 448 clistiter * cur = 0;
449 mailmime_single_fields fields;
450 int res; 449 int res;
451 QString b; 450 QString b;
452 memset(&fields, 0, sizeof(struct mailmime_single_fields));
453 RecPart part; 451 RecPart part;
454 452
455 if (mime->mm_mime_fields != NULL) {
456 mailmime_single_fields_init(&fields, mime->mm_mime_fields,
457 mime->mm_content_type);
458 }
459 switch (mime->mm_type) { 453 switch (mime->mm_type) {
460 case MAILMIME_SINGLE: 454 case MAILMIME_SINGLE:
461 r = mailmessage_fetch_section(message,mime,&data,&len); 455 r = mailmessage_fetch_section(message,mime,&data,&len);
456 part.setSize(len);
462 fillSingleBody(part,message,mime); 457 fillSingleBody(part,message,mime);
463 if (part.Type()=="text" && target.Bodytext().isNull()) { 458 if (part.Type()=="text" && target.Bodytext().isNull()) {
464 encodedString*r = new encodedString(); 459 encodedString*r = new encodedString();
465 r->setContent(data,len); 460 r->setContent(data,len);
466 encodedString*res = decode_String(r,part.Encoding()); 461 encodedString*res = decode_String(r,part.Encoding());
467 b = QString(res->Content()); 462 b = QString(res->Content());
468 delete r; 463 delete r;
469 delete res; 464 delete res;
470 target.setBodytext(b); 465 target.setBodytext(b);
471 target.setDescription(part); 466 target.setDescription(part);
472 } else { 467 } else {
473 /* TODO: Add the content to a list and store it for later use */ 468 /* TODO: Add the content to a list and store it for later use */
474 if (data) free(data); 469 if (data) free(data);
475 target.addPart(part); 470 target.addPart(part);
476 } 471 }
477 break; 472 break;
478 case MAILMIME_MULTIPLE: 473 case MAILMIME_MULTIPLE:
479 for (cur = clist_begin(mime->mm_data.mm_multipart.mm_mp_list) ; cur != NULL ; cur = clist_next(cur)) { 474 for (cur = clist_begin(mime->mm_data.mm_multipart.mm_mp_list) ; cur != NULL ; cur = clist_next(cur)) {
480 traverseBody(target,message, (mailmime*)clist_content(cur),current_rec+1); 475 traverseBody(target,message, (mailmime*)clist_content(cur),current_rec+1);
481 } 476 }
482 break; 477 break;
483 case MAILMIME_MESSAGE: 478 case MAILMIME_MESSAGE:
484 if (mime->mm_data.mm_message.mm_msg_mime != NULL) { 479 if (mime->mm_data.mm_message.mm_msg_mime != NULL) {
485 traverseBody(target,message,mime->mm_data.mm_message.mm_msg_mime,current_rec+1); 480 traverseBody(target,message,mime->mm_data.mm_message.mm_msg_mime,current_rec+1);
486 } 481 }
487 break; 482 break;
488 } 483 }
489} 484}
490 485
491QString POP3wrapper::getencoding(mailmime_mechanism*aEnc) 486QString POP3wrapper::getencoding(mailmime_mechanism*aEnc)
492{ 487{
493 QString enc="7bit"; 488 QString enc="7bit";
494 if (!aEnc) return enc; 489 if (!aEnc) return enc;
495 switch(aEnc->enc_type) { 490 switch(aEnc->enc_type) {
496 case MAILMIME_MECHANISM_7BIT: 491 case MAILMIME_MECHANISM_7BIT:
497 enc = "7bit"; 492 enc = "7bit";
498 break; 493 break;
499 case MAILMIME_MECHANISM_8BIT: 494 case MAILMIME_MECHANISM_8BIT:
500 enc = "8bit"; 495 enc = "8bit";
501 break; 496 break;
502 case MAILMIME_MECHANISM_BINARY: 497 case MAILMIME_MECHANISM_BINARY:
503 enc = "binary"; 498 enc = "binary";
504 break; 499 break;
505 case MAILMIME_MECHANISM_QUOTED_PRINTABLE: 500 case MAILMIME_MECHANISM_QUOTED_PRINTABLE:
506 enc = "quoted-printable"; 501 enc = "quoted-printable";
507 break; 502 break;
508 case MAILMIME_MECHANISM_BASE64: 503 case MAILMIME_MECHANISM_BASE64:
509 enc = "base64"; 504 enc = "base64";
510 break; 505 break;
511 case MAILMIME_MECHANISM_TOKEN: 506 case MAILMIME_MECHANISM_TOKEN:
512 default: 507 default:
513 if (aEnc->enc_token) { 508 if (aEnc->enc_token) {
514 enc = QString(aEnc->enc_token); 509 enc = QString(aEnc->enc_token);
515 } 510 }
516 break; 511 break;
517 } 512 }
518 return enc; 513 return enc;
519} 514}
520 515
521void POP3wrapper::fillSingleBody(RecPart&target,mailmessage*,mailmime*mime) 516void POP3wrapper::fillSingleBody(RecPart&target,mailmessage*,mailmime*mime)
522{ 517{
523 if (!mime) { 518 if (!mime) {
524 return; 519 return;
525 } 520 }
526 mailmime_content*type = mime->mm_content_type;
527 mailmime_field*field = 0; 521 mailmime_field*field = 0;
522 mailmime_single_fields fields;
523 memset(&fields, 0, sizeof(struct mailmime_single_fields));
524 if (mime->mm_mime_fields != NULL) {
525 mailmime_single_fields_init(&fields, mime->mm_mime_fields,
526 mime->mm_content_type);
527 }
528
529 mailmime_content*type = fields.fld_content;
528 clistcell*current; 530 clistcell*current;
529 if (!type) { 531 if (!type) {
530 target.setType("text"); 532 target.setType("text");
531 target.setSubtype("plain"); 533 target.setSubtype("plain");
532 } else { 534 } else {
533 target.setSubtype(type->ct_subtype); 535 target.setSubtype(type->ct_subtype);
534 switch(type->ct_type->tp_data.tp_discrete_type->dt_type) { 536 switch(type->ct_type->tp_data.tp_discrete_type->dt_type) {
535 case MAILMIME_DISCRETE_TYPE_TEXT: 537 case MAILMIME_DISCRETE_TYPE_TEXT:
536 target.setType("text"); 538 target.setType("text");
537 break; 539 break;
538 case MAILMIME_DISCRETE_TYPE_IMAGE: 540 case MAILMIME_DISCRETE_TYPE_IMAGE:
539 target.setType("image"); 541 target.setType("image");
540 break; 542 break;
541 case MAILMIME_DISCRETE_TYPE_AUDIO: 543 case MAILMIME_DISCRETE_TYPE_AUDIO:
542 target.setType("audio"); 544 target.setType("audio");
543 break; 545 break;
544 case MAILMIME_DISCRETE_TYPE_VIDEO: 546 case MAILMIME_DISCRETE_TYPE_VIDEO:
545 target.setType("video"); 547 target.setType("video");
546 break; 548 break;
547 case MAILMIME_DISCRETE_TYPE_APPLICATION: 549 case MAILMIME_DISCRETE_TYPE_APPLICATION:
548 target.setType("application"); 550 target.setType("application");
549 break; 551 break;
550 case MAILMIME_DISCRETE_TYPE_EXTENSION: 552 case MAILMIME_DISCRETE_TYPE_EXTENSION:
551 default: 553 default:
552 if (type->ct_type->tp_data.tp_discrete_type->dt_extension) { 554 if (type->ct_type->tp_data.tp_discrete_type->dt_extension) {
553 target.setType(type->ct_type->tp_data.tp_discrete_type->dt_extension); 555 target.setType(type->ct_type->tp_data.tp_discrete_type->dt_extension);
554 } 556 }
555 break; 557 break;
556 } 558 }
559 if (type->ct_parameters) {
560 fillParameters(target,type->ct_parameters);
561 }
557 } 562 }
558 if (mime->mm_mime_fields && mime->mm_mime_fields->fld_list) { 563 if (mime->mm_mime_fields && mime->mm_mime_fields->fld_list) {
559 for (current=clist_begin(mime->mm_mime_fields->fld_list);current!=0;current=clist_next(current)) { 564 for (current=clist_begin(mime->mm_mime_fields->fld_list);current!=0;current=clist_next(current)) {
560 field = (mailmime_field*)current->data; 565 field = (mailmime_field*)current->data;
561 switch(field->fld_type) { 566 switch(field->fld_type) {
562 case MAILMIME_FIELD_TRANSFER_ENCODING: 567 case MAILMIME_FIELD_TRANSFER_ENCODING:
563 target.setEncoding(getencoding(field->fld_data.fld_encoding)); 568 target.setEncoding(getencoding(field->fld_data.fld_encoding));
564 break; 569 break;
565 case MAILMIME_FIELD_ID: 570 case MAILMIME_FIELD_ID:
566 target.setIdentifier(field->fld_data.fld_id); 571 target.setIdentifier(field->fld_data.fld_id);
567 break; 572 break;
568 case MAILMIME_FIELD_DESCRIPTION: 573 case MAILMIME_FIELD_DESCRIPTION:
569 target.setDescription(field->fld_data.fld_description); 574 target.setDescription(field->fld_data.fld_description);
570 break; 575 break;
571 default: 576 default:
572 break; 577 break;
573 } 578 }
574 } 579 }
575 } 580 }
576 // TODO search the parameter list for unique id and so on 581}
582
583void POP3wrapper::fillParameters(RecPart&target,clist*parameters)
584{
585 if (!parameters) {return;}
586 clistcell*current=0;
587 mailmime_parameter*param;
588 for (current=clist_begin(parameters);current!=0;current=clist_next(current)) {
589 param = (mailmime_parameter*)current->data;
590 if (param) {
591 target.addParameter(QString(param->pa_name).lower(),QString(param->pa_value));
592 }
593 }
577} 594}
diff --git a/noncore/net/mail/pop3wrapper.h b/noncore/net/mail/pop3wrapper.h
index 4171a76..b17928e 100644
--- a/noncore/net/mail/pop3wrapper.h
+++ b/noncore/net/mail/pop3wrapper.h
@@ -1,57 +1,58 @@
1#ifndef __POP3WRAPPER 1#ifndef __POP3WRAPPER
2#define __POP3WRAPPER 2#define __POP3WRAPPER
3 3
4#include "mailwrapper.h" 4#include "mailwrapper.h"
5#include "abstractmail.h" 5#include "abstractmail.h"
6 6
7class RecMail; 7class RecMail;
8class RecBody; 8class RecBody;
9class encodedString; 9class encodedString;
10struct mailpop3; 10struct mailpop3;
11struct mailmessage; 11struct mailmessage;
12struct mailmime; 12struct mailmime;
13struct mailmime_mechanism; 13struct mailmime_mechanism;
14 14
15class POP3wrapper : public AbstractMail 15class POP3wrapper : public AbstractMail
16{ 16{
17 Q_OBJECT 17 Q_OBJECT
18 18
19public: 19public:
20 POP3wrapper( POP3account *a ); 20 POP3wrapper( POP3account *a );
21 virtual ~POP3wrapper(); 21 virtual ~POP3wrapper();
22 /* mailbox will be ignored */ 22 /* mailbox will be ignored */
23 virtual void listMessages(const QString & mailbox, QList<RecMail> &target ); 23 virtual void listMessages(const QString & mailbox, QList<RecMail> &target );
24 virtual QList<Folder>* listFolders(); 24 virtual QList<Folder>* listFolders();
25 virtual QString fetchTextPart(const RecMail&mail,const RecPart&part); 25 virtual QString fetchTextPart(const RecMail&mail,const RecPart&part);
26 virtual encodedString* fetchDecodedPart(const RecMail&mail,const RecPart&part); 26 virtual encodedString* fetchDecodedPart(const RecMail&mail,const RecPart&part);
27 virtual encodedString* fetchRawPart(const RecMail&mail,const RecPart&part); 27 virtual encodedString* fetchRawPart(const RecMail&mail,const RecPart&part);
28 28
29 virtual void deleteMail(const RecMail&mail); 29 virtual void deleteMail(const RecMail&mail);
30 virtual void answeredMail(const RecMail&mail); 30 virtual void answeredMail(const RecMail&mail);
31 31
32 RecBody fetchBody( const RecMail &mail ); 32 RecBody fetchBody( const RecMail &mail );
33 static void pop3_progress( size_t current, size_t maximum ); 33 static void pop3_progress( size_t current, size_t maximum );
34 34
35protected: 35protected:
36 void login(); 36 void login();
37 void logout(); 37 void logout();
38 38
39 RecMail *parseHeader( const char *header ); 39 RecMail *parseHeader( const char *header );
40 RecBody parseMail( char *message ); 40 RecBody parseMail( char *message );
41 QString parseMailboxList( mailimf_mailbox_list *list ); 41 QString parseMailboxList( mailimf_mailbox_list *list );
42 QString parseMailbox( mailimf_mailbox *box ); 42 QString parseMailbox( mailimf_mailbox *box );
43 QString parseGroup( mailimf_group *group ); 43 QString parseGroup( mailimf_group *group );
44 QString parseAddressList( mailimf_address_list *list ); 44 QString parseAddressList( mailimf_address_list *list );
45 QString parseDateTime( mailimf_date_time *date ); 45 QString parseDateTime( mailimf_date_time *date );
46 46
47 static void traverseBody(RecBody&target,mailmessage*message,mailmime*mime,unsigned int current_rek=0); 47 static void traverseBody(RecBody&target,mailmessage*message,mailmime*mime,unsigned int current_rek=0);
48 static void fillSingleBody(RecPart&target,mailmessage*message,mailmime*mime); 48 static void fillSingleBody(RecPart&target,mailmessage*message,mailmime*mime);
49 static void fillParameters(RecPart&target,clist*parameters);
49 static QString POP3wrapper::getencoding(mailmime_mechanism*aEnc); 50 static QString POP3wrapper::getencoding(mailmime_mechanism*aEnc);
50 51
51 POP3account *account; 52 POP3account *account;
52 mailpop3 *m_pop3; 53 mailpop3 *m_pop3;
53 QString msgTempName; 54 QString msgTempName;
54 unsigned int last_msg_id; 55 unsigned int last_msg_id;
55}; 56};
56 57
57#endif 58#endif