From 2551fec1a28c7be1f7c55196953ecc16bb332b85 Mon Sep 17 00:00:00 2001 From: Yunhee Seo Date: Fri, 24 Nov 2023 12:51:13 +0900 Subject: [PATCH] sound: Support maintaining theme id list in parsing order 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 --- src/sound-theme-manager.c | 128 +++++++++++++++++++---------------------- tests/test-feedback-internal.c | 1 + 2 files changed, 60 insertions(+), 69 deletions(-) diff --git a/src/sound-theme-manager.c b/src/sound-theme-manager.c index 7b60a56..0147ca1 100644 --- a/src/sound-theme-manager.c +++ b/src/sound-theme-manager.c @@ -17,6 +17,8 @@ #include +#include + #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); } diff --git a/tests/test-feedback-internal.c b/tests/test-feedback-internal.c index bfb7f05..976fa6d 100644 --- a/tests/test-feedback-internal.c +++ b/tests/test-feedback-internal.c @@ -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"); } -- 2.7.4