Make function for duplicated logic 99/286199/1
authorSuyeon Hwang <stom.hwang@samsung.com>
Tue, 29 Nov 2022 07:53:30 +0000 (16:53 +0900)
committerSuyeon Hwang <stom.hwang@samsung.com>
Fri, 30 Dec 2022 04:37:27 +0000 (13:37 +0900)
- Issue:
Some code logics are used repeatedly.

- Solution:
This patch makes functions for these logics. Through this patch,
duplicated logics are removed from vc_config_mgr module.

Change-Id: Ic923b0aa52b93ca2286aa80d386ca77b295a7aaf
Signed-off-by: Suyeon Hwang <stom.hwang@samsung.com>
common/vc_config_mgr.c

index aa391d3..e77e7f9 100644 (file)
@@ -50,6 +50,19 @@ typedef struct {
        int dir_wd;
 } vc_engine_inotify_s;
 
+typedef struct {
+       const char* before_lang;
+       const char* current_lang;
+} lang_cb_parameter_s;
+
+typedef struct {
+       const char *engine_appid;
+} engine_cb_parameter_s;
+
+typedef struct {
+       bool enable;
+} enabled_cb_parameter_s;
+
 const char* vc_config_tag()
 {
        return TAG_VCCONFIG;
@@ -78,6 +91,165 @@ static int __vc_config_mgr_set_default_language(const char* language);
 int __vc_config_mgr_print_engine_info();
 int __vc_config_mgr_print_client_info();
 
+static gint __compare_uid_in_client_list(gconstpointer a, gconstpointer b)
+{
+       const vc_config_client_s *client_info = a;
+       uintptr_t ptr_uid = (uintptr_t)b;
+       unsigned int uid = ptr_uid;
+
+       if (NULL == client_info) {
+               return 1;
+       }
+
+       if (uid == client_info->uid) {
+               SLOG(LOG_DEBUG, vc_config_tag(), "Find client information of %d", uid);
+               return 0;
+       }
+
+       return 1;
+}
+
+static vc_config_client_s *__find_client_info(unsigned int uid)
+{
+       uintptr_t ptr_uid = uid;
+       GSList *target = g_slist_find_custom(g_config_client_list, (gconstpointer)ptr_uid, __compare_uid_in_client_list);
+
+       vc_config_client_s *result = NULL;
+       if (NULL != target) {
+               result = target->data;
+       }
+
+       return result;
+}
+
+static gint __compare_engine_id_in_engine_list(gconstpointer a, gconstpointer b)
+{
+       const vc_engine_info_s *engine_info = a;
+       const char *engine_id = b;
+
+       if (NULL == engine_id) {
+               return 1;
+       }
+
+       if (NULL == engine_info || NULL == engine_info->uuid) {
+               return 1;
+       }
+
+       SLOG(LOG_DEBUG, vc_config_tag(), "Compare engine(%s). Target(%s)", engine_info->uuid, engine_id);
+       return strcmp(engine_info->uuid, engine_id);
+}
+
+static vc_engine_info_s *__find_engine_info(const char *engine_id)
+{
+       GSList *target = g_slist_find_custom(g_engine_list,     engine_id, __compare_engine_id_in_engine_list);
+       vc_engine_info_s *result = NULL;
+       if (NULL != target) {
+               result = target->data;
+       }
+
+       return result;
+}
+
+static gint __compare_language_in_languages_of_engine_info(gconstpointer a, gconstpointer b)
+{
+       const char *language = a;
+       const char *target_language = b;
+
+       if (NULL == language || NULL == target_language) {
+               return 1;
+       }
+
+       SLOG(LOG_DEBUG, vc_config_tag(), "Compare langauge(%s), Target(%s)", language, target_language);
+       return strcmp(language, target_language);
+}
+
+static bool __is_language_valid(vc_engine_info_s *engine_info, const char *language)
+{
+       if (NULL == engine_info || NULL == language) {
+               return false;
+       }
+
+       GSList *target = g_slist_find_custom(engine_info->languages, language, __compare_language_in_languages_of_engine_info);
+       return (NULL != target);
+}
+
+static void __invoke_lang_cb_in_client_list(gpointer data, gpointer user_data)
+{
+       vc_config_client_s* client_info = (vc_config_client_s*)data;
+       lang_cb_parameter_s* parameter = (lang_cb_parameter_s*)user_data;
+
+       if (NULL == client_info || NULL == parameter) {
+               return;
+       }
+
+       if (NULL != client_info->lang_cb) {
+               client_info->lang_cb(parameter->before_lang, parameter->current_lang);
+       }
+}
+
+static void __invoke_engine_cb_in_client_list(gpointer data, gpointer user_data)
+{
+       vc_config_client_s* client_info = (vc_config_client_s*)data;
+       engine_cb_parameter_s* parameter = (engine_cb_parameter_s*)user_data;
+
+       if (NULL == client_info || NULL == parameter) {
+               return;
+       }
+
+       if (NULL != client_info->engine_cb) {
+               client_info->engine_cb(parameter->engine_appid);
+       }
+}
+
+static void __invoke_enabled_cb_in_client_list(gpointer data, gpointer user_data)
+{
+       vc_config_client_s* client_info = (vc_config_client_s*)data;
+       enabled_cb_parameter_s* parameter = (enabled_cb_parameter_s*)user_data;
+
+       if (NULL == client_info || NULL == parameter) {
+               return;
+       }
+
+       if (NULL != client_info->enabled_cb) {
+               client_info->enabled_cb(parameter->enable);
+       }
+}
+
+static void __vc_config_mgr_notify_language_changed(const char* before_lang, const char* current_lang)
+{
+       if (NULL == before_lang || NULL == current_lang) {
+               SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Input parameter is NULL");
+               return;
+       }
+
+       lang_cb_parameter_s lang_cb_parameter;
+       lang_cb_parameter.before_lang = before_lang;
+       lang_cb_parameter.current_lang = current_lang;
+
+       g_slist_foreach(g_config_client_list, __invoke_lang_cb_in_client_list, &lang_cb_parameter);
+}
+
+static void __vc_config_mgr_notify_engine_changed(const char *engine_appid)
+{
+       if (NULL == engine_appid) {
+               SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Input parameter is NULL");
+               return;
+       }
+
+       engine_cb_parameter_s engine_cb_parameter;
+       engine_cb_parameter.engine_appid = engine_appid;
+
+       g_slist_foreach(g_config_client_list, __invoke_engine_cb_in_client_list, &engine_cb_parameter);
+}
+
+static void __vc_config_mgr_notify_enabled_changed(bool enable)
+{
+       enabled_cb_parameter_s enabled_cb_parameter;
+       enabled_cb_parameter.enable = enable;
+
+       g_slist_foreach(g_config_client_list, __invoke_enabled_cb_in_client_list, &enabled_cb_parameter);
+}
+
 int vc_config_convert_error_code(vc_config_error_e code)
 {
        if (code == VC_CONFIG_ERROR_NONE)                       return VC_ERROR_NONE;
@@ -96,48 +268,26 @@ int __vc_config_mgr_check_engine_is_valid(const char* engine_id)
 {
        if (NULL == engine_id) {
                SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Input parameter is NULL");
-               return -1;
+               return VC_CONFIG_ERROR_INVALID_PARAMETER;
        }
 
-       GSList *iter = NULL;
-       vc_engine_info_s *engine_info = NULL;
-
        if (0 >= g_slist_length(g_engine_list)) {
                SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] There is no engine!!");
-               return -1;
+               return VC_CONFIG_ERROR_OPERATION_FAILED;
        }
 
-       iter = g_slist_nth(g_engine_list, 0);
-
-       while (NULL != iter) {
-               engine_info = iter->data;
-
-               if (NULL == engine_info) {
-                       SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Engine info is NULL");
-                       return -1;
-               }
-
-               if (NULL == engine_info->uuid) {
-                       SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Engine id is NULL");
-                       return -1;
-               }
-
-               if (!strcmp(engine_id, engine_info->uuid)) {
-                       SLOG(LOG_DEBUG, vc_config_tag(), "Default engine is valid : %s", engine_id);
-                       return VC_ERROR_NONE;
-               }
-
-               iter = g_slist_next(iter);
+       if (NULL != __find_engine_info(engine_id)) {
+               SLOG(LOG_DEBUG, vc_config_tag(), "Default engine is valid : %s", engine_id);
+               return VC_CONFIG_ERROR_NONE;
        }
 
-       iter = g_slist_nth(g_engine_list, 0);
+       GSList *iter = g_slist_nth(g_engine_list, 0);
        if (NULL == iter) {
                SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] No engine in list");
                return -1;
        }
 
-       engine_info = iter->data;
-
+       vc_engine_info_s *engine_info = iter->data;
        if (NULL == engine_info) {
                SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Engine info is NULL");
                return -1;
@@ -174,56 +324,21 @@ bool __vc_config_mgr_check_lang_is_valid(const char* engine_id, const char* lang
                return false;
        }
 
-       GSList *iter = NULL;
-       vc_engine_info_s *engine_info = NULL;
-
        if (0 >= g_slist_length(g_engine_list)) {
                SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] There is no engine!!");
                return false;
        }
 
-       /* Get a first item */
-       iter = g_slist_nth(g_engine_list, 0);
-
-       while (NULL != iter) {
-               engine_info = iter->data;
-
-               if (NULL == engine_info) {
-                       SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Engine info is NULL");
-                       return false;
-               }
-
-               if (0 != strcmp(engine_id, engine_info->uuid)) {
-                       iter = g_slist_next(iter);
-                       continue;
-               }
-
-               GSList *iter_lang = NULL;
-               char* engine_lang;
-               if (g_slist_length(engine_info->languages) > 0) {
-                       /* Get a first item */
-                       iter_lang = g_slist_nth(engine_info->languages, 0);
-
-                       int i = 1;
-                       while (NULL != iter_lang) {
-                               /*Get handle data from list*/
-                               engine_lang = iter_lang->data;
-
-                               SLOG(LOG_DEBUG, vc_config_tag(), "  [%dth] %s", i, engine_lang);
-
-                               if (0 == strcmp(language, engine_lang)) {
-                                       return true;
-                               }
-
-                               /*Get next item*/
-                               iter_lang = g_slist_next(iter_lang);
-                               i++;
-                       }
-               }
-               break;
+       vc_engine_info_s *engine_info = __find_engine_info(engine_id);
+       if (NULL == engine_info) {
+               SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] There is no engine with id (%s)!!", engine_id);
+               return false;
        }
 
-       return false;
+       bool is_language_valid = __is_language_valid(engine_info, language);
+       SLOG(LOG_INFO, vc_config_tag(), "[INFO] Language(%s), is valid(%d)", language, (int)is_language_valid);
+
+       return is_language_valid;
 }
 
 int __vc_config_mgr_select_lang(const char* engine_id, char** language)
@@ -233,69 +348,39 @@ int __vc_config_mgr_select_lang(const char* engine_id, char** language)
                return VC_ERROR_OPERATION_FAILED;
        }
 
-       GSList *iter = NULL;
-       vc_engine_info_s *engine_info = NULL;
-
        if (0 >= g_slist_length(g_engine_list)) {
                SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] There is no engine!!");
                return VC_ERROR_OPERATION_FAILED;
        }
 
-       /* Get a first item */
-       iter = g_slist_nth(g_engine_list, 0);
-
-       while (NULL != iter) {
-               engine_info = iter->data;
-
-               if (NULL == engine_info) {
-                       SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] engine info is NULL");
-                       iter = g_slist_next(iter);
-                       continue;
-               }
-
-               if (0 != strcmp(engine_id, engine_info->uuid)) {
-                       iter = g_slist_next(iter);
-                       continue;
-               }
-
-               if (NULL == engine_info->default_lang) {
-                       SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] default language of engine info is NULL");
-                       return VC_ERROR_INVALID_LANGUAGE;
-               }
+       vc_engine_info_s *engine_info = __find_engine_info(engine_id);
+       if (NULL == engine_info) {
+               SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] There is no engine with id (%s)!!", engine_id);
+               return VC_ERROR_INVALID_PARAMETER;
+       }
 
-               *language = strdup(engine_info->default_lang);
+       if (NULL == engine_info->default_lang) {
+               SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] default language of engine info is NULL");
+               return VC_CONFIG_ERROR_INVALID_LANGUAGE;
+       }
 
-               if (NULL != *language) {
-                       SLOG(LOG_DEBUG, vc_config_tag(), "Selected language : %s", *language);
-                       return VC_ERROR_NONE;
-               }
+       *language = strdup(engine_info->default_lang);
+       if (NULL == *language) {
+               SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Fail to allocate memory");
+               return VC_CONFIG_ERROR_OUT_OF_MEMORY;
        }
 
-       return VC_ERROR_OPERATION_FAILED;
+       SLOG(LOG_DEBUG, vc_config_tag(), "Selected language : %s", *language);
+       return VC_CONFIG_ERROR_NONE;
 }
 
 int __vc_config_release_client(unsigned int uid)
 {
-       GSList *iter = NULL;
-       vc_config_client_s* temp_client = NULL;
-
-       if (0 < g_slist_length(g_config_client_list)) {
-               /* Check uid */
-               iter = g_slist_nth(g_config_client_list, 0);
+       vc_config_client_s* temp_client = __find_client_info(uid);
 
-               while (NULL != iter) {
-                       temp_client = iter->data;
-
-                       if (NULL != temp_client) {
-                               if (uid == temp_client->uid) {
-                                       g_config_client_list = g_slist_remove(g_config_client_list, temp_client);
-                                       free(temp_client);
-                                       break;
-                               }
-                       }
-
-                       iter = g_slist_next(iter);
-               }
+       if (NULL != temp_client) {
+               g_config_client_list = g_slist_remove(g_config_client_list, temp_client);
+               free(temp_client);
        }
 
        SLOG(LOG_DEBUG, vc_config_tag(), "Client count (%d)", g_slist_length(g_config_client_list));
@@ -456,9 +541,9 @@ static Eina_Bool __vc_config_mgr_engine_config_inotify_event_callback(void* data
                        SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Fail to get engine info when config updated");
                }
                __vc_config_mgr_print_engine_info();
-               bool support = vc_config_check_default_language_is_valid(g_config_info->language);
-               if (false == support) {
-                       SLOG(LOG_DEBUG, vc_config_tag(), "[ERROR] Default language is valid");
+               bool is_language_valid = vc_config_check_default_language_is_valid(g_config_info->language);
+               if (false == is_language_valid) {
+                       SLOG(LOG_DEBUG, vc_config_tag(), "[ERROR] Default language is not valid");
                        char* temp_lang = NULL;
                        ret = __vc_config_mgr_select_lang(g_config_info->engine_id, &temp_lang);
                        if (0 != ret) {
@@ -599,9 +684,6 @@ Eina_Bool vc_config_mgr_inotify_event_cb(void* data, Ecore_Fd_Handler *fd_handle
                char* engine = NULL;
                int enabled = -1;
 
-               GSList *iter = NULL;
-               vc_config_client_s* temp_client = NULL;
-
                if (0 != vc_parser_find_config_changed(&auto_lang, &lang, &engine, &enabled))
                        return ECORE_CALLBACK_PASS_ON;
 
@@ -619,25 +701,13 @@ Eina_Bool vc_config_mgr_inotify_event_cb(void* data, Ecore_Fd_Handler *fd_handle
                        g_config_info->language = strdup(lang);
 
                        /* Call all callbacks of client*/
-                       iter = g_slist_nth(g_config_client_list, 0);
-
-                       while (NULL != iter) {
-                               temp_client = iter->data;
-
-                               if (NULL != temp_client) {
-                                       if (NULL != temp_client->lang_cb) {
-                                               temp_client->lang_cb(before_lang, lang);
-                                       }
-                               }
-
-                               iter = g_slist_next(iter);
-                       }
+                       __vc_config_mgr_notify_language_changed(before_lang, lang);
 
                        if (NULL != before_lang)        free(before_lang);
+                       free(lang);
+                       lang = NULL;
                }
 
-               if (NULL != lang)       free(lang);
-
                /* Only Engine changed */
                if (NULL != engine) {
 
@@ -648,22 +718,7 @@ Eina_Bool vc_config_mgr_inotify_event_cb(void* data, Ecore_Fd_Handler *fd_handle
                        g_config_info->engine_id = strdup(engine);
 
                        /* Call all callbacks of client*/
-                       iter = g_slist_nth(g_config_client_list, 0);
-
-                       while (NULL != iter) {
-                               temp_client = iter->data;
-
-                               if (NULL != temp_client) {
-                                       if (NULL != temp_client->engine_cb) {
-                                               temp_client->engine_cb(engine);
-                                       }
-                               }
-
-                               iter = g_slist_next(iter);
-                       }
-               }
-
-               if (NULL != engine) {
+                       __vc_config_mgr_notify_engine_changed(engine);
                        free(engine);
                        engine = NULL;
                }
@@ -672,19 +727,7 @@ Eina_Bool vc_config_mgr_inotify_event_cb(void* data, Ecore_Fd_Handler *fd_handle
                        g_config_info->enabled = enabled;
 
                        /* Call all callbacks of client*/
-                       iter = g_slist_nth(g_config_client_list, 0);
-
-                       while (NULL != iter) {
-                               temp_client = iter->data;
-
-                               if (NULL != temp_client) {
-                                       if (NULL != temp_client->enabled_cb) {
-                                               temp_client->enabled_cb(enabled);
-                                       }
-                               }
-
-                               iter = g_slist_next(iter);
-                       }
+                       __vc_config_mgr_notify_enabled_changed((bool)enabled);
                }
        } else {
                SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Undefined event");
@@ -745,22 +788,7 @@ int __vc_config_set_auto_language()
                         before_lang, g_config_info->language);
 
                /* Call all callbacks of client*/
-               GSList *iter = NULL;
-               vc_config_client_s* temp_client = NULL;
-
-               iter = g_slist_nth(g_config_client_list, 0);
-
-               while (NULL != iter) {
-                       temp_client = iter->data;
-
-                       if (NULL != temp_client) {
-                               if (NULL != temp_client->lang_cb) {
-                                       temp_client->lang_cb(before_lang, g_config_info->language);
-                               }
-                       }
-
-                       iter = g_slist_next(iter);
-               }
+               __vc_config_mgr_notify_language_changed(before_lang, g_config_info->language);
 
                if (NULL != before_lang)        free(before_lang);
        } else {
@@ -793,22 +821,7 @@ int __vc_config_set_auto_language()
                         before_lang, g_config_info->language);
 
                /* Call all callbacks of client*/
-               GSList *iter = NULL;
-               vc_config_client_s* temp_client = NULL;
-
-               iter = g_slist_nth(g_config_client_list, 0);
-
-               while (NULL != iter) {
-                       temp_client = iter->data;
-
-                       if (NULL != temp_client) {
-                               if (NULL != temp_client->lang_cb) {
-                                       temp_client->lang_cb(before_lang, g_config_info->language);
-                               }
-                       }
-
-                       iter = g_slist_next(iter);
-               }
+               __vc_config_mgr_notify_language_changed(before_lang, g_config_info->language);
 
                if (NULL != before_lang)        free(before_lang);
        }
@@ -830,8 +843,6 @@ void __vc_config_language_changed_cb(keynode_t *key, void *data)
 
 int vc_config_mgr_initialize(unsigned int uid)
 {
-       GSList *iter = NULL;
-       int* get_uid;
        vc_config_client_s* temp_client = NULL;
 
        SLOG(LOG_INFO, vc_config_tag(), "[WARNING] Enter critical section");
@@ -840,20 +851,12 @@ int vc_config_mgr_initialize(unsigned int uid)
 
        if (0 < g_slist_length(g_config_client_list)) {
                /* Check uid */
-               iter = g_slist_nth(g_config_client_list, 0);
-
-               while (NULL != iter) {
-                       get_uid = iter->data;
-
-                       if (uid == *get_uid) {
-                               SLOG(LOG_WARN, vc_config_tag(), "[CONFIG] uid(%u) has already registered", uid);
-                               pthread_mutex_unlock(&vc_config_mgr_mutex);
-                               ecore_thread_main_loop_end();
-                               SLOG(LOG_DEBUG, vc_config_tag(), "[WARNING] Leave critical section");
-                               return VC_ERROR_NONE;
-                       }
-
-                       iter = g_slist_next(iter);
+               if (NULL != __find_client_info(uid)) {
+                       SLOG(LOG_WARN, vc_config_tag(), "[CONFIG] uid(%u) has already registered", uid);
+                       pthread_mutex_unlock(&vc_config_mgr_mutex);
+                       ecore_thread_main_loop_end();
+                       SLOG(LOG_DEBUG, vc_config_tag(), "[WARNING] Leave critical section");
+                       return VC_CONFIG_ERROR_NONE;
                }
 
                temp_client = (vc_config_client_s*)calloc(1, sizeof(vc_config_client_s));
@@ -1135,29 +1138,24 @@ int __vc_config_mgr_unregister_config_event()
 
 int vc_config_mgr_set_engine_cb(unsigned int uid, vc_config_engine_changed_cb engine_cb)
 {
-       GSList *iter = NULL;
-       vc_config_client_s* temp_client = NULL;
-
        ecore_thread_main_loop_begin();
        pthread_mutex_lock(&vc_config_mgr_mutex);
 
        /* Call all callbacks of client*/
-       iter = g_slist_nth(g_config_client_list, 0);
-
-       while (NULL != iter) {
-               temp_client = iter->data;
+       vc_config_client_s* temp_client = __find_client_info(uid);
+       if (NULL == temp_client) {
+               SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Uid is not valid (%u)", uid);
+               pthread_mutex_unlock(&vc_config_mgr_mutex);
+               ecore_thread_main_loop_end();
+               return VC_CONFIG_ERROR_INVALID_PARAMETER;
+       }
 
-               if (NULL != temp_client) {
-                       if (uid == temp_client->uid) {
-                               temp_client->engine_cb = engine_cb;
-                               if (0 != __vc_config_mgr_register_lang_event()) {
-                                       SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Fail to register config event");
-                                       pthread_mutex_unlock(&vc_config_mgr_mutex);
-                                       return VC_CONFIG_ERROR_OPERATION_FAILED;
-                               }
-                       }
-               }
-               iter = g_slist_next(iter);
+       temp_client->engine_cb = engine_cb;
+       if (VC_CONFIG_ERROR_NONE != __vc_config_mgr_register_lang_event()) {
+               SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Fail to register config event");
+               pthread_mutex_unlock(&vc_config_mgr_mutex);
+               ecore_thread_main_loop_end();
+               return VC_CONFIG_ERROR_OPERATION_FAILED;
        }
 
        pthread_mutex_unlock(&vc_config_mgr_mutex);
@@ -1167,27 +1165,21 @@ int vc_config_mgr_set_engine_cb(unsigned int uid, vc_config_engine_changed_cb en
 
 int vc_config_mgr_unset_engine_cb(unsigned int uid)
 {
-       GSList *iter = NULL;
-       vc_config_client_s* temp_client = NULL;
-
        ecore_thread_main_loop_begin();
        pthread_mutex_lock(&vc_config_mgr_mutex);
 
        /* Call all callbacks of client*/
-       iter = g_slist_nth(g_config_client_list, 0);
-
-       while (NULL != iter) {
-               temp_client = iter->data;
-
-               if (NULL != temp_client) {
-                       if (uid == temp_client->uid) {
-                               temp_client->engine_cb = NULL;
-                               __vc_config_mgr_unregister_config_event();
-                       }
-               }
-               iter = g_slist_next(iter);
+       vc_config_client_s* temp_client = __find_client_info(uid);
+       if (NULL == temp_client) {
+               SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Uid is not valid (%u)", uid);
+               pthread_mutex_unlock(&vc_config_mgr_mutex);
+               ecore_thread_main_loop_end();
+               return VC_CONFIG_ERROR_INVALID_PARAMETER;
        }
 
+       temp_client->engine_cb = NULL;
+       __vc_config_mgr_unregister_config_event();
+
        pthread_mutex_unlock(&vc_config_mgr_mutex);
        ecore_thread_main_loop_end();
        return VC_ERROR_NONE;
@@ -1196,29 +1188,24 @@ int vc_config_mgr_unset_engine_cb(unsigned int uid)
 
 int vc_config_mgr_set_lang_cb(unsigned int uid, vc_config_lang_changed_cb lang_cb)
 {
-       GSList *iter = NULL;
-       vc_config_client_s* temp_client = NULL;
-
        ecore_thread_main_loop_begin();
        pthread_mutex_lock(&vc_config_mgr_mutex);
 
        /* Call all callbacks of client*/
-       iter = g_slist_nth(g_config_client_list, 0);
-
-       while (NULL != iter) {
-               temp_client = iter->data;
+       vc_config_client_s* temp_client = __find_client_info(uid);
+       if (NULL == temp_client) {
+               SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Uid is not valid (%u)", uid);
+               pthread_mutex_unlock(&vc_config_mgr_mutex);
+               ecore_thread_main_loop_end();
+               return VC_CONFIG_ERROR_INVALID_PARAMETER;
+       }
 
-               if (NULL != temp_client) {
-                       if (uid == temp_client->uid) {
-                               temp_client->lang_cb = lang_cb;
-                               if (0 != __vc_config_mgr_register_lang_event()) {
-                                       SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Fail to register config event");
-                                       pthread_mutex_unlock(&vc_config_mgr_mutex);
-                                       return VC_CONFIG_ERROR_OPERATION_FAILED;
-                               }
-                       }
-               }
-               iter = g_slist_next(iter);
+       temp_client->lang_cb = lang_cb;
+       if (0 != __vc_config_mgr_register_lang_event()) {
+               SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Fail to register config event");
+               pthread_mutex_unlock(&vc_config_mgr_mutex);
+               ecore_thread_main_loop_end();
+               return VC_CONFIG_ERROR_OPERATION_FAILED;
        }
 
        pthread_mutex_unlock(&vc_config_mgr_mutex);
@@ -1228,27 +1215,21 @@ int vc_config_mgr_set_lang_cb(unsigned int uid, vc_config_lang_changed_cb lang_c
 
 int vc_config_mgr_unset_lang_cb(unsigned int uid)
 {
-       GSList *iter = NULL;
-       vc_config_client_s* temp_client = NULL;
-
        ecore_thread_main_loop_begin();
        pthread_mutex_lock(&vc_config_mgr_mutex);
 
        /* Call all callbacks of client*/
-       iter = g_slist_nth(g_config_client_list, 0);
-
-       while (NULL != iter) {
-               temp_client = iter->data;
-
-               if (NULL != temp_client) {
-                       if (uid == temp_client->uid) {
-                               temp_client->lang_cb = NULL;
-                               __vc_config_mgr_unregister_config_event();
-                       }
-               }
-               iter = g_slist_next(iter);
+       vc_config_client_s* temp_client = __find_client_info(uid);
+       if (NULL == temp_client) {
+               SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Uid is not valid (%u)", uid);
+               pthread_mutex_unlock(&vc_config_mgr_mutex);
+               ecore_thread_main_loop_end();
+               return VC_CONFIG_ERROR_INVALID_PARAMETER;
        }
 
+       temp_client->lang_cb = NULL;
+       __vc_config_mgr_unregister_config_event();
+
        pthread_mutex_unlock(&vc_config_mgr_mutex);
        ecore_thread_main_loop_end();
        return VC_ERROR_NONE;
@@ -1261,56 +1242,38 @@ int vc_config_mgr_set_enabled_cb(unsigned int uid, vc_config_enabled_cb enabled_
                return VC_CONFIG_ERROR_INVALID_PARAMETER;
        }
 
-       GSList *iter = NULL;
-       vc_config_client_s* temp_client = NULL;
-
        pthread_mutex_lock(&vc_config_mgr_mutex);
 
        /* Call all callbacks of client*/
-       iter = g_slist_nth(g_config_client_list, 0);
-
-       while (NULL != iter) {
-               temp_client = iter->data;
-
-               if (NULL != temp_client) {
-                       if (uid == temp_client->uid) {
-                               temp_client->enabled_cb = enabled_cb;
-                               pthread_mutex_unlock(&vc_config_mgr_mutex);
-                               return VC_CONFIG_ERROR_NONE;
-                       }
-               }
-               iter = g_slist_next(iter);
+       vc_config_client_s* temp_client = __find_client_info(uid);
+       if (NULL == temp_client) {
+               SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Uid is not valid (%u)", uid);
+               pthread_mutex_unlock(&vc_config_mgr_mutex);
+               return VC_CONFIG_ERROR_INVALID_PARAMETER;
        }
 
+       temp_client->enabled_cb = enabled_cb;
+
        pthread_mutex_unlock(&vc_config_mgr_mutex);
-       return VC_CONFIG_ERROR_INVALID_PARAMETER;
+       return VC_CONFIG_ERROR_NONE;
 }
 
 int vc_config_mgr_unset_enabled_cb(unsigned int uid)
 {
-       GSList *iter = NULL;
-       vc_config_client_s* temp_client = NULL;
-
        pthread_mutex_lock(&vc_config_mgr_mutex);
 
        /* Call all callbacks of client*/
-       iter = g_slist_nth(g_config_client_list, 0);
-
-       while (NULL != iter) {
-               temp_client = iter->data;
-
-               if (NULL != temp_client) {
-                       if (uid == temp_client->uid) {
-                               temp_client->enabled_cb = NULL;
-                               pthread_mutex_unlock(&vc_config_mgr_mutex);
-                               return VC_ERROR_NONE;
-                       }
-               }
-               iter = g_slist_next(iter);
+       vc_config_client_s* temp_client = __find_client_info(uid);
+       if (NULL == temp_client) {
+               SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Uid is not valid (%u)", uid);
+               pthread_mutex_unlock(&vc_config_mgr_mutex);
+               return VC_CONFIG_ERROR_INVALID_PARAMETER;
        }
 
+       temp_client->enabled_cb = NULL;
+
        pthread_mutex_unlock(&vc_config_mgr_mutex);
-       return VC_CONFIG_ERROR_INVALID_PARAMETER;
+       return VC_ERROR_NONE;
 }
 
 int vc_config_mgr_get_auto_language(bool* value)
@@ -1516,7 +1479,7 @@ int vc_config_mgr_set_engine(const char* engine)
        /* Check current engine id with new engine id */
        if (0 == strncmp(g_config_info->engine_id, engine, strlen(g_config_info->engine_id))) {
                pthread_mutex_unlock(&vc_config_mgr_mutex);
-               return VC_ERROR_NONE;
+               return VC_CONFIG_ERROR_NONE;
        }
 
        SLOG(LOG_DEBUG, vc_config_tag(), "New engine id : %s", engine);
@@ -1528,97 +1491,46 @@ int vc_config_mgr_set_engine(const char* engine)
                return ret;
        }
 
-       GSList *iter = NULL;
-       vc_engine_info_s *engine_info = NULL;
-       bool is_valid_engine = false;
-
-       /* Get a first item */
-       iter = g_slist_nth(g_engine_list, 0);
-
-       while (NULL != iter) {
-               engine_info = iter->data;
-
-               if (NULL == engine_info) {
-                       SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Engine info is NULL");
-                       iter = g_slist_next(iter);
-                       continue;
-               }
-
-               /* Check engine id is valid */
-               if (NULL == engine_info->uuid || 0 != strcmp(engine, engine_info->uuid)) {
-                       iter = g_slist_next(iter);
-                       continue;
-               }
-
-               if (g_config_info->engine_id) {
-                       free(g_config_info->engine_id);
-                       g_config_info->engine_id = NULL;
-               }
-
-               g_config_info->engine_id = strdup(engine_info->uuid);
-
-
-               /* Engine is valid*/
-               GSList *iter_lang = NULL;
-               char* lang;
-               bool is_valid_lang = false;
-
-               /* Get a first item */
-               iter_lang = g_slist_nth(engine_info->languages, 0);
-               while (NULL != iter_lang) {
-                       /*Get handle data from list*/
-                       lang = iter_lang->data;
-
-                       SLOG(LOG_DEBUG, vc_config_tag(), " %s", lang);
-                       if (NULL != lang && NULL != g_config_info->language) {
-                               if (0 == strcmp(lang, g_config_info->language)) {
-                                       /* language is valid */
-                                       is_valid_lang = true;
-                                       break;
-                               }
-                       }
-
-                       /*Get next item*/
-                       iter_lang = g_slist_next(iter_lang);
-               }
+       vc_engine_info_s *engine_info = __find_engine_info(engine);
+       if (NULL == engine_info) {
+               SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] There is no engine with id (%s)!!", engine);
+               pthread_mutex_unlock(&vc_config_mgr_mutex);
+               return VC_CONFIG_ERROR_INVALID_PARAMETER;
+       }
 
-               if (false == is_valid_lang) {
-                       if (NULL != g_config_info->language) {
-                               free(g_config_info->language);
-                               g_config_info->language = NULL;
+       free(g_config_info->engine_id);
+       g_config_info->engine_id = strdup(engine_info->uuid);
 
-                               iter_lang = g_slist_nth(engine_info->languages, 0);
-                               if (NULL == iter_lang) {
-                                       SLOG(LOG_ERROR, vc_config_tag(), "Fail to get default language");
-                                       break;
-                               }
+       /* Engine is valid*/
+       bool is_language_valid = __is_language_valid(engine_info, g_config_info->language);
+       SLOG(LOG_ERROR, vc_config_tag(), "[INFO] Language(%s), is valid(%d)", g_config_info->language, (int)is_language_valid);
 
-                               lang = iter_lang->data;
+       char* lang = NULL;
+       if (false == is_language_valid) {
+               free(g_config_info->language);
+               g_config_info->language = NULL;
 
-                               g_config_info->language = strdup(lang);
-                       }
+               GSList *iter_lang = g_slist_nth(engine_info->languages, 0);
+               if (NULL == iter_lang || NULL == iter_lang->data) {
+                       SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Fail to get default language. Engine id(%s) is not valid", engine);
+                       pthread_mutex_unlock(&vc_config_mgr_mutex);
+                       return VC_CONFIG_ERROR_OPERATION_FAILED;
                }
 
-               is_valid_engine = true;
-               break;
+               lang = iter_lang->data;
+               g_config_info->language = strdup(lang);
        }
 
-       if (true == is_valid_engine) {
-               SLOG(LOG_DEBUG, vc_config_tag(), "[Config] Engine changed");
-               SLOG(LOG_DEBUG, vc_config_tag(), "Engine : %s", g_config_info->engine_id);
-               SLOG(LOG_DEBUG, vc_config_tag(), "Auto lang : %s", g_config_info->auto_lang ? "true" : "false");
-               SLOG(LOG_DEBUG, vc_config_tag(), "Language : %s", g_config_info->language);
-               SLOG(LOG_DEBUG, vc_config_tag(), "Enabled : %s", g_config_info->enabled ? "true" : "false");
+       SLOG(LOG_DEBUG, vc_config_tag(), "[Config] Engine changed");
+       SLOG(LOG_DEBUG, vc_config_tag(), "Engine : %s", g_config_info->engine_id);
+       SLOG(LOG_DEBUG, vc_config_tag(), "Auto lang : %s", g_config_info->auto_lang ? "true" : "false");
+       SLOG(LOG_DEBUG, vc_config_tag(), "Language : %s", g_config_info->language);
+       SLOG(LOG_DEBUG, vc_config_tag(), "Enabled : %s", g_config_info->enabled ? "true" : "false");
 
-               if (0 != vc_parser_set_engine(g_config_info->engine_id)) {
-                               SLOG(LOG_ERROR, vc_config_tag(), " Fail to save config");
-                               pthread_mutex_unlock(&vc_config_mgr_mutex);
-                               return VC_CONFIG_ERROR_OPERATION_FAILED;
-               }
-       } else {
-               SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Engine id is not valid");
+       if (0 != vc_parser_set_engine(g_config_info->engine_id)) {
+               SLOG(LOG_ERROR, vc_config_tag(), " Fail to save config");
                pthread_mutex_unlock(&vc_config_mgr_mutex);
-               return VC_CONFIG_ERROR_INVALID_PARAMETER;
+               return VC_CONFIG_ERROR_OPERATION_FAILED;
        }
 
        pthread_mutex_unlock(&vc_config_mgr_mutex);
@@ -1640,46 +1552,28 @@ int vc_config_mgr_get_language_list(vc_supported_language_cb callback, void* use
                return -1;
        }
 
-       GSList *iter = NULL;
-       vc_engine_info_s *engine_info = NULL;
+       vc_engine_info_s *engine_info = __find_engine_info(g_config_info->engine_id);
+       if (NULL == engine_info) {
+               SLOG(LOG_ERROR, vc_config_tag(), "Fail to find engine information : %s", g_config_info->engine_id);
+               pthread_mutex_unlock(&vc_config_mgr_mutex);
+               return VC_CONFIG_ERROR_NONE;
+       }
 
        /* Get a first item */
-       iter = g_slist_nth(g_engine_list, 0);
+       GSList *iter_lang = g_slist_nth(engine_info->languages, 0);
 
-       while (NULL != iter) {
-               engine_info = iter->data;
+       while (NULL != iter_lang) {
+               /*Get handle data from list*/
+               char* lang = iter_lang->data;
 
-               if (NULL == engine_info) {
-                       SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] engine info is NULL");
-                       pthread_mutex_unlock(&vc_config_mgr_mutex);
-                       return -1;
-               }
-
-               if (0 != strcmp(g_config_info->engine_id, engine_info->uuid)) {
-                       iter = g_slist_next(iter);
-                       continue;
+               SLOG(LOG_INFO, vc_config_tag(), "lang(%s)", lang);
+               if (NULL != lang) {
+                       if (false == callback(lang, user_data))
+                               break;
                }
 
-               GSList *iter_lang = NULL;
-               char* lang;
-
-               /* Get a first item */
-               iter_lang = g_slist_nth(engine_info->languages, 0);
-
-               while (NULL != iter_lang) {
-                       /*Get handle data from list*/
-                       lang = iter_lang->data;
-
-                       SLOG(LOG_INFO, vc_config_tag(), "lang(%s)", lang);
-                       if (NULL != lang) {
-                               if (false == callback(lang, user_data))
-                                       break;
-                       }
-
-                       /*Get next item*/
-                       iter_lang = g_slist_next(iter_lang);
-               }
-               break;
+               /*Get next item*/
+               iter_lang = g_slist_next(iter_lang);
        }
 
        pthread_mutex_unlock(&vc_config_mgr_mutex);
@@ -1810,30 +1704,20 @@ int vc_config_mgr_get_nonfixed_support(bool* value)
                return -1;
        }
 
-       GSList *iter = NULL;
-       vc_engine_info_s *engine_info = NULL;
-
-       /* Get a first item */
-       iter = g_slist_nth(g_engine_list, 0);
-
-       while (NULL != iter) {
-               engine_info = iter->data;
-
-               if (NULL == engine_info) {
-                       SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] engine info is NULL");
-                       pthread_mutex_unlock(&vc_config_mgr_mutex);
-                       return -1;
-               }
-
-               if (0 != strcmp(g_config_info->engine_id, engine_info->uuid)) {
-                       iter = g_slist_next(iter);
-                       continue;
-               }
+       if (NULL == g_config_info || NULL == g_config_info->engine_id) {
+               SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Engine ID is not set in global config!!");
+               pthread_mutex_unlock(&vc_config_mgr_mutex);
+               return VC_CONFIG_ERROR_ENGINE_NOT_FOUND;
+       }
 
-               *value = engine_info->non_fixed_support;
+       vc_engine_info_s *engine_info = __find_engine_info(g_config_info->engine_id);
+       if (NULL == engine_info) {
+               SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] There is no engine with id (%s)!!", g_config_info->engine_id);
+               pthread_mutex_unlock(&vc_config_mgr_mutex);
+               return VC_CONFIG_ERROR_ENGINE_NOT_FOUND;
+       };
 
-               break;
-       }
+       *value = engine_info->non_fixed_support;
 
        pthread_mutex_unlock(&vc_config_mgr_mutex);
        return VC_ERROR_NONE;
@@ -1858,26 +1742,13 @@ bool vc_config_check_default_engine_is_valid(const char* engine)
                return false;
        }
 
-       GSList *iter = NULL;
-       vc_engine_info_s *engine_info = NULL;
-
-       /* Get a first item */
-       iter = g_slist_nth(g_engine_list, 0);
-
-       while (NULL != iter) {
-               engine_info = iter->data;
-
-               if (NULL != engine_info) {
-                       if (0 == strcmp(engine, engine_info->uuid)) {
-                               pthread_mutex_unlock(&vc_config_mgr_mutex);
-                               return true;
-                       }
-               }
-               iter = g_slist_next(iter);
-       }
+       vc_engine_info_s *engine_info = __find_engine_info(engine);
+       if (NULL == engine_info) {
+               SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] There is no engine with id (%s)!!", engine);
+       };
 
        pthread_mutex_unlock(&vc_config_mgr_mutex);
-       return false;
+       return (NULL != engine_info);
 }
 
 bool vc_config_check_default_language_is_valid(const char* language)
@@ -1900,47 +1771,16 @@ bool vc_config_check_default_language_is_valid(const char* language)
                return false;
        }
 
-       GSList *iter = NULL;
-       vc_engine_info_s *engine_info = NULL;
-
-       /* Get a first item */
-       iter = g_slist_nth(g_engine_list, 0);
-
-       while (NULL != iter) {
-               engine_info = iter->data;
-
-               if (NULL == engine_info) {
-                       SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Engine info is NULL");
-                       iter = g_slist_next(iter);
-                       continue;
-               }
-
-               if (0 == strcmp(g_config_info->engine_id, engine_info->uuid)) {
-                       iter = g_slist_next(iter);
-                       continue;
-               }
-
-               GSList *iter_lang = NULL;
-               char* lang;
-
-               /* Get a first item */
-               iter_lang = g_slist_nth(engine_info->languages, 0);
-
-               while (NULL != iter_lang) {
-                       lang = iter_lang->data;
-
-                       if (0 == strcmp(language, lang)) {
-                               SLOG(LOG_INFO, vc_config_tag(), "[INFO] Default language(%s) is valid", language);
-                               return true;
-                       }
+       vc_engine_info_s *engine_info = __find_engine_info(g_config_info->engine_id);
+       if (NULL == engine_info) {
+               SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] There is no engine with id (%s)!!", g_config_info->engine_id);
+               return false;
+       };
 
-                       /*Get next item*/
-                       iter_lang = g_slist_next(iter_lang);
-               }
-               break;
-       }
+       bool is_language_valid = __is_language_valid(engine_info, language);
+       SLOG(LOG_INFO, vc_config_tag(), "[INFO] Language(%s), is valid(%d)", language, (int)is_language_valid);
 
-       return false;
+       return is_language_valid;
 }
 
 int vc_config_mgr_set_foreground(int pid, bool value)
@@ -1969,8 +1809,6 @@ int vc_config_mgr_get_foreground(int* pid)
        return vc_parser_get_foreground(pid);
 }
 
-
-
 int __vc_config_mgr_print_engine_info()
 {
        GSList *iter = NULL;