Change 'ay' to 'a(y)' to avoid null character problem at ZDO bind manager
authorsaerome kim <saerome.kim@samsung.com>
Mon, 6 Feb 2017 00:21:26 +0000 (09:21 +0900)
committersaerome.kim <saerome.kim@samsung.com>
Thu, 11 May 2017 09:07:20 +0000 (18:07 +0900)
 - change timeout unit from milli second to second in zbl_dbus_get_timeout()

Change-Id: Ie44722d7e7092eadab16d5bab482ebb531927066
Signed-off-by: saerome kim <saerome.kim@samsung.com>
lib/zbl-dbus.c

index 5e6385ea681ad29f5e29e5496d5890caebf10d26..10b91ac86fa1b740a2cf03335f1046072413c115 100644 (file)
@@ -4027,8 +4027,14 @@ int zbl_bind_req(nwk_addr dst_addr16, ieee_addr src_addr64,
                unsigned char type, nwk_addr group_addr, unsigned char dst_ep,
                zb_zdo_bind_rsp cb, void *user_data)
 {
+       int i;
        int sub_id, to;
        zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GError *dbus_err = NULL;
+       GVariant *variant = NULL;
+
        GVariantBuilder *src_addr64_builder = NULL;
        GVariant* src_addr64_variant = NULL;
        GVariantBuilder *dst_addr64_builder = NULL;
@@ -4058,41 +4064,39 @@ int zbl_bind_req(nwk_addr dst_addr16, ieee_addr src_addr64,
        container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
        container->userdata = user_data;
 
-       src_addr64_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
+       src_addr64_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
 
        if (src_addr64) {
-               g_variant_builder_add(src_addr64_builder, "y", src_addr64[7]);
-               g_variant_builder_add(src_addr64_builder, "y", src_addr64[6]);
-               g_variant_builder_add(src_addr64_builder, "y", src_addr64[5]);
-               g_variant_builder_add(src_addr64_builder, "y", src_addr64[4]);
-               g_variant_builder_add(src_addr64_builder, "y", src_addr64[3]);
-               g_variant_builder_add(src_addr64_builder, "y", src_addr64[2]);
-               g_variant_builder_add(src_addr64_builder, "y", src_addr64[1]);
-               g_variant_builder_add(src_addr64_builder, "y", src_addr64[0]);
+               for (i = sizeof(ieee_addr) - 1 ; i >= 0; i--)
+                       g_variant_builder_add(src_addr64_builder, "(y)", src_addr64[i]);
        }
        src_addr64_variant = g_variant_builder_end(src_addr64_builder);
        g_variant_builder_unref(src_addr64_builder);
 
-       dst_addr64_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
+       dst_addr64_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
        if (dst_addr64) {
-               g_variant_builder_add(dst_addr64_builder, "y", dst_addr64[7]);
-               g_variant_builder_add(dst_addr64_builder, "y", dst_addr64[6]);
-               g_variant_builder_add(dst_addr64_builder, "y", dst_addr64[5]);
-               g_variant_builder_add(dst_addr64_builder, "y", dst_addr64[4]);
-               g_variant_builder_add(dst_addr64_builder, "y", dst_addr64[3]);
-               g_variant_builder_add(dst_addr64_builder, "y", dst_addr64[2]);
-               g_variant_builder_add(dst_addr64_builder, "y", dst_addr64[1]);
-               g_variant_builder_add(dst_addr64_builder, "y", dst_addr64[0]);
+               for (i = sizeof(ieee_addr) - 1 ; i >= 0; i--)
+                       g_variant_builder_add(dst_addr64_builder, "(y)", dst_addr64[i]);
        }
        dst_addr64_variant = g_variant_builder_end(dst_addr64_builder);
        g_variant_builder_unref(dst_addr64_builder);
 
-       g_dbus_proxy_call(zdo_bind_proxy, "bind_req",
-               g_variant_new("(q@ayyq@ayyqy)", dst_addr16, src_addr64_variant, src_ep,
+       variant = g_dbus_proxy_call_sync(zdo_bind_proxy, "bind_req",
+               g_variant_new("(q@a(y)yq@a(y)yqy)", dst_addr16, src_addr64_variant, src_ep,
                                                cluster_id, dst_addr64_variant, type, group_addr, dst_ep),
-               G_DBUS_CALL_FLAGS_NONE, to, NULL, NULL, container);
+               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
 
-       return ZIGBEE_ERROR_NONE;
+       if (variant) {
+               g_variant_get(variant, "(i)", &result);
+               DBG("ret = [0x%x]", result);
+               g_variant_unref(variant);
+       } else {
+               ERR("Failed to get device_annce [%s]", dbus_err->message);
+               g_error_free(dbus_err);
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
+
+       return result;
 }
 
 int zbl_unbind_req(nwk_addr dst_addr16,
@@ -4100,8 +4104,14 @@ int zbl_unbind_req(nwk_addr dst_addr16,
                ieee_addr dst_addr64, unsigned char type, nwk_addr group_addr,
                unsigned char dst_ep, zb_zdo_unbind_rsp cb, void *user_data)
 {
+       int i;
        int sub_id, to;
        zbl_req_cb_s *container;
+
+       int result = ZIGBEE_ERROR_NONE;
+       GError *dbus_err = NULL;
+       GVariant *variant = NULL;
+
        GVariantBuilder *src_addr64_builder = NULL;
        GVariant* src_addr64_variant = NULL;
        GVariantBuilder *dst_addr64_builder = NULL;
@@ -4131,40 +4141,37 @@ int zbl_unbind_req(nwk_addr dst_addr16,
        container->tid = g_timeout_add_seconds(to, _zbl_timeout_cb, container);
        container->userdata = user_data;
 
-       src_addr64_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
+       src_addr64_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
        if (src_addr64) {
-               g_variant_builder_add(src_addr64_builder, "y", src_addr64[7]);
-               g_variant_builder_add(src_addr64_builder, "y", src_addr64[6]);
-               g_variant_builder_add(src_addr64_builder, "y", src_addr64[5]);
-               g_variant_builder_add(src_addr64_builder, "y", src_addr64[4]);
-               g_variant_builder_add(src_addr64_builder, "y", src_addr64[3]);
-               g_variant_builder_add(src_addr64_builder, "y", src_addr64[2]);
-               g_variant_builder_add(src_addr64_builder, "y", src_addr64[1]);
-               g_variant_builder_add(src_addr64_builder, "y", src_addr64[0]);
+               for (i = sizeof(ieee_addr) - 1 ; i >= 0; i--)
+                       g_variant_builder_add(src_addr64_builder, "(y)", src_addr64[i]);
        }
        src_addr64_variant = g_variant_builder_end(src_addr64_builder);
        g_variant_builder_unref(src_addr64_builder);
 
-       dst_addr64_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
+       dst_addr64_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
        if (dst_addr64) {
-               g_variant_builder_add(dst_addr64_builder, "y", dst_addr64[7]);
-               g_variant_builder_add(dst_addr64_builder, "y", dst_addr64[6]);
-               g_variant_builder_add(dst_addr64_builder, "y", dst_addr64[5]);
-               g_variant_builder_add(dst_addr64_builder, "y", dst_addr64[4]);
-               g_variant_builder_add(dst_addr64_builder, "y", dst_addr64[3]);
-               g_variant_builder_add(dst_addr64_builder, "y", dst_addr64[2]);
-               g_variant_builder_add(dst_addr64_builder, "y", dst_addr64[1]);
-               g_variant_builder_add(dst_addr64_builder, "y", dst_addr64[0]);
+               for (i = sizeof(ieee_addr) - 1 ; i >= 0; i--)
+                       g_variant_builder_add(dst_addr64_builder, "(y)", dst_addr64[i]);
        }
        dst_addr64_variant = g_variant_builder_end(dst_addr64_builder);
        g_variant_builder_unref(dst_addr64_builder);
 
-       g_dbus_proxy_call(zdo_bind_proxy, "unbind_req",
-               g_variant_new("(q@ayyq@ayyqy)", dst_addr16, src_addr64_variant, src_ep,
+       variant = g_dbus_proxy_call_sync(zdo_bind_proxy, "unbind_req",
+               g_variant_new("(q@a(y)yq@a(y)yqy)", dst_addr16, src_addr64_variant, src_ep,
                                                cluster_id, dst_addr64_variant, type, group_addr, dst_ep),
-               G_DBUS_CALL_FLAGS_NONE, to, NULL, NULL, container);
+               G_DBUS_CALL_FLAGS_NONE, to, NULL, &dbus_err);
+       if (variant) {
+               g_variant_get(variant, "(i)", &result);
+               DBG("ret = [0x%x]", result);
+               g_variant_unref(variant);
+       } else {
+               ERR("Failed to get device_annce [%s]", dbus_err->message);
+               g_error_free(dbus_err);
+               return ZIGBEE_ERROR_IO_ERROR;
+       }
 
-       return ZIGBEE_ERROR_NONE;
+       return result;
 }
 
 int zbl_mgmt_nwk_disc_req(nwk_addr addr16, unsigned int scan_channels,
@@ -7236,6 +7243,6 @@ int zbl_dbus_get_timeout(GDBusProxy *proxy)
                ERR("Invalid timeout (%d)", timeout);
                return ZIGBEE_BROADCAST_TIMEOUT;
        }
-       return timeout/1000;
+       return timeout;
 }