shell: Port to GTask

This commit is contained in:
Florian Müllner 2015-09-25 23:17:08 +02:00
parent f2731d4d6a
commit 1a39666f7c

View File

@ -56,8 +56,7 @@ struct _ShellKeyringPrompt
gchar *continue_label; gchar *continue_label;
gchar *cancel_label; gchar *cancel_label;
GcrPromptReply last_reply; GTask *task;
GSimpleAsyncResult *async_result;
ClutterText *password_actor; ClutterText *password_actor;
ClutterText *confirm_actor; ClutterText *confirm_actor;
PromptingMode mode; PromptingMode mode;
@ -282,9 +281,9 @@ shell_keyring_prompt_dispose (GObject *obj)
if (self->shown) if (self->shown)
gcr_prompt_close (GCR_PROMPT (self)); gcr_prompt_close (GCR_PROMPT (self));
if (self->async_result) if (self->task)
shell_keyring_prompt_cancel (self); shell_keyring_prompt_cancel (self);
g_assert (self->async_result == NULL); g_assert (self->task == NULL);
shell_keyring_prompt_set_password_actor (self, NULL); shell_keyring_prompt_set_password_actor (self, NULL);
shell_keyring_prompt_set_confirm_actor (self, NULL); shell_keyring_prompt_set_confirm_actor (self, NULL);
@ -414,14 +413,14 @@ shell_keyring_prompt_password_async (GcrPrompt *prompt,
ShellKeyringPrompt *self = SHELL_KEYRING_PROMPT (prompt); ShellKeyringPrompt *self = SHELL_KEYRING_PROMPT (prompt);
GObject *obj; GObject *obj;
if (self->async_result != NULL) { if (self->task != NULL) {
g_warning ("this prompt can only show one prompt at a time"); g_warning ("this prompt can only show one prompt at a time");
return; return;
} }
self->mode = PROMPTING_FOR_PASSWORD; self->mode = PROMPTING_FOR_PASSWORD;
self->async_result = g_simple_async_result_new (G_OBJECT (self), callback, user_data, self->task = g_task_new (self, NULL, callback, user_data);
shell_keyring_prompt_password_async); g_task_set_source_tag (self->task, shell_keyring_prompt_password_async);
obj = G_OBJECT (self); obj = G_OBJECT (self);
g_object_notify (obj, "password-visible"); g_object_notify (obj, "password-visible");
@ -438,18 +437,11 @@ shell_keyring_prompt_password_finish (GcrPrompt *prompt,
GAsyncResult *result, GAsyncResult *result,
GError **error) GError **error)
{ {
ShellKeyringPrompt *self = SHELL_KEYRING_PROMPT (prompt); g_return_val_if_fail (g_task_get_source_object (G_TASK (result)) == prompt, NULL);
g_return_val_if_fail (g_async_result_is_tagged (result,
g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (prompt),
shell_keyring_prompt_password_async), NULL); shell_keyring_prompt_password_async), NULL);
if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error)) return g_task_propagate_pointer (G_TASK (result), error);
return NULL;
if (self->last_reply == GCR_PROMPT_REPLY_CONTINUE)
return clutter_text_get_text (self->password_actor);
return NULL;
} }
static void static void
@ -461,14 +453,14 @@ shell_keyring_prompt_confirm_async (GcrPrompt *prompt,
ShellKeyringPrompt *self = SHELL_KEYRING_PROMPT (prompt); ShellKeyringPrompt *self = SHELL_KEYRING_PROMPT (prompt);
GObject *obj; GObject *obj;
if (self->async_result != NULL) { if (self->task != NULL) {
g_warning ("this prompt is already prompting"); g_warning ("this prompt is already prompting");
return; return;
} }
self->mode = PROMPTING_FOR_CONFIRM; self->mode = PROMPTING_FOR_CONFIRM;
self->async_result = g_simple_async_result_new (G_OBJECT (self), callback, user_data, self->task = g_task_new (self, NULL, callback, user_data);
shell_keyring_prompt_confirm_async); g_task_set_source_tag (self->task, shell_keyring_prompt_confirm_async);
obj = G_OBJECT (self); obj = G_OBJECT (self);
g_object_notify (obj, "password-visible"); g_object_notify (obj, "password-visible");
@ -485,15 +477,16 @@ shell_keyring_prompt_confirm_finish (GcrPrompt *prompt,
GAsyncResult *result, GAsyncResult *result,
GError **error) GError **error)
{ {
ShellKeyringPrompt *self = SHELL_KEYRING_PROMPT (prompt); GTask *task = G_TASK (result);
gssize res;
g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (prompt), g_return_val_if_fail (g_task_get_source_object (task) == prompt,
GCR_PROMPT_REPLY_CANCEL);
g_return_val_if_fail (g_async_result_is_tagged (result,
shell_keyring_prompt_confirm_async), GCR_PROMPT_REPLY_CANCEL); shell_keyring_prompt_confirm_async), GCR_PROMPT_REPLY_CANCEL);
if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error)) res = g_task_propagate_int (task, error);
return GCR_PROMPT_REPLY_CANCEL; return res == -1 ? GCR_PROMPT_REPLY_CANCEL : (GcrPromptReply)res;
return self->last_reply;
} }
static void static void
@ -712,19 +705,20 @@ shell_keyring_prompt_set_confirm_actor (ShellKeyringPrompt *self,
gboolean gboolean
shell_keyring_prompt_complete (ShellKeyringPrompt *self) shell_keyring_prompt_complete (ShellKeyringPrompt *self)
{ {
GSimpleAsyncResult *res; GTask *res;
PromptingMode mode;
const gchar *password; const gchar *password;
const gchar *confirm; const gchar *confirm;
const gchar *env; const gchar *env;
g_return_val_if_fail (SHELL_IS_KEYRING_PROMPT (self), FALSE); g_return_val_if_fail (SHELL_IS_KEYRING_PROMPT (self), FALSE);
g_return_val_if_fail (self->mode != PROMPTING_NONE, FALSE); g_return_val_if_fail (self->mode != PROMPTING_NONE, FALSE);
g_return_val_if_fail (self->async_result != NULL, FALSE); g_return_val_if_fail (self->task != NULL, FALSE);
password = clutter_text_get_text (self->password_actor);
if (self->mode == PROMPTING_FOR_PASSWORD) if (self->mode == PROMPTING_FOR_PASSWORD)
{ {
password = clutter_text_get_text (self->password_actor);
/* Is it a new password? */ /* Is it a new password? */
if (self->password_new) if (self->password_new)
{ {
@ -750,13 +744,15 @@ shell_keyring_prompt_complete (ShellKeyringPrompt *self)
g_object_notify (G_OBJECT (self), "password-strength"); g_object_notify (G_OBJECT (self), "password-strength");
} }
self->last_reply = GCR_PROMPT_REPLY_CONTINUE; res = self->task;
mode = self->mode;
res = self->async_result; self->task = NULL;
self->async_result = NULL;
self->mode = PROMPTING_NONE; self->mode = PROMPTING_NONE;
g_simple_async_result_complete (res); if (mode == PROMPTING_FOR_CONFIRM)
g_task_return_int (res, (gssize)GCR_PROMPT_REPLY_CONTINUE);
else
g_task_return_pointer (res, (gpointer)password, NULL);
g_object_unref (res); g_object_unref (res);
return TRUE; return TRUE;
@ -771,7 +767,8 @@ shell_keyring_prompt_complete (ShellKeyringPrompt *self)
void void
shell_keyring_prompt_cancel (ShellKeyringPrompt *self) shell_keyring_prompt_cancel (ShellKeyringPrompt *self)
{ {
GSimpleAsyncResult *res; GTask *res;
PromptingMode mode;
g_return_if_fail (SHELL_IS_KEYRING_PROMPT (self)); g_return_if_fail (SHELL_IS_KEYRING_PROMPT (self));
@ -786,13 +783,16 @@ shell_keyring_prompt_cancel (ShellKeyringPrompt *self)
return; return;
} }
g_return_if_fail (self->async_result != NULL); g_return_if_fail (self->task != NULL);
self->last_reply = GCR_PROMPT_REPLY_CANCEL;
res = self->async_result; res = self->task;
self->async_result = NULL; mode = self->mode;
self->task = NULL;
self->mode = PROMPTING_NONE; self->mode = PROMPTING_NONE;
g_simple_async_result_complete_in_idle (res); if (mode == PROMPTING_FOR_CONFIRM)
g_task_return_int (res, (gssize) GCR_PROMPT_REPLY_CANCEL);
else
g_task_return_pointer (res, NULL, NULL);
g_object_unref (res); g_object_unref (res);
} }