aboutsummaryrefslogblamecommitdiffstats
path: root/mail/e-mail-store-utils.c
blob: 57304f926d8637dc38a75854114641536a920a59 (plain) (tree)





























































































































































































                                                                              
/*
 * 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 <http://www.gnu.org/licenses/>
 *
 */

#include "e-mail-store-utils.h"

#include <config.h>
#include <glib/gi18n-lib.h>

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);
}