[Telepathy-commits] [telepathy-mission-control/master] Add helpers for _call_when_ready implementations

Alberto Mardegan alberto.mardegan at nokia.com
Wed Feb 4 06:43:27 PST 2009


Add some common code to be used for objects which implement a
_call_when_ready()-like API, where the first parameter of the callback is the
object itself, the second is an error indicator, and the third is user provided
data.
---
 src/mcd-misc.c |   83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/mcd-misc.h |    5 +++
 2 files changed, 88 insertions(+), 0 deletions(-)

diff --git a/src/mcd-misc.c b/src/mcd-misc.c
index 73b6de6..dce39db 100644
--- a/src/mcd-misc.c
+++ b/src/mcd-misc.c
@@ -179,3 +179,86 @@ type_dbus_aasv (void)
     t = dbus_g_type_get_collection ("GPtrArray", tp_type_dbus_hash_sv ());
   return t;
 }
+
+typedef struct
+{
+    McdReadyCb callback;
+    gpointer user_data;
+} McdReadyCbData;
+
+typedef struct
+{
+    gpointer object;
+    GSList *callbacks;
+} McdReadyData;
+
+static void
+mcd_object_invoke_ready_callbacks (McdReadyData *rd, const GError *error)
+{
+    GSList *list;
+
+    for (list = rd->callbacks; list != NULL; list = list->next)
+    {
+        McdReadyCbData *cb = list->data;
+
+        cb->callback (rd->object, error, cb->user_data);
+        g_slice_free (McdReadyCbData, cb);
+    }
+    g_slist_free (rd->callbacks);
+}
+
+static void
+mcd_ready_data_free (McdReadyData *rd)
+{
+    if (rd->object)
+    {
+        GError error = { TP_ERRORS, TP_ERROR_CANCELLED, "Object disposed" };
+        mcd_object_invoke_ready_callbacks (rd, &error);
+    }
+    g_slice_free (McdReadyData, rd);
+}
+
+void
+mcd_object_call_when_ready (gpointer object, GQuark quark, McdReadyCb callback,
+                            gpointer user_data)
+{
+    McdReadyData *rd;
+    McdReadyCbData *cb;
+
+    g_return_if_fail (G_IS_OBJECT (object));
+    g_return_if_fail (quark != 0);
+    g_return_if_fail (callback != NULL);
+
+    cb = g_slice_new (McdReadyCbData);
+    cb->callback = callback;
+    cb->user_data = user_data;
+
+    rd = g_object_get_qdata ((GObject *)object, quark);
+    if (!rd)
+    {
+        rd = g_slice_new (McdReadyData);
+        rd->object = object;
+        rd->callbacks = NULL;
+        g_object_set_qdata_full ((GObject *)object, quark, rd,
+                                 (GDestroyNotify)mcd_ready_data_free);
+    }
+    rd->callbacks = g_slist_prepend (rd->callbacks, cb);
+}
+
+void
+mcd_object_ready (gpointer object, GQuark quark, const GError *error)
+{
+    McdReadyData *rd;
+
+    rd = g_object_get_qdata ((GObject *)object, quark);
+    if (G_UNLIKELY (!rd))
+    {
+        g_warning ("%s: callback data is missing", G_STRFUNC);
+        return;
+    }
+
+    mcd_object_invoke_ready_callbacks (rd, error);
+    rd->object = NULL; /* so the callbacks won't be invoked again */
+    g_object_set_qdata ((GObject *)object, quark, NULL);
+}
+
diff --git a/src/mcd-misc.h b/src/mcd-misc.h
index d879a80..30d2604 100644
--- a/src/mcd-misc.h
+++ b/src/mcd-misc.h
@@ -52,6 +52,11 @@ const gchar *_mcd_get_error_string (const GError *error);
 #define TP_ARRAY_TYPE_CHANNEL_CLASS_LIST (type_dbus_aasv ())
 GType type_dbus_aasv (void);
 
+typedef void (*McdReadyCb) (gpointer *object, const GError *error,
+                            gpointer user_data);
+void mcd_object_call_when_ready (gpointer object, GQuark quark,
+                                 McdReadyCb callback, gpointer user_data);
+void mcd_object_ready (gpointer object, GQuark quark, const GError *error);
 
 G_END_DECLS
 #endif /* MCD_MISC_H */
-- 
1.5.6.5




More information about the telepathy-commits mailing list