From e14a0019e799ea6c91ca6320ab0ca6c3c89dc7b6 Mon Sep 17 00:00:00 2001 From: Not Zed Date: Wed, 10 Aug 2005 02:04:31 +0000 Subject: ** See #312715. 2005-08-09 Not Zed ** See #312715. * em-folder-tree.c (emft_drop_folder_rec): removed. (emft_drop_folder): call em_folder_utils_copy_folders to perform the operation rather than: doing it sync when it shouldn't be, and 2; copying code redundantly. * em-folder-utils.c (em_folder_utils_move_folder): remove this redundant api. (em_folder_utils_copy_folder): add delete flag. (em_folder_utils_copy_folders): export this function. fix strange argument order. svn path=/trunk/; revision=30066 --- mail/ChangeLog | 15 ++++++++ mail/em-folder-browser.c | 4 +-- mail/em-folder-tree.c | 89 +++++------------------------------------------- mail/em-folder-utils.c | 36 +++++++------------- mail/em-folder-utils.h | 5 +-- mail/mail-ops.c | 8 ++--- 6 files changed, 44 insertions(+), 113 deletions(-) (limited to 'mail') diff --git a/mail/ChangeLog b/mail/ChangeLog index f26a7ac6a1..33439d45b7 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,3 +1,18 @@ +2005-08-09 Not Zed + + ** See #312715. + + * em-folder-tree.c (emft_drop_folder_rec): removed. + (emft_drop_folder): call em_folder_utils_copy_folders to perform + the operation rather than: doing it sync when it shouldn't be, and + 2; copying code redundantly. + + * em-folder-utils.c (em_folder_utils_move_folder): remove this + redundant api. + (em_folder_utils_copy_folder): add delete flag. + (em_folder_utils_copy_folders): export this function. fix strange + argument order. + 2005-08-10 Tor Lillqvist * Makefile.am: Link with all needed libraries. Use -no-undefined diff --git a/mail/em-folder-browser.c b/mail/em-folder-browser.c index 6d3937126d..1f89a2c569 100644 --- a/mail/em-folder-browser.c +++ b/mail/em-folder-browser.c @@ -585,7 +585,7 @@ emfb_folder_copy(BonoboUIComponent *uid, void *data, const char *path) emfb->view.folder->full_name, CAMEL_STORE_FOLDER_INFO_FAST, &ex)) != NULL) - em_folder_utils_copy_folder (fi); + em_folder_utils_copy_folder(fi, FALSE); camel_exception_clear (&ex); @@ -608,7 +608,7 @@ emfb_folder_move(BonoboUIComponent *uid, void *data, const char *path) emfb->view.folder->full_name, CAMEL_STORE_FOLDER_INFO_FAST, &ex)) != NULL) - em_folder_utils_move_folder (fi); + em_folder_utils_copy_folder(fi, TRUE); camel_exception_clear (&ex); diff --git a/mail/em-folder-tree.c b/mail/em-folder-tree.c index 5546bf7748..c3da19e64f 100644 --- a/mail/em-folder-tree.c +++ b/mail/em-folder-tree.c @@ -821,90 +821,17 @@ struct _DragDataReceivedAsync { unsigned int aborted:1; }; -static void -emft_drop_folder_rec (CamelStore *store, CamelFolderInfo *fi, const char *parent_name, CamelException *ex) -{ - CamelFolder *src, *dest; - CamelFolderInfo *nfi; - char *new_name; - - while (fi != NULL) { - if (!(src = mail_tool_uri_to_folder (fi->uri, 0, ex))) - break; - - /* handles dropping to the root properly */ - if (parent_name && parent_name[0]) - new_name = g_strdup_printf ("%s/%s", parent_name, src->name); - else - new_name = g_strdup (src->name); - - if ((nfi = camel_store_create_folder (store, parent_name, src->name, ex))) { - camel_store_free_folder_info (store, nfi); - - if (camel_store_supports_subscriptions (store)) - camel_store_subscribe_folder (store, new_name, ex); - - /* copy the folder to the new location */ - if ((dest = camel_store_get_folder (store, new_name, 0, ex))) { - GPtrArray *uids; - - uids = camel_folder_get_uids (src); - camel_folder_transfer_messages_to (src, uids, dest, NULL, FALSE, ex); - camel_folder_free_uids (src, uids); - - camel_object_unref (dest); - } - } - - camel_object_unref (src); - - if (fi->child) - emft_drop_folder_rec (store, fi->child, new_name, ex); - - g_free (new_name); - fi = fi->next; - } -} - static void emft_drop_folder(struct _DragDataReceivedAsync *m) { CamelFolder *src; - char *new_name; d(printf(" * Drop folder '%s' onto '%s'\n", m->selection->data, m->full_name)); if (!(src = mail_tool_uri_to_folder(m->selection->data, 0, &m->msg.ex))) return; - - /* handles dropping to the root properly */ - if (m->full_name) - new_name = g_strdup_printf("%s/%s", m->full_name, src->name); - else - new_name = g_strdup(src->name); - - if (src->parent_store == m->store && m->move) { - /* simple case, rename */ - camel_store_rename_folder(m->store, src->full_name, new_name, &m->msg.ex); - m->moved = !camel_exception_is_set (&m->msg.ex); - } else { - CamelFolderInfo *fi, *nfi; - - /* FIXME: should check we're not coming from a vfolder, otherwise bad stuff could happen */ - - if ((fi = camel_store_get_folder_info (src->parent_store, src->full_name, CAMEL_STORE_FOLDER_INFO_FAST | - CAMEL_STORE_FOLDER_INFO_RECURSIVE, &m->msg.ex))) { - if (!(nfi = camel_store_get_folder_info (m->store, new_name, CAMEL_STORE_FOLDER_INFO_FAST, &m->msg.ex))) { - /* Good. The folder doesn't already exist... */ - camel_exception_clear (&m->msg.ex); - emft_drop_folder_rec (m->store, fi, m->full_name, &m->msg.ex); - } - - camel_store_free_folder_info (src->parent_store, fi); - } - } - - g_free(new_name); + + em_folder_utils_copy_folders(src->parent_store, src->full_name, m->store, m->full_name?m->full_name:"", m->move); camel_object_unref(src); } @@ -2005,9 +1932,9 @@ emft_popup_copy(EPopup *ep, EPopupItem *item, void *data) EMFolderTree *emft = data; CamelFolderInfo *fi = NULL; - if ((fi = em_folder_tree_get_selected_folder_info (emft)) != NULL) { - em_folder_utils_copy_folder (fi); - } + /* FIXME: use async apis */ + if ((fi = em_folder_tree_get_selected_folder_info (emft)) != NULL) + em_folder_utils_copy_folder(fi, FALSE); } static void @@ -2016,9 +1943,9 @@ emft_popup_move(EPopup *ep, EPopupItem *item, void *data) EMFolderTree *emft = data; CamelFolderInfo *fi = NULL; - if ((fi = em_folder_tree_get_selected_folder_info (emft)) != NULL) { - em_folder_utils_move_folder(fi); - } + /* FIXME: use async apis */ + if ((fi = em_folder_tree_get_selected_folder_info (emft)) != NULL) + em_folder_utils_copy_folder(fi, TRUE); } static void diff --git a/mail/em-folder-utils.c b/mail/em-folder-utils.c index ca8299361c..6578423880 100644 --- a/mail/em-folder-utils.c +++ b/mail/em-folder-utils.c @@ -244,11 +244,12 @@ static struct _mail_msg_op copy_folders_op = { emft_copy_folders__free, }; -static void -emfu_copy_folders (CamelStore *tostore, const char *tobase, CamelStore *fromstore, const char *frombase, int delete) +int +em_folder_utils_copy_folders(CamelStore *fromstore, const char *frombase, CamelStore *tostore, const char *tobase, int delete) { struct _EMCopyFolders *m; - + int seq; + m = mail_msg_new (©_folders_op, NULL, sizeof (struct _EMCopyFolders)); camel_object_ref (fromstore); m->fromstore = fromstore; @@ -257,8 +258,11 @@ emfu_copy_folders (CamelStore *tostore, const char *tobase, CamelStore *fromstor m->frombase = g_strdup (frombase); m->tobase = g_strdup (tobase); m->delete = delete; - + seq = m->msg.seq; + e_thread_put (mail_thread_new, (EMsg *) m); + + return seq; } struct _copy_folder_data { @@ -308,7 +312,7 @@ emfu_copy_folder_selected (const char *uri, void *data) if (tobase == NULL) tobase = ""; - emfu_copy_folders (tostore, tobase, fromstore, cfd->fi->full_name, cfd->delete); + em_folder_utils_copy_folders(fromstore, cfd->fi->full_name, tostore, tobase, cfd->delete); camel_url_free (url); fail: @@ -353,31 +357,15 @@ emfu_copy_folder_exclude(EMFolderTree *tree, GtkTreeModel *model, GtkTreeIter *i /* FIXME: this interface references the folderinfo without copying it */ /* FIXME: these functions must be documented */ void -em_folder_utils_copy_folder (CamelFolderInfo *folderinfo) +em_folder_utils_copy_folder(CamelFolderInfo *folderinfo, int delete) { struct _copy_folder_data *cfd; cfd = g_malloc (sizeof (*cfd)); cfd->fi = folderinfo; - cfd->delete = FALSE; - - em_select_folder (NULL, _("Select folder"), _("C_opy"), - NULL, emfu_copy_folder_exclude, - emfu_copy_folder_selected, cfd);} - - -/* FIXME: this interface references the folderinfo without copying it */ -/* FIXME: these functions must be documented */ -void -em_folder_utils_move_folder (CamelFolderInfo *folderinfo) -{ - struct _copy_folder_data *cfd; - - cfd = g_malloc (sizeof (*cfd)); - cfd->fi = folderinfo; - cfd->delete = TRUE; + cfd->delete = delete; - em_select_folder (NULL, _("Select folder"), _("_Move"), + em_select_folder (NULL, _("Select folder"), delete?_("_Move"):_("C_opy"), NULL, emfu_copy_folder_exclude, emfu_copy_folder_selected, cfd); } diff --git a/mail/em-folder-utils.h b/mail/em-folder-utils.h index c8b8438777..c063e04759 100644 --- a/mail/em-folder-utils.h +++ b/mail/em-folder-utils.h @@ -24,10 +24,11 @@ #ifndef _EM_FOLDER_UTILS_H #define _EM_FOLDER_UTILS_H +int em_folder_utils_copy_folders(CamelStore *fromstore, const char *frombase, CamelStore *tostore, const char *tobase, int delete); + /* FIXME: These api's are really busted, there is no consistency and most rely on the wrong data */ -void em_folder_utils_copy_folder (struct _CamelFolderInfo *folderinfo); -void em_folder_utils_move_folder (struct _CamelFolderInfo *folderinfo); +void em_folder_utils_copy_folder (struct _CamelFolderInfo *folderinfo, int delete); void em_folder_utils_delete_folder (struct _CamelFolder *folder); void em_folder_utils_rename_folder (struct _CamelFolder *folder); diff --git a/mail/mail-ops.c b/mail/mail-ops.c index 57347b3f69..030fe8afc2 100644 --- a/mail/mail-ops.c +++ b/mail/mail-ops.c @@ -490,7 +490,7 @@ mail_send_message(CamelFolder *queue, const char *uid, const char *destination, tmp = camel_header_raw_find(&xev, "X-Evolution-Transport", NULL); if (tmp) transport_url = g_strstrip(g_strdup(tmp)); - + tmp = camel_header_raw_find(&xev, "X-Evolution-Fcc", NULL); if (tmp) sent_folder_uri = g_strstrip(g_strdup(tmp)); @@ -698,7 +698,7 @@ send_queue_send(struct _mail_msg *mm) if (!(uids = camel_folder_get_uids (m->queue))) return; - + send_uids = g_ptr_array_sized_new (uids->len); for (i = 0, j = 0; i < uids->len; i++) { CamelMessageInfo *info; @@ -765,10 +765,10 @@ send_queue_send(struct _mail_msg *mm) camel_object_unref (m->driver); m->driver = NULL; } - + camel_folder_free_uids (m->queue, uids); g_ptr_array_free (send_uids, TRUE); - + camel_folder_sync (m->queue, TRUE, &ex); camel_exception_clear (&ex); -- cgit