/* * e-mail-config-page.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-config-page.h" #include #include #include #include enum { CHANGED, SETUP_DEFAULTS, CHECK_COMPLETE, COMMIT_CHANGES, LAST_SIGNAL }; static gulong signals[LAST_SIGNAL]; G_DEFINE_INTERFACE ( EMailConfigPage, e_mail_config_page, GTK_TYPE_WIDGET) static gboolean mail_config_page_check_complete (EMailConfigPage *page) { return TRUE; } static gboolean mail_config_page_submit_sync (EMailConfigPage *page, GCancellable *cancellable, GError **error) { EAsyncClosure *closure; GAsyncResult *result; gboolean success; closure = e_async_closure_new (); e_mail_config_page_submit ( page, cancellable, e_async_closure_callback, closure); result = e_async_closure_wait (closure); success = e_mail_config_page_submit_finish (page, result, error); e_async_closure_free (closure); return success; } static void mail_config_page_submit (EMailConfigPage *page, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { GSimpleAsyncResult *simple; simple = g_simple_async_result_new ( G_OBJECT (page), callback, user_data, mail_config_page_submit); g_simple_async_result_set_check_cancellable (simple, cancellable); g_simple_async_result_complete_in_idle (simple); g_object_unref (simple); } static gboolean mail_config_page_submit_finish (EMailConfigPage *page, GAsyncResult *result, GError **error) { GSimpleAsyncResult *simple; g_return_val_if_fail ( g_simple_async_result_is_valid ( result, G_OBJECT (page), mail_config_page_submit), FALSE); simple = G_SIMPLE_ASYNC_RESULT (result); /* Assume success unless a GError is set. */ return !g_simple_async_result_propagate_error (simple, error); } static gboolean mail_config_page_check_complete_accumulator (GSignalInvocationHint *ihint, GValue *return_accu, const GValue *handler_return, gpointer unused) { gboolean v_boolean; /* Abort emission if a handler returns FALSE. */ v_boolean = g_value_get_boolean (handler_return); g_value_set_boolean (return_accu, v_boolean); return v_boolean; } static void e_mail_config_page_default_init (EMailConfigPageInterface *interface) { interface->title = _("Untitled"); interface->page_type = GTK_ASSISTANT_PAGE_CONTENT; interface->check_complete = mail_config_page_check_complete; interface->submit_sync = mail_config_page_submit_sync; interface->submit = mail_config_page_submit; interface->submit_finish = mail_config_page_submit_finish; signals[CHANGED] = g_signal_new ( "changed", G_TYPE_FROM_INTERFACE (interface), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (EMailConfigPageInterface, changed), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); signals[SETUP_DEFAULTS] = g_signal_new ( "setup-defaults", G_TYPE_FROM_INTERFACE (interface), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (EMailConfigPageInterface, setup_defaults), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); signals[CHECK_COMPLETE] = g_signal_new ( "check-complete", G_TYPE_FROM_INTERFACE (interface), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (EMailConfigPageInterface, check_complete), mail_config_page_check_complete_accumulator, NULL, e_marshal_BOOLEAN__VOID, G_TYPE_BOOLEAN, 0); signals[COMMIT_CHANGES] = g_signal_new ( "commit-changes", G_TYPE_FROM_INTERFACE (interface), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (EMailConfigPageInterface, commit_changes), NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); } gint e_mail_config_page_compare (GtkWidget *page_a, GtkWidget *page_b) { EMailConfigPageInterface *interface_a = NULL; EMailConfigPageInterface *interface_b = NULL; if (E_IS_MAIL_CONFIG_PAGE (page_a)) interface_a = E_MAIL_CONFIG_PAGE_GET_INTERFACE (page_a); if (E_IS_MAIL_CONFIG_PAGE (page_b)) interface_b = E_MAIL_CONFIG_PAGE_GET_INTERFACE (page_b); if (interface_a == interface_b) return 0; if (interface_a != NULL && interface_b == NULL) return -1; if (interface_a == NULL && interface_b != NULL) return 1; if (interface_a->sort_order < interface_b->sort_order) return -1; if (interface_a->sort_order > interface_b->sort_order) return 1; return 0; } void e_mail_config_page_changed (EMailConfigPage *page) { g_return_if_fail (E_IS_MAIL_CONFIG_PAGE (page)); g_signal_emit (page, signals[CHANGED], 0); } void e_mail_config_page_setup_defaults (EMailConfigPage *page) { g_return_if_fail (E_IS_MAIL_CONFIG_PAGE (page)); g_signal_emit (page, signals[SETUP_DEFAULTS], 0); } gboolean e_mail_config_page_check_complete (EMailConfigPage *page) { gboolean complete; g_return_val_if_fail (E_IS_MAIL_CONFIG_PAGE (page), FALSE); g_signal_emit (page, signals[CHECK_COMPLETE], 0, &complete); return complete; } void e_mail_config_page_commit_changes (EMailConfigPage *page, GQueue *source_queue) { g_return_if_fail (E_IS_MAIL_CONFIG_PAGE (page)); g_return_if_fail (source_queue != NULL); g_signal_emit (page, signals[COMMIT_CHANGES], 0, source_queue); } gboolean e_mail_config_page_submit_sync (EMailConfigPage *page, GCancellable *cancellable, GError **error) { EMailConfigPageInterface *interface; g_return_val_if_fail (E_IS_MAIL_CONFIG_PAGE (page), FALSE); interface = E_MAIL_CONFIG_PAGE_GET_INTERFACE (page); g_return_val_if_fail (interface->submit_sync != NULL, FALSE); return interface->submit_sync (page, cancellable, error); } void e_mail_config_page_submit (EMailConfigPage *page, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { EMailConfigPageInterface *interface; g_return_if_fail (E_IS_MAIL_CONFIG_PAGE (page)); interface = E_MAIL_CONFIG_PAGE_GET_INTERFACE (page); g_return_if_fail (interface->submit != NULL); return interface->submit (page, cancellable, callback, user_data); } gboolean e_mail_config_page_submit_finish (EMailConfigPage *page, GAsyncResult *result, GError **error) { EMailConfigPageInterface *interface; g_return_val_if_fail (E_IS_MAIL_CONFIG_PAGE (page), FALSE); g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); interface = E_MAIL_CONFIG_PAGE_GET_INTERFACE (page); g_return_val_if_fail (interface->submit_finish != NULL, FALSE); return interface->submit_finish (page, result, error); }