diff options
-rw-r--r-- | mail/em-folder-utils.c | 77 | ||||
-rw-r--r-- | mail/em-folder-utils.h | 2 | ||||
-rw-r--r-- | modules/mail/e-mail-shell-view-actions.c | 22 |
3 files changed, 60 insertions, 41 deletions
diff --git a/mail/em-folder-utils.c b/mail/em-folder-utils.c index 46b91edefb..fdf18c2082 100644 --- a/mail/em-folder-utils.c +++ b/mail/em-folder-utils.c @@ -58,6 +58,7 @@ #include "em-folder-selector.h" #include "em-folder-properties.h" +#include "e-mail-folder-utils.h" #include "e-mail-local.h" #include "e-mail-session.h" #include "e-mail-store.h" @@ -285,7 +286,8 @@ em_folder_utils_copy_folders (CamelStore *fromstore, const gchar *frombase, Came } struct _copy_folder_data { - CamelFolderInfo *fi; + CamelStore *source_store; + gchar *source_folder_name; gboolean delete; }; @@ -296,7 +298,7 @@ emfu_copy_folder_selected (EMailBackend *backend, { EMailSession *session; struct _copy_folder_data *cfd = data; - CamelStore *fromstore = NULL, *tostore = NULL; + CamelStore *tostore = NULL; CamelStore *local_store; CamelService *service = NULL; CamelProvider *provider; @@ -304,42 +306,32 @@ emfu_copy_folder_selected (EMailBackend *backend, CamelURL *url; GError *local_error = NULL; - if (uri == NULL) { - g_free (cfd); - return; - } + if (uri == NULL) + goto fail; local_store = e_mail_local_get_store (); session = e_mail_backend_get_session (backend); - url = camel_url_new (cfd->fi->uri, &local_error); - if (url != NULL) { - service = camel_session_get_service_by_url ( - CAMEL_SESSION (session), url, CAMEL_PROVIDER_STORE); - camel_url_free (url); - } - - if (service != NULL) - camel_service_connect_sync (service, &local_error); + service = CAMEL_SERVICE (cfd->source_store); + camel_service_connect_sync (service, &local_error); if (local_error != NULL) { e_mail_backend_submit_alert ( backend, cfd->delete ? "mail:no-move-folder-notexist" : "mail:no-copy-folder-notexist", - cfd->fi->full_name, uri, + cfd->source_folder_name, uri, local_error->message, NULL); goto fail; } g_return_if_fail (CAMEL_IS_STORE (service)); - fromstore = CAMEL_STORE (service); - - if (cfd->delete && fromstore == local_store && emfu_is_special_local_folder (cfd->fi->full_name)) { + if (cfd->delete && cfd->source_store == local_store && + emfu_is_special_local_folder (cfd->source_folder_name)) { e_mail_backend_submit_alert ( backend, "mail:no-rename-special-folder", - cfd->fi->full_name, NULL); + cfd->source_folder_name, NULL); goto fail; } @@ -358,7 +350,7 @@ emfu_copy_folder_selected (EMailBackend *backend, backend, cfd->delete ? "mail:no-move-folder-to-notexist" : "mail:no-copy-folder-to-notexist", - cfd->fi->full_name, uri, + cfd->source_folder_name, uri, local_error->message, NULL); goto fail; } @@ -377,20 +369,29 @@ emfu_copy_folder_selected (EMailBackend *backend, tobase = ""; em_folder_utils_copy_folders ( - fromstore, cfd->fi->full_name, tostore, tobase, cfd->delete); + cfd->source_store, cfd->source_folder_name, + tostore, tobase, cfd->delete); camel_url_free (url); + fail: g_clear_error (&local_error); + g_object_unref (cfd->source_store); + g_free (cfd->source_folder_name); g_free (cfd); } /* tree here is the 'destination' selector, not 'self' */ static gboolean -emfu_copy_folder_exclude (EMFolderTree *tree, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) +emfu_copy_folder_exclude (EMFolderTree *tree, + GtkTreeModel *model, + GtkTreeIter *iter, + gpointer data) { struct _copy_folder_data *cfd = data; + CamelProvider *source_provider; + CamelService *source_service; gint fromvfolder, tovfolder; gchar *touri; guint flags; @@ -398,8 +399,15 @@ emfu_copy_folder_exclude (EMFolderTree *tree, GtkTreeModel *model, GtkTreeIter * /* handles moving to/from vfolders */ - fromvfolder = strncmp(cfd->fi->uri, "vfolder:", 8) == 0; - gtk_tree_model_get (model, iter, COL_STRING_URI, &touri, COL_UINT_FLAGS, &flags, COL_BOOL_IS_STORE, &is_store, -1); + source_service = CAMEL_SERVICE (cfd->source_store); + source_provider = camel_service_get_provider (source_service); + fromvfolder = (g_strcmp0 (source_provider->protocol, "vfolder") == 0); + + gtk_tree_model_get ( + model, iter, + COL_STRING_URI, &touri, + COL_UINT_FLAGS, &flags, + COL_BOOL_IS_STORE, &is_store, -1); tovfolder = strncmp(touri, "vfolder:", 8) == 0; g_free (touri); @@ -416,12 +424,10 @@ emfu_copy_folder_exclude (EMFolderTree *tree, GtkTreeModel *model, GtkTreeIter * return (flags & EMFT_EXCLUDE_NOINFERIORS) == 0; } -/* FIXME: this interface references the folderinfo without copying it */ -/* FIXME: these functions must be documented */ void em_folder_utils_copy_folder (GtkWindow *parent, EMailBackend *backend, - CamelFolderInfo *folderinfo, + const gchar *folder_uri, gint delete) { GtkWidget *dialog; @@ -430,16 +436,27 @@ em_folder_utils_copy_folder (GtkWindow *parent, const gchar *label; const gchar *title; struct _copy_folder_data *cfd; + GError *error = NULL; g_return_if_fail (E_IS_MAIL_BACKEND (backend)); - g_return_if_fail (folderinfo != NULL); + g_return_if_fail (folder_uri != NULL); session = e_mail_backend_get_session (backend); cfd = g_malloc (sizeof (*cfd)); - cfd->fi = folderinfo; cfd->delete = delete; + e_mail_folder_uri_parse ( + CAMEL_SESSION (session), folder_uri, + &cfd->source_store, &cfd->source_folder_name, &error); + + if (error != NULL) { + g_warning ("%s", error->message); + g_error_free (error); + g_free (cfd); + return; + } + /* XXX Do we leak this reference. */ emft = (EMFolderTree *) em_folder_tree_new (session); emu_restore_folder_tree_state (emft); diff --git a/mail/em-folder-utils.h b/mail/em-folder-utils.h index 03aacc15fd..54ccf5806e 100644 --- a/mail/em-folder-utils.h +++ b/mail/em-folder-utils.h @@ -42,7 +42,7 @@ gint em_folder_utils_copy_folders (CamelStore *fromstore, void em_folder_utils_copy_folder (GtkWindow *parent, EMailBackend *backend, - CamelFolderInfo *folderinfo, + const gchar *folder_uri, gboolean delete); void em_folder_utils_delete_folder (EMailBackend *backend, CamelFolder *folder); diff --git a/modules/mail/e-mail-shell-view-actions.c b/modules/mail/e-mail-shell-view-actions.c index d20b22455c..a2b6f18133 100644 --- a/modules/mail/e-mail-shell-view-actions.c +++ b/modules/mail/e-mail-shell-view-actions.c @@ -210,8 +210,8 @@ action_mail_folder_copy_cb (GtkAction *action, EShellBackend *shell_backend; EShellWindow *shell_window; EShellView *shell_view; - CamelFolderInfo *folder_info; EMFolderTree *folder_tree; + gchar *selected_uri; shell_view = E_SHELL_VIEW (mail_shell_view); shell_window = e_shell_view_get_shell_window (shell_view); @@ -219,14 +219,15 @@ action_mail_folder_copy_cb (GtkAction *action, mail_shell_sidebar = mail_shell_view->priv->mail_shell_sidebar; folder_tree = e_mail_shell_sidebar_get_folder_tree (mail_shell_sidebar); - folder_info = em_folder_tree_get_selected_folder_info (folder_tree); - g_return_if_fail (folder_info != NULL); + selected_uri = em_folder_tree_get_selected_uri (folder_tree); + g_return_if_fail (selected_uri != NULL); - /* XXX Leaking folder_info? */ em_folder_utils_copy_folder ( GTK_WINDOW (shell_window), E_MAIL_BACKEND (shell_backend), - folder_info, FALSE); + selected_uri, FALSE); + + g_free (selected_uri); } static void @@ -356,8 +357,8 @@ action_mail_folder_move_cb (GtkAction *action, EShellBackend *shell_backend; EShellWindow *shell_window; EShellView *shell_view; - CamelFolderInfo *folder_info; EMFolderTree *folder_tree; + gchar *selected_uri; shell_view = E_SHELL_VIEW (mail_shell_view); shell_window = e_shell_view_get_shell_window (shell_view); @@ -365,14 +366,15 @@ action_mail_folder_move_cb (GtkAction *action, mail_shell_sidebar = mail_shell_view->priv->mail_shell_sidebar; folder_tree = e_mail_shell_sidebar_get_folder_tree (mail_shell_sidebar); - folder_info = em_folder_tree_get_selected_folder_info (folder_tree); - g_return_if_fail (folder_info != NULL); + selected_uri = em_folder_tree_get_selected_uri (folder_tree); + g_return_if_fail (selected_uri != NULL); - /* XXX Leaking folder_info? */ em_folder_utils_copy_folder ( GTK_WINDOW (shell_window), E_MAIL_BACKEND (shell_backend), - folder_info, TRUE); + selected_uri, TRUE); + + g_free (selected_uri); } static void |