sound: Support maintaining theme id list in parsing order 36/301836/4
authorYunhee Seo <yuni.seo@samsung.com>
Fri, 24 Nov 2023 03:51:13 +0000 (12:51 +0900)
committerYunhee Seo <yuni.seo@samsung.com>
Wed, 29 Nov 2023 10:36:17 +0000 (19:36 +0900)
Before, GHashTable did not guarantee conf file parsing order.
To guarantee conf file parsing order, sound theme id list has been changed
from GHashTable to GList.

Change-Id: Ib225e807d5d77dcf468b5999c36a2e7688ee58f8
Signed-off-by: Yunhee Seo <yuni.seo@samsung.com>
src/sound-theme-manager.c
tests/test-feedback-internal.c

index 7b60a56..0147ca1 100644 (file)
@@ -17,6 +17,8 @@
 
 #include <glib.h>
 
+#include <libsyscommon/list.h>
+
 #include "feedback-config.h"
 #include "profiles.h"
 #include "log.h"
@@ -29,45 +31,20 @@ struct sound_theme_element {
 };
 
 static unsigned int default_sound_theme_id;
-static GHashTable *g_sound_theme_list;
-
-static void destroy_sound_theme_hashtable_value(gpointer data)
-{
-       struct feedback_config_info *sound_info = (struct feedback_config_info*)data;
-
-       if (!sound_info)
-               return;
-
-       feedback_free_config(sound_info);
-       free(sound_info);
-}
-
-static bool is_g_sound_theme_list_initialized(void)
-{
-       if (!g_sound_theme_list) {
-               _E("Sound theme is not initialized. please check sound config file.");
-               return false;
-       }
-       return true;
-}
+static GList *g_sound_theme_list;
 
 bool sound_thememan_is_sound_theme_id_exist(unsigned int sound_theme_id)
 {
-       gint *hash_key = g_new(gint, 1);
-
-       *hash_key = sound_theme_id;
-       if (!is_g_sound_theme_list_initialized()) {
-               g_free(hash_key);
-               return false;
-       }
+       struct sound_theme_element *sound_theme_elem = NULL;
+       GList *temp_glist = NULL;
 
-       if (!g_hash_table_lookup(g_sound_theme_list, hash_key)) {
-               g_free(hash_key);
-               return false;
+       SYS_G_LIST_FOREACH(g_sound_theme_list, temp_glist, sound_theme_elem) {
+               if (sound_theme_elem->id == sound_theme_id) {
+                       return true;
+               }
        }
 
-       g_free(hash_key);
-       return true;
+       return false;
 }
 
 void sound_thememan_set_default_sound_theme_id(unsigned int sound_theme_id)
@@ -82,29 +59,35 @@ void sound_thememan_get_default_sound_theme_id(unsigned int *sound_theme_id)
 
 int sound_thememan_get_number_of_theme(unsigned int *number_of_theme)
 {
-       if (!is_g_sound_theme_list_initialized())
-               return -EPERM;
+       if (!number_of_theme) {
+               _E("Invalid parameter: number_of_theme(NULL)");
+               return -EINVAL;
+       }
 
-       *number_of_theme = (unsigned int)g_hash_table_size(g_sound_theme_list);
+       *number_of_theme = (unsigned int)g_list_length(g_sound_theme_list);
        return 0;
 }
 
 int sound_thememan_get_sound_theme_info(unsigned int sound_theme_id, void *sound_info)
 {
-       gint *hash_key = g_new(gint, 1);
-       struct feedback_config_info* sound_theme_info;
+       struct sound_theme_element *sound_theme_elem = NULL;
+       GList *temp_glist = NULL;
+       int find_flag = 0;
 
-       if (!is_g_sound_theme_list_initialized()) {
-               g_free(hash_key);
-               return -EPERM;
+       if (!sound_info) {
+               _E("Invalid parameter: sound_info(NULL)");
+               return -EINVAL;
        }
 
-       *hash_key = sound_theme_id;
-       sound_theme_info = (struct feedback_config_info*)g_hash_table_lookup(g_sound_theme_list, hash_key);
-       g_free(hash_key);
+       SYS_G_LIST_FOREACH(g_sound_theme_list, temp_glist, sound_theme_elem) {
+               if (sound_theme_elem->id == sound_theme_id) {
+                       *(struct feedback_config_info**)sound_info = sound_theme_elem->sound_info;
+                       find_flag = 1;
+                       break;
+               }
+       }
 
-       *(struct feedback_config_info**)sound_info = sound_theme_info;
-       if (!sound_theme_info)
+       if (!find_flag)
                return -EPERM;
 
        return 0;
@@ -112,16 +95,20 @@ int sound_thememan_get_sound_theme_info(unsigned int sound_theme_id, void *sound
 
 int sound_thememan_add_sound_theme(unsigned int sound_theme_id, const char* conf_file_path)
 {
+       struct sound_theme_element *sound_theme_elem = NULL;
        struct feedback_config_info *sound_info = NULL;
-       gint *hash_key = NULL;
        int ret = 0;
 
-       if (!is_g_sound_theme_list_initialized())
-               return -EPERM;
+       sound_theme_elem = (struct sound_theme_element*)calloc(1, sizeof(struct sound_theme_element));
+       if (!sound_theme_elem) {
+               _E("Failed to allocate memory for sound_theme_elem.");
+               return -ENOMEM;
+       }
 
        sound_info = (struct feedback_config_info*)calloc(1, sizeof(struct feedback_config_info));
        if (!sound_info) {
                _E("Failed to allocate memory for sound_info.");
+               free(sound_theme_elem);
                return -ENOMEM;
        }
 
@@ -130,56 +117,59 @@ int sound_thememan_add_sound_theme(unsigned int sound_theme_id, const char* conf
        if (ret < 0) {
                _E("Failed to load config file %s", conf_file_path);
                feedback_free_config(sound_info);
-               free(sound_info);
+               free(sound_theme_elem);
                return ret;
        }
 
-       hash_key = g_new(gint, 1);
-       *hash_key = sound_theme_id;
-       g_hash_table_insert(g_sound_theme_list, hash_key, (gpointer)sound_info);
+       sound_theme_elem->id = sound_theme_id;
+       sound_theme_elem->sound_info = sound_info;
+       g_sound_theme_list = g_list_append(g_sound_theme_list, sound_theme_elem);
        return 0;
 }
 
 int sound_thememan_get_sound_theme_ids(unsigned int *count_of_theme, unsigned int **sound_theme_ids)
 {
-       GHashTableIter iter;
-       gpointer key, value;
-       int get_id = 0;
        int index = 0;
        unsigned int *temp_sound_theme_ids = NULL;
+       struct sound_theme_element* sound_theme_elem = NULL;
+       GList *temp_glist = NULL;
 
-       if (!is_g_sound_theme_list_initialized())
-               return -EPERM;
-
-       g_hash_table_iter_init(&iter, g_sound_theme_list);
        sound_thememan_get_number_of_theme(count_of_theme);
 
        temp_sound_theme_ids = calloc(*count_of_theme, sizeof(unsigned int));
        if (!temp_sound_theme_ids)
                return -ENOMEM;
 
-       while (g_hash_table_iter_next(&iter, &key, &value)) {
-               get_id = *(unsigned int*)key;
-               temp_sound_theme_ids[index++] = get_id;
+       SYS_G_LIST_FOREACH(g_sound_theme_list, temp_glist, sound_theme_elem) {
+               temp_sound_theme_ids[index++] = sound_theme_elem->id;
        }
 
        *sound_theme_ids = g_steal_pointer(&temp_sound_theme_ids);
        return 0;
 }
 
-int sound_thememan_init(void)
+static void cleanup_sound_theme_element(gpointer data)
 {
-       g_sound_theme_list = g_hash_table_new_full(g_int_hash, g_int_equal, g_free,
-                                                       destroy_sound_theme_hashtable_value);
-       if (!g_sound_theme_list)
-               return -EPERM;
+       struct sound_theme_element *sound_theme_elem = NULL;
+
+       if (!data)
+               return;
 
+       sound_theme_elem = data;
+       sound_theme_elem->sound_info->name = NULL;
+       feedback_free_config(sound_theme_elem->sound_info);
+       free(sound_theme_elem);
+}
+
+int sound_thememan_init(void)
+{
+       g_sound_theme_list = NULL;
        return 0;
 }
 
 void sound_thememan_exit(void)
 {
        if (g_sound_theme_list)
-               g_hash_table_destroy(g_steal_pointer(&g_sound_theme_list));
+               g_list_free_full(g_steal_pointer(&g_sound_theme_list), cleanup_sound_theme_element);
 }
 
index bfb7f05..976fa6d 100644 (file)
@@ -426,6 +426,7 @@ static void test_get_sound_theme_ids_internal(void)
 
        for (index = 0; index < count_of_theme; index++)
        {
+               _D("Feedback type=Sound, sound theme id=%d is get", sound_theme_ids[index]);
                RESULT(feedback_set_theme_id_internal(FEEDBACK_TYPE_SOUND, sound_theme_ids[index]),
                        FEEDBACK_ERROR_NONE, "error none");
        }