MH class now should not change working directory anymore.
authorAndrej Kacian <ticho@claws-mail.org>
Sat, 23 Jan 2016 22:58:34 +0000 (23:58 +0100)
committerAndrej Kacian <ticho@claws-mail.org>
Sat, 23 Jan 2016 22:58:34 +0000 (23:58 +0100)
src/mh.c
src/procmsg.c

index dbf250c..b9036aa 100644 (file)
--- 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)
 {
 
 static void mh_get_last_num(Folder *folder, FolderItem *item)
 {
-       gchar *path;
+       gchar *path, *fullpath;
        GDir *dp;
        const gchar *d;
        GError *error = NULL;
        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);
 
        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_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) {
                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 &&
                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;
                }
                        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);
                        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;
 
        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);
 
        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_message("Couldn't open current directory: %s (%d).\n",
                                error->message, error->code);
                g_error_free(error);
+               g_free(path);
                return -1;
        }
                return -1;
        }
+       g_free(path);
 
        while ((d = g_dir_read_name(dp)) != NULL) {
                if ((num = to_number(d)) > 0) {
 
        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;
                                  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->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;
                return TRUE;
+       }
 
 
+       g_free(path);
        return FALSE;
 }
 
 static gint mh_scan_tree(Folder *folder)
 {
        FolderItem *item;
        return FALSE;
 }
 
 static gint mh_scan_tree(Folder *folder)
 {
        FolderItem *item;
-       gchar *rootpath;
 
        cm_return_val_if_fail(folder != NULL, -1);
 
 
        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);
 
        } 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);
        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; \
                } \
                if (make_dir_hier(dir) < 0) \
                        return -1; \
+               debug_print("Created dir '%s'\n", dir); \
        } \
 }
 
 static gint mh_create_tree(Folder *folder)
 {
        } \
 }
 
 static gint mh_create_tree(Folder *folder)
 {
-       gchar *rootpath, *f;
+       gchar *rootpath, *f, *path;
 
        cm_return_val_if_fail(folder != NULL, -1);
 
 
        cm_return_val_if_fail(folder != NULL, -1);
 
-       CHDIR_RETURN_VAL_IF_FAIL(get_mail_base_dir(), -1);
        rootpath = LOCAL_FOLDER(folder)->rootpath;
        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);
        MAKE_DIR_IF_NOT_EXIST(rootpath);
-       CHDIR_RETURN_VAL_IF_FAIL(rootpath, -1);
 
        /* Create special directories as needed */
        if (folder->inbox != NULL &&
 
        /* 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;
                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;
 
        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;
 
        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;
 
        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;
 
        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;
 }
 
        return 0;
 }
 
@@ -1105,7 +1122,7 @@ static void mh_scan_tree_recursive(FolderItem *item)
        Folder *folder;
        GDir *dir;
        const gchar *dir_name;
        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;
 
        gint n_msg = 0;
        GError *error = NULL;
 
@@ -1114,16 +1131,16 @@ static void mh_scan_tree_recursive(FolderItem *item)
 
        folder = item->folder;
 
 
        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)",
        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_error_free(error);
-               g_free(real_path);
+               g_free(path);
                return;
        }
                return;
        }
-       g_free(real_path);
 
        debug_print("scanning %s ...\n",
                    item->path ? item->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;
 
        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);
                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;
 
                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);
                        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);
                                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_dir_close(dir);
+       g_free(path);
 
        mh_set_mtime(folder, item);
 }
 
        mh_set_mtime(folder, item);
 }
index d3f11a7..153da63 100644 (file)
@@ -537,7 +537,6 @@ gboolean procmsg_msg_exist(MsgInfo *msginfo)
        if (!msginfo) return FALSE;
 
        path = folder_item_get_path(msginfo->folder);
        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);
 
        ret = !folder_item_is_msg_changed(msginfo->folder, msginfo);
        g_free(path);