diff options
-rw-r--r-- | libempathy/empathy-connection-managers.c | 63 | ||||
-rw-r--r-- | libempathy/empathy-connection-managers.h | 10 |
2 files changed, 73 insertions, 0 deletions
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__*/ |