static void print_message_list(mailsession * session) { int r; struct mailmessage_list * env_list; struct mailmessage_tree * env_tree; unsigned int count; /* get the list of messages numbers of the folder */ r = mailsession_get_messages_list(session, &env_list); if (r != MAIL_NO_ERROR) { printf("error message list\n"); goto err; } /* get fields content of these messages */ r = mailsession_get_envelopes_list(session, env_list); if (r != MAIL_NO_ERROR) { printf("error envelopes list\n"); goto free_msg_list; } /* build threads */ r = mail_build_thread(MAIL_THREAD_REFERENCES_NO_SUBJECT, DEST_CHARSET, env_list, &env_tree, mailthread_tree_timecomp); if (r != MAIL_NO_ERROR) { printf("can't build tree\n"); goto free_msg_list; } /* display message tree */ count = 0; display_tree(env_tree, &count); printf(" %i messages\n", count); /* free structure */ mailmessage_tree_free_recursive(env_tree); mailmessage_list_free(env_list); return; free_msg_list: mailmessage_list_free(env_list); err: {} }
static void print_message_list(mailsession * session) { int r; uint32_t i; struct mailmessage_list * env_list; unsigned int count; /* get the list of messages numbers of the folder */ r = mailsession_get_messages_list(session, &env_list); if (r != MAIL_NO_ERROR) { printf("error message list\n"); goto err; } /* get fields content of these messages */ r = mailsession_get_envelopes_list(session, env_list); if (r != MAIL_NO_ERROR) { printf("error envelopes list\n"); goto free_msg_list; } /* display all the messages */ count = 0; for(i = 0 ; i < carray_count(env_list->msg_tab) ; i ++) { mailmessage * msg; msg = carray_get(env_list->msg_tab, i); if (msg->msg_fields == NULL) { printf("could not fetch envelope of message %i\n", i); } else { simple_print_mail_info(msg); count ++; } } printf(" %i messages\n", count); /* free structure */ mailmessage_list_free(env_list); return; free_msg_list: mailmessage_list_free(env_list); err: {} }
LIBETPAN_EXPORT int mailfolder_get_messages_list(struct mailfolder * folder, struct mailmessage_list ** result) { int r; struct mailmessage_list * msg_list; unsigned int i; struct mailstorage * storage; /* workaround for POP3 case - begin */ storage = folder->fld_storage; if (strcmp(storage->sto_driver->sto_name, "pop3") == 0) { mailstorage_disconnect(storage); r = mailstorage_connect(storage); if (r != MAIL_NO_ERROR) return r; r = mailfolder_connect(folder); if (r != MAIL_NO_ERROR) return r; } /* workaround for POP3 case - begin */ r = mailsession_get_messages_list(folder->fld_session, &msg_list); if (r != MAIL_NO_ERROR) return r; for(i = 0 ; i < carray_count(msg_list->msg_tab) ; i ++) { mailmessage * msg; msg = carray_get(msg_list->msg_tab, i); msg->msg_folder = folder; } * result = msg_list; return MAIL_NO_ERROR; }
int maildriver_generic_search_messages(mailsession * session, char * charset, struct mail_search_key * key, struct mail_search_result ** result) { int header; clist * list; struct mail_search_result * search_result; int r; struct mailmessage_list * env_list; int res; unsigned int i; header = is_search_header_only(key); r = mailsession_get_messages_list(session, &env_list); if (r != MAIL_NO_ERROR) return r; list = NULL; for(i = 0 ; i < carray_count(env_list->tab) ; i ++) { char * message; size_t length; struct mail_info * info; uint32_t flags; struct mailimf_fields * fields; size_t cur_token; info = carray_get(env_list->tab, i); if (!header) { r = mailsession_fetch_message(session, info->indx, &message, &length); if (r != MAIL_NO_ERROR) { res = r; goto free_list; } cur_token = 0; r = mailimf_optional_fields_parse(message, length, &cur_token, &fields); if (r != MAILIMF_NO_ERROR) { res = MAIL_ERROR_PARSE; goto free_list; } } else { char * msg_header; int r; size_t cur_token; size_t header_len; r = mailsession_fetch_message_header(session, info->indx, &msg_header, &header_len); if (r != MAIL_NO_ERROR) { res = r; goto free_list; } message = NULL; cur_token = 0; r = mailimf_optional_fields_parse(msg_header, header_len, &cur_token, &fields); if (r != MAILIMF_NO_ERROR) { res = MAIL_ERROR_PARSE; goto free_list; } mailsession_fetch_result_free(session, msg_header); } r = mailsession_get_message_flags(session, info->indx, &flags); if (r != MAIL_NO_ERROR) { res = r; goto free_list; } if (match_messages(message, info->size, fields, flags, charset, key)) { uint32_t * pnum; pnum = malloc(sizeof(* pnum)); if (pnum == NULL) { if (message != NULL) mailsession_fetch_result_free(session, message); res = MAIL_ERROR_MEMORY; goto free_list; } * pnum = info->indx; r = clist_append(list, pnum); if (r < 0) { free(pnum); if (message != NULL) mailsession_fetch_result_free(session, message); res = MAIL_ERROR_MEMORY; goto free_list; } } if (message != NULL) mailsession_fetch_result_free(session, message); } search_result = mail_search_result_new(list); if (search_result == NULL) { res = MAIL_ERROR_MEMORY; goto free_list; } * result = search_result; return MAIL_NO_ERROR; free_list: clist_foreach(list, (clist_func) free, NULL); clist_free(list); mailmessage_list_free(env_list); return res; }