From 6a727da28e1070824c53e1e7d9792649936b029e Mon Sep 17 00:00:00 2001 From: Cheoleun Moon Date: Mon, 17 Feb 2020 20:12:30 +0900 Subject: [PATCH] Handle service_spcific_info and match_filter as byte array for dbus parameter --- src/wifi-aware-gdbus.c | 68 ++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 52 insertions(+), 16 deletions(-) diff --git a/src/wifi-aware-gdbus.c b/src/wifi-aware-gdbus.c index 48dfe6d..c05e530 100644 --- a/src/wifi-aware-gdbus.c +++ b/src/wifi-aware-gdbus.c @@ -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); -- 2.7.4