Diffstat (limited to 'kmicromail/libetpan/generic/maildirdriver_cached.c') (more/less context) (ignore 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 | |||
@@ -65,95 +65,99 @@ static int parameters(mailsession * session, | |||
65 | int id, void * value); | 65 | int id, void * value); |
66 | 66 | ||
67 | static int connect_path(mailsession * session, char * path); | 67 | static int connect_path(mailsession * session, char * path); |
68 | 68 | ||
69 | static int logout(mailsession * session); | 69 | static int logout(mailsession * session); |
70 | 70 | ||
71 | static int expunge_folder(mailsession * session); | 71 | static int expunge_folder(mailsession * session); |
72 | 72 | ||
73 | static int status_folder(mailsession * session, char * mb, | 73 | static int status_folder(mailsession * session, char * mb, |
74 | uint32_t * result_messages, uint32_t * result_recent, | 74 | uint32_t * result_messages, uint32_t * result_recent, |
75 | uint32_t * result_unseen); | 75 | uint32_t * result_unseen); |
76 | 76 | ||
77 | static int recent_number(mailsession * session, char * mb, | 77 | static int recent_number(mailsession * session, char * mb, |
78 | uint32_t * result); | 78 | uint32_t * result); |
79 | 79 | ||
80 | static int unseen_number(mailsession * session, char * mb, | 80 | static int unseen_number(mailsession * session, char * mb, |
81 | uint32_t * result); | 81 | uint32_t * result); |
82 | 82 | ||
83 | static int messages_number(mailsession * session, char * mb, | 83 | static int messages_number(mailsession * session, char * mb, |
84 | uint32_t * result); | 84 | uint32_t * result); |
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, |
93 | struct mailmessage_list * env_list); | 96 | struct mailmessage_list * env_list); |
94 | 97 | ||
95 | static int check_folder(mailsession * session); | 98 | static int check_folder(mailsession * session); |
96 | 99 | ||
97 | static int get_message(mailsession * session, | 100 | static int get_message(mailsession * session, |
98 | uint32_t num, mailmessage ** result); | 101 | uint32_t num, mailmessage ** result); |
99 | 102 | ||
100 | static int get_message_by_uid(mailsession * session, | 103 | static int get_message_by_uid(mailsession * session, |
101 | const char * uid, mailmessage ** result); | 104 | const char * uid, mailmessage ** result); |
102 | 105 | ||
103 | static mailsession_driver local_maildir_cached_session_driver = { | 106 | static mailsession_driver local_maildir_cached_session_driver = { |
104 | .sess_name = "maildir-cached", | 107 | .sess_name = "maildir-cached", |
105 | 108 | ||
106 | .sess_initialize = initialize, | 109 | .sess_initialize = initialize, |
107 | .sess_uninitialize = uninitialize, | 110 | .sess_uninitialize = uninitialize, |
108 | 111 | ||
109 | .sess_parameters = parameters, | 112 | .sess_parameters = parameters, |
110 | 113 | ||
111 | .sess_connect_stream = NULL, | 114 | .sess_connect_stream = NULL, |
112 | .sess_connect_path = connect_path, | 115 | .sess_connect_path = connect_path, |
113 | .sess_starttls = NULL, | 116 | .sess_starttls = NULL, |
114 | .sess_login = NULL, | 117 | .sess_login = NULL, |
115 | .sess_logout = logout, | 118 | .sess_logout = logout, |
116 | .sess_noop = NULL, | 119 | .sess_noop = NULL, |
117 | 120 | ||
118 | .sess_build_folder_name = NULL, | 121 | .sess_build_folder_name = NULL, |
119 | .sess_create_folder = NULL, | 122 | .sess_create_folder = NULL, |
120 | .sess_delete_folder = NULL, | 123 | .sess_delete_folder = NULL, |
121 | .sess_rename_folder = NULL, | 124 | .sess_rename_folder = NULL, |
122 | .sess_check_folder = check_folder, | 125 | .sess_check_folder = check_folder, |
123 | .sess_examine_folder = NULL, | 126 | .sess_examine_folder = NULL, |
124 | .sess_select_folder = NULL, | 127 | .sess_select_folder = NULL, |
125 | .sess_expunge_folder = expunge_folder, | 128 | .sess_expunge_folder = expunge_folder, |
126 | .sess_status_folder = status_folder, | 129 | .sess_status_folder = status_folder, |
127 | .sess_messages_number = messages_number, | 130 | .sess_messages_number = messages_number, |
128 | .sess_recent_number = recent_number, | 131 | .sess_recent_number = recent_number, |
129 | .sess_unseen_number = unseen_number, | 132 | .sess_unseen_number = unseen_number, |
130 | .sess_list_folders = NULL, | 133 | .sess_list_folders = NULL, |
131 | .sess_lsub_folders = NULL, | 134 | .sess_lsub_folders = NULL, |
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, |
140 | .sess_get_envelopes_list = get_envelopes_list, | 144 | .sess_get_envelopes_list = get_envelopes_list, |
141 | .sess_remove_message = NULL, | 145 | .sess_remove_message = NULL, |
142 | #if 0 | 146 | #if 0 |
143 | .sess_search_messages = maildriver_generic_search_messages, | 147 | .sess_search_messages = maildriver_generic_search_messages, |
144 | #endif | 148 | #endif |
145 | 149 | ||
146 | .sess_get_message = get_message, | 150 | .sess_get_message = get_message, |
147 | .sess_get_message_by_uid = get_message_by_uid, | 151 | .sess_get_message_by_uid = get_message_by_uid, |
148 | }; | 152 | }; |
149 | 153 | ||
150 | mailsession_driver * maildir_cached_session_driver = | 154 | mailsession_driver * maildir_cached_session_driver = |
151 | &local_maildir_cached_session_driver; | 155 | &local_maildir_cached_session_driver; |
152 | 156 | ||
153 | 157 | ||
154 | static inline struct maildir_cached_session_state_data * | 158 | static inline struct maildir_cached_session_state_data * |
155 | get_cached_data(mailsession * session) | 159 | get_cached_data(mailsession * session) |
156 | { | 160 | { |
157 | return session->sess_data; | 161 | return session->sess_data; |
158 | } | 162 | } |
159 | 163 | ||
@@ -433,51 +437,125 @@ static int status_folder(mailsession * session, char * mb, | |||
433 | } | 437 | } |
434 | 438 | ||
435 | static int messages_number(mailsession * session, char * mb, | 439 | static int messages_number(mailsession * session, char * mb, |
436 | uint32_t * result) | 440 | uint32_t * result) |
437 | { | 441 | { |
438 | return mailsession_messages_number(get_ancestor(session), mb, result); | 442 | return mailsession_messages_number(get_ancestor(session), mb, result); |
439 | } | 443 | } |
440 | 444 | ||
441 | static int unseen_number(mailsession * session, char * mb, | 445 | static int unseen_number(mailsession * session, char * mb, |
442 | uint32_t * result) | 446 | uint32_t * result) |
443 | { | 447 | { |
444 | return mailsession_unseen_number(get_ancestor(session), mb, result); | 448 | return mailsession_unseen_number(get_ancestor(session), mb, result); |
445 | } | 449 | } |
446 | 450 | ||
447 | static int recent_number(mailsession * session, char * mb, | 451 | static int recent_number(mailsession * session, char * mb, |
448 | uint32_t * result) | 452 | uint32_t * result) |
449 | { | 453 | { |
450 | return mailsession_recent_number(get_ancestor(session), mb, result); | 454 | return mailsession_recent_number(get_ancestor(session), mb, result); |
451 | } | 455 | } |
452 | 456 | ||
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, |
464 | struct mailmessage_list * env_list) | 542 | struct mailmessage_list * env_list) |
465 | { | 543 | { |
466 | chash * hash_exist; | 544 | chash * hash_exist; |
467 | int res; | 545 | int res; |
468 | int r; | 546 | int r; |
469 | unsigned int i; | 547 | unsigned int i; |
470 | chashdatum key; | 548 | chashdatum key; |
471 | chashdatum value; | 549 | chashdatum value; |
472 | char key_str[PATH_MAX]; | 550 | char key_str[PATH_MAX]; |
473 | 551 | ||
474 | /* flush cache */ | 552 | /* flush cache */ |
475 | 553 | ||
476 | hash_exist = chash_new(CHASH_DEFAULTSIZE, CHASH_COPYALL); | 554 | hash_exist = chash_new(CHASH_DEFAULTSIZE, CHASH_COPYALL); |
477 | if (hash_exist == NULL) { | 555 | if (hash_exist == NULL) { |
478 | res = MAIL_ERROR_MEMORY; | 556 | res = MAIL_ERROR_MEMORY; |
479 | goto err; | 557 | goto err; |
480 | } | 558 | } |
481 | 559 | ||
482 | value.data = NULL; | 560 | value.data = NULL; |
483 | value.len = 0; | 561 | value.len = 0; |