* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <telepathy-glib/connection-manager.h>
-#include <telepathy-glib/util.h>
-
+#include "config.h"
#include "empathy-connection-managers.h"
+
#include "empathy-utils.h"
#define DEBUG_FLAG EMPATHY_DEBUG_OTHER
-#include <libempathy/empathy-debug.h>
+#include "empathy-debug.h"
static GObject *managers = NULL;
G_TYPE_FROM_CLASS (object_class),
G_SIGNAL_RUN_LAST,
0, NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
+ g_cclosure_marshal_generic,
G_TYPE_NONE, 0);
}
}
static void
-empathy_connection_managers_listed_cb (TpConnectionManager * const *cms,
- gsize n_cms,
- const GError *error,
- gpointer user_data,
- GObject *weak_object)
+empathy_connection_managers_listed_cb (GObject *source,
+ GAsyncResult *result,
+ gpointer user_data)
{
- EmpathyConnectionManagers *self =
- EMPATHY_CONNECTION_MANAGERS (weak_object);
- EmpathyConnectionManagersPriv *priv = GET_PRIV (self);
- TpConnectionManager * const *iter;
+ TpWeakRef *wr = user_data;
+ GError *error = NULL;
+ EmpathyConnectionManagers *self = tp_weak_ref_dup_object (wr);
+ GList *cms, *l;
+ EmpathyConnectionManagersPriv *priv;
+
+ if (self == NULL)
+ {
+ tp_weak_ref_destroy (wr);
+ return;
+ }
+
+ priv = GET_PRIV (self);
empathy_connection_managers_free_cm_list (self);
+ cms = tp_list_connection_managers_finish (result, &error);
if (error != NULL)
{
DEBUG ("Failed to get connection managers: %s", error->message);
+ g_error_free (error);
goto out;
}
- for (iter = cms ; iter != NULL && *iter != NULL; iter++)
+ for (l = cms ; l != NULL; l = g_list_next (l))
{
+ TpConnectionManager *cm = l->data;
+
/* only list cms that didn't hit errors */
- if (tp_connection_manager_is_ready (*iter))
- priv->cms = g_list_prepend (priv->cms, g_object_ref (*iter));
+ if (tp_proxy_is_prepared (cm, TP_CONNECTION_MANAGER_FEATURE_CORE))
+ priv->cms = g_list_prepend (priv->cms, g_object_ref (cm));
}
out:
- g_object_ref (weak_object);
if (!priv->ready)
{
priv->ready = TRUE;
- g_object_notify (weak_object, "ready");
+ g_object_notify (G_OBJECT (self), "ready");
}
- g_signal_emit (weak_object, signals[UPDATED], 0);
- g_object_unref (weak_object);
+
+ g_signal_emit (self, signals[UPDATED], 0);
+ g_object_unref (self);
+ tp_weak_ref_destroy (wr);
}
void
{
EmpathyConnectionManagersPriv *priv = GET_PRIV (self);
- tp_list_connection_managers (priv->dbus,
+ tp_list_connection_managers_async (priv->dbus,
empathy_connection_managers_listed_cb,
- NULL, NULL, G_OBJECT (self));
+ tp_weak_ref_new (self, NULL, NULL));
}
GList *
{
TpConnectionManager *c = TP_CONNECTION_MANAGER (l->data);
- if (!tp_strdiff (c->name, cm))
+ if (!tp_strdiff (tp_connection_manager_get_name (c), cm))
return c;
}
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,
+notify_ready_cb (EmpathyConnectionManagers *self,
GParamSpec *spec,
- CallWhenReadyContext *ctx)
+ GSimpleAsyncResult *result)
{
- g_assert (ctx->callback != NULL);
-
- ctx->callback (self, NULL, ctx->user_data);
-
- call_when_ready_ctx_free (ctx);
+ g_simple_async_result_complete (result);
+ g_object_unref (result);
}
-static CallWhenReadyContext *
-call_when_ready_ctx_new (EmpathyConnectionManagers *self,
- EmpathyConnectionManagersWhenReadyCb callback,
+void
+empathy_connection_managers_prepare_async (
+ EmpathyConnectionManagers *self,
+ GAsyncReadyCallback callback,
gpointer user_data)
{
- CallWhenReadyContext *ctx = g_slice_new (CallWhenReadyContext);
+ EmpathyConnectionManagersPriv *priv = GET_PRIV (self);
+ GSimpleAsyncResult *result;
- ctx->self = g_object_ref (self);
- ctx->callback = callback;
- ctx->user_data = user_data;
+ result = g_simple_async_result_new (G_OBJECT (managers),
+ callback, user_data, empathy_connection_managers_prepare_finish);
- ctx->ready_id = g_signal_connect (self, "notify::ready",
- G_CALLBACK (cwr_ready), ctx);
+ if (priv->ready)
+ {
+ g_simple_async_result_complete_in_idle (result);
+ g_object_unref (result);
+ return;
+ }
- return ctx;
+ g_signal_connect (self, "notify::ready", G_CALLBACK (notify_ready_cb),
+ result);
}
-void
-empathy_connection_managers_call_when_ready (
+gboolean
+empathy_connection_managers_prepare_finish (
EmpathyConnectionManagers *self,
- EmpathyConnectionManagersWhenReadyCb callback,
- gpointer user_data)
+ GAsyncResult *result,
+ GError **error)
{
- EmpathyConnectionManagersPriv *priv = GET_PRIV (self);
+ GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result);
- if (priv->ready)
- {
- callback (self, NULL, user_data);
- }
- else
- {
- call_when_ready_ctx_new (self, callback, user_data);
- }
+ g_return_val_if_fail (g_simple_async_result_is_valid (result,
+ G_OBJECT (self), empathy_connection_managers_prepare_finish), FALSE);
+
+ if (g_simple_async_result_propagate_error (simple, error))
+ return FALSE;
+
+ return TRUE;
}