[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