diff options
author | Alberto Mardegan <mardy@users.sourceforge.net> | 2008-02-06 10:02:27 +0000 |
---|---|---|
committer | Alberto Mardegan <mardy@users.sourceforge.net> | 2008-02-06 10:02:27 +0000 |
commit | 608cadcc554ba241a7ce94652974bf7d4eda016c (patch) | |
tree | 6ff277e3c361ce8e41c5f65ca8fc888833421160 | |
parent | b5e399d15166aa43ec35fbbcbfb521d77559f6ad (diff) | |
download | telepathy-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-- | ChangeLog | 6 | ||||
-rw-r--r-- | libmissioncontrol/mission-control.c | 59 | ||||
-rw-r--r-- | libmissioncontrol/mission-control.h | 1 |
3 files changed, 65 insertions, 1 deletions
@@ -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; }; |