replace dbus cache property method 09/23409/2
authorGu Chaojie <chao.jie.gu@intel.com>
Wed, 25 Jun 2014 06:23:15 +0000 (14:23 +0800)
committerGu Chaojie <chao.jie.gu@intel.com>
Wed, 25 Jun 2014 06:23:15 +0000 (14:23 +0800)
Change-Id: Ib223243a414d15c77ececb535d573a12998f0d8c
Signed-off-by: Gu Chaojie <chao.jie.gu@intel.com>
include/common.h
lib/bluetooth-service.c
lib/bluez.c
lib/common.c
lib/obex.c

index 9b6beda..e038c83 100644 (file)
@@ -76,23 +76,39 @@ struct simple_reply_data {
 enum bluez_error_type get_error_type(GError *error);
 
 int property_get_boolean(GDBusProxy *proxy,
+                               const char *interface_name,
                                const char *property,
                                gboolean *value);
 char *property_get_string(GDBusProxy *proxy,
+                               const char *interface_name,
                                const char *property);
 int property_get_int16(GDBusProxy *proxy,
+                               const char *interface_name,
                                const char *property,
                                gint16 *value);
 int property_get_uint32(GDBusProxy *proxy,
+                               const char *interface_name,
                                const char *property,
                                guint32 *u32);
 int property_get_uint64(GDBusProxy *proxy,
+                               const char *interface_name,
                                const char *property,
                                guint64 *u64);
 
 char **property_get_string_list(GDBusProxy *proxy,
+                               const char *interface_name,
                                const char *property);
 
+void property_set_string(GDBusProxy *proxy,
+                               const char *interface_name,
+                               const char *property,
+                               const char *str);
+
+void property_set_uint64(GDBusProxy *proxy,
+                               const char *interface_name,
+                               const char *property,
+                               guint64 u64);
+
 void simple_reply_callback(GObject *source_object,
                                GAsyncResult *res,
                                gpointer user_data);
index 09ea143..86318c6 100644 (file)
@@ -51,6 +51,7 @@ struct _comms_manager {
        char *object_path;
        GDBusInterface *interface;
        GDBusProxy *proxy;
+       GDBusProxy *property_proxy;
        struct _comms_object *parent;
 };
 
@@ -58,6 +59,7 @@ struct _proxy {
        char *interface_name;
        GDBusInterface *interface;
        GDBusProxy *proxy;
+       GDBusProxy *property_proxy;
 };
 
 struct _comms_bluetooth {
@@ -130,6 +132,7 @@ static void free_comms_manager(struct _comms_manager *manager)
        g_free(manager->object_path);
        g_object_unref(manager->interface);
        g_object_unref(manager->proxy);
+       g_object_unref(manager->property_proxy);
        g_free(manager);
 }
 
@@ -213,6 +216,25 @@ static inline int get_proxy(struct _proxy *proxy,
 
        DBG("proxy %p", proxy->proxy);
 
+       proxy->property_proxy = g_dbus_proxy_new_for_bus_sync((is_system ?
+                                                       G_BUS_TYPE_SYSTEM :
+                                                       G_BUS_TYPE_SESSION),
+                                                       0,
+                                                       NULL,
+                                                       object->service_name,
+                                                       object->path_name,
+                                                       PROPERTIES_INTERFACE,
+                                                       NULL, NULL);
+       if (proxy->proxy == NULL) {
+               g_object_unref(proxy->interface);
+               proxy->interface = NULL;
+               g_free(proxy->interface_name);
+               proxy->interface_name = NULL;
+               return -1;
+       }
+
+       DBG("property proxy %p", proxy->property_proxy);
+
        return 0;
 }
 
@@ -223,6 +245,9 @@ static void free_proxy(struct _proxy *proxy)
                g_object_unref(proxy->interface);
        if (proxy->proxy)
                g_object_unref(proxy->proxy);
+       if (proxy->property_proxy)
+               g_object_unref(proxy->proxy);
+
 }
 
 void free_comms_bluetooth(struct _comms_bluetooth *bluetooth)
@@ -386,21 +411,35 @@ static void parse_comms_manager(gpointer data, gpointer user_data)
        struct _comms_manager *manager = user_data;
        GDBusInterface *interface = data;
        GDBusProxy *proxy = G_DBUS_PROXY(interface);
-       gchar *iface_name;
+       GDBusProxy *properties_proxy;
+       gchar *iface_name, *path;
 
        if (!manager) {
                WARN("no manager");
                return;
        }
 
+       path = g_dbus_proxy_get_object_path(proxy);
+
        iface_name = g_strdup(g_dbus_proxy_get_interface_name(proxy));
        DBG("%s", iface_name);
 
        if (g_strcmp0(iface_name, COMMS_MANAGER_INTERFACE))
                return;
 
+       properties_proxy = g_dbus_proxy_new_for_bus_sync(
+                                               G_BUS_TYPE_SYSTEM, 0,
+                                               NULL,
+                                               COMMS_SERVICE_NAME,
+                                               path,
+                                               PROPERTIES_INTERFACE,
+                                               NULL, NULL);
+       if (properties_proxy == NULL)
+               WARN("create properties proxy error");
+
        manager->interface = g_object_ref(interface);
        manager->proxy = g_object_ref(proxy);
+       manager->property_proxy = properties_proxy;
 
        g_signal_connect(proxy, "g-properties-changed",
                        G_CALLBACK(manager_properties_changed), NULL);
@@ -679,8 +718,8 @@ int comms_manager_get_property_bt_in_service(gboolean *in_service)
        if (this_manager == NULL)
                return -1;
 
-       return property_get_boolean(this_manager->proxy,
-                               "BluetoothInService", in_service);
+       return property_get_boolean(this_manager->property_proxy,
+               COMMS_MANAGER_INTERFACE, "BluetoothInService", in_service);
 }
 
 void comms_bluetooth_device_pair(const char *address,
index bc43316..0394ab5 100644 (file)
@@ -95,6 +95,7 @@ struct _bluez_adapter {
        GDBusProxy *proxy;
        GDBusProxy *media_proxy;
        GDBusProxy *netserver_proxy;
+       GDBusProxy *property_proxy;
        struct _bluez_object *parent;
        struct _device_head *device_head;
        bluez_adapter_powered_cb_t powered_cb;
@@ -138,6 +139,7 @@ struct _bluez_device {
        GDBusInterface *input_interface;
        GDBusInterface *hdp_interface;
        GDBusProxy *proxy;
+       GDBusProxy *property_proxy;
        GDBusProxy *control_proxy;
        GDBusProxy *network_proxy;
        GDBusProxy *input_proxy;
@@ -386,7 +388,7 @@ static void parse_bluez_adapter_interfaces(gpointer data, gpointer user_data)
        struct _bluez_adapter *adapter = user_data;
        GDBusInterface *interface = data;
        GDBusProxy *proxy = G_DBUS_PROXY(interface);
-       GDBusProxy *signal_proxy;
+       GDBusProxy *signal_proxy, *property_proxy;
        const gchar *iface_name, *adapter_path;
 
        if (!adapter) {
@@ -394,14 +396,24 @@ static void parse_bluez_adapter_interfaces(gpointer data, gpointer user_data)
                return;
        }
 
+       adapter_path = g_dbus_proxy_get_object_path(proxy);
+
        iface_name = g_dbus_proxy_get_interface_name(proxy);
        DBG("%s", iface_name);
 
        if (g_strcmp0(iface_name, ADAPTER_INTERFACE) == 0) {
+               property_proxy = g_dbus_proxy_new_for_bus_sync(
+                                               G_BUS_TYPE_SYSTEM, 0,
+                                               NULL,
+                                               BLUEZ_NAME,
+                                               adapter_path,
+                                               PROPERTIES_INTERFACE,
+                                               NULL, NULL);
+
                DBG("adapter->proxy = proxy");
                adapter->interface = interface;
                adapter->proxy = proxy;
-
+               adapter->property_proxy = property_proxy;
                g_signal_connect(proxy, "g-properties-changed",
                        G_CALLBACK(adapter_properties_changed), adapter);
        } else if (g_strcmp0(iface_name, MEDIA_INTERFACE) == 0) {
@@ -410,8 +422,6 @@ static void parse_bluez_adapter_interfaces(gpointer data, gpointer user_data)
                adapter->media_proxy = proxy;
        } else if (g_strcmp0(iface_name,
                                NETWORKSERVER_INTERFACES) == 0) {
-               adapter_path = g_dbus_proxy_get_object_path(proxy);
-
                signal_proxy = g_dbus_proxy_new_for_bus_sync(
                                                G_BUS_TYPE_SYSTEM, 0,
                                                NULL,
@@ -743,20 +753,31 @@ static void parse_bluez_device_interfaces(gpointer data, gpointer user_data)
        struct _bluez_device *device = user_data;
        GDBusInterface *interface = data;
        GDBusProxy *proxy = G_DBUS_PROXY(interface);
-       GDBusProxy *signal_proxy;
+       GDBusProxy *signal_proxy, *property_proxy;
        const gchar *iface_name, *path;
 
        if (!device) {
-               WARN("no adapter");
+               WARN("no device");
                return;
        }
 
+       path = g_dbus_proxy_get_object_path(proxy);
+
        iface_name = g_dbus_proxy_get_interface_name(proxy);
        DBG("%s", iface_name);
 
        if (g_strcmp0(iface_name, DEVICE_INTERFACE) == 0) {
+               property_proxy = g_dbus_proxy_new_for_bus_sync(
+                                       G_BUS_TYPE_SYSTEM, 0,
+                                       NULL,
+                                       BLUEZ_NAME,
+                                       path,
+                                       PROPERTIES_INTERFACE,
+                                       NULL, NULL);
+
                device->interface = interface;
                device->proxy = proxy;
+               device->property_proxy = property_proxy;
                g_signal_connect(proxy, "g-properties-changed",
                        G_CALLBACK(device_properties_changed), device);
        } else if (g_strcmp0(iface_name, MEDIACONTROL_INTERFACE) == 0) {
@@ -770,8 +791,6 @@ static void parse_bluez_device_interfaces(gpointer data, gpointer user_data)
                g_signal_connect(proxy, "g-properties-changed",
                        G_CALLBACK(network_properties_changed), device);
        } else if (g_strcmp0(iface_name, HDP_DEVICE_INTERFACE) == 0) {
-               path = g_dbus_proxy_get_object_path(proxy);
-
                DBG("hdp path = %s", path);
 
                g_signal_connect(proxy, "g-properties-changed",
@@ -803,7 +822,8 @@ static void parse_bluez_control_interfaces(gpointer data, gpointer user_data)
        struct _bluez_object *object = user_data;
        GDBusInterface *interface = data;
        GDBusProxy *proxy = G_DBUS_PROXY(interface);
-       const gchar *iface_name;
+       GDBusProxy *property_proxy;
+       const gchar *iface_name, *path;
 
        iface_name = g_dbus_proxy_get_interface_name(proxy);
        DBG("%s", iface_name);
@@ -813,11 +833,22 @@ static void parse_bluez_control_interfaces(gpointer data, gpointer user_data)
                gchar *device_path;
                bt_audio_profile_type_e type;
 
+               path = g_dbus_proxy_get_object_path(proxy);
+
+               property_proxy = g_dbus_proxy_new_for_bus_sync(
+                                               G_BUS_TYPE_SYSTEM, 0,
+                                               NULL,
+                                               BLUEZ_NAME,
+                                               path,
+                                               PROPERTIES_INTERFACE,
+                                               NULL, NULL);
+
                device_address = g_malloc0(BT_ADDRESS_STRING_SIZE);
                if (device_address == NULL)
                        return;
 
-               device_path = property_get_string(proxy, "Device");
+               device_path = property_get_string(property_proxy,
+                               MEDIATRANSPORT_INTERFACE, "Device");
                if (device_path == NULL) {
                        DBG("device_path == NULL");
                        g_free(device_address);
@@ -827,7 +858,8 @@ static void parse_bluez_control_interfaces(gpointer data, gpointer user_data)
                convert_device_path_to_address((const gchar *)device_path,
                                                        device_address);
 
-               uuid = property_get_string(proxy, "UUID");
+               uuid = property_get_string(property_proxy,
+                               MEDIATRANSPORT_INTERFACE, "UUID");
                if (uuid == NULL) {
                        g_free(device_address);
                        g_free(device_path);
@@ -856,7 +888,8 @@ static void parse_bluez_control_interfaces(gpointer data, gpointer user_data)
 
 char *bluez_device_property_get_adapter(struct _bluez_device *device)
 {
-       return property_get_string(device->proxy, "Adapter");
+       return property_get_string(device->property_proxy,
+                                       DEVICE_INTERFACE, "Adapter");
 }
 
 static void free_bluez_device(gpointer data)
@@ -885,6 +918,8 @@ static void free_bluez_device(gpointer data)
                g_object_unref(device->network_interface);
        if (device->network_proxy)
                g_object_unref(device->network_proxy);
+       if (device->property_proxy)
+               g_object_unref(device->property_proxy);
 
        g_free(device);
 }
@@ -1331,6 +1366,7 @@ static void destruct_bluez_adapter(gpointer data)
        g_object_unref(adapter->media_interface);
        g_object_unref(adapter->netserver_proxy);
        g_object_unref(adapter->netserver_interface);
+       g_object_unref(adapter->property_proxy);
        g_object_unref(adapter->proxy);
 
        g_free(adapter);
@@ -1669,7 +1705,8 @@ void bluez_adapter_stop_discovery(struct _bluez_adapter *adapter)
 int bluez_adapter_get_property_powered(struct _bluez_adapter *adapter,
                                                gboolean *powered)
 {
-       return property_get_boolean(adapter->proxy, "Powered", powered);
+       return property_get_boolean(adapter->property_proxy, ADAPTER_INTERFACE,
+                                       "Powered", powered);
 }
 
 void bluez_adapter_set_powered_changed_cb(struct _bluez_adapter *adapter,
@@ -1778,7 +1815,8 @@ void bluez_adapter_unset_device_discovering_cb(struct _bluez_adapter *adapter)
 
 char *bluez_adapter_get_property_alias(struct _bluez_adapter *adapter)
 {
-       return property_get_string(adapter->proxy, "Alias");
+       return property_get_string(adapter->property_proxy,
+                                       ADAPTER_INTERFACE, "Alias");
 }
 
 void bluez_adapter_set_alias_changed_cb(struct _bluez_adapter *adapter,
@@ -1797,33 +1835,36 @@ void bluez_adapter_unset_alias_changed_cb(struct _bluez_adapter *adapter)
 
 char *bluez_adapter_get_property_address(struct _bluez_adapter *adapter)
 {
-       return property_get_string(adapter->proxy, "Address");
+       return property_get_string(adapter->property_proxy,
+                                       ADAPTER_INTERFACE, "Address");
 }
 
 int bluez_adapter_get_property_discoverable(struct _bluez_adapter *adapter,
                                                gboolean *discoverable)
 {
-       return property_get_boolean(adapter->proxy, "Discoverable", discoverable);
+       return property_get_boolean(adapter->property_proxy, ADAPTER_INTERFACE,
+                               "Discoverable", discoverable);
 }
 
 int bluez_adapter_get_property_discoverable_timeout(
                                struct _bluez_adapter *adapter,
                                guint32 *time)
 {
-       return property_get_uint32(adapter->proxy,
+       return property_get_uint32(adapter->property_proxy, ADAPTER_INTERFACE,
                                "DiscoverableTimeout", time);
 }
 
 int bluez_adapter_get_property_discovering(struct _bluez_adapter *adapter,
                                                gboolean *discovering)
 {
-       return property_get_boolean(adapter->proxy,
+       return property_get_boolean(adapter->property_proxy, ADAPTER_INTERFACE,
                                        "Discovering", discovering);
 }
 
 char **bluez_adapter_get_property_uuids(struct _bluez_adapter *adapter)
 {
-       return property_get_string_list(adapter->proxy, "UUIDs");
+       return property_get_string_list(adapter->property_proxy,
+                                               ADAPTER_INTERFACE, "UUIDs");
 }
 
 static gchar *address_to_path(const gchar *prefix, const gchar *address)
@@ -1978,7 +2019,8 @@ void bluez_device_network_unset_connected_changed_cb(
 int bluez_device_network_get_property_connected(struct _bluez_device *device,
                                                gboolean *connected)
 {
-       return property_get_boolean(device->network_proxy, "Connected", connected);
+       return property_get_boolean(device->property_proxy, NETWORK_INTERFACE,
+                                       "Connected", connected);
 }
 
 void bluez_device_input_set_connected_changed_cb(
@@ -2002,8 +2044,8 @@ void bluez_device_input_unset_connected_changed_cb(
 int bluez_device_input_get_property_connected(struct _bluez_device *device,
                                                gboolean *connected)
 {
-       return property_get_boolean(device->input_proxy,
-                                       "Connected", connected);
+       return property_get_boolean(device->property_proxy,
+                       INPUT_INTERFACE, "Connected", connected);
 }
 
 void bluez_device_set_paired_changed_cb(struct _bluez_device *device,
@@ -2076,52 +2118,61 @@ void bluez_device_set_alias(struct _bluez_device *device,
 
 char **bluez_device_get_property_uuids(struct _bluez_device *device)
 {
-       return property_get_string_list(device->proxy, "UUIDs");
+       return property_get_string_list(device->property_proxy,
+                                       DEVICE_INTERFACE, "UUIDs");
 }
 
 char *bluez_device_get_property_address(struct _bluez_device *device)
 {
-       return property_get_string(device->proxy, "Address");
+       return property_get_string(device->property_proxy,
+                                       DEVICE_INTERFACE, "Address");
 }
 
 char *bluez_device_get_property_alias(struct _bluez_device *device)
 {
-       return property_get_string(device->proxy, "Alias");
+       return property_get_string(device->property_proxy,
+                                       DEVICE_INTERFACE, "Alias");
 }
 
 int bluez_device_get_property_class(struct _bluez_device *device,
                                        guint32 *class)
 {
-       return property_get_uint32(device->proxy, "Class", class);
+       return property_get_uint32(device->property_proxy,
+                               DEVICE_INTERFACE, "Class", class);
 }
 
 int bluez_device_get_property_paired(struct _bluez_device *device,
                                        gboolean *paired)
 {
-       return property_get_boolean(device->proxy, "Paired", paired);
+       return property_get_boolean(device->property_proxy, DEVICE_INTERFACE,
+                                               "Paired", paired);
 }
 
 int bluez_device_get_property_trusted(struct _bluez_device *device,
                                        gboolean *trusted)
 {
-       return property_get_boolean(device->proxy, "Trusted", trusted);
+       return property_get_boolean(device->property_proxy, DEVICE_INTERFACE,
+                                               "Trusted", trusted);
 }
 
 int bluez_device_get_property_connected(struct _bluez_device *device,
                                        gboolean *connected)
 {
-       return property_get_boolean(device->proxy, "Connected", connected);
+       return property_get_boolean(device->property_proxy, DEVICE_INTERFACE,
+                                               "Connected", connected);
 }
 
 int bluez_device_get_property_rssi(struct _bluez_device *device,
                                        gint16 *rssi)
 {
-       return property_get_int16(device->proxy, "RSSI", rssi);
+       return property_get_int16(device->property_proxy, DEVICE_INTERFACE,
+                                       "RSSI", rssi);
 }
 
 char *bluez_device_get_property_icon(struct _bluez_device *device)
 {
-       return property_get_string(device->proxy, "Icon");
+       return property_get_string(device->property_proxy, DEVICE_INTERFACE,
+                                       "Icon");
 }
 
 struct profile_connect_state_notify {
index 85aaa94..7e688dc 100644 (file)
@@ -59,17 +59,25 @@ enum bluez_error_type get_error_type(GError *error)
        return ERROR_NONE;
 }
 int property_get_boolean(GDBusProxy *proxy,
-                                       const char *property,
-                                       gboolean *value)
+                               const char *interface_name,
+                               const char *property,
+                               gboolean *value)
 {
-       GVariant *bool_v;
+       GVariant *bool_v, *bool_vv;
+       GError *error = NULL;
 
-       bool_v = g_dbus_proxy_get_cached_property(proxy, property);
-       if (bool_v == NULL) {
+       bool_vv = g_dbus_proxy_call_sync(
+                       proxy, "Get",
+                       g_variant_new("(ss)", interface_name, property),
+                       0, -1, NULL, &error);
+
+       if (bool_vv == NULL) {
                WARN("no cached property %s", property);
                return -1;
        }
 
+       g_variant_get(bool_vv, "(v)", &bool_v);
+
        *value = g_variant_get_boolean(bool_v);
 
        g_variant_unref(bool_v);
@@ -78,17 +86,25 @@ int property_get_boolean(GDBusProxy *proxy,
 }
 
 char *property_get_string(GDBusProxy *proxy,
-                                       const char *property)
+                               const char *interface_name,
+                               const char *property)
 {
-       GVariant *string_v;
+       GVariant *string_v, *string_vv;
        char *string;
+       GError *error = NULL;
+
+       string_vv = g_dbus_proxy_call_sync(
+                       proxy, "Get",
+                       g_variant_new("(ss)", interface_name, property),
+                       0, -1, NULL, &error);
 
-       string_v = g_dbus_proxy_get_cached_property(proxy, property);
-       if (string_v == NULL) {
+       if (string_vv == NULL) {
                WARN("no cached property %s", property);
                return NULL;
        }
 
+       g_variant_get(string_vv, "(v)", &string_v);
+
        string = g_variant_dup_string(string_v, NULL);
 
        g_variant_unref(string_v);
@@ -97,17 +113,25 @@ char *property_get_string(GDBusProxy *proxy,
 }
 
 int property_get_int16(GDBusProxy *proxy,
-                                       const char *property,
-                                       gint16 *value)
+                               const char *interface_name,
+                               const char *property,
+                               gint16 *value)
 {
-       GVariant *int16_v;
+       GVariant *int16_v, *int16_vv;
+       GError *error = NULL;
 
-       int16_v = g_dbus_proxy_get_cached_property(proxy, property);
-       if (int16_v == NULL) {
+       int16_vv = g_dbus_proxy_call_sync(
+                       proxy, "Get",
+                       g_variant_new("(ss)", interface_name, property),
+                       0, -1, NULL, &error);
+
+       if (int16_vv == NULL) {
                WARN("no cached property %s", property);
                return -1;
        }
 
+       g_variant_get(int16_vv, "(v)", &int16_v);
+
        *value = g_variant_get_int16(int16_v);
 
        g_variant_unref(int16_v);
@@ -116,17 +140,24 @@ int property_get_int16(GDBusProxy *proxy,
 }
 
 int property_get_uint32(GDBusProxy *proxy,
-                                       const char *property,
-                                       guint32 *u32)
+                               const char *interface_name,
+                               const char *property,
+                               guint32 *u32)
 {
-       GVariant *u32_v;
+       GVariant *u32_v, *u32_vv;
+       GError *error = NULL;
 
-       u32_v = g_dbus_proxy_get_cached_property(proxy, property);
-       if (u32_v == NULL) {
+       u32_vv = g_dbus_proxy_call_sync(
+                       proxy, "Get",
+                       g_variant_new("(ss)", interface_name, property),
+                       0, -1, NULL, &error);
+       if (u32_vv == NULL) {
                WARN("no cached property %s", property);
                return -1;
        }
 
+       g_variant_get(u32_vv, "(v)", &u32_v);
+
        *u32 = g_variant_get_uint32(u32_v);
 
        g_variant_unref(u32_v);
@@ -135,17 +166,24 @@ int property_get_uint32(GDBusProxy *proxy,
 }
 
 int property_get_uint64(GDBusProxy *proxy,
-                                       const char *property,
-                                       guint64 *u64)
+                               const char *interface_name,
+                               const char *property,
+                               guint64 *u64)
 {
-       GVariant *u64_v;
+       GVariant *u64_v, *u64_vv;
+       GError *error = NULL;
 
-       u64_v = g_dbus_proxy_get_cached_property(proxy, property);
-       if (u64_v == NULL) {
+       u64_vv = g_dbus_proxy_call_sync(
+                       proxy, "Get",
+                       g_variant_new("(ss)", interface_name, property),
+                       0, -1, NULL, &error);
+       if (u64_vv == NULL) {
                WARN("no cached property %s", property);
                return -1;
        }
 
+       g_variant_get(u64_vv, "(v)", &u64_v);
+
        *u64 = g_variant_get_uint64(u64_v);
 
        g_variant_unref(u64_v);
@@ -154,36 +192,58 @@ int property_get_uint64(GDBusProxy *proxy,
 }
 
 char **property_get_string_list(GDBusProxy *proxy,
+                                       const char *interface_name,
                                        const char *property)
 {
-       GVariant *strv_v;
+       GVariant *strv_v, *strv_vv;
        char **strv;
+       GError *error = NULL;
 
-       strv_v = g_dbus_proxy_get_cached_property(proxy, property);
-       if (strv_v == NULL) {
+       strv_vv = g_dbus_proxy_call_sync(
+                       proxy, "Get",
+                       g_variant_new("(ss)", interface_name, property),
+                       0, -1, NULL, &error);
+
+       if (strv_vv == NULL) {
                WARN("no cached property %s", property);
                return NULL;
        }
 
+       g_variant_get(strv_vv, "(v)", &strv_v);
+
        strv = g_variant_dup_strv(strv_v, NULL);
 
        return strv;
 }
 
 void property_set_string(GDBusProxy *proxy,
+                                       const char *interface_name,
                                        const char *property,
                                        const char *str)
 {
-       g_dbus_proxy_set_cached_property(proxy, property,
-                               g_variant_new("s", str));
+       GError *error = NULL;
+       GVariant *val = g_variant_new("s", str);
+       GVariant *parameters = g_variant_new("(ssv)",
+               interface_name, property, val);
+
+       g_dbus_proxy_call_sync(
+                       proxy, "Set", parameters,
+                       0, -1, NULL, &error);
 }
 
 void property_set_uint64(GDBusProxy *proxy,
+                                       const char *interface_name,
                                        const char *property,
                                        guint64 u64)
 {
-       g_dbus_proxy_set_cached_property(proxy, property,
-                               g_variant_new("t", u64));
+       GError *error = NULL;
+       GVariant *val = g_variant_new("t", u64);
+       GVariant *parameters = g_variant_new("(ssv)",
+                               interface_name, property, val);
+
+       g_dbus_proxy_call_sync(
+                       proxy, "Set", parameters,
+                       0, -1, NULL, &error);
 }
 
 void convert_device_path_to_address(const gchar *device_path,
index 32b1d93..a0f8feb 100644 (file)
@@ -82,6 +82,7 @@ struct _proxy {
        char *interface_name;
        GDBusInterface *interface;
        GDBusProxy *proxy;
+       GDBusProxy *property_proxy;
 };
 
 /*
@@ -527,22 +528,6 @@ static inline const char *get_session_interface_name(enum obex_target target)
        return NULL;
 }
 
-static inline void property_set_uint64(GDBusProxy *proxy,
-                                               const char *property,
-                                               guint64 u64)
-{
-       g_dbus_proxy_set_cached_property(proxy, property,
-                               g_variant_new("t", u64));
-}
-
-static inline void property_set_string(GDBusProxy *proxy,
-                                               const char *property,
-                                               const char *str)
-{
-       g_dbus_proxy_set_cached_property(proxy, property,
-                               g_variant_new("s", str));
-}
-
 gchar *obex_session_property_get_destination(struct _obex_session *session)
 {
        GVariant *dest_vv, *dest_v;
@@ -579,8 +564,8 @@ gchar *obex_session_property_get_source(struct _obex_session *session)
        if (session == NULL)
                return NULL;
 
-       return property_get_string(session->session_proxy.proxy,
-                                       "Source");
+       return property_get_string(session->session_proxy.property_proxy,
+                       OBEX_TRANSFER_INTERFACE, "Source");
 }
 
 gchar *obex_session_property_get_target_uuid(struct _obex_session *session)
@@ -588,8 +573,8 @@ gchar *obex_session_property_get_target_uuid(struct _obex_session *session)
        if (session == NULL)
                return NULL;
 
-       return property_get_string(session->session_proxy.proxy,
-                                       "Target");
+       return property_get_string(session->session_proxy.property_proxy,
+                       OBEX_TRANSFER_INTERFACE, "Target");
 }
 
 static inline enum obex_target target_uuid_to_target(const char *target_uuid)
@@ -682,6 +667,9 @@ static void free_proxy(struct _proxy *proxy)
                g_object_unref(proxy->interface);
        if (proxy->proxy)
                g_object_unref(proxy->proxy);
+       if (proxy->property_proxy)
+               g_object_unref(proxy->property_proxy);
+
 }
 
 static GList *session_notify_list;
@@ -841,7 +829,8 @@ struct _obex_session *obex_session_get_session_from_path(const char *path)
 
 gchar *obex_transfer_property_get_session_path(struct _obex_transfer *transfer)
 {
-       return property_get_string(transfer->proxy.proxy, "Session");
+       return property_get_string(transfer->proxy.property_proxy,
+                                       OBEX_TRANSFER_INTERFACE, "Session");
 }
 
 static GList *transfer_notify_list;
@@ -983,7 +972,8 @@ static enum transfer_state get_transfer_state_from_string(const char *string)
 enum transfer_state obex_transfer_property_get_state(
                                struct _obex_transfer *transfer)
 {
-       char *status = property_get_string(transfer->proxy.proxy, "Status");
+       char *status = property_get_string(transfer->proxy.property_proxy,
+                               OBEX_TRANSFER_INTERFACE, "Status");
 
        return get_transfer_state_from_string(status);
 }
@@ -992,26 +982,30 @@ int obex_transfer_property_get_transferred(
                                struct _obex_transfer *transfer,
                                guint64 *u64)
 {
-       return property_get_uint64(transfer->proxy.proxy, "Transferred", u64);
+       return property_get_uint64(transfer->proxy.property_proxy,
+                       OBEX_TRANSFER_INTERFACE, "Transferred", u64);
 }
 
 int obex_transfer_property_get_size(
                                struct _obex_transfer *transfer,
                                guint64 *u64)
 {
-       return property_get_uint64(transfer->proxy.proxy, "Size", u64);
+       return property_get_uint64(transfer->proxy.property_proxy,
+                               OBEX_TRANSFER_INTERFACE, "Size", u64);
 }
 
 void obex_transfer_set_property_name(struct _obex_transfer *transfer,
                                                        const char *name)
 {
-       property_set_string(transfer->proxy.proxy, "Name", name);
+       property_set_string(transfer->proxy.property_proxy,
+                               OBEX_TRANSFER_INTERFACE, "Name", name);
 }
 
 void obex_transfer_set_property_size(struct _obex_transfer *transfer,
                                                        guint64 size)
 {
-       property_set_uint64(transfer->proxy.proxy, "Size", size);
+       property_set_uint64(transfer->proxy.property_proxy,
+                               OBEX_TRANSFER_INTERFACE, "Size", size);
 }
 
 static struct _transfer_notify *create_transfer_notify(
@@ -1919,13 +1913,15 @@ char *obex_transfer_get_property_destination(struct _obex_transfer *transfer)
 
 char *obex_transfer_get_property_file_name(struct _obex_transfer *transfer)
 {
-       return property_get_string(transfer->proxy.proxy, "Filename");
+       return property_get_string(transfer->proxy.property_proxy,
+                       OBEX_TRANSFER_INTERFACE, "Filename");
 }
 
 char *obex_transfer_get_property_name(struct _obex_transfer *transfer)
 {
 
-       return property_get_string(transfer->proxy.proxy, "Name");
+       return property_get_string(transfer->proxy.property_proxy,
+                       OBEX_TRANSFER_INTERFACE, "Name");
 }
 
 char *obex_transfer_get_name(struct _obex_transfer *transfer)