diff options
author | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2014-04-01 11:30:17 +0100 |
---|---|---|
committer | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2014-04-01 11:30:17 +0100 |
commit | 113926ef197e8d228bcc3a734ac9763415546347 (patch) | |
tree | 88c7793e94407e7fce7789bda2cffce052d3ae29 | |
parent | ff2328c312fb630ba80c16bb8214e9e43d75f7c3 (diff) |
Pass a TpClientFactory around instead of a TpDBusDaemonnext-factory
-rw-r--r-- | src/client-registry.c | 128 | ||||
-rw-r--r-- | src/client-registry.h | 4 | ||||
-rw-r--r-- | src/mcd-account-manager.c | 64 | ||||
-rw-r--r-- | src/mcd-account-manager.h | 5 | ||||
-rw-r--r-- | src/mcd-account.c | 37 | ||||
-rw-r--r-- | src/mcd-client-priv.h | 2 | ||||
-rw-r--r-- | src/mcd-client.c | 4 | ||||
-rw-r--r-- | src/mcd-dispatch-operation.c | 9 | ||||
-rw-r--r-- | src/mcd-dispatcher.c | 39 | ||||
-rw-r--r-- | src/mcd-dispatcher.h | 2 | ||||
-rw-r--r-- | src/mcd-handler-map-priv.h | 2 | ||||
-rw-r--r-- | src/mcd-handler-map.c | 33 | ||||
-rw-r--r-- | src/mcd-manager.c | 10 | ||||
-rw-r--r-- | src/mcd-master.c | 37 | ||||
-rw-r--r-- | src/mcd-master.h | 2 | ||||
-rw-r--r-- | src/mcd-service.c | 17 | ||||
-rw-r--r-- | src/request.c | 11 | ||||
-rw-r--r-- | tests/twisted/mc-debug-server.c | 6 | ||||
-rw-r--r-- | tests/twisted/mcp-plugin.c | 21 | ||||
-rw-r--r-- | util/mc-tool.c | 16 |
20 files changed, 216 insertions, 233 deletions
diff --git a/src/client-registry.c b/src/client-registry.c index cebcf4d9..d27f17aa 100644 --- a/src/client-registry.c +++ b/src/client-registry.c @@ -36,7 +36,7 @@ G_DEFINE_TYPE (McdClientRegistry, _mcd_client_registry, G_TYPE_OBJECT) enum { PROP_0, - PROP_DBUS_DAEMON + PROP_FACTORY }; enum @@ -54,7 +54,7 @@ struct _McdClientRegistryPrivate * owned gchar * well_known_name -> owned McdClientProxy */ GHashTable *clients; - TpDBusDaemon *dbus_daemon; + TpClientFactory *factory; /* subscription to NameOwnerChanged */ guint noc_id; @@ -153,7 +153,7 @@ _mcd_client_registry_found_name (McdClientRegistry *self, DEBUG ("Registering client %s", well_known_name); - client = _mcd_client_proxy_new (self->priv->dbus_daemon, + client = _mcd_client_proxy_new (self->priv->factory, well_known_name, unique_name_if_known, activatable); g_hash_table_insert (self->priv->clients, g_strdup (well_known_name), client); @@ -237,70 +237,95 @@ _mcd_client_registry_init (McdClientRegistry *self) } static void -mcd_client_registry_list_activatable_names_cb (TpDBusDaemon *proxy, - const gchar **names, - const GError *error, - gpointer user_data, - GObject *weak_object) +mcd_client_registry_list_activatable_names_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) { - McdClientRegistry *self = MCD_CLIENT_REGISTRY (weak_object); + McdClientRegistry *self = MCD_CLIENT_REGISTRY (user_data); + GDBusConnection *conn = G_DBUS_CONNECTION (source_object); + GVariant *tuple; + GError *error = NULL; + + tuple = g_dbus_connection_call_finish (conn, result, &error); - if (error != NULL) + if (tuple == NULL) { DEBUG ("ListActivatableNames returned error, assuming none: %s %d: %s", g_quark_to_string (error->domain), error->code, error->message); + g_error_free (error); } - else if (names != NULL) + else { - const gchar **iter = names; + const gchar **names = NULL; + const gchar **iter; + + g_variant_get (tuple, "(^a&s)", &names); DEBUG ("ListActivatableNames returned"); - while (*iter != NULL) + for (iter = names; iter != NULL && *iter != NULL; iter++) { _mcd_client_registry_found_name (self, *iter, NULL, TRUE); - iter++; } + + g_free (names); + g_variant_unref (tuple); } /* paired with the lock taken when the McdClientRegistry was constructed */ _mcd_client_registry_dec_startup_lock (self); + + g_object_unref (self); } static void -mcd_client_registry_list_names_cb (TpDBusDaemon *proxy, - const gchar **names, - const GError *error, - gpointer user_data, - GObject *weak_object) +mcd_client_registry_list_names_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) { - McdClientRegistry *self = MCD_CLIENT_REGISTRY (weak_object); + McdClientRegistry *self = MCD_CLIENT_REGISTRY (user_data); + GDBusConnection *conn = G_DBUS_CONNECTION (source_object); + GVariant *tuple; + GError *error = NULL; + + tuple = g_dbus_connection_call_finish (conn, result, &error); - if (error != NULL) + if (tuple == NULL) { DEBUG ("ListNames returned error, assuming none: %s %d: %s", g_quark_to_string (error->domain), error->code, error->message); + g_error_free (error); } - else if (names != NULL) + else { - const gchar **iter = names; + const gchar **names = NULL; + const gchar **iter; + + g_variant_get (tuple, "(^a&s)", &names); DEBUG ("ListNames returned"); - while (*iter != NULL) + for (iter = names; iter != NULL && *iter != NULL; iter++) { _mcd_client_registry_found_name (self, *iter, NULL, FALSE); - iter++; } + + g_free (names); + g_variant_unref (tuple); } - tp_cli_dbus_daemon_call_list_activatable_names (proxy, -1, - mcd_client_registry_list_activatable_names_cb, - NULL, NULL, weak_object); + g_dbus_connection_call (conn, + "org.freedesktop.DBus", "/org/freedesktop/DBus", + "org.freedesktop.DBus", "ListNames", + NULL, + G_VARIANT_TYPE ("(as)"), G_DBUS_CALL_FLAGS_NONE, -1, NULL, + mcd_client_registry_list_activatable_names_cb, g_object_ref (self)); /* deliberately not calling _mcd_client_registry_dec_startup_lock here - * this function is "lock-neutral", similarly to list_names_cb (we would * take a lock for ListActivatableNames then release the one used for * ReloadConfig), so simplify by doing nothing */ + + g_object_unref (self); } static void @@ -331,8 +356,8 @@ mcd_client_registry_name_owner_changed_cb (GDBusConnection *conn, static void watch_clients (McdClientRegistry *self) { - TpDBusDaemon *dbus_daemon = self->priv->dbus_daemon; - GDBusConnection *gconn = tp_proxy_get_dbus_connection (dbus_daemon); + GDBusConnection *gconn = tp_client_factory_get_dbus_connection ( + self->priv->factory); /* for simplicity we now hard-depend on D-Bus 1.6, which is in Debian 7, * Ubuntu LTS, etc. */ @@ -354,14 +379,19 @@ mcd_client_registry_constructed (GObject *object) if (chain_up != NULL) chain_up (object); - g_return_if_fail (self->priv->dbus_daemon != NULL); + g_return_if_fail (self->priv->factory != NULL); DEBUG ("Starting to look for clients"); watch_clients (self); - tp_cli_dbus_daemon_call_list_names (self->priv->dbus_daemon, -1, - mcd_client_registry_list_names_cb, NULL, NULL, object); + g_dbus_connection_call ( + tp_client_factory_get_dbus_connection (self->priv->factory), + "org.freedesktop.DBus", "/org/freedesktop/DBus", + "org.freedesktop.DBus", "ListNames", + NULL, + G_VARIANT_TYPE ("(as)"), G_DBUS_CALL_FLAGS_NONE, -1, NULL, + mcd_client_registry_list_names_cb, g_object_ref (object)); } static void @@ -374,9 +404,9 @@ mcd_client_registry_set_property (GObject *object, switch (prop_id) { - case PROP_DBUS_DAEMON: - g_assert (self->priv->dbus_daemon == NULL); /* it's construct-only */ - self->priv->dbus_daemon = TP_DBUS_DAEMON (g_value_dup_object (value)); + case PROP_FACTORY: + g_assert (self->priv->factory == NULL); /* it's construct-only */ + self->priv->factory = TP_CLIENT_FACTORY (g_value_dup_object (value)); break; default: @@ -395,8 +425,8 @@ mcd_client_registry_get_property (GObject *object, switch (prop_id) { - case PROP_DBUS_DAEMON: - g_value_set_object (value, self->priv->dbus_daemon); + case PROP_FACTORY: + g_value_set_object (value, self->priv->factory); break; default: @@ -412,15 +442,15 @@ mcd_client_registry_dispose (GObject *object) void (*chain_up) (GObject *) = G_OBJECT_CLASS (_mcd_client_registry_parent_class)->dispose; - if (self->priv->dbus_daemon != NULL && self->priv->noc_id != 0) + if (self->priv->factory != NULL && self->priv->noc_id != 0) { GDBusConnection *gconn = - tp_proxy_get_dbus_connection (self->priv->dbus_daemon); + tp_client_factory_get_dbus_connection (self->priv->factory); g_dbus_connection_signal_unsubscribe (gconn, self->priv->noc_id); } - tp_clear_object (&self->priv->dbus_daemon); + tp_clear_object (&self->priv->factory); if (self->priv->clients != NULL) { @@ -447,9 +477,9 @@ _mcd_client_registry_class_init (McdClientRegistryClass *cls) object_class->set_property = mcd_client_registry_set_property; object_class->dispose = mcd_client_registry_dispose; - g_object_class_install_property (object_class, PROP_DBUS_DAEMON, - g_param_spec_object ("dbus-daemon", "D-Bus daemon", "D-Bus daemon", - TP_TYPE_DBUS_DAEMON, + 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_PARAM_STATIC_STRINGS)); signals[S_CLIENT_ADDED] = g_signal_new ("client-added", @@ -468,10 +498,10 @@ _mcd_client_registry_class_init (McdClientRegistryClass *cls) } McdClientRegistry * -_mcd_client_registry_new (TpDBusDaemon *dbus_daemon) +_mcd_client_registry_new (TpClientFactory *factory) { return g_object_new (MCD_TYPE_CLIENT_REGISTRY, - "dbus-daemon", dbus_daemon, + "factory", factory, NULL); } @@ -677,9 +707,9 @@ _mcd_client_registry_list_possible_handlers (McdClientRegistry *self, return handlers; } -TpDBusDaemon * -_mcd_client_registry_get_dbus_daemon (McdClientRegistry *self) +TpClientFactory * +_mcd_client_registry_get_factory (McdClientRegistry *self) { g_return_val_if_fail (MCD_IS_CLIENT_REGISTRY (self), NULL); - return self->priv->dbus_daemon; + return self->priv->factory; } diff --git a/src/client-registry.h b/src/client-registry.h index fb81f6d4..2a6275a2 100644 --- a/src/client-registry.h +++ b/src/client-registry.h @@ -64,9 +64,9 @@ GType _mcd_client_registry_get_type (void); McdClientRegistryClass)) G_GNUC_INTERNAL McdClientRegistry *_mcd_client_registry_new ( - TpDBusDaemon *dbus_daemon); + TpClientFactory *factory); -TpDBusDaemon *_mcd_client_registry_get_dbus_daemon (McdClientRegistry *self); +TpClientFactory *_mcd_client_registry_get_factory (McdClientRegistry *self); G_GNUC_INTERNAL McdClientProxy *_mcd_client_registry_lookup ( McdClientRegistry *self, const gchar *well_known_name); diff --git a/src/mcd-account-manager.c b/src/mcd-account-manager.c index 97e25452..9c267592 100644 --- a/src/mcd-account-manager.c +++ b/src/mcd-account-manager.c @@ -79,7 +79,6 @@ G_DEFINE_TYPE_WITH_CODE (McdAccountManager, mcd_account_manager, G_TYPE_OBJECT, struct _McdAccountManagerPrivate { - TpDBusDaemon *dbus_daemon; TpClientFactory *client_factory; McdConnectivityMonitor *minotaur; @@ -129,7 +128,6 @@ typedef struct enum { PROP_0, - PROP_DBUS_DAEMON, PROP_CLIENT_FACTORY }; @@ -1416,7 +1414,8 @@ _mcd_account_manager_setup (McdAccountManager *account_manager) priv->setup_lock = 1; /* will be released at the end of this function */ - g_dbus_connection_call (tp_proxy_get_dbus_connection (priv->dbus_daemon), + g_dbus_connection_call ( + tp_client_factory_get_dbus_connection (priv->client_factory), "org.freedesktop.DBus", "/org/freedesktop/DBus", "org.freedesktop.DBus", "ListNames", NULL, @@ -1520,13 +1519,13 @@ register_dbus_service (McdAccountManager *account_manager) if (priv->dbus_registered) return; - tp_dbus_daemon_register_object (priv->dbus_daemon, - TP_ACCOUNT_MANAGER_OBJECT_PATH, - account_manager); + tp_dbus_connection_register_object ( + tp_client_factory_get_dbus_connection (priv->client_factory), + TP_ACCOUNT_MANAGER_OBJECT_PATH, account_manager); - if (!tp_dbus_daemon_request_name (priv->dbus_daemon, - TP_ACCOUNT_MANAGER_BUS_NAME, - TRUE /* idempotent */, &error)) + if (!tp_dbus_connection_request_name ( + tp_client_factory_get_dbus_connection (priv->client_factory), + TP_ACCOUNT_MANAGER_BUS_NAME, TRUE /* idempotent */, &error)) { /* FIXME: put in proper error handling when MC gains the ability to * be the AM or the CD but not both */ @@ -1551,9 +1550,6 @@ set_property (GObject *obj, guint prop_id, case PROP_CLIENT_FACTORY: g_assert (priv->client_factory == NULL); /* construct-only */ priv->client_factory = TP_CLIENT_FACTORY (g_value_dup_object (val)); - priv->dbus_daemon = - tp_client_factory_get_dbus_daemon (priv->client_factory); - g_object_ref (priv->dbus_daemon); break; default: @@ -1563,23 +1559,6 @@ set_property (GObject *obj, guint prop_id, } static void -get_property (GObject *obj, guint prop_id, - GValue *val, GParamSpec *pspec) -{ - McdAccountManagerPrivate *priv = MCD_ACCOUNT_MANAGER_PRIV (obj); - - switch (prop_id) - { - case PROP_DBUS_DAEMON: - g_value_set_object (val, priv->dbus_daemon); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); - break; - } -} - -static void _mcd_account_manager_finalize (GObject *object) { McdAccountManagerPrivate *priv = MCD_ACCOUNT_MANAGER_PRIV (object); @@ -1599,7 +1578,6 @@ _mcd_account_manager_dispose (GObject *object) { McdAccountManagerPrivate *priv = MCD_ACCOUNT_MANAGER_PRIV (object); - tp_clear_object (&priv->dbus_daemon); tp_clear_object (&priv->client_factory); tp_clear_object (&priv->minotaur); @@ -1615,16 +1593,9 @@ mcd_account_manager_class_init (McdAccountManagerClass *klass) object_class->dispose = _mcd_account_manager_dispose; object_class->finalize = _mcd_account_manager_finalize; object_class->set_property = set_property; - object_class->get_property = get_property; object_class->constructed = _mcd_account_manager_constructed; 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_READABLE)); - - g_object_class_install_property (object_class, PROP_CLIENT_FACTORY, g_param_spec_object ("client-factory", "Client factory", @@ -1699,20 +1670,6 @@ mcd_account_manager_new (TpClientFactory *client_factory) return MCD_ACCOUNT_MANAGER (obj); } -/** - * mcd_account_manager_get_dbus_daemon: - * @account_manager: the #McdAccountManager. - * - * Returns: the #TpDBusDaemon. - */ -TpDBusDaemon * -mcd_account_manager_get_dbus_daemon (McdAccountManager *account_manager) -{ - g_return_val_if_fail (MCD_IS_ACCOUNT_MANAGER (account_manager), NULL); - - return account_manager->priv->dbus_daemon; -} - McdConnectivityMonitor * mcd_account_manager_get_connectivity_monitor (McdAccountManager *self) { @@ -1803,3 +1760,8 @@ mcd_account_manager_get_storage (McdAccountManager *account_manager) return account_manager->priv->storage; } +TpClientFactory * +mcd_account_manager_get_factory (McdAccountManager *account_manager) +{ + return account_manager->priv->client_factory; +} diff --git a/src/mcd-account-manager.h b/src/mcd-account-manager.h index 847fef5f..7438191c 100644 --- a/src/mcd-account-manager.h +++ b/src/mcd-account-manager.h @@ -63,9 +63,6 @@ GType mcd_account_manager_get_type (void); McdAccountManager *mcd_account_manager_new ( TpClientFactory *client_factory); -TpDBusDaemon *mcd_account_manager_get_dbus_daemon - (McdAccountManager *account_manager); - McdAccount *mcd_account_manager_lookup_account (McdAccountManager *account_manager, const gchar *name); McdAccount *mcd_account_manager_lookup_account_by_path (McdAccountManager *account_manager, @@ -76,6 +73,8 @@ McdStorage *mcd_account_manager_get_storage (McdAccountManager *manager); McdConnectivityMonitor *mcd_account_manager_get_connectivity_monitor ( McdAccountManager *self); +TpClientFactory *mcd_account_manager_get_factory (McdAccountManager *self); + G_END_DECLS #endif diff --git a/src/mcd-account.c b/src/mcd-account.c index 6716e108..8644be25 100644 --- a/src/mcd-account.c +++ b/src/mcd-account.c @@ -106,7 +106,7 @@ struct _McdAccountPrivate McdManager *manager; McdStorage *storage; - TpDBusDaemon *dbus_daemon; + TpClientFactory *factory; McdConnectivityMonitor *connectivity; McdAccountConnectionContext *connection_context; @@ -170,7 +170,7 @@ struct _McdAccountPrivate enum { PROP_0, - PROP_DBUS_DAEMON, + PROP_FACTORY, PROP_CONNECTIVITY_MONITOR, PROP_STORAGE, PROP_STORAGE_PLUGIN, @@ -2733,8 +2733,6 @@ register_dbus_service (McdAccount *self, const GError *error, gpointer unused G_GNUC_UNUSED) { - TpDBusDaemon *dbus_daemon; - if (error != NULL) { /* due to some tangled error handling, the McdAccount might already @@ -2752,11 +2750,9 @@ register_dbus_service (McdAccount *self, g_assert (self->priv->storage != NULL); g_assert (self->priv->object_path != NULL); - dbus_daemon = self->priv->dbus_daemon; - g_return_if_fail (dbus_daemon != NULL); - - tp_dbus_daemon_register_object (dbus_daemon, self->priv->object_path, - self); + tp_dbus_connection_register_object ( + tp_client_factory_get_dbus_connection (self->priv->factory), + self->priv->object_path, self); } /* @@ -3114,9 +3110,9 @@ set_property (GObject *obj, guint prop_id, priv->storage_plugin = g_value_dup_object (val); break; - case PROP_DBUS_DAEMON: - g_assert (priv->dbus_daemon == NULL); - priv->dbus_daemon = g_value_dup_object (val); + case PROP_FACTORY: + g_assert (priv->factory == NULL); + priv->factory = g_value_dup_object (val); break; case PROP_CONNECTIVITY_MONITOR: @@ -3143,8 +3139,8 @@ get_property (GObject *obj, guint prop_id, switch (prop_id) { - case PROP_DBUS_DAEMON: - g_value_set_object (val, priv->dbus_daemon); + case PROP_FACTORY: + g_value_set_object (val, priv->factory); break; case PROP_CONNECTIVITY_MONITOR: @@ -3229,7 +3225,7 @@ _mcd_account_dispose (GObject *object) tp_clear_object (&priv->manager); tp_clear_object (&priv->storage_plugin); tp_clear_object (&priv->storage); - tp_clear_object (&priv->dbus_daemon); + tp_clear_object (&priv->factory); tp_clear_object (&priv->self_contact); tp_clear_object (&priv->connectivity); @@ -3352,9 +3348,9 @@ mcd_account_class_init (McdAccountClass * klass) klass->check_request = _mcd_account_check_request_real; g_object_class_install_property - (object_class, PROP_DBUS_DAEMON, - g_param_spec_object ("dbus-daemon", "DBus daemon", "DBus daemon", - TP_TYPE_DBUS_DAEMON, + (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 @@ -3455,12 +3451,13 @@ mcd_account_new (McdAccountManager *account_manager, { gpointer *obj; McdStorage *storage = mcd_account_manager_get_storage (account_manager); - TpDBusDaemon *dbus = mcd_account_manager_get_dbus_daemon (account_manager); + TpClientFactory *factory = mcd_account_manager_get_factory ( + account_manager); obj = g_object_new (MCD_TYPE_ACCOUNT, "storage", storage, "storage-plugin", storage_plugin, - "dbus-daemon", dbus, + "factory", factory, "connectivity-monitor", connectivity, "name", name, NULL); diff --git a/src/mcd-client-priv.h b/src/mcd-client-priv.h index 8e9bbc78..f8a68ff1 100644 --- a/src/mcd-client-priv.h +++ b/src/mcd-client-priv.h @@ -70,7 +70,7 @@ G_GNUC_INTERNAL GType _mcd_client_proxy_get_type (void); McdClientProxyClass)) G_GNUC_INTERNAL McdClientProxy *_mcd_client_proxy_new ( - TpDBusDaemon *dbus_daemon, + TpClientFactory *factory, const gchar *well_known_name, const gchar *unique_name_if_known, gboolean activatable); diff --git a/src/mcd-client.c b/src/mcd-client.c index 1cc006fa..ff3ea1e4 100644 --- a/src/mcd-client.c +++ b/src/mcd-client.c @@ -1215,7 +1215,7 @@ _mcd_client_check_valid_name (const gchar *name_suffix, } McdClientProxy * -_mcd_client_proxy_new (TpDBusDaemon *dbus_daemon, +_mcd_client_proxy_new (TpClientFactory *factory, const gchar *well_known_name, const gchar *unique_name_if_known, gboolean activatable) @@ -1239,7 +1239,7 @@ _mcd_client_proxy_new (TpDBusDaemon *dbus_daemon, g_assert (tp_dbus_check_valid_object_path (object_path, NULL)); self = g_object_new (MCD_TYPE_CLIENT_PROXY, - "dbus-daemon", dbus_daemon, + "factory", factory, "object-path", object_path, "bus-name", well_known_name, "unique-name", unique_name_if_known, diff --git a/src/mcd-dispatch-operation.c b/src/mcd-dispatch-operation.c index afe4cda3..db74e5dc 100644 --- a/src/mcd-dispatch-operation.c +++ b/src/mcd-dispatch-operation.c @@ -1107,15 +1107,16 @@ mcd_dispatch_operation_constructor (GType type, guint n_params, * don't run) */ if (priv->needs_approval) { - TpDBusDaemon *dbus_daemon; + TpClientFactory *factory; g_object_get (priv->client_registry, - "dbus-daemon", &dbus_daemon, + "factory", &factory, NULL); - tp_dbus_daemon_register_object (dbus_daemon, priv->object_path, + tp_dbus_connection_register_object ( + tp_client_factory_get_dbus_connection (factory), priv->object_path, object); - g_object_unref (dbus_daemon); + g_object_unref (factory); } priv->plugin_api = _mcd_plugin_dispatch_operation_new (operation); diff --git a/src/mcd-dispatcher.c b/src/mcd-dispatcher.c index 58aef9dc..92592411 100644 --- a/src/mcd-dispatcher.c +++ b/src/mcd-dispatcher.c @@ -112,7 +112,7 @@ struct _McdDispatcherPrivate /* Channel dispatch operations */ GList *operations; - TpDBusDaemon *dbus_daemon; + TpClientFactory *factory; /* hash table containing clients * char *bus_name -> McdClientProxy */ @@ -144,7 +144,7 @@ struct cancel_call_data enum { PROP_0, - PROP_DBUS_DAEMON, + PROP_FACTORY, PROP_MCD_MASTER, PROP_INTERFACES, PROP_SUPPORTS_REQUEST_HINTS, @@ -331,9 +331,9 @@ _mcd_dispatcher_set_property (GObject * obj, guint prop_id, switch (prop_id) { - case PROP_DBUS_DAEMON: - tp_clear_object (&priv->dbus_daemon); - priv->dbus_daemon = TP_DBUS_DAEMON (g_value_dup_object (val)); + case PROP_FACTORY: + tp_clear_object (&priv->factory); + priv->factory = TP_CLIENT_FACTORY (g_value_dup_object (val)); break; case PROP_MCD_MASTER: master = g_value_get_object (val); @@ -366,8 +366,8 @@ _mcd_dispatcher_get_property (GObject * obj, guint prop_id, switch (prop_id) { - case PROP_DBUS_DAEMON: - g_value_set_object (val, priv->dbus_daemon); + case PROP_FACTORY: + g_value_set_object (val, priv->factory); break; case PROP_MCD_MASTER: @@ -739,7 +739,7 @@ _mcd_dispatcher_dispose (GObject * object) tp_clear_pointer (&priv->connections, g_hash_table_unref); tp_clear_object (&priv->master); - tp_clear_object (&priv->dbus_daemon); + tp_clear_object (&priv->factory); G_OBJECT_CLASS (mcd_dispatcher_parent_class)->dispose (object); } @@ -783,21 +783,22 @@ mcd_dispatcher_constructed (GObject *object) McdDispatcherPrivate *priv = MCD_DISPATCHER_PRIV (object); GError *error = NULL; - priv->handler_map = _mcd_handler_map_new (priv->dbus_daemon); + priv->handler_map = _mcd_handler_map_new (priv->factory); - priv->clients = _mcd_client_registry_new (priv->dbus_daemon); + priv->clients = _mcd_client_registry_new (priv->factory); g_signal_connect (priv->clients, "client-added", G_CALLBACK (mcd_dispatcher_client_added_cb), object); g_signal_connect (priv->clients, "ready", G_CALLBACK (mcd_dispatcher_client_registry_ready_cb), object); - tp_dbus_daemon_register_object (priv->dbus_daemon, + tp_dbus_connection_register_object ( + tp_client_factory_get_dbus_connection (priv->factory), TP_CHANNEL_DISPATCHER_OBJECT_PATH, object); - if (!tp_dbus_daemon_request_name (priv->dbus_daemon, - TP_CHANNEL_DISPATCHER_BUS_NAME, - TRUE /* idempotent */, &error)) + if (!tp_dbus_connection_request_name ( + tp_client_factory_get_dbus_connection (priv->factory), + TP_CHANNEL_DISPATCHER_BUS_NAME, TRUE /* idempotent */, &error)) { /* FIXME: put in proper error handling when MC gains the ability to * be the AM or the CD but not both */ @@ -843,9 +844,9 @@ mcd_dispatcher_class_init (McdDispatcherClass * klass) /* Properties */ g_object_class_install_property - (object_class, PROP_DBUS_DAEMON, - g_param_spec_object ("dbus-daemon", "DBus daemon", "DBus daemon", - TP_TYPE_DBUS_DAEMON, + (object_class, PROP_FACTORY, + g_param_spec_object ("factory", "Factory", "Client factory", + TP_TYPE_CLIENT_FACTORY, G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); g_object_class_install_property (object_class, PROP_MCD_MASTER, @@ -890,11 +891,11 @@ mcd_dispatcher_init (McdDispatcher * dispatcher) } McdDispatcher * -mcd_dispatcher_new (TpDBusDaemon *dbus_daemon, McdMaster *master) +mcd_dispatcher_new (TpClientFactory *factory, McdMaster *master) { McdDispatcher *obj; obj = MCD_DISPATCHER (g_object_new (MCD_TYPE_DISPATCHER, - "dbus-daemon", dbus_daemon, + "factory", factory, "mcd-master", master, NULL)); return obj; diff --git a/src/mcd-dispatcher.h b/src/mcd-dispatcher.h index 461254d5..fcb33c92 100644 --- a/src/mcd-dispatcher.h +++ b/src/mcd-dispatcher.h @@ -62,7 +62,7 @@ struct _McdDispatcherClass GType mcd_dispatcher_get_type (void); -McdDispatcher *mcd_dispatcher_new (TpDBusDaemon *dbus_daemon, +McdDispatcher *mcd_dispatcher_new (TpClientFactory *factory, McdMaster * master); G_END_DECLS diff --git a/src/mcd-handler-map-priv.h b/src/mcd-handler-map-priv.h index cc7109f7..6389317a 100644 --- a/src/mcd-handler-map-priv.h +++ b/src/mcd-handler-map-priv.h @@ -63,7 +63,7 @@ struct _McdHandlerMapClass GObjectClass parent_class; }; -McdHandlerMap *_mcd_handler_map_new (TpDBusDaemon *dbus_daemon); +McdHandlerMap *_mcd_handler_map_new (TpClientFactory *factory); const gchar *_mcd_handler_map_get_handler (McdHandlerMap *self, const gchar *channel_path, diff --git a/src/mcd-handler-map.c b/src/mcd-handler-map.c index 2487d10d..e88582cb 100644 --- a/src/mcd-handler-map.c +++ b/src/mcd-handler-map.c @@ -40,7 +40,7 @@ typedef struct { struct _McdHandlerMapPrivate { - TpDBusDaemon *dbus_daemon; + TpClientFactory *factory; /* The handler for each channel currently being handled * owned gchar *object_path => owned gchar *unique_name */ GHashTable *channel_processes; @@ -57,7 +57,7 @@ struct _McdHandlerMapPrivate enum { PROP_0, - PROP_DBUS_DAEMON + PROP_FACTORY }; static void @@ -109,8 +109,8 @@ _mcd_handler_map_get_property (GObject *object, switch (prop_id) { - case PROP_DBUS_DAEMON: - g_value_set_object (value, self->priv->dbus_daemon); + case PROP_FACTORY: + g_value_set_object (value, self->priv->factory); break; default: @@ -128,10 +128,10 @@ _mcd_handler_map_set_property (GObject *object, switch (prop_id) { - case PROP_DBUS_DAEMON: - g_assert (self->priv->dbus_daemon == NULL); /* construct-only */ - self->priv->dbus_daemon = - TP_DBUS_DAEMON (g_value_dup_object (value)); + case PROP_FACTORY: + g_assert (self->priv->factory == NULL); /* construct-only */ + self->priv->factory = + TP_CLIENT_FACTORY (g_value_dup_object (value)); break; default: @@ -151,7 +151,7 @@ _mcd_handler_map_dispose (GObject *object) tp_clear_pointer (&self->priv->handled_channels, g_hash_table_unref); tp_clear_pointer (&self->priv->handler_processes, g_hash_table_unref); - tp_clear_object (&self->priv->dbus_daemon); + tp_clear_object (&self->priv->factory); G_OBJECT_CLASS (_mcd_handler_map_parent_class)->dispose (object); } @@ -179,18 +179,18 @@ _mcd_handler_map_class_init (McdHandlerMapClass *klass) object_class->set_property = _mcd_handler_map_set_property; object_class->finalize = _mcd_handler_map_finalize; - g_object_class_install_property (object_class, PROP_DBUS_DAEMON, - g_param_spec_object ("dbus-daemon", "D-Bus daemon", "D-Bus daemon", - TP_TYPE_DBUS_DAEMON, + 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_PARAM_STATIC_STRINGS)); } McdHandlerMap * -_mcd_handler_map_new (TpDBusDaemon *dbus_daemon) +_mcd_handler_map_new (TpClientFactory *factory) { return g_object_new (MCD_TYPE_HANDLER_MAP, - "dbus-daemon", dbus_daemon, + "factory", factory, NULL); } @@ -281,7 +281,7 @@ _mcd_handler_map_set_path_handled (McdHandlerMap *self, g_hash_table_insert (self->priv->handler_processes, g_strdup (unique_name), hp); hp->watch = g_bus_watch_name_on_connection ( - tp_proxy_get_dbus_connection (self->priv->dbus_daemon), + tp_client_factory_get_dbus_connection (self->priv->factory), unique_name, G_BUS_NAME_WATCHER_FLAGS_NONE, NULL, mcd_handler_map_name_vanished_cb, self, NULL); } @@ -471,6 +471,7 @@ _mcd_handler_map_set_channel_handled_internally (McdHandlerMap *self, const gchar *account_path) { _mcd_handler_map_set_channel_handled (self, channel, - tp_dbus_daemon_get_unique_name (self->priv->dbus_daemon), + g_dbus_connection_get_unique_name ( + tp_client_factory_get_dbus_connection (self->priv->factory)), NULL, account_path); } diff --git a/src/mcd-manager.c b/src/mcd-manager.c index 49d8008f..7319801b 100644 --- a/src/mcd-manager.c +++ b/src/mcd-manager.c @@ -57,7 +57,6 @@ G_DEFINE_TYPE (McdManager, mcd_manager, MCD_TYPE_OPERATION); struct _McdManagerPrivate { gchar *name; - TpDBusDaemon *dbus_daemon; TpClientFactory *client_factory; McdDispatcher *dispatcher; @@ -124,7 +123,6 @@ _mcd_manager_dispose (GObject * object) tp_clear_object (&priv->dispatcher); tp_clear_object (&priv->tp_conn_mgr); tp_clear_object (&priv->client_factory); - tp_clear_object (&priv->dbus_daemon); tp_clear_object (&priv->slacker); G_OBJECT_CLASS (mcd_manager_parent_class)->dispose (object); @@ -166,9 +164,9 @@ mcd_manager_setup (McdManager *manager) priv->slacker = mcd_slacker_new (); - priv->tp_conn_mgr = - tp_connection_manager_new (priv->dbus_daemon, priv->name, - NULL, &error); + priv->tp_conn_mgr = tp_client_factory_ensure_connection_manager ( + priv->client_factory, priv->name, NULL, &error); + if (error) { g_warning ("%s, cannot create manager %s: %s", G_STRFUNC, @@ -235,8 +233,6 @@ _mcd_manager_set_property (GObject * obj, guint prop_id, case PROP_CLIENT_FACTORY: g_assert (priv->client_factory == NULL); /* construct-only */ priv->client_factory = g_value_dup_object (val); - priv->dbus_daemon = g_object_ref ( - tp_client_factory_get_dbus_daemon (priv->client_factory)); break; default: diff --git a/src/mcd-master.c b/src/mcd-master.c index 2dbfe611..24b03df3 100644 --- a/src/mcd-master.c +++ b/src/mcd-master.c @@ -88,7 +88,6 @@ struct _McdMasterPrivate McdDispatcher *dispatcher; /* We create these for our member objects */ - TpDBusDaemon *dbus_daemon; TpClientFactory *client_factory; /* Current pending sleep timer */ @@ -104,7 +103,7 @@ enum PROP_0, PROP_PRESENCE_FRAME, PROP_DBUS_CONNECTION, - PROP_DBUS_DAEMON, + PROP_FACTORY, PROP_DISPATCHER, PROP_ACCOUNT_MANAGER, }; @@ -126,12 +125,12 @@ _mcd_master_get_property (GObject * obj, guint prop_id, case PROP_DISPATCHER: g_value_set_object (val, priv->dispatcher); break; - case PROP_DBUS_DAEMON: - g_value_set_object (val, priv->dbus_daemon); + case PROP_FACTORY: + g_value_set_object (val, priv->client_factory); break; case PROP_DBUS_CONNECTION: - g_value_set_pointer (val, tp_proxy_get_dbus_connection ( - TP_PROXY (priv->dbus_daemon))); + g_value_set_pointer (val, tp_client_factory_get_dbus_connection ( + priv->client_factory)); break; case PROP_ACCOUNT_MANAGER: g_value_set_object (val, priv->account_manager); @@ -150,9 +149,9 @@ _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); + case PROP_FACTORY: + g_assert (priv->client_factory == NULL); + priv->client_factory = g_value_dup_object (val); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); @@ -172,7 +171,6 @@ _mcd_master_dispose (GObject * object) priv->is_disposed = TRUE; tp_clear_object (&priv->account_manager); - tp_clear_object (&priv->dbus_daemon); tp_clear_object (&priv->dispatcher); tp_clear_object (&priv->client_factory); @@ -202,10 +200,9 @@ 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); + priv->dispatcher = mcd_dispatcher_new (priv->client_factory, master); g_assert (MCD_IS_DISPATCHER (priv->dispatcher)); _mcd_account_manager_setup (priv->account_manager); @@ -234,9 +231,9 @@ mcd_master_class_init (McdMasterClass * klass) G_PARAM_READABLE)); g_object_class_install_property - (object_class, PROP_DBUS_DAEMON, - g_param_spec_object ("dbus-daemon", "DBus daemon", "DBus daemon", - TP_TYPE_DBUS_DAEMON, + (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 @@ -320,16 +317,16 @@ _mcd_master_lookup_manager (McdMaster *master, } /** - * mcd_master_get_dbus_daemon: + * mcd_master_get_factory: * @master: the #McdMaster. * - * Returns: the #TpDBusDaemon. + * Returns: the #TpClientFactory. */ -TpDBusDaemon * -mcd_master_get_dbus_daemon (McdMaster *master) +TpClientFactory * +mcd_master_get_factory (McdMaster *master) { g_return_val_if_fail (MCD_IS_MASTER (master), NULL); - return master->priv->dbus_daemon; + return master->priv->client_factory; } /* Milliseconds to wait for Connectivity coming back up before exiting MC */ diff --git a/src/mcd-master.h b/src/mcd-master.h index 185b7604..f727ca9b 100644 --- a/src/mcd-master.h +++ b/src/mcd-master.h @@ -58,7 +58,7 @@ struct _McdMasterClass GType mcd_master_get_type (void); McdMaster *mcd_master_get_default (void); -TpDBusDaemon *mcd_master_get_dbus_daemon (McdMaster *master); +TpClientFactory *mcd_master_get_factory (McdMaster *master); void mcd_master_shutdown (McdMaster *self, const gchar *reason); G_END_DECLS diff --git a/src/mcd-service.c b/src/mcd-service.c index 3e68861b..e761fc9b 100644 --- a/src/mcd-service.c +++ b/src/mcd-service.c @@ -82,9 +82,10 @@ mcd_service_obtain_bus_name (McdService * obj) DEBUG ("Requesting MC dbus service"); - if (!tp_dbus_daemon_request_name (mcd_master_get_dbus_daemon (master), - MISSION_CONTROL_DBUS_SERVICE, - TRUE /* idempotent */, &error)) + if (!tp_dbus_connection_request_name ( + tp_client_factory_get_dbus_connection ( + mcd_master_get_factory (master)), + MISSION_CONTROL_DBUS_SERVICE, TRUE /* idempotent */, &error)) { g_warning ("Failed registering '%s' service: %s", MISSION_CONTROL_DBUS_SERVICE, error->message); @@ -170,21 +171,21 @@ McdService * mcd_service_new (void) { McdService *obj; - TpDBusDaemon *dbus_daemon; GError *error = NULL; + TpClientFactory *client_factory; /* Initialize DBus connection */ - dbus_daemon = tp_dbus_daemon_dup (&error); - if (dbus_daemon == NULL) + client_factory = tp_client_factory_dup (&error); + if (client_factory == NULL) { g_printerr ("Failed to open connection to bus: %s", error->message); g_error_free (error); return NULL; } obj = g_object_new (MCD_TYPE_SERVICE, - "dbus-daemon", dbus_daemon, + "factory", client_factory, NULL); - g_object_unref (dbus_daemon); + g_object_unref (client_factory); return obj; } diff --git a/src/request.c b/src/request.c index 02d7198b..f022fac1 100644 --- a/src/request.c +++ b/src/request.c @@ -57,7 +57,7 @@ struct _McdRequest { gboolean use_existing; McdClientRegistry *clients; - TpDBusDaemon *dbus_daemon; + TpClientFactory *factory; McdAccount *account; GHashTable *properties; gint64 user_action_time; @@ -132,8 +132,10 @@ _mcd_request_constructed (GObject *object) g_return_if_fail (self->account != NULL); g_return_if_fail (self->clients != NULL); - self->dbus_daemon = _mcd_client_registry_get_dbus_daemon (self->clients); - tp_dbus_daemon_register_object (self->dbus_daemon, self->object_path, self); + self->factory = _mcd_client_registry_get_factory (self->clients); + tp_dbus_connection_register_object ( + tp_client_factory_get_dbus_connection (self->factory), + self->object_path, self); } static void @@ -798,7 +800,8 @@ static void _mcd_request_clean_up (McdRequest *self) { tp_clear_object (&self->predicted_handler); - tp_dbus_daemon_unregister_object (self->dbus_daemon, self); + tp_dbus_connection_unregister_object ( + tp_client_factory_get_dbus_connection (self->factory), self); } void diff --git a/tests/twisted/mc-debug-server.c b/tests/twisted/mc-debug-server.c index 8497c02c..644dd400 100644 --- a/tests/twisted/mc-debug-server.c +++ b/tests/twisted/mc-debug-server.c @@ -37,7 +37,6 @@ #include "mcd-service.h" -TpDBusDaemon *bus_daemon = NULL; static McdService *mcd = NULL; static void @@ -216,10 +215,6 @@ main (int argc, char **argv) g_signal_connect (gdbus_system, "closed", G_CALLBACK (bus_closed), "system"); - bus_daemon = tp_dbus_daemon_dup (&error); - g_assert_no_error (error); - g_assert (bus_daemon != NULL); - test_interface_id = g_dbus_connection_register_object (gdbus, TP_ACCOUNT_MANAGER_OBJECT_PATH, &test_interface, &test_interface_vtable, NULL, NULL, &error); @@ -259,7 +254,6 @@ main (int argc, char **argv) tp_clear_object (&gdbus); tp_clear_object (&gdbus_system); - tp_clear_object (&bus_daemon); g_message ("Exiting with %d", ret); tp_clear_object (&debug_sender); diff --git a/tests/twisted/mcp-plugin.c b/tests/twisted/mcp-plugin.c index 99430405..d93aa11f 100644 --- a/tests/twisted/mcp-plugin.c +++ b/tests/twisted/mcp-plugin.c @@ -182,15 +182,18 @@ test_permission_plugin_check_cdo (McpDispatchOperationPolicy *policy, TP_IFACE_CHANNEL ".TargetID"), "policy@example.net")) { - TpDBusDaemon *dbus_daemon = tp_dbus_daemon_dup (NULL); + GError *error = NULL; + GDBusConnection *bus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); PermissionContext *ctx; + g_assert_no_error (error); + ctx = g_slice_new0 (PermissionContext); ctx->dispatch_operation = g_object_ref (dispatch_operation); ctx->dispatch_operation_delay = mcp_dispatch_operation_start_delay ( dispatch_operation); - g_dbus_connection_call (tp_proxy_get_dbus_connection (dbus_daemon), + g_dbus_connection_call (bus, "com.example.Policy", "/com/example/Policy", "com.example.Policy", "RequestPermission", /* in a real policy-mechanism you'd give some details, like the @@ -200,6 +203,7 @@ test_permission_plugin_check_cdo (McpDispatchOperationPolicy *policy, NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, permission_cb, ctx); DEBUG ("Waiting for permission"); + g_object_unref (bus); } g_hash_table_unref (properties); @@ -233,7 +237,7 @@ handler_is_suitable_async (McpDispatchOperationPolicy *self, "policy@example.net")) { GError *error = NULL; - TpDBusDaemon *dbus_daemon = tp_dbus_daemon_dup (&error); + GDBusConnection *bus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); PermissionContext *ctx; g_assert_no_error (error); @@ -244,7 +248,7 @@ handler_is_suitable_async (McpDispatchOperationPolicy *self, /* take ownership */ simple = NULL; - g_dbus_connection_call (tp_proxy_get_dbus_connection (dbus_daemon), + g_dbus_connection_call (bus, "com.example.Policy", "/com/example/Policy", "com.example.Policy", "CheckHandler", /* in a real policy-mechanism you'd give some details, like the @@ -252,6 +256,7 @@ handler_is_suitable_async (McpDispatchOperationPolicy *self, * handler */ NULL, NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, permission_cb, ctx); + g_object_unref (bus); } finally: @@ -286,16 +291,19 @@ test_permission_plugin_check_request (McpRequestPolicy *policy, 0, g_quark_from_static_string ("com.example.QuestionableChannel"), NULL, NULL)) { - TpDBusDaemon *dbus_daemon = tp_dbus_daemon_dup (NULL); + GError *error = NULL; + GDBusConnection *bus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); PermissionContext *ctx; + g_assert_no_error (error); + DEBUG ("Questionable channel detected, asking for permission"); ctx = g_slice_new0 (PermissionContext); ctx->request = g_object_ref (request); ctx->request_delay = mcp_request_start_delay (request); - g_dbus_connection_call (tp_proxy_get_dbus_connection (dbus_daemon), + g_dbus_connection_call (bus, "com.example.Policy", "/com/example/Policy", "com.example.Policy", "RequestRequest", /* in a real policy-mechanism you'd give some details, like the @@ -303,6 +311,7 @@ test_permission_plugin_check_request (McpRequestPolicy *policy, * regression test so we don't bother */ NULL, NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, permission_cb, ctx); + g_object_unref (bus); } g_hash_table_unref (properties); diff --git a/util/mc-tool.c b/util/mc-tool.c index f642fe97..9fa3faea 100644 --- a/util/mc-tool.c +++ b/util/mc-tool.c @@ -1471,7 +1471,6 @@ main (int argc, char **argv) { TpAccountManager *am = NULL; TpAccount *a = NULL; - TpDBusDaemon *dbus = NULL; TpClientFactory *client_factory = NULL; GError *error = NULL; const GQuark features[] = { TP_ACCOUNT_FEATURE_CORE, @@ -1485,7 +1484,8 @@ main (int argc, char **argv) command.common.ret = 1; - dbus = tp_dbus_daemon_dup (&error); + client_factory = tp_client_factory_dup (&error); + if (error != NULL) { fprintf (stderr, "%s %s: Failed to connect to D-Bus: %s\n", @@ -1493,17 +1493,10 @@ main (int argc, char **argv) goto out; } - client_factory = tp_client_factory_new (dbus); - if (command.common.account == NULL) { - TpClientFactory *factory; - - am = tp_account_manager_new (dbus); - factory = tp_proxy_get_factory (am); - - tp_client_factory_add_account_features (factory, features); - + tp_client_factory_add_account_features (client_factory, features); + am = tp_client_factory_ensure_account_manager (client_factory); tp_proxy_prepare_async (am, NULL, manager_ready, NULL); } else @@ -1528,7 +1521,6 @@ main (int argc, char **argv) out: g_clear_error (&error); tp_clear_object (&client_factory); - tp_clear_object (&dbus); tp_clear_object (&am); tp_clear_object (&a); tp_clear_pointer (&main_loop, g_main_loop_unref); |