summaryrefslogtreecommitdiff
path: root/gdbus
diff options
context:
space:
mode:
authorArman Uguray <armansito@chromium.org>2015-02-27 08:16:25 (GMT)
committerMarcel Holtmann <marcel@holtmann.org>2015-03-26 09:02:05 (GMT)
commit97ac3f7c769b2a6c982a0889475e0c76296c383f (patch)
treed963c499efa69edbae58bcab84b8bd479c951cba /gdbus
parent26a00f2f31225b9ec8564a9fc6c3987480e47e36 (diff)
downloadofono-97ac3f7c769b2a6c982a0889475e0c76296c383f.tar.gz
ofono-97ac3f7c769b2a6c982a0889475e0c76296c383f.tar.xz
gdbus/client: Allow specifying ObjectManager path
GDBusClient currently hard-codes "/" as the remote ObjectManager path. This is generally incorrect, as an application can choose to expose an ObjectManager at any well-known path. This patch fixes this by allowing the user to pass in the ObjectManager path by introducing a new conctructor "g_dbus_client_new_full".
Diffstat (limited to 'gdbus')
-rw-r--r--gdbus/client.c24
-rw-r--r--gdbus/gdbus.h4
2 files changed, 22 insertions, 6 deletions
diff --git a/gdbus/client.c b/gdbus/client.c
index cd5c767..fe0c0db 100644
--- a/gdbus/client.c
+++ b/gdbus/client.c
@@ -42,6 +42,7 @@ struct GDBusClient {
DBusConnection *dbus_conn;
char *service_name;
char *base_path;
+ char *root_path;
guint watch;
guint added_watch;
guint removed_watch;
@@ -1118,9 +1119,10 @@ static void get_managed_objects(GDBusClient *client)
if (client->get_objects_call != NULL)
return;
- msg = dbus_message_new_method_call(client->service_name, "/",
- DBUS_INTERFACE_DBUS ".ObjectManager",
- "GetManagedObjects");
+ msg = dbus_message_new_method_call(client->service_name,
+ client->root_path,
+ DBUS_INTERFACE_OBJECT_MANAGER,
+ "GetManagedObjects");
if (msg == NULL)
return;
@@ -1199,10 +1201,18 @@ static DBusHandlerResult message_filter(DBusConnection *connection,
GDBusClient *g_dbus_client_new(DBusConnection *connection,
const char *service, const char *path)
{
+ return g_dbus_client_new_full(connection, service, path, "/");
+}
+
+GDBusClient *g_dbus_client_new_full(DBusConnection *connection,
+ const char *service,
+ const char *path,
+ const char *root_path)
+{
GDBusClient *client;
unsigned int i;
- if (connection == NULL)
+ if (!connection || !service || !root_path)
return NULL;
client = g_try_new0(GDBusClient, 1);
@@ -1218,6 +1228,7 @@ GDBusClient *g_dbus_client_new(DBusConnection *connection,
client->dbus_conn = dbus_connection_ref(connection);
client->service_name = g_strdup(service);
client->base_path = g_strdup(path);
+ client->root_path = g_strdup(root_path);
client->connected = FALSE;
client->match_rules = g_ptr_array_sized_new(1);
@@ -1228,13 +1239,13 @@ GDBusClient *g_dbus_client_new(DBusConnection *connection,
service_disconnect,
client, NULL);
client->added_watch = g_dbus_add_signal_watch(connection, service,
- "/",
+ client->root_path,
DBUS_INTERFACE_OBJECT_MANAGER,
"InterfacesAdded",
interfaces_added,
client, NULL);
client->removed_watch = g_dbus_add_signal_watch(connection, service,
- "/",
+ client->root_path,
DBUS_INTERFACE_OBJECT_MANAGER,
"InterfacesRemoved",
interfaces_removed,
@@ -1308,6 +1319,7 @@ void g_dbus_client_unref(GDBusClient *client)
g_free(client->service_name);
g_free(client->base_path);
+ g_free(client->root_path);
g_free(client);
}
diff --git a/gdbus/gdbus.h b/gdbus/gdbus.h
index 551c306..9814838 100644
--- a/gdbus/gdbus.h
+++ b/gdbus/gdbus.h
@@ -355,6 +355,10 @@ gboolean g_dbus_proxy_set_removed_watch(GDBusProxy *proxy,
GDBusClient *g_dbus_client_new(DBusConnection *connection,
const char *service, const char *path);
+GDBusClient *g_dbus_client_new_full(DBusConnection *connection,
+ const char *service,
+ const char *path,
+ const char *root_path);
GDBusClient *g_dbus_client_ref(GDBusClient *client);
void g_dbus_client_unref(GDBusClient *client);