aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mail/e-mail-session-utils.c119
-rw-r--r--mail/e-mail-session-utils.h16
-rw-r--r--mail/em-folder-utils.c75
-rw-r--r--mail/em-folder-utils.h3
-rw-r--r--mail/mail.error.xml5
-rw-r--r--modules/mail/e-mail-shell-view-actions.c50
-rw-r--r--modules/mail/e-mail-shell-view-private.h2
7 files changed, 190 insertions, 80 deletions
diff --git a/mail/e-mail-session-utils.c b/mail/e-mail-session-utils.c
index 2369a69d35..0df301f67f 100644
--- a/mail/e-mail-session-utils.c
+++ b/mail/e-mail-session-utils.c
@@ -50,6 +50,7 @@ struct _AsyncContext {
GPtrArray *post_to_uris;
+ gchar *folder_uri;
gchar *destination;
gchar *message_uid;
gchar *transport_uri;
@@ -91,6 +92,7 @@ async_context_free (AsyncContext *context)
g_ptr_array_free (context->post_to_uris, TRUE);
}
+ g_free (context->folder_uri);
g_free (context->destination);
g_free (context->message_uid);
g_free (context->transport_uri);
@@ -791,3 +793,120 @@ e_mail_session_send_to_finish (EMailSession *session,
/* Assume success unless a GError is set. */
return !g_simple_async_result_propagate_error (simple, error);
}
+
+static void
+mail_session_unsubscribe_folder_thread (GSimpleAsyncResult *simple,
+ EMailSession *session,
+ GCancellable *cancellable)
+{
+ AsyncContext *context;
+ GError *error = NULL;
+
+ context = g_simple_async_result_get_op_res_gpointer (simple);
+
+ e_mail_session_unsubscribe_folder_sync (
+ session, context->folder_uri, cancellable, &error);
+
+ if (error != NULL) {
+ g_simple_async_result_set_from_error (simple, error);
+ g_error_free (error);
+ }
+}
+
+gboolean
+e_mail_session_unsubscribe_folder_sync (EMailSession *session,
+ const gchar *folder_uri,
+ GCancellable *cancellable,
+ GError **error)
+{
+ CamelURL *url;
+ CamelStore *store;
+ CamelProviderURLFlags flags;
+ const gchar *message;
+ const gchar *path = NULL;
+ gboolean success = FALSE;
+
+ g_return_val_if_fail (E_IS_MAIL_SESSION (session), FALSE);
+ g_return_val_if_fail (folder_uri != NULL, FALSE);
+
+ message = _("Unsubscribing from folder '%s'");
+ camel_operation_push_message (cancellable, message, folder_uri);
+
+ store = camel_session_get_store (
+ CAMEL_SESSION (session), folder_uri, error);
+ if (store == NULL)
+ goto exit;
+
+ url = camel_url_new (folder_uri, error);
+ if (url == NULL)
+ goto exit;
+
+ flags = CAMEL_SERVICE (store)->provider->url_flags;
+
+ if (flags & CAMEL_URL_FRAGMENT_IS_PATH)
+ path = url->fragment;
+ else if (url->path != NULL && *url->path != '\0')
+ path = url->path + 1;
+
+ g_return_val_if_fail (path != NULL, FALSE);
+
+ success = camel_store_unsubscribe_folder_sync (
+ store, path, cancellable, error);
+
+ camel_url_free (url);
+
+exit:
+ camel_operation_pop_message (cancellable);
+
+ return success;
+}
+
+void
+e_mail_session_unsubscribe_folder (EMailSession *session,
+ const gchar *folder_uri,
+ gint io_priority,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ GSimpleAsyncResult *simple;
+ AsyncContext *context;
+
+ g_return_if_fail (E_IS_MAIL_SESSION (session));
+ g_return_if_fail (folder_uri != NULL);
+
+ context = g_slice_new0 (AsyncContext);
+ context->folder_uri = g_strdup (folder_uri);
+
+ simple = g_simple_async_result_new (
+ G_OBJECT (session), callback, user_data,
+ e_mail_session_unsubscribe_folder);
+
+ g_simple_async_result_set_op_res_gpointer (
+ simple, context, (GDestroyNotify) async_context_free);
+
+ g_simple_async_result_run_in_thread (
+ simple, (GSimpleAsyncThreadFunc)
+ mail_session_unsubscribe_folder_thread,
+ io_priority, cancellable);
+
+ g_object_unref (simple);
+}
+
+gboolean
+e_mail_session_unsubscribe_folder_finish (EMailSession *session,
+ GAsyncResult *result,
+ GError **error)
+{
+ GSimpleAsyncResult *simple;
+
+ g_return_val_if_fail (
+ g_simple_async_result_is_valid (
+ result, G_OBJECT (session),
+ e_mail_session_unsubscribe_folder), FALSE);
+
+ simple = G_SIMPLE_ASYNC_RESULT (result);
+
+ /* Assume success unless a GError is set. */
+ return !g_simple_async_result_propagate_error (simple, error);
+}
diff --git a/mail/e-mail-session-utils.h b/mail/e-mail-session-utils.h
index 4d97524f5d..e7ec28dd2d 100644
--- a/mail/e-mail-session-utils.h
+++ b/mail/e-mail-session-utils.h
@@ -69,6 +69,22 @@ void e_mail_session_send_to (EMailSession *session,
gboolean e_mail_session_send_to_finish (EMailSession *session,
GAsyncResult *result,
GError **error);
+gboolean e_mail_session_unsubscribe_folder_sync
+ (EMailSession *session,
+ const gchar *folder_uri,
+ GCancellable *cancellable,
+ GError **error);
+void e_mail_session_unsubscribe_folder
+ (EMailSession *session,
+ const gchar *folder_uri,
+ gint io_priority,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+gboolean e_mail_session_unsubscribe_folder_finish
+ (EMailSession *session,
+ GAsyncResult *result,
+ GError **error);
G_END_DECLS
diff --git a/mail/em-folder-utils.c b/mail/em-folder-utils.c
index c2720fc5ae..e84152e574 100644
--- a/mail/em-folder-utils.c
+++ b/mail/em-folder-utils.c
@@ -754,81 +754,6 @@ em_folder_utils_create_folder (CamelFolderInfo *folderinfo,
gtk_dialog_run (GTK_DIALOG (dialog));
}
-struct _folder_unsub_t {
- MailMsg base;
- EMailSession *session;
- gchar *folder_uri;
-};
-
-static gchar *
-emfu_unsubscribe_folder__desc (struct _folder_unsub_t *msg)
-{
- return g_strdup_printf (
- _("Unsubscribing from folder \"%s\""), msg->folder_uri);
-}
-
-static void
-emfu_unsubscribe_folder__exec (struct _folder_unsub_t *msg,
- GCancellable *cancellable,
- GError **error)
-{
- CamelStore *store;
- CamelURL *url;
- const gchar *path = NULL;
- gint url_flags;
-
- store = camel_session_get_store (
- CAMEL_SESSION (msg->session),
- msg->folder_uri, error);
- if (store == NULL)
- return;
-
- url = camel_url_new (msg->folder_uri, NULL);
- url_flags = CAMEL_SERVICE (store)->provider->url_flags;
-
- if (url_flags & CAMEL_URL_FRAGMENT_IS_PATH)
- path = url->fragment;
- else if (url->path != NULL && *url->path != '\0')
- path = url->path + 1;
-
- if (path != NULL)
- camel_store_unsubscribe_folder_sync (
- store, path, cancellable, error);
-
- camel_url_free (url);
-}
-
-static void
-emfu_unsubscribe_folder__free (struct _folder_unsub_t *msg)
-{
- g_object_unref (msg->session);
- g_free (msg->folder_uri);
-}
-
-static MailMsgInfo unsubscribe_info = {
- sizeof (struct _folder_unsub_t),
- (MailMsgDescFunc) emfu_unsubscribe_folder__desc,
- (MailMsgExecFunc) emfu_unsubscribe_folder__exec,
- (MailMsgDoneFunc) NULL,
- (MailMsgFreeFunc) emfu_unsubscribe_folder__free
-};
-
-void
-em_folder_utils_unsubscribe_folder (EMailSession *session,
- const gchar *folder_uri)
-{
- struct _folder_unsub_t *unsub;
-
- g_return_if_fail (E_IS_MAIL_SESSION (session));
- g_return_if_fail (folder_uri != NULL);
-
- unsub = mail_msg_new (&unsubscribe_info);
- unsub->session = g_object_ref (session);
- unsub->folder_uri = g_strdup (folder_uri);
-
- mail_msg_unordered_push (unsub);
-}
-
const gchar *
em_folder_utils_get_icon_name (guint32 flags)
{
diff --git a/mail/em-folder-utils.h b/mail/em-folder-utils.h
index f67ef50531..9d937d2424 100644
--- a/mail/em-folder-utils.h
+++ b/mail/em-folder-utils.h
@@ -49,9 +49,6 @@ void em_folder_utils_delete_folder (EMailBackend *backend,
void em_folder_utils_create_folder (CamelFolderInfo *folderinfo,
EMFolderTree *emft,
GtkWindow *parent);
-void em_folder_utils_unsubscribe_folder
- (EMailSession *session,
- const gchar *folder_uri);
const gchar * em_folder_utils_get_icon_name (guint32 flags);
diff --git a/mail/mail.error.xml b/mail/mail.error.xml
index 60e4d5670c..0e9dfa151f 100644
--- a/mail/mail.error.xml
+++ b/mail/mail.error.xml
@@ -486,5 +486,10 @@ You can choose to ignore this folder, overwrite or append its contents, or quit.
<_secondary>Folder '{0}' doesn't contain any duplicate message.</_secondary>
<button stock="gtk-ok" response="GTK_RESPONSE_OK"/>
</error>
+
+ <error id="folder-unsubscribe" type="warning">
+ <_primary>Failed to unsubscribe from folder.</_primary>
+ <_secondary>The reported error was &quot;{0}&quot;.</_secondary>
+ </error>
</error-list>
diff --git a/modules/mail/e-mail-shell-view-actions.c b/modules/mail/e-mail-shell-view-actions.c
index 467afa5ff9..ba21f28b8d 100644
--- a/modules/mail/e-mail-shell-view-actions.c
+++ b/modules/mail/e-mail-shell-view-actions.c
@@ -19,10 +19,39 @@
*
*/
-#include "mail/mail-folder-cache.h"
#include "e-mail-shell-view-private.h"
static void
+mail_folder_unsubscribe_done_cb (EMailSession *session,
+ GAsyncResult *result,
+ EActivity *activity)
+{
+ EAlertSink *alert_sink;
+ GError *error = NULL;
+
+ alert_sink = e_activity_get_alert_sink (activity);
+
+ e_mail_session_unsubscribe_folder_finish (session, result, &error);
+
+ if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+ e_activity_set_state (activity, E_ACTIVITY_CANCELLED);
+ g_error_free (error);
+
+ } else if (error != NULL) {
+ e_alert_submit (
+ alert_sink,
+ "mail:folder-unsubscribe",
+ error->message, NULL);
+ g_error_free (error);
+
+ } else {
+ e_activity_set_state (activity, E_ACTIVITY_COMPLETED);
+ }
+
+ g_object_unref (activity);
+}
+
+static void
action_gal_save_custom_view_cb (GtkAction *action,
EMailShellView *mail_shell_view)
{
@@ -587,10 +616,14 @@ action_mail_folder_unsubscribe_cb (GtkAction *action,
{
EMailShellSidebar *mail_shell_sidebar;
EShellBackend *shell_backend;
+ EShellContent *shell_content;
EShellView *shell_view;
EMailBackend *backend;
EMailSession *session;
EMFolderTree *folder_tree;
+ EActivity *activity;
+ EAlertSink *alert_sink;
+ GCancellable *cancellable;
gchar *folder_uri;
mail_shell_sidebar = mail_shell_view->priv->mail_shell_sidebar;
@@ -598,12 +631,25 @@ action_mail_folder_unsubscribe_cb (GtkAction *action,
shell_view = E_SHELL_VIEW (mail_shell_view);
shell_backend = e_shell_view_get_shell_backend (shell_view);
+ shell_content = e_shell_view_get_shell_content (shell_view);
backend = E_MAIL_BACKEND (shell_backend);
session = e_mail_backend_get_session (backend);
+ activity = e_activity_new ();
+ cancellable = camel_operation_new ();
+ alert_sink = E_ALERT_SINK (shell_content);
+ e_activity_set_alert_sink (activity, alert_sink);
+ e_activity_set_cancellable (activity, cancellable);
+ e_shell_backend_add_activity (shell_backend, activity);
+
folder_uri = em_folder_tree_get_selected_uri (folder_tree);
- em_folder_utils_unsubscribe_folder (session, folder_uri);
+
+ e_mail_session_unsubscribe_folder (
+ session, folder_uri, G_PRIORITY_DEFAULT, cancellable,
+ (GAsyncReadyCallback) mail_folder_unsubscribe_done_cb,
+ activity);
+
g_free (folder_uri);
}
diff --git a/modules/mail/e-mail-shell-view-private.h b/modules/mail/e-mail-shell-view-private.h
index 92f00d4eb9..806b408772 100644
--- a/modules/mail/e-mail-shell-view-private.h
+++ b/modules/mail/e-mail-shell-view-private.h
@@ -43,6 +43,7 @@
#include "e-mail-local.h"
#include "e-mail-reader.h"
#include "e-mail-session.h"
+#include "e-mail-session-utils.h"
#include "e-mail-sidebar.h"
#include "e-mail-store.h"
#include "em-composer-utils.h"
@@ -53,6 +54,7 @@
#include "em-subscription-editor.h"
#include "em-utils.h"
#include "mail-autofilter.h"
+#include "mail-folder-cache.h"
#include "mail-ops.h"
#include "mail-send-recv.h"
#include "mail-tools.h"