static int feeddriver_get_messages_list(mailsession * session, struct mailmessage_list ** result) { unsigned int i; struct feed_session_state_data * data; unsigned int count; struct mailmessage_list * msg_list; carray * tab; int res; int r; update(session); data = get_data(session); if (data->feed_error != MAIL_NO_ERROR) { res = data->feed_error; goto err; } count = newsfeed_item_list_get_count(data->feed_session); tab = carray_new(count); if (tab == NULL) { res = MAIL_ERROR_MEMORY; goto err; } fprintf(stderr, "count: %i\n", count); for(i = 0 ; i < count ; i ++) { struct newsfeed_item * item; mailmessage * msg; item = newsfeed_get_item(data->feed_session, i); msg = feed_item_to_message(session, i, item); r = carray_add(tab, msg, NULL); if (r < 0) { res = MAIL_ERROR_MEMORY; goto free_tab; } } msg_list = mailmessage_list_new(tab); if (msg_list == NULL) { res = MAIL_ERROR_MEMORY; goto free_tab; } * result = msg_list; return MAIL_NO_ERROR; free_tab: for(i = 0 ; i < carray_count(tab) ; i ++) { mailmessage * msg; msg = carray_get(tab, i); mailmessage_free(msg); } err: return res; }
static int folder_update_msg_list(struct folder_ref_info * ref_info, struct mailmessage_list ** p_new_msg_list, struct mailmessage_list ** p_lost_msg_list) { int r; int res; struct mailmessage_list * new_env_list; unsigned int i; carray * lost_msg_tab; struct mailmessage_list * lost_msg_list; unsigned int free_start_index; chashiter * iter; unsigned int lost_count; r = mailfolder_get_messages_list(ref_info->folder, &new_env_list); if (r != MAIL_NO_ERROR) { res = r; goto err; } for(iter = chash_begin(ref_info->msg_hash) ; iter != NULL ; iter = chash_next(ref_info->msg_hash, iter)) { struct message_ref_elt * msg_ref; chashdatum data; chash_value(iter, &data); msg_ref = data.data; msg_ref->lost = 1; } lost_count = chash_count(ref_info->msg_hash); for(i = 0 ; i < carray_count(new_env_list->msg_tab) ; i ++) { mailmessage * msg; mailmessage * old_msg; msg = carray_get(new_env_list->msg_tab, i); if (msg->msg_uid == NULL) continue; old_msg = folder_info_get_msg_by_uid(ref_info, msg->msg_uid); if (old_msg != NULL) { struct message_ref_elt * msg_ref; /* replace old message */ old_msg->msg_index = msg->msg_index; carray_set(new_env_list->msg_tab, i, old_msg); mailmessage_free(msg); msg_ref = folder_info_get_msg_ref(ref_info, old_msg); msg_ref->lost = 0; lost_count --; } else { /* set new message */ r = folder_message_add(ref_info, msg); if (r != MAIL_NO_ERROR) { free_start_index = i; res = r; goto free_remaining; } } } /* build the table of lost messages */ lost_msg_tab = carray_new(lost_count); if (lost_msg_tab == NULL) { res = MAIL_ERROR_MEMORY; goto free_env_list; } carray_set_size(lost_msg_tab, lost_count); i = 0; for(iter = chash_begin(ref_info->msg_hash) ; iter != NULL ; iter = chash_next(ref_info->msg_hash, iter)) { struct message_ref_elt * msg_ref; chashdatum key; chashdatum value; mailmessage * msg; chash_key(iter, &key); memcpy(&msg, key.data, sizeof(msg)); chash_value(iter, &value); msg_ref = value.data; if (msg_ref->lost) { carray_set(lost_msg_tab, i, msg); i ++; } } lost_msg_list = mailmessage_list_new(lost_msg_tab); if (lost_msg_list == NULL) { res = MAIL_ERROR_MEMORY; goto free_lost_msg_tab; } /* reference messages */ for(i = 0 ; i < carray_count(new_env_list->msg_tab) ; i ++) { mailmessage * msg; msg = carray_get(new_env_list->msg_tab, i); folder_message_ref(ref_info, msg); } * p_new_msg_list = new_env_list; * p_lost_msg_list = lost_msg_list; return MAIL_NO_ERROR; free_lost_msg_tab: carray_free(lost_msg_tab); free_env_list: for(i = 0 ; i < carray_count(new_env_list->msg_tab) ; i ++) { mailmessage * msg; struct message_ref_elt * msg_ref; msg = carray_get(new_env_list->msg_tab, i); msg_ref = folder_info_get_msg_ref(ref_info, msg); if (msg_ref != NULL) { if (msg_ref->ref_count == 0) folder_message_remove(ref_info, msg); } } carray_set_size(new_env_list->msg_tab, 0); mailmessage_list_free(new_env_list); goto err; free_remaining: for(i = 0 ; i < carray_count(new_env_list->msg_tab) ; i ++) { mailmessage * msg; struct message_ref_elt * msg_ref; msg = carray_get(new_env_list->msg_tab, i); msg_ref = folder_info_get_msg_ref(ref_info, msg); if (msg_ref != NULL) { if (msg_ref->ref_count == 0) folder_message_remove(ref_info, msg); } } for(i = free_start_index ; i < carray_count(new_env_list->msg_tab) ; i ++) { mailmessage * msg; msg = carray_get(new_env_list->msg_tab, i); mailmessage_free(msg); } carray_set_size(new_env_list->msg_tab, 0); mailmessage_list_free(new_env_list); err: return res; }
int nntp_get_messages_list(mailsession * nntp_session, mailsession * session, mailmessage_driver * driver, struct mailmessage_list ** result) { carray * tab; struct mailmessage_list * env_list; uint32_t i; int res; int r; struct nntp_session_state_data * data; struct newsnntp_group_info * group_info; uint32_t max; unsigned int cur; data = session_get_data(nntp_session); if (data->nntp_group_name == NULL) { res = MAIL_ERROR_BAD_STATE; goto err; } r = nntpdriver_select_folder(nntp_session, data->nntp_group_name); if (r != MAIL_NO_ERROR) { res = r; goto err; } group_info = data->nntp_group_info; if (group_info == NULL) { res = MAIL_ERROR_BAD_STATE; goto err; } max = group_info->grp_first; if (data->nntp_max_articles != 0) { if (group_info->grp_last - data->nntp_max_articles + 1 > max) max = group_info->grp_last - data->nntp_max_articles + 1; } tab = carray_new(128); if (tab == NULL) { res = MAIL_ERROR_MEMORY; goto err; } for(i = max ; i <= group_info->grp_last ; i++) { mailmessage * msg; msg = mailmessage_new(); if (msg == NULL) { res = MAIL_ERROR_MEMORY; goto free_list; } r = mailmessage_init(msg, session, driver, i, 0); if (r != MAIL_NO_ERROR) { mailmessage_free(msg); res = r; goto free_list; } r = carray_add(tab, msg, NULL); if (r < 0) { mailmessage_free(msg); res = MAIL_ERROR_MEMORY; goto free_list; } } env_list = mailmessage_list_new(tab); if (env_list == NULL) { res = MAIL_ERROR_MEMORY; goto free_list; } * result = env_list; return MAIL_NO_ERROR; free_list: for(cur = 0 ; cur < carray_count(tab) ; cur ++) mailmessage_free(carray_get(tab, cur)); carray_free(tab); err: return res; }
static int get_messages_list(mailsession * session, struct mailmessage_list ** result) { int r; char key[PATH_MAX]; struct mail_cache_db * maildb; struct db_session_state_data * data; int res; carray * msglist; unsigned int i; carray * msgtab; struct mailmessage_list * driver_msglist; data = get_data(session); r = mail_cache_db_open_lock(data->db_filename, &maildb); if (r < 0) { res = MAIL_ERROR_FILE; goto err; } r = db_get_message_list(maildb, &msglist); if (r != MAIL_NO_ERROR) { res = r; goto close_db; } msgtab = carray_new(16); if (msgtab == NULL) { res = MAIL_ERROR_MEMORY; goto close_db; } for(i = 0 ; i < carray_count(msglist) ; i ++) { uint32_t msg_num; uint32_t * pmsg_num; mailmessage * msg; size_t size; pmsg_num = carray_get(msglist, i); msg_num = * pmsg_num; free(pmsg_num); carray_set(msglist, i, NULL); snprintf(key, sizeof(key), "%lu", (unsigned long) msg_num); r = mail_cache_db_get_size(maildb, key, strlen(key), &size); if (r < 0) { continue; } msg = mailmessage_new(); if (msg == NULL) { res = MAIL_ERROR_MEMORY; goto free_list; } r = mailmessage_init(msg, session, db_message_driver, msg_num, size); if (r != MAIL_NO_ERROR) { mailmessage_free(msg); res = r; goto free_list; } r = carray_add(msgtab, msg, NULL); if (r < 0) { mailmessage_free(msg); res = MAIL_ERROR_MEMORY; goto free_list; } } carray_free(msglist); driver_msglist = mailmessage_list_new(msgtab); if (driver_msglist == NULL) { res = MAIL_ERROR_MEMORY; goto free_list; } mail_cache_db_close_unlock(data->db_filename, maildb); * result = driver_msglist; return MAIL_NO_ERROR; free_list: for(i = 0 ; i < carray_count(msgtab) ; i ++) { mailmessage * msg; msg = carray_get(msgtab, i); mailmessage_free(msg); } carray_free(msgtab); for(i = 0 ; i < carray_count(msglist) ; i ++) { uint32_t * msg; msg = carray_get(msglist, i); if (msg != NULL) free(msg); } carray_free(msglist); close_db: mail_cache_db_close_unlock(data->db_filename, maildb); err: return res; }