Handle service_spcific_info and match_filter as byte array for dbus parameter
authorCheoleun Moon <chleun.moon@samsung.com>
Mon, 17 Feb 2020 11:12:30 +0000 (20:12 +0900)
committerCheoleun Moon <chleun.moon@samsung.com>
Mon, 17 Feb 2020 11:12:30 +0000 (20:12 +0900)
src/wifi-aware-gdbus.c

index 48dfe6d..c05e530 100644 (file)
@@ -210,6 +210,26 @@ static GVariant *__create_enable_request_param(wifi_aware_enable_request_s *req)
        return params;
 }
 
+static GVariant *__pack_byte_array(const unsigned char *array, uint16_t size)
+{
+       GVariantBuilder *builder = NULL;
+       GVariant *var = NULL;
+
+       if (array == NULL) {
+               WIFI_AWARE_LOGE("Byte array is NULL");
+               return NULL;
+       }
+
+       builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
+
+       for (int i = 0; i < size; ++i)
+               g_variant_builder_add(builder, "y", array[i]);
+
+       var = g_variant_new("ay", builder);
+       g_variant_builder_unref(builder);
+       return var;
+}
+
 static GVariant *__create_publish_request_param(int client_id, wifi_aware_publish_request_s *req)
 {
        GVariantBuilder *builder = NULL;
@@ -219,10 +239,14 @@ static GVariant *__create_publish_request_param(int client_id, wifi_aware_publis
        g_variant_builder_add(builder, "{sv}", "ttl", g_variant_new("q", req->ttl));
        g_variant_builder_add(builder, "{sv}", "publish_type", g_variant_new("y", req->publish_type));
        g_variant_builder_add(builder, "{sv}", "service_name", g_variant_new("s", req->service_name));
-       g_variant_builder_add(builder, "{sv}", "specific_info", g_variant_new("s", req->specific_info));
-       g_variant_builder_add(builder, "{sv}", "specific_info_len", g_variant_new("q", req->specific_info_len));
-       g_variant_builder_add(builder, "{sv}", "match_filter", g_variant_new("s", req->match_filter));
-       g_variant_builder_add(builder, "{sv}", "match_filter_len", g_variant_new("q", req->match_filter_len));
+       if (req->specific_info_len > 0 && req->specific_info != NULL) {
+               g_variant_builder_add(builder, "{sv}", "specific_info", __pack_byte_array(req->specific_info, req->specific_info_len));
+               g_variant_builder_add(builder, "{sv}", "specific_info_len", g_variant_new("q", req->specific_info_len));
+       }
+       if (req->match_filter_len > 0 && req->match_filter != NULL) {
+               g_variant_builder_add(builder, "{sv}", "match_filter", __pack_byte_array(req->match_filter, req->match_filter_len));
+               g_variant_builder_add(builder, "{sv}", "match_filter_len", g_variant_new("q", req->match_filter_len));
+       }
        g_variant_builder_add(builder, "{sv}", "enable_termination_event", g_variant_new("b", req->enable_termination_event));
        g_variant_builder_add(builder, "{sv}", "enable_ranging", g_variant_new("b", req->enable_ranging));
 
@@ -246,10 +270,14 @@ static GVariant *__create_update_publish_request_param(int client_id,
        g_variant_builder_add(builder, "{sv}", "ttl", g_variant_new("q", req->ttl));
        g_variant_builder_add(builder, "{sv}", "publish_type", g_variant_new("y", req->publish_type));
        g_variant_builder_add(builder, "{sv}", "service_name", g_variant_new("s", req->service_name));
-       g_variant_builder_add(builder, "{sv}", "specific_info", g_variant_new("s", req->specific_info));
-       g_variant_builder_add(builder, "{sv}", "specific_info_len", g_variant_new("q", req->specific_info_len));
-       g_variant_builder_add(builder, "{sv}", "match_filter", g_variant_new("s", req->match_filter));
-       g_variant_builder_add(builder, "{sv}", "match_filter_len", g_variant_new("q", req->match_filter_len));
+       if (req->specific_info_len > 0 && req->specific_info != NULL) {
+               g_variant_builder_add(builder, "{sv}", "specific_info", __pack_byte_array(req->specific_info, req->specific_info_len));
+               g_variant_builder_add(builder, "{sv}", "specific_info_len", g_variant_new("q", req->specific_info_len));
+       }
+       if (req->match_filter_len > 0 && req->match_filter != NULL) {
+               g_variant_builder_add(builder, "{sv}", "match_filter", __pack_byte_array(req->match_filter, req->match_filter_len));
+               g_variant_builder_add(builder, "{sv}", "match_filter_len", g_variant_new("q", req->match_filter_len));
+       }
        g_variant_builder_add(builder, "{sv}", "enable_termination_event", g_variant_new("b", req->enable_termination_event));
        g_variant_builder_add(builder, "{sv}", "enable_ranging", g_variant_new("b", req->enable_ranging));
 
@@ -267,10 +295,14 @@ static GVariant *__create_subscribe_request_param(int client_id, wifi_aware_subs
        g_variant_builder_add(builder, "{sv}", "ttl", g_variant_new("q", req->ttl));
        g_variant_builder_add(builder, "{sv}", "subscribe_type", g_variant_new("y", req->subscribe_type));
        g_variant_builder_add(builder, "{sv}", "service_name", g_variant_new("s", req->service_name));
-       g_variant_builder_add(builder, "{sv}", "specific_info", g_variant_new("s", req->specific_info));
-       g_variant_builder_add(builder, "{sv}", "specific_info_len", g_variant_new("q", req->specific_info_len));
-       g_variant_builder_add(builder, "{sv}", "match_filter", g_variant_new("s", req->match_filter));
-       g_variant_builder_add(builder, "{sv}", "match_filter_len", g_variant_new("q", req->match_filter_len));
+       if (req->specific_info_len > 0 && req->specific_info != NULL) {
+               g_variant_builder_add(builder, "{sv}", "specific_info", __pack_byte_array(req->specific_info, req->specific_info_len));
+               g_variant_builder_add(builder, "{sv}", "specific_info_len", g_variant_new("q", req->specific_info_len));
+       }
+       if (req->match_filter_len > 0 && req->match_filter != NULL) {
+               g_variant_builder_add(builder, "{sv}", "match_filter", __pack_byte_array(req->match_filter, req->match_filter_len));
+               g_variant_builder_add(builder, "{sv}", "match_filter_len", g_variant_new("q", req->match_filter_len));
+       }
        g_variant_builder_add(builder, "{sv}", "enable_termination_event", g_variant_new("b", req->enable_termination_event));
 
        params = g_variant_new("(ia{sv})", client_id, builder);
@@ -293,10 +325,14 @@ static GVariant *__create_update_subscribe_request_param(int client_id,
        g_variant_builder_add(builder, "{sv}", "ttl", g_variant_new("q", req->ttl));
        g_variant_builder_add(builder, "{sv}", "subscribe_type", g_variant_new("y", req->subscribe_type));
        g_variant_builder_add(builder, "{sv}", "service_name", g_variant_new("s", req->service_name));
-       g_variant_builder_add(builder, "{sv}", "specific_info", g_variant_new("s", req->specific_info));
-       g_variant_builder_add(builder, "{sv}", "specific_info_len", g_variant_new("q", req->specific_info_len));
-       g_variant_builder_add(builder, "{sv}", "match_filter", g_variant_new("s", req->match_filter));
-       g_variant_builder_add(builder, "{sv}", "match_filter_len", g_variant_new("q", req->match_filter_len));
+       if (req->specific_info_len > 0 && req->specific_info != NULL) {
+               g_variant_builder_add(builder, "{sv}", "specific_info", __pack_byte_array(req->specific_info, req->specific_info_len));
+               g_variant_builder_add(builder, "{sv}", "specific_info_len", g_variant_new("q", req->specific_info_len));
+       }
+       if (req->match_filter_len > 0 && req->match_filter != NULL) {
+               g_variant_builder_add(builder, "{sv}", "match_filter", __pack_byte_array(req->match_filter, req->match_filter_len));
+               g_variant_builder_add(builder, "{sv}", "match_filter_len", g_variant_new("q", req->match_filter_len));
+       }
        g_variant_builder_add(builder, "{sv}", "enable_termination_event", g_variant_new("b", req->enable_termination_event));
 
        params = g_variant_new("(iua{sv})", client_id, sub_id, builder);