summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon McVittie <simon.mcvittie@collabora.co.uk>2014-04-01 12:17:48 +0100
committerSimon McVittie <simon.mcvittie@collabora.co.uk>2014-04-01 12:17:48 +0100
commita1e564f0b14cf868e61d5d3cadcf145cc82495c9 (patch)
tree5a28fb9091c5a02627bbf3a2bb1b60fb8577845b
parentff2328c312fb630ba80c16bb8214e9e43d75f7c3 (diff)
McdMaster: take a TpClientFactory at construct-time
We don't want the shared singleton (tp_client_factory_dup()) because it constructs specialized TpChannel subclasses, and we'd rather have the base class. Similarly, if a plugin asks for extra features on the shared singleton, MC actively doesn't want them.
-rw-r--r--src/mcd-master.c23
-rw-r--r--src/mcd-service.c6
2 files changed, 22 insertions, 7 deletions
diff --git a/src/mcd-master.c b/src/mcd-master.c
index 2dbfe611..822dc30c 100644
--- a/src/mcd-master.c
+++ b/src/mcd-master.c
@@ -107,6 +107,7 @@ enum
PROP_DBUS_DAEMON,
PROP_DISPATCHER,
PROP_ACCOUNT_MANAGER,
+ PROP_FACTORY,
};
/* Used to poison 'default_master' when the object it points to is disposed.
@@ -126,6 +127,9 @@ _mcd_master_get_property (GObject * obj, guint prop_id,
case PROP_DISPATCHER:
g_value_set_object (val, priv->dispatcher);
break;
+ case PROP_FACTORY:
+ g_value_set_object (val, priv->client_factory);
+ break;
case PROP_DBUS_DAEMON:
g_value_set_object (val, priv->dbus_daemon);
break;
@@ -150,10 +154,12 @@ _mcd_master_set_property (GObject *obj, guint prop_id,
switch (prop_id)
{
- case PROP_DBUS_DAEMON:
- g_assert (priv->dbus_daemon == NULL);
- priv->dbus_daemon = g_value_dup_object (val);
- break;
+ case PROP_FACTORY:
+ g_assert (priv->client_factory == NULL);
+ priv->client_factory = g_value_dup_object (val);
+ priv->dbus_daemon = tp_client_factory_get_dbus_daemon (
+ priv->client_factory);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
break;
@@ -202,7 +208,6 @@ mcd_master_constructor (GType type, guint n_params,
umask (0077);
#endif
- priv->client_factory = tp_client_factory_new (priv->dbus_daemon);
priv->account_manager = mcd_account_manager_new (priv->client_factory);
priv->dispatcher = mcd_dispatcher_new (priv->dbus_daemon, master);
@@ -234,10 +239,16 @@ mcd_master_class_init (McdMasterClass * klass)
G_PARAM_READABLE));
g_object_class_install_property
+ (object_class, PROP_FACTORY,
+ g_param_spec_object ("factory", "Factory", "Client factory",
+ TP_TYPE_CLIENT_FACTORY,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+
+ g_object_class_install_property
(object_class, PROP_DBUS_DAEMON,
g_param_spec_object ("dbus-daemon", "DBus daemon", "DBus daemon",
TP_TYPE_DBUS_DAEMON,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+ G_PARAM_READABLE));
g_object_class_install_property
(object_class, PROP_DBUS_CONNECTION,
diff --git a/src/mcd-service.c b/src/mcd-service.c
index 3e68861b..705298f9 100644
--- a/src/mcd-service.c
+++ b/src/mcd-service.c
@@ -171,19 +171,23 @@ mcd_service_new (void)
{
McdService *obj;
TpDBusDaemon *dbus_daemon;
+ TpClientFactory *factory;
GError *error = NULL;
/* Initialize DBus connection */
dbus_daemon = tp_dbus_daemon_dup (&error);
+
if (dbus_daemon == NULL)
{
g_printerr ("Failed to open connection to bus: %s", error->message);
g_error_free (error);
return NULL;
}
+ factory = tp_client_factory_new (dbus_daemon);
obj = g_object_new (MCD_TYPE_SERVICE,
- "dbus-daemon", dbus_daemon,
+ "factory", factory,
NULL);
+ g_object_unref (factory);
g_object_unref (dbus_daemon);
return obj;
}