From a53807c9d8dc3b0d4e745a5e01be2ed64bd65adb Mon Sep 17 00:00:00 2001 From: Vivek Dasmohapatra Date: Mon, 21 Mar 2011 18:02:32 +0000 Subject: Allow MC to set callbacks for internally generated requests These requests will typically be handled by MC itself rather than being dispatched to a "real" handler. --- src/request.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/request.h | 12 +++++++++++ 2 files changed, 77 insertions(+) diff --git a/src/request.c b/src/request.c index af118555..cfa7e6f5 100644 --- a/src/request.c +++ b/src/request.c @@ -69,6 +69,11 @@ struct _McdRequest { GHashTable *hints; gchar *object_path; + /* if the request is an internally handled special case: */ + McdRequestInternalHandler internal_handler; + GFreeFunc internal_handler_clear; + gpointer internal_handler_data; + /* Number of reasons to not make the request yet. * * We hold one extra ref to ourselves per delay. The object starts with @@ -290,6 +295,19 @@ _mcd_request_finalize (GObject *object) DEBUG ("%p", object); + if (self->internal_handler_clear != NULL) + { + tp_clear_pointer (&self->internal_handler_data, + self->internal_handler_clear); + self->internal_handler_clear = NULL; + } + else + { + self->internal_handler_data = NULL; + } + + self->internal_handler = NULL; + g_free (self->preferred_handler); g_free (self->object_path); g_free (self->failure_message); @@ -426,6 +444,53 @@ _mcd_request_new (McdClientRegistry *clients, return self; } +void +_mcd_request_set_internal_handler (McdRequest *self, + McdRequestInternalHandler handler, + GFreeFunc free_func, + gpointer data) +{ + g_assert (self->internal_handler == NULL); + g_assert (self->internal_handler_data == NULL); + g_assert (self->internal_handler_clear == NULL); + + self->internal_handler = handler; + self->internal_handler_clear = free_func; + self->internal_handler_data = data; +} + +gboolean +_mcd_request_handle_internally (McdRequest *self, + McdChannel *channel, + gboolean close_after) +{ + gboolean handled = self->internal_handler != NULL; + gpointer data = self->internal_handler_data; + McdRequestInternalHandler handler = self->internal_handler; + + if (handled) + handler (self, channel, data, close_after); + + return handled; +} + +void +_mcd_request_clear_internal_handler (McdRequest *self) +{ + if (self->internal_handler_clear != NULL) + self->internal_handler_clear (self->internal_handler_data); + + self->internal_handler = NULL; + self->internal_handler_data = NULL; + self->internal_handler_clear = NULL; +} + +gboolean +_mcd_request_is_internal (McdRequest *self) +{ + return self != NULL && self->internal_handler != NULL; +} + gboolean _mcd_request_get_use_existing (McdRequest *self) { diff --git a/src/request.h b/src/request.h index 21f44a8e..a79f3ed1 100644 --- a/src/request.h +++ b/src/request.h @@ -34,6 +34,9 @@ typedef struct _McdRequest McdRequest; typedef struct _McdRequestClass McdRequestClass; typedef struct _McdRequestPrivate McdRequestPrivate; +typedef void (*McdRequestInternalHandler) + (McdRequest *, McdChannel *, gpointer, gboolean); + G_GNUC_INTERNAL GType _mcd_request_get_type (void); #define MCD_TYPE_REQUEST \ @@ -89,6 +92,15 @@ G_GNUC_INTERNAL gboolean _mcd_request_cancel (McdRequest *self, G_GNUC_INTERNAL void _mcd_request_predict_handler (McdRequest *self); +G_GNUC_INTERNAL void _mcd_request_set_internal_handler (McdRequest *self, + McdRequestInternalHandler handler, + GFreeFunc free_func, + gpointer data); +G_GNUC_INTERNAL gboolean _mcd_request_handle_internally (McdRequest *self, + McdChannel *channel, + gboolean close_after); +G_GNUC_INTERNAL void _mcd_request_clear_internal_handler (McdRequest *self); +G_GNUC_INTERNAL gboolean _mcd_request_is_internal (McdRequest *self); G_END_DECLS #endif -- cgit v1.2.1