Add logic to apply duplication of search keywords 21/210821/10 accepted/tizen/unified/20190729.081053 submit/tizen/20190726.053215
authorjiyong.min <jiyong.min@samsung.com>
Thu, 25 Jul 2019 05:33:06 +0000 (14:33 +0900)
committerjiyong.min <jiyong.min@samsung.com>
Fri, 26 Jul 2019 05:18:40 +0000 (14:18 +0900)
Change-Id: I35ca0e04e6deebab44ca901c0fcb592989b3bdce

include/media_controller_private.h
src/media_controller_client.c
src/media_controller_server.c
src/media_controller_util.c

index d2c5a71..79fb844 100644 (file)
@@ -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);
index 1ee8bc2..ccfda07 100644 (file)
@@ -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;
 }
index 885fbb6..fd5ec62 100644 (file)
@@ -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);
 
index 5d4c489..1d9a395 100644 (file)
@@ -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;
+}