From f6d60f33a0ab2af025e7d13a8dea9a93c6eab3f9 Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Thu, 21 Jan 2010 11:57:18 +0000 Subject: add empathy_connection_managers_call_when_ready That's easier to use than checking if ready and connecting a callback. --- libempathy/empathy-connection-managers.c | 63 ++++++++++++++++++++++++++++++++ libempathy/empathy-connection-managers.h | 10 +++++ 2 files changed, 73 insertions(+) (limited to 'libempathy') diff --git a/libempathy/empathy-connection-managers.c b/libempathy/empathy-connection-managers.c index 5d381075e..7085b507b 100644 --- a/libempathy/empathy-connection-managers.c +++ b/libempathy/empathy-connection-managers.c @@ -291,3 +291,66 @@ empathy_connection_managers_get_cms_num (EmpathyConnectionManagers *self) return g_list_length (priv->cms); } + +typedef struct +{ + EmpathyConnectionManagers *self; + EmpathyConnectionManagersWhenReadyCb callback; + gpointer user_data; + guint ready_id; +} CallWhenReadyContext; + +static void +call_when_ready_ctx_free (CallWhenReadyContext *ctx) +{ + g_signal_handler_disconnect (ctx->self, ctx->ready_id); + g_object_unref (ctx->self); + g_slice_free (CallWhenReadyContext, ctx); +} + +static void +cwr_ready (EmpathyConnectionManagers *self, + GParamSpec *spec, + CallWhenReadyContext *ctx) +{ + g_assert (ctx->callback != NULL); + + ctx->callback (self, NULL, ctx->user_data); + + call_when_ready_ctx_free (ctx); +} + +static CallWhenReadyContext * +call_when_ready_ctx_new (EmpathyConnectionManagers *self, + EmpathyConnectionManagersWhenReadyCb callback, + gpointer user_data) +{ + CallWhenReadyContext *ctx = g_slice_new (CallWhenReadyContext); + + ctx->self = g_object_ref (self); + ctx->callback = callback; + ctx->user_data = user_data; + + ctx->ready_id = g_signal_connect (self, "notify::ready", + G_CALLBACK (cwr_ready), ctx); + + return ctx; +} + +void +empathy_connection_managers_call_when_ready ( + EmpathyConnectionManagers *self, + EmpathyConnectionManagersWhenReadyCb callback, + gpointer user_data) +{ + EmpathyConnectionManagersPriv *priv = GET_PRIV (self); + + if (priv->ready) + { + callback (self, NULL, user_data); + } + else + { + call_when_ready_ctx_new (self, callback, user_data); + } +} diff --git a/libempathy/empathy-connection-managers.h b/libempathy/empathy-connection-managers.h index 17289d36d..956f24315 100644 --- a/libempathy/empathy-connection-managers.h +++ b/libempathy/empathy-connection-managers.h @@ -72,6 +72,16 @@ guint empathy_connection_managers_get_cms_num TpConnectionManager *empathy_connection_managers_get_cm ( EmpathyConnectionManagers *managers, const gchar *cm); +typedef void (*EmpathyConnectionManagersWhenReadyCb) ( + EmpathyConnectionManagers *managers, + const GError *error, + gpointer user_data); + +void empathy_connection_managers_call_when_ready ( + EmpathyConnectionManagers *managers, + EmpathyConnectionManagersWhenReadyCb callback, + gpointer user_data); + G_END_DECLS #endif /* #ifndef __EMPATHY_CONNECTION_MANAGERS_H__*/ -- cgit v1.2.3