aboutsummaryrefslogtreecommitdiffstats
path: root/mail
diff options
context:
space:
mode:
Diffstat (limited to 'mail')
-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
5 files changed, 140 insertions, 78 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>