aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2005-07-04 04:07:53 +0000
committerhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2005-07-04 04:07:53 +0000
commit2b0be50efb1c9426b8d729750e1b0e822beed4cd (patch)
treedb8163009c59ae372633b3b3593a6ad68378cd35
parent0ada6c15f7eef4e46d8f1b8964dad1193692a10a (diff)
implemented IMAP4 folder move.
git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@390 ee746299-78ed-0310-b773-934348b2243d
-rw-r--r--ChangeLog5
-rw-r--r--ChangeLog.ja5
-rw-r--r--src/folderview.c2
-rw-r--r--src/imap.c71
4 files changed, 72 insertions, 11 deletions
diff --git a/ChangeLog b/ChangeLog
index 548137d0..20ddd5c7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2005-07-04
+
+ * src/imap.c
+ src/folderview.c: implemented IMAP4 folder move.
+
2005-07-01
* src/mh.c
diff --git a/ChangeLog.ja b/ChangeLog.ja
index 1fff563b..6f05e4f3 100644
--- a/ChangeLog.ja
+++ b/ChangeLog.ja
@@ -1,3 +1,8 @@
+2005-07-04
+
+ * src/imap.c
+ src/folderview.c: IMAP4 のフォルダの移動を実装。
+
2005-07-01
* src/mh.c
diff --git a/src/folderview.c b/src/folderview.c
index 2cbd85e2..15b7f86a 100644
--- a/src/folderview.c
+++ b/src/folderview.c
@@ -246,6 +246,7 @@ static GtkItemFactoryEntry folderview_imap_popup_entries[] =
{
{N_("/Create _new folder..."), NULL, folderview_new_folder_cb, 0, NULL},
{N_("/_Rename folder..."), NULL, folderview_rename_folder_cb, 0, NULL},
+ {N_("/_Move folder..."), NULL, folderview_move_folder_cb, 0, NULL},
{N_("/_Delete folder"), NULL, folderview_delete_folder_cb, 0, NULL},
{N_("/---"), NULL, NULL, 0, "<Separator>"},
{N_("/Empty _trash"), NULL, folderview_empty_trash_cb, 0, NULL},
@@ -1509,6 +1510,7 @@ static gboolean folderview_menu_popup(FolderView *folderview,
menu_set_insensitive_all(GTK_MENU_SHELL(popup));
SET_SENS(imap_factory, "/Create new folder...", new_folder);
SET_SENS(imap_factory, "/Rename folder...", rename_folder);
+ SET_SENS(imap_factory, "/Move folder...", move_folder);
SET_SENS(imap_factory, "/Delete folder", delete_folder);
SET_SENS(imap_factory, "/Empty trash", empty_trash);
SET_SENS(imap_factory, "/Download", download_msg);
diff --git a/src/imap.c b/src/imap.c
index bf523e62..852ed26a 100644
--- a/src/imap.c
+++ b/src/imap.c
@@ -157,6 +157,9 @@ static FolderItem *imap_create_folder (Folder *folder,
static gint imap_rename_folder (Folder *folder,
FolderItem *item,
const gchar *name);
+static gint imap_move_folder (Folder *folder,
+ FolderItem *item,
+ FolderItem *new_parent);
static gint imap_remove_folder (Folder *folder,
FolderItem *item);
@@ -391,7 +394,7 @@ static FolderClass imap_class =
imap_create_folder,
imap_rename_folder,
- NULL,
+ imap_move_folder,
imap_remove_folder
};
@@ -2045,10 +2048,9 @@ static FolderItem *imap_create_folder(Folder *folder, FolderItem *parent,
return new_item;
}
-static gint imap_rename_folder(Folder *folder, FolderItem *item,
- const gchar *name)
+static gint imap_rename_folder_real(Folder *folder, FolderItem *item,
+ FolderItem *new_parent, const gchar *name)
{
- gchar *dirpath;
gchar *newpath;
gchar *real_oldpath;
gchar *real_newpath;
@@ -2063,8 +2065,18 @@ static gint imap_rename_folder(Folder *folder, FolderItem *item,
g_return_val_if_fail(folder != NULL, -1);
g_return_val_if_fail(item != NULL, -1);
+ g_return_val_if_fail(folder == item->folder, -1);
g_return_val_if_fail(item->path != NULL, -1);
- g_return_val_if_fail(name != 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;
+ }
+ }
session = imap_session_get(folder);
if (!session) return -1;
@@ -2081,12 +2093,31 @@ static gint imap_rename_folder(Folder *folder, FolderItem *item,
}
separator = imap_get_path_separator(IMAP_FOLDER(folder), item->path);
- if (strchr(item->path, G_DIR_SEPARATOR)) {
- dirpath = g_dirname(item->path);
- newpath = g_strconcat(dirpath, G_DIR_SEPARATOR_S, name, NULL);
- g_free(dirpath);
- } else
- newpath = g_strdup(name);
+ if (new_parent) {
+ if (name) {
+ newpath = g_strconcat(new_parent->path,
+ G_DIR_SEPARATOR_S, name, NULL);
+ } else {
+ gchar *name_;
+
+ name_ = g_path_get_basename(item->path);
+ newpath = g_strconcat(new_parent->path,
+ G_DIR_SEPARATOR_S, name_, NULL);
+ AUTORELEASE_STR(name_, );
+ name = name_;
+ }
+ } else {
+ if (strchr(item->path, G_DIR_SEPARATOR)) {
+ gchar *dirpath;
+
+ dirpath = g_dirname(item->path);
+ newpath = g_strconcat(dirpath, G_DIR_SEPARATOR_S, name,
+ NULL);
+ g_free(dirpath);
+ } else
+ newpath = g_strdup(name);
+ }
+ g_print("oldpath = %s, newpath = %s\n", item->path, newpath);
real_newpath = imap_utf8_to_modified_utf7(newpath);
imap_path_separator_subst(real_newpath, separator);
@@ -2101,6 +2132,12 @@ static gint imap_rename_folder(Folder *folder, FolderItem *item,
return -1;
}
+ if (new_parent) {
+ g_node_unlink(item->node);
+ g_node_append(new_parent->node, item->node);
+ item->parent = new_parent;
+ }
+
g_free(item->name);
item->name = g_strdup(name);
@@ -2128,6 +2165,18 @@ static gint imap_rename_folder(Folder *folder, FolderItem *item,
return 0;
}
+static gint imap_rename_folder(Folder *folder, FolderItem *item,
+ const gchar *name)
+{
+ return imap_rename_folder_real(folder, item, NULL, name);
+}
+
+static gint imap_move_folder(Folder *folder, FolderItem *item,
+ FolderItem *new_parent)
+{
+ return imap_rename_folder_real(folder, item, new_parent, NULL);
+}
+
static gint imap_remove_folder(Folder *folder, FolderItem *item)
{
gint ok;