From e6ca69069401c5739762a466291d5c9148b1bc76 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Wed, 9 Jan 2008 14:43:41 +0000 Subject: [PATCH] Change the API a bit so that unhandled methods get reported via the reply, 2008-01-09 Alexander Larsson * gio-marshal.list: * gmountoperation.[ch]: Change the API a bit so that unhandled methods get reported via the reply, rather than by the signal emission return value. This is because some handlers can't know this immediately without doing I/O, and this is an async operation that should not block. svn path=/trunk/; revision=6282 --- gio/ChangeLog | 11 +++++++++++ gio/gio-marshal.list | 4 ++-- gio/gmountoperation.c | 51 +++++++++++++++++++++++++-------------------------- gio/gmountoperation.h | 37 ++++++++++++++++++++++++++----------- 4 files changed, 64 insertions(+), 39 deletions(-) diff --git a/gio/ChangeLog b/gio/ChangeLog index 276f416..4a67e8d 100644 --- a/gio/ChangeLog +++ b/gio/ChangeLog @@ -1,5 +1,16 @@ 2008-01-09 Alexander Larsson + * gio-marshal.list: + * gmountoperation.[ch]: + Change the API a bit so that unhandled methods + get reported via the reply, rather than by + the signal emission return value. This is because + some handlers can't know this immediately without + doing I/O, and this is an async operation that + should not block. + +2008-01-09 Alexander Larsson + * fam/fam-helper.c: * fam/gfamdirectorymonitor.c: * fam/gfamfilemonitor.c: diff --git a/gio/gio-marshal.list b/gio/gio-marshal.list index d06467d..ab176d6 100644 --- a/gio/gio-marshal.list +++ b/gio/gio-marshal.list @@ -1,4 +1,4 @@ -BOOLEAN:STRING,STRING,STRING,FLAGS -BOOLEAN:STRING,BOXED +VOID:STRING,STRING,STRING,FLAGS +VOID:STRING,BOXED VOID:BOOLEAN,POINTER VOID:OBJECT,OBJECT,ENUM diff --git a/gio/gmountoperation.c b/gio/gmountoperation.c index bdaa7d9..c810eb7 100644 --- a/gio/gmountoperation.c +++ b/gio/gmountoperation.c @@ -193,37 +193,36 @@ g_mount_operation_finalize (GObject *object) } static gboolean -boolean_handled_accumulator (GSignalInvocationHint *ihint, - GValue *return_accu, - const GValue *handler_return, - gpointer dummy) +reply_non_handled_in_idle (gpointer data) { - gboolean continue_emission; - gboolean signal_handled; - - signal_handled = g_value_get_boolean (handler_return); - g_value_set_boolean (return_accu, signal_handled); - continue_emission = !signal_handled; - - return continue_emission; + GMountOperation *op = data; + + g_mount_operation_reply (op, G_MOUNT_OPERATION_UNHANDLED); + return FALSE; } -static gboolean +static void ask_password (GMountOperation *op, const char *message, const char *default_user, const char *default_domain, GAskPasswordFlags flags) { - return FALSE; + g_idle_add_full (G_PRIORITY_DEFAULT_IDLE, + reply_non_handled_in_idle, + g_object_ref (op), + g_object_unref); } -static gboolean +static void ask_question (GMountOperation *op, const char *message, const char *choices[]) { - return FALSE; + g_idle_add_full (G_PRIORITY_DEFAULT_IDLE, + reply_non_handled_in_idle, + g_object_ref (op), + g_object_unref); } static void @@ -256,9 +255,9 @@ g_mount_operation_class_init (GMountOperationClass *klass) G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GMountOperationClass, ask_password), - boolean_handled_accumulator, NULL, - _gio_marshal_BOOLEAN__STRING_STRING_STRING_FLAGS, - G_TYPE_BOOLEAN, 4, + NULL, NULL, + _gio_marshal_VOID__STRING_STRING_STRING_FLAGS, + G_TYPE_NONE, 4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_ASK_PASSWORD_FLAGS); /** @@ -275,9 +274,9 @@ g_mount_operation_class_init (GMountOperationClass *klass) G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GMountOperationClass, ask_question), - boolean_handled_accumulator, NULL, - _gio_marshal_BOOLEAN__STRING_BOXED, - G_TYPE_BOOLEAN, 2, + NULL, NULL, + _gio_marshal_VOID__STRING_BOXED, + G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_STRV); /** @@ -293,9 +292,9 @@ g_mount_operation_class_init (GMountOperationClass *klass) G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GMountOperationClass, reply), NULL, NULL, - g_cclosure_marshal_VOID__BOOLEAN, + g_cclosure_marshal_VOID__ENUM, G_TYPE_NONE, 1, - G_TYPE_BOOLEAN); + G_TYPE_MOUNT_OPERATION_RESULT); /** * GMountOperation:username: @@ -628,10 +627,10 @@ g_mount_operation_set_choice (GMountOperation *op, **/ void g_mount_operation_reply (GMountOperation *op, - gboolean abort) + GMountOperationResult result) { g_return_if_fail (G_IS_MOUNT_OPERATION (op)); - g_signal_emit (op, signals[REPLY], 0, abort); + g_signal_emit (op, signals[REPLY], 0, result); } #define __G_MOUNT_OPERATION_C__ diff --git a/gio/gmountoperation.h b/gio/gmountoperation.h index 9b8add8..a220d95 100644 --- a/gio/gmountoperation.h +++ b/gio/gmountoperation.h @@ -92,24 +92,39 @@ typedef enum { G_PASSWORD_SAVE_PERMANENTLY } GPasswordSave; +/** + * GMountOperationResult: + * @G_MOUNT_OPERATION_HANDLED: The request was fulfilled and the user specified data is now availible + * @G_MOUNT_OPERATION_ABORTED: The user requested the mount operation to be aborted + * @G_MOUNT_OPERATION_UNHANDLED: The request was unhandled (i.e. not implemented) + * + * #GMountOperationResult is returned as a result when a request for information + * is send by the mounting operation. + **/ +typedef enum { + G_MOUNT_OPERATION_HANDLED, + G_MOUNT_OPERATION_ABORTED, + G_MOUNT_OPERATION_UNHANDLED +} GMountOperationResult; + struct _GMountOperationClass { GObjectClass parent_class; /* signals: */ - gboolean (* ask_password) (GMountOperation *op, - const char *message, - const char *default_user, - const char *default_domain, - GAskPasswordFlags flags); + void (* ask_password) (GMountOperation *op, + const char *message, + const char *default_user, + const char *default_domain, + GAskPasswordFlags flags); - gboolean (* ask_question) (GMountOperation *op, - const char *message, - const char *choices[]); + void (* ask_question) (GMountOperation *op, + const char *message, + const char *choices[]); - void (* reply) (GMountOperation *op, - gboolean abort); + void (* reply) (GMountOperation *op, + GMountOperationResult result); /*< private >*/ /* Padding for future expansion */ @@ -150,7 +165,7 @@ int g_mount_operation_get_choice (GMountOperation *op); void g_mount_operation_set_choice (GMountOperation *op, int choice); void g_mount_operation_reply (GMountOperation *op, - gboolean abort); + GMountOperationResult result); G_END_DECLS -- 2.7.4