From: jiyong.min Date: Thu, 25 Jul 2019 05:33:06 +0000 (+0900) Subject: Add logic to apply duplication of search keywords X-Git-Tag: accepted/tizen/unified/20190729.081053^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F21%2F210821%2F10;p=platform%2Fcore%2Fapi%2Fmedia-controller.git Add logic to apply duplication of search keywords Change-Id: I35ca0e04e6deebab44ca901c0fcb592989b3bdce --- diff --git a/include/media_controller_private.h b/include/media_controller_private.h index d2c5a71..79fb844 100644 --- a/include/media_controller_private.h +++ b/include/media_controller_private.h @@ -398,6 +398,7 @@ gboolean _mc_util_is_valid_playback_action(mc_playback_action_e action); gboolean _mc_util_is_valid_subscription_type(const mc_subscription_type_e subscription_type); void _mc_util_set_bit(int bit_num, gboolean set, unsigned long long *value); gboolean _mc_util_is_true_bit(unsigned long long value, int bit_num); +const char * _mc_util_replace_null(const char *data); /* for d-bus IPC */ int mc_ipc_get_dbus_connection(GDBusConnection **conn, int *dref_count); diff --git a/src/media_controller_client.c b/src/media_controller_client.c index 1ee8bc2..ccfda07 100644 --- a/src/media_controller_client.c +++ b/src/media_controller_client.c @@ -1195,6 +1195,7 @@ int __mc_client_get_bundle_from_search(mc_search_h search, bundle **res_bundle) mc_search_item_s *search_item = NULL; bundle * bundle_data = NULL; char *bundle_str = NULL; + char *key_str = NULL; char *val_str = NULL; mc_retvm_if(mc_search == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Search is NULL"); @@ -1209,57 +1210,53 @@ int __mc_client_get_bundle_from_search(mc_search_h search, bundle **res_bundle) for (idx = 0; idx < length; idx++) { search_item = (mc_search_item_s*)g_list_nth_data(mc_search->search_list, idx); - if (search_item == NULL) { + if (!search_item) { mc_error("Invalid item [%d]", idx); ret = MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER; goto ERROR; } - if (search_item->search_keyword == NULL) { + if (!MC_STRING_VALID(search_item->search_keyword) && (search_item->category != MC_SEARCH_NO_CATEGORY)) { mc_error("Invalid search_keyword [%d]", idx); ret = MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER; goto ERROR; } - if (search_item->data != NULL) { - ret = mc_util_bundle_to_string(search_item->data, &bundle_str); - if (ret != MEDIA_CONTROLLER_ERROR_NONE) { - mc_error("Error when encode bundle [%d][%d]", ret, idx); - goto ERROR; - } + ret = mc_util_bundle_to_string(search_item->data, &bundle_str); + if (ret != MEDIA_CONTROLLER_ERROR_NONE) { + mc_error("Error when encode bundle [%d][%d]", ret, idx); + goto ERROR; } - /*set content_type, category, bundle_size, bundle */ - if (bundle_str != NULL) { - val_str = g_strdup_printf("%d%s%d%s%s", - search_item->content_type, MC_STRING_DELIMITER, - search_item->category, MC_STRING_DELIMITER, - bundle_str); - } else { - val_str = g_strdup_printf("%d%s%d%s%d", - search_item->content_type, MC_STRING_DELIMITER, - search_item->category, MC_STRING_DELIMITER, - 0); - } + /*set index */ + key_str = g_strdup_printf("%d", idx); + + /*set content_type, category, keyword, bundle_size, bundle */ + val_str = g_strdup_printf("%d%s%d%s%s%s%s", + search_item->content_type, MC_STRING_DELIMITER, + search_item->category, MC_STRING_DELIMITER, + search_item->search_keyword, MC_STRING_DELIMITER, + bundle_str); MC_SAFE_FREE(bundle_str); - mc_secure_debug("[%d][%d][%s][%s]", idx, length, search_item->search_keyword, val_str); + mc_secure_debug("[%d][%d][%s][%s]", idx, length, key_str, val_str); - if (val_str == NULL) { + if (!key_str || !val_str) { mc_error("fail to make val_str [%d]", idx); ret = MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY; goto ERROR; } - /*key - keyword, val - val_str (content_type, category, bundle_size, bundle)*/ - ret = bundle_add_str(bundle_data, search_item->search_keyword, val_str); - MC_SAFE_FREE(val_str); + /*key - index, val - val_str (content_type, category, keyword, bundle_size, bundle)*/ + ret = bundle_add_str(bundle_data, key_str, val_str); if (ret != BUNDLE_ERROR_NONE) { mc_error("Error bundle_add_str [%d][%d]", ret, idx); ret = MEDIA_CONTROLLER_ERROR_INVALID_OPERATION; goto ERROR; } + MC_SAFE_FREE(key_str); + MC_SAFE_FREE(val_str); } *res_bundle = bundle_data; @@ -1268,6 +1265,8 @@ int __mc_client_get_bundle_from_search(mc_search_h search, bundle **res_bundle) ERROR: bundle_free(bundle_data); + MC_SAFE_FREE(key_str); + MC_SAFE_FREE(val_str); return ret; } diff --git a/src/media_controller_server.c b/src/media_controller_server.c index 885fbb6..fd5ec62 100644 --- a/src/media_controller_server.c +++ b/src/media_controller_server.c @@ -404,20 +404,21 @@ static void __server_event_reply_received_cb(const char *interface_name, const c g_strfreev(params); } -void _search_cb(const char *key, const int type, const bundle_keyval_t *kv, void *user_data) +static void __search_cb(const char *key, const int type, const bundle_keyval_t *kv, void *user_data) { void *basic_val = NULL; size_t basic_size = 0; gchar **params = NULL; int content_type = 0; int category = 0; + char *keyword = NULL; int bundle_size = 0; bundle *bundle_data = NULL; GList **mc_search = (GList**)user_data; bundle_keyval_get_basic_val((bundle_keyval_t *)kv, &basic_val, &basic_size); - mc_secure_debug("Key [%s], Type [%d], basic_val [%s]", key, type, (char *)basic_val); + mc_secure_debug("key [%s], type [%d], basic_val [%s]", key, type, (char *)basic_val); params = g_strsplit(basic_val, MC_STRING_DELIMITER, 0); mc_retm_if(params == NULL, "invalid search data"); @@ -429,35 +430,37 @@ void _search_cb(const char *key, const int type, const bundle_keyval_t *kv, voi } if (mc_safe_strtoi(params[1], &category) != MEDIA_CONTROLLER_ERROR_NONE) { - mc_error("Error get content_type"); + mc_error("Error get category"); g_strfreev(params); return; } - if (mc_safe_strtoi(params[2], &bundle_size) != MEDIA_CONTROLLER_ERROR_NONE) { + if (mc_safe_strtoi(params[3], &bundle_size) != MEDIA_CONTROLLER_ERROR_NONE) { mc_error("Error get bundle_size"); g_strfreev(params); return; } - mc_secure_debug("content_type [%d], category [%d], bundle_size [%d]", content_type, category, bundle_size); + keyword = g_strdup(_mc_util_replace_null(params[2])); - if (bundle_size > 0) { - bundle_data = bundle_decode((bundle_raw *)params[3], bundle_size); - } + mc_secure_debug("content_type [%d], category [%d], keyword[%s] bundle_size [%d]", content_type, category, keyword, bundle_size); + + if (bundle_size > 0) + bundle_data = bundle_decode((bundle_raw *)params[4], bundle_size); g_strfreev(params); mc_search_item_s *search_item = (mc_search_item_s*)calloc(1, sizeof(mc_search_item_s)); if (search_item == NULL) { mc_error("Error OUT_OF_MEMORY"); + MC_SAFE_FREE(keyword); bundle_free(bundle_data); return; } search_item->content_type = content_type; search_item->category = category; - search_item->search_keyword = g_strdup(key); + search_item->search_keyword = keyword; search_item->data = bundle_dup(bundle_data); if (bundle_data != NULL) @@ -519,7 +522,7 @@ static void __server_search_cmd_cb(const char *interface_name, const char *signa return; } - bundle_foreach(bundle_data, _search_cb, &mc_search->search_list); + bundle_foreach(bundle_data, __search_cb, &mc_search->search_list); bundle_free(bundle_data); diff --git a/src/media_controller_util.c b/src/media_controller_util.c index 5d4c489..1d9a395 100644 --- a/src/media_controller_util.c +++ b/src/media_controller_util.c @@ -278,3 +278,15 @@ gboolean _mc_util_is_true_bit(unsigned long long value, int bit_num) return ((rshift & MC_BIT64_SET) ? TRUE : FALSE); } + +/* g_strdup_printf replaces NULL to "(null)"*/ +const char * _mc_util_replace_null(const char *data) +{ + const char *_null_str = "(null)"; + mc_retvm_if(!data, NULL, "invalid data"); + + if (!strncmp(_null_str, data, strlen(_null_str))) + return NULL; + else + return data; +}