Diffstat (limited to 'kmicromail/libetpan/tests/frm-tree.c') (more/less context) (ignore whitespace changes)
-rw-r--r-- | kmicromail/libetpan/tests/frm-tree.c | 234 |
1 files changed, 234 insertions, 0 deletions
diff --git a/kmicromail/libetpan/tests/frm-tree.c b/kmicromail/libetpan/tests/frm-tree.c new file mode 100644 index 0000000..3a8464a --- a/dev/null +++ b/kmicromail/libetpan/tests/frm-tree.c @@ -0,0 +1,234 @@ +#include "option-parser.h" +#include "frm-common.h" + +#include <libetpan/libetpan.h> + +#include <stdlib.h> +#include <string.h> + +#define DEST_CHARSET "iso-8859-1" + +/* display tree */ + +static void +display_sub_tree(MMAPString * prefix, + struct mailmessage_tree * msg_tree, + int level, int has_next, unsigned int * pcount) +{ + carray * list; + uint32_t cur; + + if (msg_tree->node_msg != NULL) { + print_mail_info(prefix->str, msg_tree->node_msg); + (* pcount) ++; + } + + list = msg_tree->node_children; + + if (carray_count(list) != 0) { + char old_prefix[2]; + + if (level > 1) { + memcpy(old_prefix, prefix->str + prefix->len - 2, 2); + if (has_next) + memcpy(prefix->str + prefix->len - 2, "| ", 2); + else + memcpy(prefix->str + prefix->len - 2, " ", 2); + } + for(cur = 0 ; cur < carray_count(list) ; cur ++) { + int sub_has_next; + + if (cur != carray_count(list) - 1) { + if (level > 0) { + if (mmap_string_append(prefix, "+-") == NULL) + return; + } + sub_has_next = 1; + } + else { + if (level > 0) { + if (mmap_string_append(prefix, "\\-") == NULL) + return; + } + sub_has_next = 0; + } + + display_sub_tree(prefix, carray_get(list, cur), + level + 1, sub_has_next, pcount); + + if (mmap_string_truncate(prefix, prefix->len - 2) == NULL) { + return; + } + } + if (level > 1) { + memcpy(prefix->str + prefix->len - 2, old_prefix, 2); + } + } +} + +static void display_tree(struct mailmessage_tree * env_tree, + unsigned int * pcount) +{ + MMAPString * prefix; + + prefix = mmap_string_new(""); + if (prefix == NULL) + return; + + display_sub_tree(prefix, env_tree, 0, 0, pcount); + + mmap_string_free(prefix); +} + +/* get the message list and display it */ + +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: +} + +int main(int argc, char ** argv) +{ + int r; + int driver; + char * server; + int port; + int connection_type; + char * user; + char * password; + int auth_type; + char * path; + char * cache_directory; + char * flags_directory; + struct mailstorage * storage; + int cached; + struct mailfolder * folder; + + /* get options */ + + r = parse_options(argc, argv, + &driver, &server, &port, &connection_type, + &user, &password, &auth_type, + &path, &cache_directory, &flags_directory); + + cached = (cache_directory != NULL); + + /* build the storage structure */ + + storage = mailstorage_new(NULL); + if (storage == NULL) { + printf("error initializing storage\n"); + goto free_opt; + } + + r = init_storage(storage, driver, server, port, connection_type, + user, password, auth_type, path, cache_directory, flags_directory); + if (r != MAIL_NO_ERROR) { + printf("error initializing storage\n"); + goto free_opt; + } + + /* get the folder structure */ + + folder = mailfolder_new(storage, path, NULL); + if (folder == NULL) { + printf("error initializing folder\n"); + goto free_storage; + } + + r = mailfolder_connect(folder); + if (r != MAIL_NO_ERROR) { + printf("error initializing folder\n"); + goto free_folder; + } + + /* get and display the list of messages */ + + print_message_list(folder->fld_session); + + mailfolder_free(folder); + mailstorage_free(storage); + + if (server != NULL) + free(server); + if (user != NULL) + free(user); + if (password != NULL) + free(password); + if (path != NULL) + free(path); + if (cache_directory != NULL) + free(cache_directory); + if (flags_directory != NULL) + free(flags_directory); + + return 0; + + free_folder: + mailfolder_free(folder); + free_storage: + mailstorage_free(storage); + free_opt: + if (server != NULL) + free(server); + if (user != NULL) + free(user); + if (password != NULL) + free(password); + if (path != NULL) + free(path); + if (cache_directory != NULL) + free(cache_directory); + if (flags_directory != NULL) + free(flags_directory); + return -1; +} + |