summaryrefslogtreecommitdiffabout
path: root/kmicromail/libetpan/generic/maildirdriver.c
Unidiff
Diffstat (limited to 'kmicromail/libetpan/generic/maildirdriver.c') (more/less context) (show whitespace changes)
-rw-r--r--kmicromail/libetpan/generic/maildirdriver.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/kmicromail/libetpan/generic/maildirdriver.c b/kmicromail/libetpan/generic/maildirdriver.c
index 7830ceb..5f21422 100644
--- a/kmicromail/libetpan/generic/maildirdriver.c
+++ b/kmicromail/libetpan/generic/maildirdriver.c
@@ -76,24 +76,27 @@ static int status_folder(mailsession * session, char * mb,
76static int recent_number(mailsession * session, char * mb, 76static int recent_number(mailsession * session, char * mb,
77 uint32_t * result); 77 uint32_t * result);
78 78
79static int unseen_number(mailsession * session, char * mb, 79static int unseen_number(mailsession * session, char * mb,
80 uint32_t * result); 80 uint32_t * result);
81 81
82static int messages_number(mailsession * session, char * mb, 82static int messages_number(mailsession * session, char * mb,
83 uint32_t * result); 83 uint32_t * result);
84 84
85static int append_message(mailsession * session, 85static int append_message(mailsession * session,
86 char * message, size_t size); 86 char * message, size_t size);
87 87
88static int append_message_flags(mailsession * session,
89 char * message, size_t size, struct mail_flags * flags);
90
88static int get_messages_list(mailsession * session, 91static int get_messages_list(mailsession * session,
89 struct mailmessage_list ** result); 92 struct mailmessage_list ** result);
90 93
91static int get_envelopes_list(mailsession * session, 94static int get_envelopes_list(mailsession * session,
92 struct mailmessage_list * env_list); 95 struct mailmessage_list * env_list);
93 96
94static int check_folder(mailsession * session); 97static int check_folder(mailsession * session);
95 98
96static int get_message_by_uid(mailsession * session, 99static int get_message_by_uid(mailsession * session,
97 const char * uid, mailmessage ** result); 100 const char * uid, mailmessage ** result);
98 101
99static mailsession_driver local_maildir_session_driver = { 102static mailsession_driver local_maildir_session_driver = {
@@ -120,24 +123,25 @@ static mailsession_driver local_maildir_session_driver = {
120 .sess_select_folder = NULL, 123 .sess_select_folder = NULL,
121 .sess_expunge_folder = expunge_folder, 124 .sess_expunge_folder = expunge_folder,
122 .sess_status_folder = status_folder, 125 .sess_status_folder = status_folder,
123 .sess_messages_number = messages_number, 126 .sess_messages_number = messages_number,
124 .sess_recent_number = recent_number, 127 .sess_recent_number = recent_number,
125 .sess_unseen_number = unseen_number, 128 .sess_unseen_number = unseen_number,
126 .sess_list_folders = NULL, 129 .sess_list_folders = NULL,
127 .sess_lsub_folders = NULL, 130 .sess_lsub_folders = NULL,
128 .sess_subscribe_folder = NULL, 131 .sess_subscribe_folder = NULL,
129 .sess_unsubscribe_folder = NULL, 132 .sess_unsubscribe_folder = NULL,
130 133
131 .sess_append_message = append_message, 134 .sess_append_message = append_message,
135 .sess_append_message_flags = append_message_flags,
132 .sess_copy_message = NULL, 136 .sess_copy_message = NULL,
133 .sess_move_message = NULL, 137 .sess_move_message = NULL,
134 138
135 .sess_get_messages_list = get_messages_list, 139 .sess_get_messages_list = get_messages_list,
136 .sess_get_envelopes_list = get_envelopes_list, 140 .sess_get_envelopes_list = get_envelopes_list,
137 .sess_remove_message = NULL, 141 .sess_remove_message = NULL,
138#if 0 142#if 0
139 .sess_search_messages = maildriver_generic_search_messages, 143 .sess_search_messages = maildriver_generic_search_messages,
140#endif 144#endif
141 145
142 .sess_get_message = NULL, 146 .sess_get_message = NULL,
143 .sess_get_message_by_uid = get_message_by_uid, 147 .sess_get_message_by_uid = get_message_by_uid,
@@ -346,36 +350,83 @@ static int recent_number(mailsession * session, char * mb,
346 350
347 * result = recent; 351 * result = recent;
348 352
349 return MAIL_NO_ERROR; 353 return MAIL_NO_ERROR;
350} 354}
351 355
352 356
353/* messages operations */ 357/* messages operations */
354 358
355static int append_message(mailsession * session, 359static int append_message(mailsession * session,
356 char * message, size_t size) 360 char * message, size_t size)
357{ 361{
362#if 0
358 struct maildir * md; 363 struct maildir * md;
359 int r; 364 int r;
360 365
361 md = get_maildir_session(session); 366 md = get_maildir_session(session);
362 if (md == NULL) 367 if (md == NULL)
363 return MAIL_ERROR_BAD_STATE; 368 return MAIL_ERROR_BAD_STATE;
364 369
365 r = maildir_message_add(md, message, size); 370 r = maildir_message_add(md, message, size);
366 if (r != MAILDIR_NO_ERROR) 371 if (r != MAILDIR_NO_ERROR)
367 return maildirdriver_maildir_error_to_mail_error(r); 372 return maildirdriver_maildir_error_to_mail_error(r);
368 373
369 return MAIL_NO_ERROR; 374 return MAIL_NO_ERROR;
375#endif
376
377 return append_message_flags(session, message, size, NULL);
378}
379
380static int append_message_flags(mailsession * session,
381 char * message, size_t size, struct mail_flags * flags)
382{
383 struct maildir * md;
384 int r;
385 char uid[PATH_MAX];
386 struct maildir_msg * md_msg;
387 chashdatum key;
388 chashdatum value;
389 uint32_t md_flags;
390
391 md = get_maildir_session(session);
392 if (md == NULL)
393 return MAIL_ERROR_BAD_STATE;
394
395 r = maildir_message_add_uid(md, message, size,
396 uid, sizeof(uid));
397 if (r != MAILDIR_NO_ERROR)
398 return maildirdriver_maildir_error_to_mail_error(r);
399
400 if (flags == NULL)
401 goto exit;
402
403 key.data = uid;
404 key.len = strlen(uid);
405 r = chash_get(md->mdir_msg_hash, &key, &value);
406 if (r < 0)
407 goto exit;
408
409 md_msg = value.data;
410
411 md_flags = maildirdriver_flags_to_maildir_flags(flags->fl_flags);
412
413 r = maildir_message_change_flags(md, uid, md_flags);
414 if (r != MAILDIR_NO_ERROR)
415 goto exit;
416
417 return MAIL_NO_ERROR;
418
419 exit:
420 return MAIL_NO_ERROR;
370} 421}
371 422
372static int get_messages_list(mailsession * session, 423static int get_messages_list(mailsession * session,
373 struct mailmessage_list ** result) 424 struct mailmessage_list ** result)
374{ 425{
375 struct maildir * md; 426 struct maildir * md;
376 int r; 427 int r;
377 struct mailmessage_list * env_list; 428 struct mailmessage_list * env_list;
378 int res; 429 int res;
379 430
380 md = get_maildir_session(session); 431 md = get_maildir_session(session);
381 if (md == NULL) 432 if (md == NULL)