summaryrefslogtreecommitdiff
path: root/gdbus
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2012-12-27 21:19:31 -0800
committerMarcel Holtmann <marcel@holtmann.org>2012-12-27 23:59:31 -0800
commitf84c848f983d8a5c93ba5e93f156b9ecff554f5e (patch)
tree2b3b05b0a94aeb35a3f7c107734309411433e436 /gdbus
parent3bda76eb442c9395db1dba17352c3e78376671cc (diff)
downloadconnman-f84c848f983d8a5c93ba5e93f156b9ecff554f5e.tar.gz
connman-f84c848f983d8a5c93ba5e93f156b9ecff554f5e.tar.bz2
connman-f84c848f983d8a5c93ba5e93f156b9ecff554f5e.zip
gdbus: Add support for creating D-Bus proxies without object manager
Diffstat (limited to 'gdbus')
-rw-r--r--gdbus/client.c203
-rw-r--r--gdbus/gdbus.h6
2 files changed, 147 insertions, 62 deletions
diff --git a/gdbus/client.c b/gdbus/client.c
index 3b000806..8b55e5bf 100644
--- a/gdbus/client.c
+++ b/gdbus/client.c
@@ -198,6 +198,128 @@ static void prop_entry_free(gpointer data)
g_free(prop);
}
+static void add_property(GDBusProxy *proxy, const char *name,
+ DBusMessageIter *iter)
+{
+ DBusMessageIter value;
+ struct prop_entry *prop;
+
+ if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_VARIANT)
+ return;
+
+ dbus_message_iter_recurse(iter, &value);
+
+ prop = g_hash_table_lookup(proxy->prop_list, name);
+ if (prop != NULL) {
+ GDBusClient *client = proxy->client;
+
+ prop_entry_update(prop, &value);
+
+ if (client == NULL)
+ return;
+
+ if (client->property_changed)
+ client->property_changed(proxy, name, &value,
+ client->user_data);
+ return;
+ }
+
+ prop = prop_entry_new(name, &value);
+ if (prop == NULL)
+ return;
+
+ g_hash_table_replace(proxy->prop_list, prop->name, prop);
+}
+
+static void update_properties(GDBusProxy *proxy, DBusMessageIter *iter)
+{
+ DBusMessageIter dict;
+
+ if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_ARRAY)
+ return;
+
+ dbus_message_iter_recurse(iter, &dict);
+
+ while (dbus_message_iter_get_arg_type(&dict) == DBUS_TYPE_DICT_ENTRY) {
+ DBusMessageIter entry;
+ const char *name;
+
+ dbus_message_iter_recurse(&dict, &entry);
+
+ if (dbus_message_iter_get_arg_type(&entry) != DBUS_TYPE_STRING)
+ break;
+
+ dbus_message_iter_get_basic(&entry, &name);
+ dbus_message_iter_next(&entry);
+
+ add_property(proxy, name, &entry);
+
+ dbus_message_iter_next(&dict);
+ }
+}
+
+static void get_all_properties_reply(DBusPendingCall *call, void *user_data)
+{
+ GDBusProxy *proxy = user_data;
+ DBusMessage *reply = dbus_pending_call_steal_reply(call);
+ DBusMessageIter iter;
+ DBusError error;
+
+ dbus_error_init(&error);
+
+ if (dbus_set_error_from_message(&error, reply) == TRUE) {
+ dbus_error_free(&error);
+ goto done;
+ }
+
+ dbus_message_iter_init(reply, &iter);
+
+ update_properties(proxy, &iter);
+
+done:
+ if (proxy->client != NULL) {
+ GDBusClient *client = proxy->client;
+
+ if (client->proxy_added)
+ client->proxy_added(proxy, client->user_data);
+
+ client->proxy_list = g_list_append(client->proxy_list, proxy);
+ } else
+ g_dbus_proxy_unref(proxy);
+
+ dbus_message_unref(reply);
+}
+
+static void get_all_properties(GDBusProxy *proxy)
+{
+ GDBusClient *client = proxy->client;
+ const char *service_name = client->service_name;
+ DBusMessage *msg;
+ DBusPendingCall *call;
+
+ msg = dbus_message_new_method_call(service_name, proxy->obj_path,
+ DBUS_INTERFACE_PROPERTIES, "GetAll");
+ if (msg == NULL)
+ return;
+
+ dbus_message_append_args(msg, DBUS_TYPE_STRING, &proxy->interface,
+ DBUS_TYPE_INVALID);
+
+ if (dbus_connection_send_with_reply(client->dbus_conn, msg,
+ &call, -1) == FALSE) {
+ dbus_message_unref(msg);
+ return;
+ }
+
+ g_dbus_proxy_ref(proxy);
+
+ dbus_pending_call_set_notify(call, get_all_properties_reply,
+ proxy, NULL);
+ dbus_pending_call_unref(call);
+
+ dbus_message_unref(msg);
+}
+
static GDBusProxy *proxy_lookup(GDBusClient *client, const char *path,
const char *interface)
{
@@ -285,6 +407,27 @@ static void proxy_remove(GDBusClient *client, const char *path,
}
}
+GDBusProxy *g_dbus_proxy_new(GDBusClient *client, const char *path,
+ const char *interface)
+{
+ GDBusProxy *proxy;
+
+ if (client == NULL)
+ return NULL;
+
+ proxy = proxy_lookup(client, path, interface);
+ if (proxy)
+ return g_dbus_proxy_ref(proxy);
+
+ proxy = proxy_new(client, path, interface);
+ if (proxy == NULL)
+ return NULL;
+
+ get_all_properties(proxy);
+
+ return proxy;
+}
+
GDBusProxy *g_dbus_proxy_ref(GDBusProxy *proxy)
{
if (proxy == NULL)
@@ -514,66 +657,6 @@ gboolean g_dbus_proxy_method_call(GDBusProxy *proxy, const char *method,
return TRUE;
}
-static void add_property(GDBusProxy *proxy, const char *name,
- DBusMessageIter *iter)
-{
- DBusMessageIter value;
- struct prop_entry *prop;
-
- if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_VARIANT)
- return;
-
- dbus_message_iter_recurse(iter, &value);
-
- prop = g_hash_table_lookup(proxy->prop_list, name);
- if (prop != NULL) {
- GDBusClient *client = proxy->client;
-
- prop_entry_update(prop, &value);
-
- if (client == NULL)
- return;
-
- if (client->property_changed)
- client->property_changed(proxy, name, &value,
- client->user_data);
- return;
- }
-
- prop = prop_entry_new(name, &value);
- if (prop == NULL)
- return;
-
- g_hash_table_replace(proxy->prop_list, prop->name, prop);
-}
-
-static void update_properties(GDBusProxy *proxy, DBusMessageIter *iter)
-{
- DBusMessageIter dict;
-
- if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_ARRAY)
- return;
-
- dbus_message_iter_recurse(iter, &dict);
-
- while (dbus_message_iter_get_arg_type(&dict) == DBUS_TYPE_DICT_ENTRY) {
- DBusMessageIter entry;
- const char *name;
-
- dbus_message_iter_recurse(&dict, &entry);
-
- if (dbus_message_iter_get_arg_type(&entry) != DBUS_TYPE_STRING)
- break;
-
- dbus_message_iter_get_basic(&entry, &name);
- dbus_message_iter_next(&entry);
-
- add_property(proxy, name, &entry);
-
- dbus_message_iter_next(&dict);
- }
-}
-
static void properties_changed(GDBusClient *client, const char *path,
DBusMessage *msg)
{
diff --git a/gdbus/gdbus.h b/gdbus/gdbus.h
index 0e5c0126..4caa31da 100644
--- a/gdbus/gdbus.h
+++ b/gdbus/gdbus.h
@@ -274,8 +274,12 @@ gboolean g_dbus_get_properties(DBusConnection *connection, const char *path,
gboolean g_dbus_attach_object_manager(DBusConnection *connection);
gboolean g_dbus_detach_object_manager(DBusConnection *connection);
+typedef struct GDBusClient GDBusClient;
typedef struct GDBusProxy GDBusProxy;
+GDBusProxy *g_dbus_proxy_new(GDBusClient *client, const char *path,
+ const char *interface);
+
GDBusProxy *g_dbus_proxy_ref(GDBusProxy *proxy);
void g_dbus_proxy_unref(GDBusProxy *proxy);
@@ -300,8 +304,6 @@ gboolean g_dbus_proxy_method_call(GDBusProxy *proxy, const char *method,
GDBusReturnFunction function, void *user_data,
GDBusDestroyFunction destroy);
-typedef struct GDBusClient GDBusClient;
-
GDBusClient *g_dbus_client_new(DBusConnection *connection,
const char *service, const char *path);