/* * e-mail-store-utils.c * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with the program; if not, see * */ #include "e-mail-store-utils.h" #include #include typedef struct _AsyncContext AsyncContext; static void mail_store_go_offline_thread (GSimpleAsyncResult *simple, CamelStore *store, GCancellable *cancellable) { CamelService *service; gchar *service_name; GError *error = NULL; service = CAMEL_SERVICE (store); service_name = camel_service_get_name (service, TRUE); camel_operation_push_message ( cancellable, _("Disconnecting from '%s'"), service_name); g_free (service_name); if (CAMEL_IS_DISCO_STORE (store)) { CamelDiscoStore *disco_store; disco_store = CAMEL_DISCO_STORE (store); if (camel_disco_store_can_work_offline (disco_store)) camel_disco_store_set_status ( disco_store, CAMEL_DISCO_STORE_OFFLINE, cancellable, &error); else camel_service_disconnect_sync (service, TRUE, &error); } else if (CAMEL_IS_OFFLINE_STORE (store)) { CamelOfflineStore *offline_store; offline_store = CAMEL_OFFLINE_STORE (store); camel_offline_store_set_online_sync ( offline_store, FALSE, cancellable, &error); } else camel_service_disconnect_sync (service, TRUE, &error); if (error != NULL) { g_simple_async_result_set_from_error (simple, error); g_error_free (error); } camel_operation_pop_message (cancellable); } void e_mail_store_go_offline (CamelStore *store, gint io_priority, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { GSimpleAsyncResult *simple; g_return_if_fail (CAMEL_IS_STORE (store)); /* Cancel any pending connect first so the set_offline_op * thread won't get queued behind a hung connect op. */ camel_service_cancel_connect (CAMEL_SERVICE (store)); simple = g_simple_async_result_new ( G_OBJECT (store), callback, user_data, e_mail_store_go_offline); g_simple_async_result_run_in_thread ( simple, (GSimpleAsyncThreadFunc) mail_store_go_offline_thread, io_priority, cancellable); g_object_unref (simple); } gboolean e_mail_store_go_offline_finish (CamelStore *store, GAsyncResult *result, GError **error) { GSimpleAsyncResult *simple; g_return_val_if_fail ( g_simple_async_result_is_valid ( result, G_OBJECT (store), e_mail_store_go_offline), FALSE); simple = G_SIMPLE_ASYNC_RESULT (result); /* Assume success unless a GError is set. */ return !g_simple_async_result_propagate_error (simple, error); } static void mail_store_go_online_thread (GSimpleAsyncResult *simple, CamelStore *store, GCancellable *cancellable) { CamelService *service; gchar *service_name; GError *error = NULL; service = CAMEL_SERVICE (store); service_name = camel_service_get_name (service, TRUE); camel_operation_push_message ( cancellable, _("Reconnecting to '%s'"), service_name); g_free (service_name); if (CAMEL_IS_DISCO_STORE (store)) camel_disco_store_set_status ( CAMEL_DISCO_STORE (store), CAMEL_DISCO_STORE_ONLINE, cancellable, &error); else if (CAMEL_IS_OFFLINE_STORE (store)) camel_offline_store_set_online_sync ( CAMEL_OFFLINE_STORE (store), TRUE, cancellable, &error); if (error != NULL) { g_simple_async_result_set_from_error (simple, error); g_error_free (error); } camel_operation_pop_message (cancellable); } void e_mail_store_go_online (CamelStore *store, gint io_priority, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { GSimpleAsyncResult *simple; g_return_if_fail (CAMEL_IS_STORE (store)); simple = g_simple_async_result_new ( G_OBJECT (store), callback, user_data, e_mail_store_go_online); g_simple_async_result_run_in_thread ( simple, (GSimpleAsyncThreadFunc) mail_store_go_online_thread, io_priority, cancellable); g_object_unref (simple); } gboolean e_mail_store_go_online_finish (CamelStore *store, GAsyncResult *result, GError **error) { GSimpleAsyncResult *simple; g_return_val_if_fail ( g_simple_async_result_is_valid ( result, G_OBJECT (store), e_mail_store_go_online), FALSE); simple = G_SIMPLE_ASYNC_RESULT (result); /* Assume success unless a GError is set. */ return !g_simple_async_result_propagate_error (simple, error); }