aboutsummaryrefslogtreecommitdiffstats
path: root/mail
diff options
context:
space:
mode:
authorNot Zed <NotZed@Ximian.com>2003-10-22 13:27:25 +0800
committerMichael Zucci <zucchi@src.gnome.org>2003-10-22 13:27:25 +0800
commit03f4b3a74c678e0bad0ea92fa0931c8e356b2c46 (patch)
tree14dd29569d878056b6dff269068dfab32e0efa47 /mail
parent8a5bdee67abcaed88fc75296763b89e339c8da35 (diff)
downloadgsoc2013-evolution-03f4b3a74c678e0bad0ea92fa0931c8e356b2c46.tar.gz
gsoc2013-evolution-03f4b3a74c678e0bad0ea92fa0931c8e356b2c46.tar.zst
gsoc2013-evolution-03f4b3a74c678e0bad0ea92fa0931c8e356b2c46.zip
handle destination of "" properly. (emc_popup_copy_folder_selected):
2003-10-22 Not Zed <NotZed@Ximian.com> * mail-component.c (em_copy_folders): handle destination of "" properly. (emc_popup_copy_folder_selected): handle url->path properly, strip leading /. (em_copy_folders): if we just created a new folder on a subscribable store, subscribe to it. (em_copy_folders): handle nonselectable folders specially. svn path=/trunk/; revision=22973
Diffstat (limited to 'mail')
-rw-r--r--mail/ChangeLog10
-rw-r--r--mail/mail-component.c63
2 files changed, 58 insertions, 15 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog
index ea233bacd9..85189ae5a3 100644
--- a/mail/ChangeLog
+++ b/mail/ChangeLog
@@ -1,3 +1,13 @@
+2003-10-22 Not Zed <NotZed@Ximian.com>
+
+ * mail-component.c (em_copy_folders): handle destination of ""
+ properly.
+ (emc_popup_copy_folder_selected): handle url->path properly, strip
+ leading /.
+ (em_copy_folders): if we just created a new folder on a
+ subscribable store, subscribe to it.
+ (em_copy_folders): handle nonselectable folders specially.
+
2003-10-21 Jeffrey Stedfast <fejj@ximian.com>
* mail-component.c (drag_text_uri_list, folder_dragged_cb)
diff --git a/mail/mail-component.c b/mail/mail-component.c
index 4bffcb1e9b..bb0bc876d1 100644
--- a/mail/mail-component.c
+++ b/mail/mail-component.c
@@ -1481,12 +1481,13 @@ emc_popup_open_new(GtkWidget *w, MailComponent *mc)
}
#endif
+/* FIXME: This must be done in another thread */
static void
em_copy_folders(CamelStore *tostore, const char *tobase, CamelStore *fromstore, const char *frombase, int delete)
{
GString *toname, *fromname;
CamelFolderInfo *fi;
- GList *pending = NULL;
+ GList *pending = NULL, *deleting = NULL, *l;
guint32 flags = CAMEL_STORE_FOLDER_INFO_RECURSIVE;
CamelException *ex = camel_exception_new();
int fromlen;
@@ -1508,7 +1509,7 @@ em_copy_folders(CamelStore *tostore, const char *tobase, CamelStore *fromstore,
if (tmp == NULL)
fromlen = 0;
else
- fromlen = tmp-frombase;
+ fromlen = tmp-frombase+1;
printf("top name is '%s'\n", fi->full_name);
@@ -1522,37 +1523,66 @@ em_copy_folders(CamelStore *tostore, const char *tobase, CamelStore *fromstore,
if (info->child)
pending = g_list_append(pending, info->child);
- g_string_printf(toname, "%s/%s", tobase, info->full_name + fromlen);
+ if (tobase[0])
+ g_string_printf(toname, "%s/%s", tobase, info->full_name + fromlen);
+ else
+ g_string_printf(toname, "%s", info->full_name + fromlen);
printf("Copying from '%s' to '%s'\n", info->full_name, toname->str);
/* This makes sure we create the same tree, e.g. from a nonselectable source */
/* Not sure if this is really the 'right thing', e.g. for spool stores, but it makes the ui work */
- fromfolder = camel_store_get_folder(fromstore, info->full_name, 0, ex);
- tofolder = camel_store_get_folder(tostore, toname->str, CAMEL_STORE_FOLDER_CREATE, ex);
- if (tofolder == NULL) {
- if (fromfolder)
+ if ((info->flags & CAMEL_FOLDER_NOSELECT) == 0) {
+ printf("this folder is selectable\n");
+ fromfolder = camel_store_get_folder(fromstore, info->full_name, 0, ex);
+ if (fromfolder == NULL)
+ goto exception;
+
+ tofolder = camel_store_get_folder(tostore, toname->str, CAMEL_STORE_FOLDER_CREATE, ex);
+ if (tofolder == NULL) {
camel_object_unref(fromfolder);
- goto exception;
- }
+ goto exception;
+ }
+
+ if (camel_store_supports_subscriptions(tostore)
+ && !camel_store_folder_subscribed(tostore, toname->str))
+ camel_store_subscribe_folder(tostore, toname->str, NULL);
- if (fromfolder) {
uids = camel_folder_get_uids(fromfolder);
- camel_folder_transfer_messages_to(fromfolder, uids, tofolder, NULL, FALSE, ex);
+ camel_folder_transfer_messages_to(fromfolder, uids, tofolder, NULL, delete, ex);
camel_folder_free_uids(fromfolder, uids);
camel_object_unref(fromfolder);
+ camel_object_unref(tofolder);
}
- camel_object_unref(tofolder);
+
if (camel_exception_is_set(ex))
goto exception;
+ else if (delete)
+ deleting = g_list_prepend(deleting, info);
+
info = info->sibling;
}
}
- camel_store_free_folder_info(fromstore, fi);
+ /* delete the folders in reverse order from how we copyied them, if we are deleting any */
+ l = deleting;
+ while (l) {
+ CamelFolderInfo *info = l->data;
+
+ printf("deleting folder '%s'\n", info->full_name);
+
+ if (camel_store_supports_subscriptions(fromstore))
+ camel_store_unsubscribe_folder(fromstore, info->full_name, NULL);
+
+ camel_store_delete_folder(fromstore, info->full_name, NULL);
+ l = l->next;
+ }
exception:
+ camel_store_free_folder_info(fromstore, fi);
+ g_list_free(deleting);
+
g_string_free(toname, TRUE);
g_string_free(fromname, TRUE);
done:
@@ -1591,8 +1621,10 @@ emc_popup_copy_folder_selected(const char *uri, void *data)
url = camel_url_new(uri, NULL);
if (url->fragment)
tobase = url->fragment;
+ else if (url->path && url->path[0])
+ tobase = url->path+1;
else
- tobase = url->path;
+ tobase = "";
em_copy_folders(tostore, tobase, fromstore, frombase, d->delete);
@@ -1704,6 +1736,7 @@ em_delete_rec(CamelStore *store, CamelFolderInfo *fi, CamelException *ex)
printf("deleting folder '%s'\n", fi->full_name);
+ /* shouldn't camel do this itself? */
if (camel_store_supports_subscriptions(store))
camel_store_unsubscribe_folder(store, fi->full_name, NULL);
@@ -1839,7 +1872,7 @@ emc_popup_rename_folder(GtkWidget *w, MailComponent *mc)
e_notice(NULL, GTK_MESSAGE_ERROR,
_("A folder named \"%s\" already exists. Please use a different name."), new);
} else {
- CamelStore *store;
+ CamelStore *store;
CamelException *ex = camel_exception_new();
const char *oldpath, *newpath;