Add e_mail_reader_delete_folder_name().

Fetches the CamelFolder asynchronously, then deletes it asynchronously.
This commit is contained in:
Matthew Barnes
2012-07-08 11:45:03 -04:00
parent acac6795d9
commit 451afa8429
3 changed files with 89 additions and 4 deletions

View File

@ -64,6 +64,7 @@ struct _AsyncContext {
CamelFolder *folder;
EMailReader *reader;
CamelInternetAddress *address;
gchar *folder_name;
gchar *message_uid;
EMailReplyType reply_type;
@ -88,6 +89,7 @@ async_context_free (AsyncContext *context)
if (context->address != NULL)
g_object_unref (context->address);
g_free (context->folder_name);
g_free (context->message_uid);
g_slice_free (AsyncContext, context);
@ -189,6 +191,10 @@ mail_reader_delete_folder_cb (CamelFolder *folder,
camel_folder_get_full_name (folder),
error->message, NULL);
g_error_free (error);
} else {
e_activity_set_state (
context->activity, E_ACTIVITY_COMPLETED);
}
async_context_free (context);
@ -305,6 +311,72 @@ e_mail_reader_delete_folder (EMailReader *reader,
gtk_widget_destroy (dialog);
}
static void
mail_reader_delete_folder_name_cb (GObject *source_object,
GAsyncResult *result,
gpointer user_data)
{
CamelStore *store;
CamelFolder *folder;
AsyncContext *context;
EAlertSink *alert_sink;
GError *error = NULL;
store = CAMEL_STORE (source_object);
context = (AsyncContext *) user_data;
alert_sink = e_activity_get_alert_sink (context->activity);
/* XXX The returned CamelFolder is a borrowed reference. */
folder = camel_store_get_folder_finish (store, result, &error);
if (e_activity_handle_cancellation (context->activity, error)) {
g_error_free (error);
} else if (error != NULL) {
e_alert_submit (
alert_sink, "mail:no-delete-folder",
context->folder_name, error->message, NULL);
g_error_free (error);
} else {
e_activity_set_state (
context->activity, E_ACTIVITY_COMPLETED);
e_mail_reader_delete_folder (context->reader, folder);
}
async_context_free (context);
}
void
e_mail_reader_delete_folder_name (EMailReader *reader,
CamelStore *store,
const gchar *folder_name)
{
EActivity *activity;
AsyncContext *context;
GCancellable *cancellable;
g_return_if_fail (E_IS_MAIL_READER (reader));
g_return_if_fail (CAMEL_IS_STORE (store));
g_return_if_fail (folder_name != NULL);
activity = e_mail_reader_new_activity (reader);
cancellable = e_activity_get_cancellable (activity);
context = g_slice_new0 (AsyncContext);
context->activity = activity;
context->reader = g_object_ref (reader);
context->folder_name = g_strdup (folder_name);
camel_store_get_folder (
store, folder_name,
CAMEL_STORE_FOLDER_INFO_FAST,
G_PRIORITY_DEFAULT, cancellable,
mail_reader_delete_folder_name_cb,
context);
}
guint
e_mail_reader_mark_selected (EMailReader *reader,
guint32 mask,

View File

@ -39,6 +39,10 @@ struct _EMailReaderHeader {
gboolean e_mail_reader_confirm_delete (EMailReader *reader);
void e_mail_reader_delete_folder (EMailReader *reader,
CamelFolder *folder);
void e_mail_reader_delete_folder_name
(EMailReader *reader,
CamelStore *store,
const gchar *folder_name);
guint e_mail_reader_mark_selected (EMailReader *reader,
guint32 mask,
guint32 set);

View File

@ -333,17 +333,26 @@ action_mail_folder_delete_cb (GtkAction *action,
EMailShellSidebar *mail_shell_sidebar;
EMailView *mail_view;
EMFolderTree *folder_tree;
CamelFolder *folder;
CamelStore *selected_store = NULL;
gchar *selected_folder_name = NULL;
mail_shell_content = mail_shell_view->priv->mail_shell_content;
mail_view = e_mail_shell_content_get_mail_view (mail_shell_content);
mail_shell_sidebar = mail_shell_view->priv->mail_shell_sidebar;
folder_tree = e_mail_shell_sidebar_get_folder_tree (mail_shell_sidebar);
folder = em_folder_tree_get_selected_folder (folder_tree);
g_return_if_fail (folder != NULL);
e_mail_reader_delete_folder (E_MAIL_READER (mail_view), folder);
em_folder_tree_get_selected (
folder_tree, &selected_store, &selected_folder_name);
g_return_if_fail (CAMEL_IS_STORE (selected_store));
g_return_if_fail (selected_folder_name != NULL);
e_mail_reader_delete_folder_name (
E_MAIL_READER (mail_view),
selected_store, selected_folder_name);
g_object_unref (selected_store);
g_free (selected_folder_name);
}
static void