summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVivek Dasmohapatra <vivek@collabora.co.uk>2011-03-21 18:02:32 +0000
committerVivek Dasmohapatra <vivek@collabora.co.uk>2011-04-05 14:19:09 +0100
commita53807c9d8dc3b0d4e745a5e01be2ed64bd65adb (patch)
treecfb1303d7fc903be8136a38e7df21d2b38f24454
parentf83fbe87848689edc028837de829b8f0748c9eaa (diff)
downloadtelepathy-mission-control-a53807c9d8dc3b0d4e745a5e01be2ed64bd65adb.tar.gz
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.
-rw-r--r--src/request.c65
-rw-r--r--src/request.h12
2 files changed, 77 insertions, 0 deletions
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