Change the API a bit so that unhandled methods get reported via the reply,

2008-01-09  Alexander Larsson  <alexl@redhat.com>

        * 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
This commit is contained in:
Alexander Larsson 2008-01-09 14:43:41 +00:00 committed by Alexander Larsson
parent 91d7fdc186
commit e6ca690694
4 changed files with 64 additions and 39 deletions

View File

@ -1,3 +1,14 @@
2008-01-09 Alexander Larsson <alexl@redhat.com>
* 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 <alexl@redhat.com>
* fam/fam-helper.c:

View File

@ -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

View File

@ -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__

View File

@ -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