Diffstat (limited to 'kmicromail/libetpan/generic/maildirdriver_cached.c') (more/less context) (show whitespace changes)
-rw-r--r-- | kmicromail/libetpan/generic/maildirdriver_cached.c | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/kmicromail/libetpan/generic/maildirdriver_cached.c b/kmicromail/libetpan/generic/maildirdriver_cached.c index 503d1c9..8a5e206 100644 --- a/kmicromail/libetpan/generic/maildirdriver_cached.c +++ b/kmicromail/libetpan/generic/maildirdriver_cached.c | |||
@@ -85,8 +85,11 @@ static int messages_number(mailsession * session, char * mb, | |||
85 | 85 | ||
86 | static int append_message(mailsession * session, | 86 | static int append_message(mailsession * session, |
87 | char * message, size_t size); | 87 | char * message, size_t size); |
88 | 88 | ||
89 | static int append_message_flags(mailsession * session, | ||
90 | char * message, size_t size, struct mail_flags * flags); | ||
91 | |||
89 | static int get_messages_list(mailsession * session, | 92 | static int get_messages_list(mailsession * session, |
90 | struct mailmessage_list ** result); | 93 | struct mailmessage_list ** result); |
91 | 94 | ||
92 | static int get_envelopes_list(mailsession * session, | 95 | static int get_envelopes_list(mailsession * session, |
@@ -132,8 +135,9 @@ static mailsession_driver local_maildir_cached_session_driver = { | |||
132 | .sess_subscribe_folder = NULL, | 135 | .sess_subscribe_folder = NULL, |
133 | .sess_unsubscribe_folder = NULL, | 136 | .sess_unsubscribe_folder = NULL, |
134 | 137 | ||
135 | .sess_append_message = append_message, | 138 | .sess_append_message = append_message, |
139 | .sess_append_message_flags = append_message_flags, | ||
136 | .sess_copy_message = NULL, | 140 | .sess_copy_message = NULL, |
137 | .sess_move_message = NULL, | 141 | .sess_move_message = NULL, |
138 | 142 | ||
139 | .sess_get_messages_list = get_messages_list, | 143 | .sess_get_messages_list = get_messages_list, |
@@ -453,11 +457,85 @@ static int recent_number(mailsession * session, char * mb, | |||
453 | 457 | ||
454 | static int append_message(mailsession * session, | 458 | static int append_message(mailsession * session, |
455 | char * message, size_t size) | 459 | char * message, size_t size) |
456 | { | 460 | { |
461 | #if 0 | ||
457 | return mailsession_append_message(get_ancestor(session), message, size); | 462 | return mailsession_append_message(get_ancestor(session), message, size); |
463 | #endif | ||
464 | return append_message_flags(session, message, size, NULL); | ||
458 | } | 465 | } |
459 | 466 | ||
467 | static int append_message_flags(mailsession * session, | ||
468 | char * message, size_t size, struct mail_flags * flags) | ||
469 | { | ||
470 | struct maildir * md; | ||
471 | int r; | ||
472 | char uid[PATH_MAX]; | ||
473 | struct maildir_msg * md_msg; | ||
474 | chashdatum key; | ||
475 | chashdatum value; | ||
476 | uint32_t md_flags; | ||
477 | struct mail_cache_db * cache_db_flags; | ||
478 | char filename_flags[PATH_MAX]; | ||
479 | MMAPString * mmapstr; | ||
480 | struct maildir_cached_session_state_data * data; | ||
481 | |||
482 | md = get_maildir_session(session); | ||
483 | if (md == NULL) | ||
484 | return MAIL_ERROR_BAD_STATE; | ||
485 | |||
486 | r = maildir_message_add_uid(md, message, size, | ||
487 | uid, sizeof(uid)); | ||
488 | if (r != MAILDIR_NO_ERROR) | ||
489 | return maildirdriver_maildir_error_to_mail_error(r); | ||
490 | |||
491 | if (flags == NULL) | ||
492 | goto exit; | ||
493 | |||
494 | data = get_cached_data(session); | ||
495 | |||
496 | snprintf(filename_flags, PATH_MAX, "%s%c%s%c%s", | ||
497 | data->md_flags_directory, MAIL_DIR_SEPARATOR, data->md_quoted_mb, | ||
498 | MAIL_DIR_SEPARATOR, FLAGS_NAME); | ||
499 | |||
500 | r = mail_cache_db_open_lock(filename_flags, &cache_db_flags); | ||
501 | if (r < 0) | ||
502 | goto exit; | ||
503 | |||
504 | mmapstr = mmap_string_new(""); | ||
505 | if (mmapstr == NULL) | ||
506 | goto close_db_flags; | ||
507 | |||
508 | r = write_cached_flags(cache_db_flags, mmapstr, | ||
509 | uid, flags); | ||
510 | |||
511 | mmap_string_free(mmapstr); | ||
512 | mail_cache_db_close_unlock(filename_flags, cache_db_flags); | ||
513 | |||
514 | if (r != MAIL_NO_ERROR) | ||
515 | goto exit; | ||
516 | |||
517 | key.data = uid; | ||
518 | key.len = strlen(uid); | ||
519 | r = chash_get(md->mdir_msg_hash, &key, &value); | ||
520 | if (r < 0) | ||
521 | goto exit; | ||
522 | |||
523 | md_msg = value.data; | ||
524 | |||
525 | md_flags = maildirdriver_flags_to_maildir_flags(flags->fl_flags); | ||
526 | |||
527 | r = maildir_message_change_flags(md, uid, md_flags); | ||
528 | if (r != MAILDIR_NO_ERROR) | ||
529 | goto exit; | ||
530 | |||
531 | return MAIL_NO_ERROR; | ||
532 | |||
533 | close_db_flags: | ||
534 | mail_cache_db_close_unlock(filename_flags, cache_db_flags); | ||
535 | exit: | ||
536 | return MAIL_NO_ERROR; | ||
537 | } | ||
460 | 538 | ||
461 | #define UID_NAME "uid.db" | 539 | #define UID_NAME "uid.db" |
462 | 540 | ||
463 | static int uid_clean_up(struct mail_cache_db * uid_db, | 541 | static int uid_clean_up(struct mail_cache_db * uid_db, |