summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlberto Mardegan <mardy@users.sourceforge.net>2008-02-06 10:02:27 +0000
committerAlberto Mardegan <mardy@users.sourceforge.net>2008-02-06 10:02:27 +0000
commit608cadcc554ba241a7ce94652974bf7d4eda016c (patch)
tree6ff277e3c361ce8e41c5f65ca8fc888833421160
parentb5e399d15166aa43ec35fbbcbfb521d77559f6ad (diff)
downloadtelepathy-mission-control-608cadcc554ba241a7ce94652974bf7d4eda016c.tar.gz
Invoke the callback from an idle function, so that the clients can get
their request ID before the callback gets executed. git-svn-id: https://mission-control.svn.sourceforge.net/svnroot/mission-control/trunk@267 d91c8aed-3f2b-0410-a83d-924a1c20a0ba
-rw-r--r--ChangeLog6
-rw-r--r--libmissioncontrol/mission-control.c59
-rw-r--r--libmissioncontrol/mission-control.h1
3 files changed, 65 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index c84eb4f8..19521fe6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2008-02-06 Alberto Mardegan <alberto.mardegan@nokia.com>
+
+ * libmissioncontrol/mission-control.[hc]:
+ Invoke the callback from an idle function, so that the clients can get
+ their request ID before the callback gets executed.
+
2008-02-05 Alberto Mardegan <alberto.mardegan@nokia.com>
* src/mcd-dispatcher.c:
diff --git a/libmissioncontrol/mission-control.c b/libmissioncontrol/mission-control.c
index 7995be40..74e76921 100644
--- a/libmissioncontrol/mission-control.c
+++ b/libmissioncontrol/mission-control.c
@@ -57,6 +57,14 @@ struct dbus_cb_data {
gpointer user_data;
};
+struct idle_cb_data {
+ MissionControl *self;
+ McCallback callback;
+ GError *error;
+ gpointer user_data;
+ guint id;
+};
+
struct get_current_status_cb_data {
McGetCurrentStatusCallback callback;
gpointer user_data;
@@ -66,10 +74,48 @@ struct get_current_status_cb_data {
if (callback) { \
GError *error = NULL; \
error = g_error_new (MC_ERROR, code, __VA_ARGS__); \
- callback (mc, error, data); \
+ queue_callback (mc, callback, error, data); \
}
static void
+free_idle_cb_data (gpointer data)
+{
+ struct idle_cb_data *cbdata = data;
+
+ if (cbdata->error)
+ g_error_free (cbdata->error);
+ g_free (cbdata);
+}
+
+static gboolean
+invoke_callback (gpointer data)
+{
+ struct idle_cb_data *cbdata = data;
+
+ cbdata->callback (cbdata->self, cbdata->error, cbdata->user_data);
+ cbdata->error = NULL;
+ g_hash_table_remove (cbdata->self->active_callbacks,
+ GINT_TO_POINTER (cbdata->id));
+ return FALSE;
+}
+
+static void
+queue_callback (MissionControl *self, McCallback callback,
+ GError *error, gpointer user_data)
+{
+ struct idle_cb_data *data;
+
+ data = g_malloc (sizeof (struct idle_cb_data));
+ data->self = self;
+ data->callback = callback;
+ data->error = error;
+ data->user_data = user_data;
+ data->id = g_idle_add (invoke_callback, data);
+ g_hash_table_insert (self->active_callbacks, GINT_TO_POINTER (data->id),
+ data);
+}
+
+static void
dbus_async_cb (DBusGProxy * proxy, GError * error, gpointer userdata)
{
struct dbus_cb_data *cb_data = (struct dbus_cb_data *)userdata;
@@ -226,6 +272,11 @@ mission_control_init (GTypeInstance * instance, gpointer g_class)
{
MissionControl *self = MISSIONCONTROL (instance);
self->first_run = TRUE;
+
+ self->active_callbacks =
+ g_hash_table_new_full (g_direct_hash, g_direct_equal,
+ (GDestroyNotify)g_source_remove,
+ free_idle_cb_data);
}
@@ -239,6 +290,12 @@ mission_control_dispose (GObject * obj)
self->first_run = FALSE;
}
+ if (self->active_callbacks)
+ {
+ g_hash_table_destroy (self->active_callbacks);
+ self->active_callbacks = NULL;
+ }
+
if (G_OBJECT_CLASS (parent_class)->dispose)
{
G_OBJECT_CLASS (parent_class)->dispose (obj);
diff --git a/libmissioncontrol/mission-control.h b/libmissioncontrol/mission-control.h
index 23d06a32..9ac97168 100644
--- a/libmissioncontrol/mission-control.h
+++ b/libmissioncontrol/mission-control.h
@@ -119,6 +119,7 @@ struct _missioncontrol
DBusGProxy parent;
gboolean first_run;
+ GHashTable *active_callbacks;
};