[Telepathy-commits] [telepathy-mission-control/master] Add mcd_manager_call_when_ready()
Alberto Mardegan
alberto.mardegan at nokia.com
Wed Feb 4 03:23:54 PST 2009
This function registers a callback that will be called when the CM protocols
and parameters information is available.
---
src/mcd-manager.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++++
src/mcd-manager.h | 6 +++++
2 files changed, 60 insertions(+), 0 deletions(-)
diff --git a/src/mcd-manager.c b/src/mcd-manager.c
index ad36177..a376c80 100644
--- a/src/mcd-manager.c
+++ b/src/mcd-manager.c
@@ -37,6 +37,7 @@
#define _POSIX_C_SOURCE 200112L /* for strtok_r() */
#include "config.h"
#include "mcd-manager.h"
+#include "mcd-misc.h"
#include <stdio.h>
#include <string.h>
@@ -68,6 +69,7 @@ struct _McdManagerPrivate
GArray *protocols; /* array of McdProtocol structures */
guint is_disposed : 1;
guint delay_presence_request : 1;
+ guint got_info : 1;
};
enum
@@ -79,6 +81,26 @@ enum
PROP_DBUS_DAEMON,
};
+static GQuark pending_got_info = 0;
+
+static void
+on_got_info (TpConnectionManager *tp_conn_mgr, guint source,
+ McdManager *manager)
+{
+ McdManagerPrivate *priv;
+
+ priv = manager->priv;
+ if (priv->got_info) return;
+
+ if (source == TP_CM_INFO_SOURCE_NONE &&
+ tp_connection_manager_activate (tp_conn_mgr))
+ return; /* let's wait for live introspection */
+
+ g_debug ("manager %s is ready", priv->name);
+ priv->got_info = TRUE;
+ mcd_object_ready (manager, pending_got_info, NULL);
+}
+
static const gchar**
_mc_manager_get_dirs (void)
{
@@ -364,6 +386,7 @@ static void
_mcd_manager_dispose (GObject * object)
{
McdManagerPrivate *priv;
+
priv = MCD_MANAGER_PRIV (object);
if (priv->is_disposed)
@@ -383,6 +406,8 @@ _mcd_manager_dispose (GObject * object)
if (priv->tp_conn_mgr)
{
+ g_signal_handlers_disconnect_by_func (priv->tp_conn_mgr,
+ on_got_info, object);
g_object_unref (priv->tp_conn_mgr);
priv->tp_conn_mgr = NULL;
}
@@ -528,6 +553,9 @@ mcd_manager_setup (McdManager *manager)
goto error;
}
+ g_signal_connect (priv->tp_conn_mgr, "got-info", G_CALLBACK (on_got_info),
+ manager);
+
keyfile = g_key_file_new ();
if (!g_key_file_load_from_file (keyfile, filename, G_KEY_FILE_NONE, &error))
@@ -700,6 +728,8 @@ mcd_manager_class_init (McdManagerClass * klass)
g_param_spec_object ("dbus-daemon", "DBus daemon", "DBus daemon",
TP_TYPE_DBUS_DAEMON,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+
+ pending_got_info = g_quark_from_static_string ("mcd_manager_got_info");
}
static void
@@ -859,3 +889,27 @@ mcd_manager_get_dispatcher (McdManager *manager)
return manager->priv->dispatcher;
}
+/**
+ * mcd_manager_call_when_ready:
+ * @manager: the #McdManager.
+ * @callbacks: the #McdManagerReadyCb to invoke.
+ * @user_data: user data to be passed to the callback.
+ *
+ * Invoke @callback when @manager is ready, i.e. when its introspection has
+ * completed and all the manager protocols and parameter descriptions are
+ * available.
+ */
+void
+mcd_manager_call_when_ready (McdManager *manager, McdManagerReadyCb callback,
+ gpointer user_data)
+{
+ g_return_if_fail (MCD_IS_MANAGER (manager));
+ g_return_if_fail (callback != NULL);
+
+ if (manager->priv->got_info)
+ callback (manager, NULL, user_data);
+ else
+ mcd_object_call_when_ready (manager, pending_got_info,
+ (McdReadyCb)callback, user_data);
+}
+
diff --git a/src/mcd-manager.h b/src/mcd-manager.h
index ea938b5..b3cd001 100644
--- a/src/mcd-manager.h
+++ b/src/mcd-manager.h
@@ -109,5 +109,11 @@ McdConnection *mcd_manager_get_connection (McdManager *manager,
TpConnectionManager *mcd_manager_get_tp_proxy (McdManager *manager);
McdDispatcher *mcd_manager_get_dispatcher (McdManager *manager);
+typedef void (*McdManagerReadyCb) (McdManager *manager, const GError *error,
+ gpointer user_data);
+void mcd_manager_call_when_ready (McdManager *manager,
+ McdManagerReadyCb callback,
+ gpointer user_data);
+
G_END_DECLS
#endif /* MCD_MANAGER_H */
--
1.5.6.5
More information about the telepathy-commits
mailing list