From: saerome kim Date: Tue, 31 Jan 2017 03:43:46 +0000 (+0900) Subject: Fix handling GVariant byte array X-Git-Tag: submit/tizen/20170512.045637~60 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=08a1c128a8e03bc9a87e49dec836c4b1346263de;p=platform%2Fcore%2Fapi%2Fzigbee.git Fix handling GVariant byte array - 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 --- diff --git a/lib/zbl-dbus.c b/lib/zbl-dbus.c index be36bea..6c61cf6 100644 --- a/lib/zbl-dbus.c +++ b/lib/zbl-dbus.c @@ -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) {