aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mail/em-account-editor.c136
-rw-r--r--mail/mail-ops.c78
-rw-r--r--mail/mail-ops.h5
3 files changed, 73 insertions, 146 deletions
diff --git a/mail/em-account-editor.c b/mail/em-account-editor.c
index c0ddbd1871..66d8ea68c8 100644
--- a/mail/em-account-editor.c
+++ b/mail/em-account-editor.c
@@ -128,11 +128,10 @@ typedef struct _EMAccountEditorService {
GtkButton *check_supported;
GtkToggleButton *needs_auth;
+ GCancellable *checking;
GtkWidget *check_dialog;
- gint check_id;
- struct _EMAccountEditorService **check_data;
- GList *authtypes; /* if "Check supported" */
+ GList *auth_types; /* if "Check supported" */
CamelProvider *provider;
CamelProviderType type;
@@ -374,8 +373,8 @@ emae_finalize (GObject *object)
g_signal_handler_disconnect (signatures, priv->sig_changed_id);
}
- g_list_free (priv->source.authtypes);
- g_list_free (priv->transport.authtypes);
+ g_list_free (priv->source.auth_types);
+ g_list_free (priv->transport.auth_types);
g_list_free (priv->providers);
@@ -1686,8 +1685,8 @@ emae_provider_changed (GtkComboBox *dropdown, EMAccountEditorService *service)
gtk_tree_model_get (model, &iter, 1, &service->provider, -1);
- g_list_free (service->authtypes);
- service->authtypes = NULL;
+ g_list_free (service->auth_types);
+ service->auth_types = NULL;
emae_service_provider_changed (service);
@@ -1895,8 +1894,8 @@ emae_refresh_authtype (EMAccountEditor *emae, EMAccountEditorService *service)
gint avail;
/* if we have some already shown */
- if (service->authtypes) {
- for (ll = service->authtypes;ll;ll = g_list_next (ll))
+ if (service->auth_types) {
+ for (ll = service->auth_types;ll;ll = g_list_next (ll))
if (!strcmp (authtype->authproto, ((CamelServiceAuthType *) ll->data)->authproto))
break;
avail = ll != NULL;
@@ -1932,99 +1931,110 @@ emae_refresh_authtype (EMAccountEditor *emae, EMAccountEditorService *service)
}
static void
-emae_check_authtype_done (GList *types,
- gpointer data)
+emae_check_authtype_done (CamelService *camel_service,
+ GAsyncResult *result,
+ EMAccountEditorService *service)
{
- EMAccountEditorService **pservice = data;
- EMAccountEditorService *service;
GtkWidget *editor;
+ GList *auth_types;
+ GError *error = NULL;
- g_return_if_fail (pservice != NULL);
+ auth_types = camel_service_query_auth_types_finish (
+ camel_service, result, &error);
- service = *pservice;
- if (!service) {
- g_free (pservice);
- return;
- }
-
- editor = E_CONFIG (service->emae->config)->window;
+ if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+ g_warn_if_fail (auth_types == NULL);
+ g_error_free (error);
- if (service->check_dialog) {
- if (service->authtypes)
- g_list_free (service->authtypes);
+ } else if (error != NULL) {
+ g_warn_if_fail (auth_types == NULL);
+ g_warning ("%s", error->message);
+ g_error_free (error);
- service->authtypes = g_list_copy (types);
+ } else {
+ g_list_free (service->auth_types);
+ service->auth_types = auth_types;
emae_refresh_authtype (service->emae, service);
- gtk_widget_destroy (service->check_dialog);
}
+ gtk_widget_destroy (service->check_dialog);
+ service->check_dialog = NULL;
+
+ editor = E_CONFIG (service->emae->config)->window;
+
if (editor != NULL)
gtk_widget_set_sensitive (editor, TRUE);
- service->check_id = -1;
- service->check_data = NULL;
g_object_unref (service->emae);
- *pservice = NULL;
- g_free (pservice);
}
static void
-emae_check_authtype_response (GtkWidget *d,
+emae_check_authtype_response (GtkDialog *dialog,
gint button,
- EMAccountEditorService *service)
+ GCancellable *cancellable)
{
- GtkWidget *editor;
-
- editor = E_CONFIG (service->emae->config)->window;
-
- if (service->check_data)
- (*service->check_data) = NULL;
- service->check_data = NULL;
- mail_msg_cancel (service->check_id);
- gtk_widget_destroy (service->check_dialog);
- service->check_dialog = NULL;
-
- if (editor != NULL)
- gtk_widget_set_sensitive (editor, TRUE);
+ g_cancellable_cancel (cancellable);
}
static void
emae_check_authtype (GtkWidget *w,
EMAccountEditorService *service)
{
- EMAccountEditor *emae = service->emae;
- EMAccountEditorService **pservice;
+ CamelService *camel_service;
EMailSession *session;
EAccount *account;
GtkWidget *editor;
+ gpointer parent;
gchar *uid;
- account = em_account_editor_get_modified_account (emae);
+ account = em_account_editor_get_modified_account (service->emae);
editor = E_CONFIG (service->emae->config)->window;
- session = em_account_editor_get_session (emae);
-
- g_object_ref (emae);
-
- service->check_dialog = e_alert_dialog_new_for_args (editor ? (GtkWindow *) gtk_widget_get_toplevel (editor) : (GtkWindow *) gtk_widget_get_toplevel (w),
- "mail:checking-service", NULL);
- g_signal_connect (service->check_dialog, "response", G_CALLBACK(emae_check_authtype_response), service);
- gtk_widget_show (service->check_dialog);
- if (editor != NULL)
- gtk_widget_set_sensitive (editor, FALSE);
+ session = em_account_editor_get_session (service->emae);
if (service->type == CAMEL_PROVIDER_TRANSPORT)
uid = g_strconcat (account->uid, "-transport", NULL);
else
uid = g_strdup (account->uid);
- pservice = g_new0 (EMAccountEditorService *, 1);
- *pservice = service;
- service->check_data = pservice;
- service->check_id = mail_check_service (
- session, uid, emae_check_authtype_done, pservice);
+ camel_service = camel_session_get_service (
+ CAMEL_SESSION (session), uid);
g_free (uid);
+
+ g_return_if_fail (CAMEL_IS_SERVICE (camel_service));
+
+ if (service->checking != NULL) {
+ g_cancellable_cancel (service->checking);
+ g_object_unref (service->checking);
+ }
+
+ service->checking = g_cancellable_new ();
+
+ if (editor != NULL)
+ parent = gtk_widget_get_toplevel (editor);
+ else
+ parent = gtk_widget_get_toplevel (w);
+
+ service->check_dialog = e_alert_dialog_new_for_args (
+ parent, "mail:checking-service", NULL);
+
+ g_object_ref (service->emae);
+
+ camel_service_query_auth_types (
+ camel_service, G_PRIORITY_DEFAULT,
+ service->checking, (GAsyncReadyCallback)
+ emae_check_authtype_done, service);
+
+ g_signal_connect (
+ service->check_dialog, "response",
+ G_CALLBACK (emae_check_authtype_response),
+ service->checking);
+
+ gtk_widget_show (service->check_dialog);
+
+ if (editor != NULL)
+ gtk_widget_set_sensitive (editor, FALSE);
}
static void
diff --git a/mail/mail-ops.c b/mail/mail-ops.c
index 9f3d2dad28..0678370b49 100644
--- a/mail/mail-ops.c
+++ b/mail/mail-ops.c
@@ -1986,84 +1986,6 @@ mail_execute_shell_command (CamelFilterDriver *driver, gint argc, gchar **argv,
g_spawn_async (NULL, argv, NULL, 0, NULL, data, NULL, NULL);
}
-/* Async service-checking/authtype-lookup code. */
-struct _check_msg {
- MailMsg base;
-
- EMailSession *session;
- gchar *service_uid;
- GList *authtypes;
-
- void (*done)(GList *types, gpointer data);
- gpointer data;
-};
-
-static gchar *
-check_service_desc (struct _check_msg *m)
-{
- return g_strdup(_("Checking Service"));
-}
-
-static void
-check_service_exec (struct _check_msg *m,
- GCancellable *cancellable,
- GError **error)
-{
- CamelService *service;
-
- service = camel_session_get_service (
- CAMEL_SESSION (m->session), m->service_uid);
- if (!service)
- return;
-
- m->authtypes = camel_service_query_auth_types_sync (
- service, cancellable, error);
-}
-
-static void
-check_service_done (struct _check_msg *m)
-{
- if (m->done)
- m->done (m->authtypes, m->data);
-}
-
-static void
-check_service_free (struct _check_msg *m)
-{
- g_object_unref (m->session);
- g_free (m->service_uid);
- g_list_free (m->authtypes);
-}
-
-static MailMsgInfo check_service_info = {
- sizeof (struct _check_msg),
- (MailMsgDescFunc) check_service_desc,
- (MailMsgExecFunc) check_service_exec,
- (MailMsgDoneFunc) check_service_done,
- (MailMsgFreeFunc) check_service_free
-};
-
-gint
-mail_check_service (EMailSession *session,
- const gchar *service_uid,
- void (*done)(GList *authtypes, gpointer data),
- gpointer data)
-{
- struct _check_msg *m;
- gint id;
-
- m = mail_msg_new (&check_service_info);
- m->session = g_object_ref (session);
- m->service_uid = g_strdup (service_uid);
- m->done = done;
- m->data = data;
-
- id = m->base.seq;
- mail_msg_unordered_push (m);
-
- return id;
-}
-
/* ---------------------------------------------------------------------------------- */
struct _disconnect_msg {
diff --git a/mail/mail-ops.h b/mail/mail-ops.h
index 89bf23cf04..58dd8dff3d 100644
--- a/mail/mail-ops.h
+++ b/mail/mail-ops.h
@@ -118,11 +118,6 @@ gint mail_store_prepare_offline (CamelStore *store);
/* filter driver execute shell command async callback */
void mail_execute_shell_command (CamelFilterDriver *driver, gint argc, gchar **argv, gpointer data);
-gint mail_check_service (EMailSession *session,
- const gchar *service_uid,
- void (*done)(GList *authtypes, gpointer data),
- gpointer data);
-
gint mail_disconnect_store (CamelStore *store);
gint mail_remove_attachments (CamelFolder *folder, GPtrArray *uids);