aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2005-07-04 05:32:51 +0000
committerhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2005-07-04 05:32:51 +0000
commite15e2513a81f0eb179508b633aca7d2cfa232450 (patch)
tree5bd5c7bea8d8a971a81afe2f5e1ac7afd5e2e871 /src
parent2b0be50efb1c9426b8d729750e1b0e822beed4cd (diff)
unified mh_move_folder and mh_rename_folder.
git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@391 ee746299-78ed-0310-b773-934348b2243d
Diffstat (limited to 'src')
-rw-r--r--src/mh.c157
1 files changed, 76 insertions, 81 deletions
diff --git a/src/mh.c b/src/mh.c
index eb7af852..5f7347e1 100644
--- a/src/mh.c
+++ b/src/mh.c
@@ -886,91 +886,59 @@ static FolderItem *mh_create_folder(Folder *folder, FolderItem *parent,
return new_item;
}
-static gint mh_rename_folder(Folder *folder, FolderItem *item,
- const gchar *name)
-{
- gchar *fs_name;
- gchar *oldpath;
- gchar *dirname;
- gchar *newpath;
- gchar *paths[2];
-
- g_return_val_if_fail(folder != NULL, -1);
- g_return_val_if_fail(item != NULL, -1);
- g_return_val_if_fail(item->path != NULL, -1);
- g_return_val_if_fail(name != NULL, -1);
-
- oldpath = folder_item_get_path(item);
- dirname = g_dirname(oldpath);
- fs_name = g_filename_from_utf8(name, -1, NULL, NULL, NULL);
- newpath = g_strconcat(dirname, G_DIR_SEPARATOR_S,
- fs_name ? fs_name : name, NULL);
- g_free(fs_name);
- g_free(dirname);
-
- if (rename(oldpath, newpath) < 0) {
- FILE_OP_ERROR(oldpath, "rename");
- g_free(oldpath);
- g_free(newpath);
- return -1;
- }
-
- g_free(oldpath);
- g_free(newpath);
-
- if (strchr(item->path, G_DIR_SEPARATOR) != NULL) {
- dirname = g_dirname(item->path);
- newpath = g_strconcat(dirname, G_DIR_SEPARATOR_S, name, NULL);
- g_free(dirname);
- } else
- newpath = g_strdup(name);
-
- g_free(item->name);
- item->name = g_strdup(name);
-
- paths[0] = g_strdup(item->path);
- paths[1] = newpath;
- g_node_traverse(item->node, G_PRE_ORDER, G_TRAVERSE_ALL, -1,
- mh_rename_folder_func, paths);
-
- g_free(paths[0]);
- g_free(paths[1]);
-
- return 0;
-}
-
-static gint mh_move_folder(Folder *folder, FolderItem *item,
- FolderItem *new_parent)
+static gint mh_move_folder_real(Folder *folder, FolderItem *item,
+ FolderItem *new_parent, const gchar *name)
{
gchar *oldpath;
gchar *newpath;
+ gchar *dirname;
gchar *new_dir;
- gchar *name;
+ gchar *name_;
gchar *utf8_name;
gchar *paths[2];
g_return_val_if_fail(folder != NULL, -1);
g_return_val_if_fail(item != NULL, -1);
- g_return_val_if_fail(item->path != NULL, -1);
- g_return_val_if_fail(new_parent != NULL, -1);
- g_return_val_if_fail(item != new_parent, -1);
- g_return_val_if_fail(item->parent != new_parent, -1);
g_return_val_if_fail(folder == item->folder, -1);
- g_return_val_if_fail(item->folder == new_parent->folder, -1);
-
- if (g_node_is_ancestor(item->node, new_parent->node)) {
- g_warning("folder to be moved is ancestor of new parent\n");
- return -1;
+ g_return_val_if_fail(item->path != NULL, -1);
+ g_return_val_if_fail(new_parent != NULL || name != NULL, -1);
+ if (new_parent) {
+ g_return_val_if_fail(item != new_parent, -1);
+ g_return_val_if_fail(item->parent != new_parent, -1);
+ g_return_val_if_fail(item->folder == new_parent->folder, -1);
+ if (g_node_is_ancestor(item->node, new_parent->node)) {
+ g_warning("folder to be moved is ancestor of new parent\n");
+ return -1;
+ }
}
oldpath = folder_item_get_path(item);
- name = g_path_get_basename(oldpath);
- utf8_name = g_filename_to_utf8(name, -1, NULL, NULL, NULL);
- if (!utf8_name)
+ if (new_parent) {
+ if (name) {
+ name_ = g_filename_from_utf8(name, -1, NULL, NULL,
+ NULL);
+ if (!name_)
+ name_ = g_strdup(name);
+ utf8_name = g_strdup(name);
+ } else {
+ name_ = g_path_get_basename(oldpath);
+ utf8_name = g_filename_to_utf8(name_, -1, NULL, NULL,
+ NULL);
+ if (!utf8_name)
+ utf8_name = g_strdup(name_);
+ }
+ new_dir = folder_item_get_path(new_parent);
+ newpath = g_strconcat(new_dir, G_DIR_SEPARATOR_S, name_, NULL);
+ g_free(new_dir);
+ } else {
+ name_ = g_filename_from_utf8(name, -1, NULL, NULL, NULL);
utf8_name = g_strdup(name);
- new_dir = folder_item_get_path(new_parent);
- newpath = g_strconcat(new_dir, G_DIR_SEPARATOR_S, name, NULL);
- g_free(new_dir);
+ dirname = g_dirname(oldpath);
+ newpath = g_strconcat(dirname, G_DIR_SEPARATOR_S,
+ name_ ? name_ : name, NULL);
+ g_free(dirname);
+ }
+ g_free(name_);
if (is_file_entry_exist(newpath)) {
g_warning("%s already exists\n", newpath);
@@ -981,7 +949,6 @@ static gint mh_move_folder(Folder *folder, FolderItem *item,
}
debug_print("mh_move_folder: rename(%s, %s)\n", oldpath, newpath);
- g_free(name);
if (rename(oldpath, newpath) < 0) {
FILE_OP_ERROR(oldpath, "rename");
@@ -994,16 +961,32 @@ static gint mh_move_folder(Folder *folder, FolderItem *item,
g_free(oldpath);
g_free(newpath);
- g_node_unlink(item->node);
- g_node_append(new_parent->node, item->node);
- item->parent = new_parent;
+ if (new_parent) {
+ g_node_unlink(item->node);
+ g_node_append(new_parent->node, item->node);
+ item->parent = new_parent;
+ if (new_parent->path != NULL) {
+ newpath = g_strconcat(new_parent->path,
+ G_DIR_SEPARATOR_S, utf8_name,
+ NULL);
+ g_free(utf8_name);
+ } else
+ newpath = utf8_name;
+ } else {
+ if (strchr(item->path, G_DIR_SEPARATOR) != NULL) {
+ dirname = g_dirname(item->path);
+ newpath = g_strconcat(dirname, G_DIR_SEPARATOR_S,
+ utf8_name, NULL);
+ g_free(dirname);
+ g_free(utf8_name);
+ } else
+ newpath = utf8_name;
+ }
- if (new_parent->path != NULL) {
- newpath = g_strconcat(new_parent->path, G_DIR_SEPARATOR_S,
- utf8_name, NULL);
- g_free(utf8_name);
- } else
- newpath = utf8_name;
+ if (name) {
+ g_free(item->name);
+ item->name = g_strdup(name);
+ }
paths[0] = g_strdup(item->path);
paths[1] = newpath;
@@ -1016,6 +999,18 @@ static gint mh_move_folder(Folder *folder, FolderItem *item,
return 0;
}
+static gint mh_move_folder(Folder *folder, FolderItem *item,
+ FolderItem *new_parent)
+{
+ return mh_move_folder_real(folder, item, new_parent, NULL);
+}
+
+static gint mh_rename_folder(Folder *folder, FolderItem *item,
+ const gchar *name)
+{
+ return mh_move_folder_real(folder, item, NULL, name);
+}
+
static gint mh_remove_folder(Folder *folder, FolderItem *item)
{
gchar *path;