Fix handling GVariant byte array
authorsaerome kim <saerome.kim@samsung.com>
Tue, 31 Jan 2017 03:43:46 +0000 (12:43 +0900)
committersaerome.kim <saerome.kim@samsung.com>
Thu, 11 May 2017 09:07:19 +0000 (18:07 +0900)
- GDbus XML codegen replaces 'ay' variant
  (written XML introspection file)
  into '^ay' variant.
- If there is '0x0' inside of byte array,
  array would be broken. (it acts as a null terminator)

Change-Id: I13eb4e38733eb7ef1c610a11855eef950340b1cb
Signed-off-by: Jiwan Kim <ji-wan.kim@samsung.com>
lib/zbl-dbus.c

index be36bea4aac9375d72c006169fac0f1ad3710829..6c61cf6480fc8a4a008c283949df6cdd3a559d52 100644 (file)
@@ -3011,7 +3011,7 @@ int zbl_get_network_info(ieee_addr addr64, nwk_addr *nodeid, nwk_addr *panid,
                unsigned char *channel, unsigned char *tx_power)
 {
        GVariant *variant = NULL;
-       GVariant *eui64 = NULL;
+       GVariantIter *iter = NULL;
        GError *dbus_err = NULL;
        int result = ZIGBEE_ERROR_NONE;
 
@@ -3030,15 +3030,16 @@ int zbl_get_network_info(ieee_addr addr64, nwk_addr *nodeid, nwk_addr *panid,
                                NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
 
        if (variant) {
-               g_variant_get(variant, "(ia(y)qqyy)", &result, &eui64,
+               g_variant_get(variant, "(ia(y)qqyy)", &result, &iter,
                                &_nodeid, &_panid, &_radio_channel, &_radio_tx_power);
 
                /* Get EUI */
                i = 0;
-               while (g_variant_iter_loop(eui64, "(y)", &value)) {
+               while (g_variant_iter_loop(iter, "(y)", &value)) {
                        addr64[i] = value;
                        i++;
                }
+
                DBG("  Result: [%X]", result);
                DBG("  EUI(%d) : %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", i,
                                addr64[0], addr64[1], addr64[2], addr64[3],
@@ -3056,9 +3057,10 @@ int zbl_get_network_info(ieee_addr addr64, nwk_addr *nodeid, nwk_addr *panid,
                if (tx_power)
                        *tx_power = _radio_tx_power;
 
-               if (eui64)
-                       g_variant_iter_free(eui64);
+               if (iter)
+                       g_variant_iter_free(iter);
                g_variant_unref(variant);
+
        } else {
                ERR("Failed to get_network_info [%s]", dbus_err->message);
                g_error_free(dbus_err);
@@ -3086,11 +3088,13 @@ int zbl_get_controller_mac_address(ieee_addr addr64)
                        NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
 
        if (variant) {
-               g_variant_get(variant, "(ay)", &iter);
-               while (g_variant_iter_loop(iter, "y", &value)) {
+               g_variant_get(variant, "(ia(y))", &result, &iter);
+
+               while (g_variant_iter_loop(iter, "(y)", &value)) {
                        addr64[j] = value;
                        j++;
                }
+
                DBG("IEEE ADDR 0x%02X:0x%02X:0x%02X:0x%02X:0x%02X:0x%02X:0x%02X:0x%02X, Ret=%d ",
                        addr64[0], addr64[1], addr64[2], addr64[3], addr64[4], addr64[5],
                        addr64[6], addr64[7], result);
@@ -3098,6 +3102,7 @@ int zbl_get_controller_mac_address(ieee_addr addr64)
                if (iter)
                        g_variant_iter_free(iter);
                g_variant_unref(variant);
+
                return result;
        }
        else {
@@ -3133,7 +3138,7 @@ int zbl_get_cluster_list(ieee_addr eui64, unsigned char endpoint, unsigned short
        mac_variant = g_variant_builder_end(mac_builder);
        g_variant_builder_unref(mac_builder);
 
-       variant = g_dbus_proxy_call_sync(service_gproxy, "cluster_list",
+       variant = g_dbus_proxy_call_sync(service_gproxy, "get_cluster_list",
                                g_variant_new("(@ayy)", mac_variant, endpoint), G_DBUS_CALL_FLAGS_NONE,
                                -1, NULL, &dbus_err);
 
@@ -3184,8 +3189,8 @@ int zbl_get_endpoint_list(ieee_addr eui64, unsigned char list[], unsigned char *
        mac_variant = g_variant_builder_end(mac_builder);
        g_variant_builder_unref(mac_builder);
 
-       variant = g_dbus_proxy_call_sync(service_gproxy, "endpoint_list",
-               g_variant_new("(@ay)", mac_variant), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+       variant = g_dbus_proxy_call_sync(service_gproxy, "get_endpoint_list",
+                               g_variant_new("(@ay)", mac_variant), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
 
        if (variant) {
                g_variant_get(variant, "(ay)", &iter);
@@ -3238,8 +3243,8 @@ int zbl_api_get_node_type(ieee_addr eui64, unsigned char *node_type)
        mac_variant = g_variant_builder_end(mac_builder);
        g_variant_builder_unref(mac_builder);
 
-       variant = g_dbus_proxy_call_sync(service_gproxy, "node_type", g_variant_new("(@ay)",
-               mac_variant), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
+       variant = g_dbus_proxy_call_sync(service_gproxy, "get_node_type",
+                               g_variant_new("(@ay)", mac_variant), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
 
        if (variant) {
                g_variant_get(variant, "(y)", &n_type);
@@ -3278,7 +3283,7 @@ int zbl_get_all_device_info(zb_end_device_info_h **dev_list, unsigned char* num)
        RETV_IF(NULL == service_gproxy, ZIGBEE_ERROR_IO_ERROR);
 
        /* check the format string when there are no input args */
-       variant = g_dbus_proxy_call_sync(service_gproxy, "device_info",
+       variant = g_dbus_proxy_call_sync(service_gproxy, "get_device_info",
                                NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &dbus_err);
 
        if (variant) {