talons

Fork of Claws Mail https://www.claws-mail
Log | Files | Refs | README | LICENSE

commit a5c8092f06252c6cd9b000690a8190d77a8ceed2
parent cbc36707c3f39c95ea45d83428ca15a06cc979be
Author: Andrej Kacian <ticho@claws-mail.org>
Date:   Sat, 23 Jan 2016 23:58:34 +0100

MH class now should not change working directory anymore.

Diffstat:
Msrc/mh.c | 99+++++++++++++++++++++++++++++++++++++++++++++++--------------------------------
Msrc/procmsg.c | 1-
2 files changed, 59 insertions(+), 41 deletions(-)

diff --git a/src/mh.c b/src/mh.c @@ -243,7 +243,7 @@ gboolean mh_scan_required(Folder *folder, FolderItem *item) static void mh_get_last_num(Folder *folder, FolderItem *item) { - gchar *path; + gchar *path, *fullpath; GDir *dp; const gchar *d; GError *error = NULL; @@ -256,22 +256,19 @@ static void mh_get_last_num(Folder *folder, FolderItem *item) path = folder_item_get_path(item); cm_return_if_fail(path != NULL); - if (change_dir(path) < 0) { - g_free(path); - return; - } - g_free(path); - if ((dp = g_dir_open(".", 0, &error)) == NULL) { + if ((dp = g_dir_open(path, 0, &error)) == NULL) { g_message("Couldn't open current directory: %s (%d).\n", error->message, error->code); g_error_free(error); + g_free(path); return; } while ((d = g_dir_read_name(dp)) != NULL) { + fullpath = g_strconcat(path, G_DIR_SEPARATOR_S, d, NULL); if ((num = to_number(d)) > 0 && - g_file_test(d, G_FILE_TEST_IS_REGULAR)) { + g_file_test(fullpath, G_FILE_TEST_IS_REGULAR)) { if (max < num) max = num; } @@ -279,6 +276,8 @@ static void mh_get_last_num(Folder *folder, FolderItem *item) GTK_EVENTS_FLUSH(); } g_dir_close(dp); + g_free(fullpath); + g_free(path); debug_print("Last number in dir %s = %d\n", item->path?item->path:"(null)", max); item->last_num = max; @@ -301,18 +300,15 @@ gint mh_get_num_list(Folder *folder, FolderItem *item, GSList **list, gboolean * path = folder_item_get_path(item); cm_return_val_if_fail(path != NULL, -1); - if (change_dir(path) < 0) { - g_free(path); - return -1; - } - g_free(path); - if ((dp = g_dir_open(".", 0, &error)) == NULL) { + if ((dp = g_dir_open(path, 0, &error)) == NULL) { g_message("Couldn't open current directory: %s (%d).\n", error->message, error->code); g_error_free(error); + g_free(path); return -1; } + g_free(path); while ((d = g_dir_read_name(dp)) != NULL) { if ((num = to_number(d)) > 0) { @@ -734,21 +730,26 @@ static gboolean mh_is_msg_changed(Folder *folder, FolderItem *item, MsgInfo *msginfo) { GStatBuf s; + gchar *path; - if (g_stat(itos(msginfo->msgnum), &s) < 0 || + path = g_strdup_printf("%s%c%d", folder_item_get_path(item), + G_DIR_SEPARATOR, msginfo->msgnum); + if (g_stat((path), &s) < 0 || msginfo->size != s.st_size || ( (msginfo->mtime - s.st_mtime != 0) && (msginfo->mtime - s.st_mtime != 3600) && - (msginfo->mtime - s.st_mtime != -3600))) + (msginfo->mtime - s.st_mtime != -3600))) { + g_free(path); return TRUE; + } + g_free(path); return FALSE; } static gint mh_scan_tree(Folder *folder) { FolderItem *item; - gchar *rootpath; cm_return_val_if_fail(folder != NULL, -1); @@ -759,13 +760,6 @@ static gint mh_scan_tree(Folder *folder) } else item = FOLDER_ITEM(folder->node->data); - rootpath = folder_item_get_path(item); - if (change_dir(rootpath) < 0) { - g_free(rootpath); - return -1; - } - g_free(rootpath); - mh_create_tree(folder); mh_remove_missing_folder_items(folder); mh_scan_tree_recursive(item); @@ -783,19 +777,31 @@ static gint mh_scan_tree(Folder *folder) } \ if (make_dir_hier(dir) < 0) \ return -1; \ + debug_print("Created dir '%s'\n", dir); \ } \ } static gint mh_create_tree(Folder *folder) { - gchar *rootpath, *f; + gchar *rootpath, *f, *path; cm_return_val_if_fail(folder != NULL, -1); - CHDIR_RETURN_VAL_IF_FAIL(get_mail_base_dir(), -1); rootpath = LOCAL_FOLDER(folder)->rootpath; +#ifdef G_OS_UNIX + if (*rootpath == '/') { +#elif G_OS_WIN32 + if (g_ascii_isalpha(*rootpath) && !strncmp(rootpath + 1, "\:", 2)) { +#endif + /* Folder path is absolute. */ + rootpath = g_strdup(rootpath); + } else { + /* Folder path is relative, using mail base dir. */ + rootpath = g_strconcat(get_mail_base_dir(), G_DIR_SEPARATOR_S, + rootpath, NULL); + } + MAKE_DIR_IF_NOT_EXIST(rootpath); - CHDIR_RETURN_VAL_IF_FAIL(rootpath, -1); /* Create special directories as needed */ if (folder->inbox != NULL && @@ -803,36 +809,47 @@ static gint mh_create_tree(Folder *folder) f = folder->inbox->path; else f = INBOX_DIR; - MAKE_DIR_IF_NOT_EXIST(f); + path = g_strconcat(rootpath, G_DIR_SEPARATOR_S, f, NULL); + MAKE_DIR_IF_NOT_EXIST(path); + g_free(path); if (folder->outbox != NULL && folder->outbox->path != NULL) f = folder->outbox->path; else f = OUTBOX_DIR; - MAKE_DIR_IF_NOT_EXIST(f); + path = g_strconcat(rootpath, G_DIR_SEPARATOR_S, f, NULL); + MAKE_DIR_IF_NOT_EXIST(path); + g_free(path); if (folder->draft != NULL && folder->draft->path != NULL) f = folder->draft->path; else f = DRAFT_DIR; - MAKE_DIR_IF_NOT_EXIST(f); + path = g_strconcat(rootpath, G_DIR_SEPARATOR_S, f, NULL); + MAKE_DIR_IF_NOT_EXIST(path); + g_free(path); if (folder->queue != NULL && folder->queue->path != NULL) f = folder->queue->path; else f = QUEUE_DIR; - MAKE_DIR_IF_NOT_EXIST(f); + path = g_strconcat(rootpath, G_DIR_SEPARATOR_S, f, NULL); + MAKE_DIR_IF_NOT_EXIST(path); + g_free(path); if (folder->trash != NULL && folder->trash->path != NULL) f = folder->trash->path; else f = TRASH_DIR; - MAKE_DIR_IF_NOT_EXIST(f); + path = g_strconcat(rootpath, G_DIR_SEPARATOR_S, f, NULL); + MAKE_DIR_IF_NOT_EXIST(path); + g_free(path); + g_free(rootpath); return 0; } @@ -1105,7 +1122,7 @@ static void mh_scan_tree_recursive(FolderItem *item) Folder *folder; GDir *dir; const gchar *dir_name; - gchar *real_path, *entry, *utf8entry, *utf8name; + gchar *entry, *utf8entry, *utf8name, *path; gint n_msg = 0; GError *error = NULL; @@ -1114,16 +1131,16 @@ static void mh_scan_tree_recursive(FolderItem *item) folder = item->folder; - real_path = item->path ? mh_filename_from_utf8(item->path) : g_strdup("."); - dir = g_dir_open(real_path, 0, &error); + path = folder_item_get_path(item); + debug_print("mh_scan_tree_recursive() opening '%s'\n", path); + dir = g_dir_open(path, 0, &error); if (!dir) { g_warning("failed to open directory '%s': %s (%d)", - real_path, error->message, error->code); + path, error->message, error->code); g_error_free(error); - g_free(real_path); + g_free(path); return; } - g_free(real_path); debug_print("scanning %s ...\n", item->path ? item->path @@ -1134,13 +1151,14 @@ static void mh_scan_tree_recursive(FolderItem *item) while ((dir_name = g_dir_read_name(dir)) != NULL) { if (dir_name[0] == '.') continue; + entry = g_strconcat(path, G_DIR_SEPARATOR_S, dir_name, NULL); + utf8name = mh_filename_to_utf8(dir_name); if (item->path) utf8entry = g_strconcat(item->path, G_DIR_SEPARATOR_S, utf8name, NULL); else utf8entry = g_strdup(utf8name); - entry = mh_filename_from_utf8(utf8entry); if (g_file_test(entry, G_FILE_TEST_IS_DIR)) { FolderItem *new_item = NULL; @@ -1149,7 +1167,7 @@ static void mh_scan_tree_recursive(FolderItem *item) node = item->node; for (node = node->children; node != NULL; node = node->next) { FolderItem *cur_item = FOLDER_ITEM(node->data); - gchar *curpath = mh_filename_from_utf8(cur_item->path); + gchar *curpath = folder_item_get_path(cur_item); if (!strcmp2(curpath, entry)) { new_item = cur_item; g_free(curpath); @@ -1196,6 +1214,7 @@ static void mh_scan_tree_recursive(FolderItem *item) } g_dir_close(dir); + g_free(path); mh_set_mtime(folder, item); } diff --git a/src/procmsg.c b/src/procmsg.c @@ -537,7 +537,6 @@ gboolean procmsg_msg_exist(MsgInfo *msginfo) if (!msginfo) return FALSE; path = folder_item_get_path(msginfo->folder); - change_dir(path); ret = !folder_item_is_msg_changed(msginfo->folder, msginfo); g_free(path);