Fix to handle the null private data
[platform/core/uifw/stt.git] / common / stt_config_mgr.c
index 045bc86..626f054 100644 (file)
@@ -1,5 +1,5 @@
 /*
-*  Copyright (c) 2011-2014 Samsung Electronics Co., Ltd All Rights Reserved
+*  Copyright (c) 2011-2016 Samsung Electronics Co., Ltd All Rights Reserved
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
@@ -90,7 +90,7 @@ bool __stt_config_mgr_check_lang_is_valid(const char* engine_id, const char* lan
                                /*Get handle data from list*/
                                engine_lang = iter_lang->data;
 
-                               SECURE_SLOG(LOG_DEBUG, stt_tag(), "  [%dth] %s", i, engine_lang);
+                               SLOG(LOG_DEBUG, stt_tag(), "  [%dth] %s", i, engine_lang);
 
                                if (0 == strcmp(language, engine_lang)) {
                                        return true;
@@ -150,7 +150,7 @@ int __stt_config_mgr_select_lang(const char* engine_id, char** language)
                                        /* Default language is STT_BASE_LANGUAGE */
                                        if (0 == strcmp(STT_BASE_LANGUAGE, engine_lang)) {
                                                *language = strdup(engine_lang);
-                                               SECURE_SLOG(LOG_DEBUG, stt_tag(), "Selected language : %s", *language);
+                                               SLOG(LOG_DEBUG, stt_tag(), "Selected language : %s", (NULL == *language) ? "NULL" : *language);
                                                return 0;
                                        }
                                }
@@ -161,7 +161,7 @@ int __stt_config_mgr_select_lang(const char* engine_id, char** language)
                        /* Not support STT_BASE_LANGUAGE */
                        if (NULL != engine_lang) {
                                *language = strdup(engine_lang);
-                               SECURE_SLOG(LOG_DEBUG, stt_tag(), "Selected language : %s", *language);
+                               SLOG(LOG_DEBUG, stt_tag(), "Selected language : %s", (NULL == *language) ? "NULL" : *language);
                                return 0;
                        }
                }
@@ -193,11 +193,12 @@ Eina_Bool stt_config_mgr_inotify_event_cb(void* data, Ecore_Fd_Handler *fd_handl
                char* lang = NULL;
                int auto_lang = -1;
                int silence = -1;
+               int credential = -1;
 
                GSList *iter = NULL;
                stt_config_client_s* temp_client = NULL;
 
-               if (0 != stt_parser_find_config_changed(&engine, &setting, &auto_lang, &lang, &silence))
+               if (0 != stt_parser_find_config_changed(&engine, &setting, &auto_lang, &lang, &silence, &credential))
                        return ECORE_CALLBACK_PASS_ON;
 
                /* Engine changed */
@@ -220,6 +221,8 @@ Eina_Bool stt_config_mgr_inotify_event_cb(void* data, Ecore_Fd_Handler *fd_handl
 
                        if (-1 != silence)      g_config_info->silence_detection = silence;
 
+                       if (-1 != credential)   g_config_info->credential = credential;
+
                        /* Call all callbacks of client*/
                        iter = g_slist_nth(g_config_client_list, 0);
 
@@ -229,7 +232,7 @@ Eina_Bool stt_config_mgr_inotify_event_cb(void* data, Ecore_Fd_Handler *fd_handl
                                if (NULL != temp_client) {
                                        if (NULL != temp_client->engine_cb) {
                                                temp_client->engine_cb(g_config_info->engine_id, g_config_info->setting, g_config_info->language,
-                                                       g_config_info->silence_detection, temp_client->user_data);
+                                                       g_config_info->silence_detection, g_config_info->credential, temp_client->user_data);
                                        }
                                }
 
@@ -353,7 +356,18 @@ int __stt_config_set_auto_language()
        strncpy(candidate_lang, value, 5);
        free(value);
 
+       /* Check current config info */
+       if (NULL == g_config_info) {
+               SLOG(LOG_ERROR, stt_tag(), "Current config info is NULL");
+               return STT_CONFIG_ERROR_OPERATION_FAILED;
+       }
+
        /* Check current language */
+       if (NULL == g_config_info->language) {
+               SLOG(LOG_ERROR, stt_tag(), "Current config language is NULL");
+               return STT_CONFIG_ERROR_OPERATION_FAILED;
+       }
+
        if (0 == strncmp(g_config_info->language, candidate_lang, 5)) {
                SLOG(LOG_DEBUG, stt_tag(), "[Config] Language is auto. STT language(%s) is same with display lang", g_config_info->language);
                return 0;
@@ -362,12 +376,6 @@ int __stt_config_set_auto_language()
        }
 
        if (true == __stt_config_mgr_check_lang_is_valid(g_config_info->engine_id, candidate_lang)) {
-               /* stt default language change */
-               if (NULL == g_config_info->language) {
-                       SLOG(LOG_ERROR, stt_tag(), "Current config language is NULL");
-                       return -1;
-               }
-
                char* before_lang = NULL;
                if (0 != stt_parser_set_language(candidate_lang)) {
                        SLOG(LOG_ERROR, stt_tag(), "Fail to save default language");
@@ -379,7 +387,7 @@ int __stt_config_set_auto_language()
                free(g_config_info->language);
                g_config_info->language = strdup(candidate_lang);
 
-               SECURE_SLOG(LOG_DEBUG, stt_tag(), "[Config] Language is auto. Set default language(%s)", g_config_info->language);
+               SLOG(LOG_DEBUG, stt_tag(), "[Config] Language is auto. Set default language(%s)", g_config_info->language);
 
                /* Call all callbacks of client*/
                GSList *iter = NULL;
@@ -421,7 +429,7 @@ int __stt_config_set_auto_language()
                        return -1;
                }
 
-               SECURE_SLOG(LOG_DEBUG, stt_tag(), "[Config] Language is auto but display lang is not supported. Default language change(%s)", tmp_language);
+               SLOG(LOG_DEBUG, stt_tag(), "[Config] Language is auto but display lang is not supported. Default language change(%s)", tmp_language);
 
                /* Call all callbacks of client*/
                GSList *iter = NULL;
@@ -441,10 +449,8 @@ int __stt_config_set_auto_language()
                        iter = g_slist_next(iter);
                }
 
-               if (NULL != g_config_info->language) {
-                       free(g_config_info->language);
-                       g_config_info->language = strdup(tmp_language);
-               }
+               free(g_config_info->language);
+               g_config_info->language = strdup(tmp_language);
 
                free(tmp_language);
        }
@@ -490,6 +496,7 @@ void __stt_config_release_client(int uid)
        if (0 < g_slist_length(g_config_client_list)) {
                SLOG(LOG_DEBUG, stt_tag(), "Client count (%d)", g_slist_length(g_config_client_list));
        }
+       return;
 }
 
 void __stt_config_release_engine()
@@ -514,6 +521,7 @@ void __stt_config_release_engine()
                        iter = g_slist_nth(g_engine_list, 0);
                }
        }
+       return;
 }
 
 int __stt_config_mgr_check_engine_is_valid(const char* engine_id)
@@ -628,9 +636,10 @@ int __stt_config_mgr_check_engine_is_valid(const char* engine_id)
        SLOG(LOG_DEBUG, stt_tag(), "  Setting : %s", g_config_info->setting);
        SLOG(LOG_DEBUG, stt_tag(), "  language : %s", g_config_info->language);
        SLOG(LOG_DEBUG, stt_tag(), "  Silence detection : %s", g_config_info->silence_detection ? "on" : "off");
+       SLOG(LOG_DEBUG, stt_tag(), "  Credential : %s", g_config_info->credential ? "true" : "false");
 
        if (0 != stt_parser_set_engine(g_config_info->engine_id, g_config_info->setting, g_config_info->language,
-               g_config_info->silence_detection)) {
+               g_config_info->silence_detection, g_config_info->credential)) {
                        SLOG(LOG_ERROR, stt_tag(), " Fail to save config");
                        return STT_CONFIG_ERROR_OPERATION_FAILED;
        }
@@ -652,7 +661,7 @@ int stt_config_mgr_initialize(int uid)
                        get_uid = iter->data;
 
                        if (uid == *get_uid) {
-                               SECURE_SLOG(LOG_WARN, stt_tag(), "[CONFIG] uid(%d) has already registered", uid);
+                               SLOG(LOG_WARN, stt_tag(), "[CONFIG] uid(%d) has already registered", uid);
                                return 0;
                        }
 
@@ -673,7 +682,7 @@ int stt_config_mgr_initialize(int uid)
                /* Add uid */
                g_config_client_list = g_slist_append(g_config_client_list, temp_client);
 
-               SECURE_SLOG(LOG_WARN, stt_tag(), "[CONFIG] Add uid(%d) but config has already initialized", uid);
+               SLOG(LOG_WARN, stt_tag(), "[CONFIG] Add uid(%d) but config has already initialized", uid);
                return STT_CONFIG_ERROR_NONE;
        }
 
@@ -685,6 +694,7 @@ int stt_config_mgr_initialize(int uid)
 
        g_engine_list = NULL;
 
+       SLOG(LOG_WARN, stt_tag(), "[CONFIG] default engine info(%s)", STT_DEFAULT_ENGINE_INFO);
        dp  = opendir(STT_DEFAULT_ENGINE_INFO);
        if (NULL != dp) {
                do {
@@ -772,11 +782,12 @@ int stt_config_mgr_initialize(int uid)
 
        /* print daemon config */
        SLOG(LOG_DEBUG, stt_tag(), "== Daemon config ==");
-       SECURE_SLOG(LOG_DEBUG, stt_tag(), " engine : %s", g_config_info->engine_id);
-       SECURE_SLOG(LOG_DEBUG, stt_tag(), " setting : %s", g_config_info->setting);
-       SECURE_SLOG(LOG_DEBUG, stt_tag(), " auto language : %s", g_config_info->auto_lang ? "on" : "off");
-       SECURE_SLOG(LOG_DEBUG, stt_tag(), " language : %s", g_config_info->language);
-       SECURE_SLOG(LOG_DEBUG, stt_tag(), " silence detection : %s", g_config_info->silence_detection ? "on" : "off");
+       SLOG(LOG_DEBUG, stt_tag(), " engine : %s", g_config_info->engine_id);
+       SLOG(LOG_DEBUG, stt_tag(), " setting : %s", g_config_info->setting);
+       SLOG(LOG_DEBUG, stt_tag(), " auto language : %s", g_config_info->auto_lang ? "on" : "off");
+       SLOG(LOG_DEBUG, stt_tag(), " language : %s", g_config_info->language);
+       SLOG(LOG_DEBUG, stt_tag(), " silence detection : %s", g_config_info->silence_detection ? "on" : "off");
+       SLOG(LOG_DEBUG, stt_tag(), " credential : %s", g_config_info->credential ? "true" : "false");
        SLOG(LOG_DEBUG, stt_tag(), "===================");
 
        if (0 != __stt_config_mgr_register_config_event()) {
@@ -951,7 +962,7 @@ int stt_config_mgr_get_engine_list(stt_config_supported_engine_cb callback, void
                        return STT_CONFIG_ERROR_OPERATION_FAILED;
                }
 
-               if (false == callback(engine_info->uuid, engine_info->name, 
+               if (false == callback(engine_info->uuid, engine_info->name,
                        engine_info->setting, engine_info->support_silence_detection, user_data)) {
                        break;
                }
@@ -1003,7 +1014,7 @@ int stt_config_mgr_set_engine(const char* engine)
                return 0;
        }
 
-       SECURE_SLOG(LOG_DEBUG, stt_tag(), "New engine id : %s", engine);
+       SLOG(LOG_DEBUG, stt_tag(), "New engine id : %s", engine);
 
        GSList *iter = NULL;
        stt_engine_info_s *engine_info = NULL;
@@ -1054,17 +1065,15 @@ int stt_config_mgr_set_engine(const char* engine)
                        /*Get handle data from list*/
                        lang = iter_lang->data;
 
-                       SECURE_SLOG(LOG_DEBUG, stt_tag(), " %s", lang);
-                       if (NULL != lang) {
+                       SLOG(LOG_DEBUG, stt_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;
 
-                                       if (NULL != g_config_info->language) {
-                                               free(g_config_info->language);
+                                       free(g_config_info->language);
+                                       g_config_info->language = strdup(lang);
 
-                                               g_config_info->language = strdup(lang);
-                                       }
                                        break;
                                }
                        }
@@ -1076,8 +1085,14 @@ int stt_config_mgr_set_engine(const char* engine)
                if (false == is_valid_lang) {
                        if (NULL != g_config_info->language) {
                                free(g_config_info->language);
+                               g_config_info->language = NULL;
 
                                iter_lang = g_slist_nth(engine_info->languages, 0);
+                               if (NULL == iter_lang) {
+                                       SLOG(LOG_ERROR, stt_tag(), "Fail to get default language");
+                                       break;
+                               }
+
                                lang = iter_lang->data;
 
                                g_config_info->language = strdup(lang);
@@ -1090,19 +1105,25 @@ int stt_config_mgr_set_engine(const char* engine)
                                g_config_info->silence_detection = false;
                }
 
+               if (false == engine_info->need_credential) {
+                       if (true == g_config_info->credential)
+                               g_config_info->credential = false;
+               }
+
                is_valid_engine = true;
                break;
        }
 
        if (true == is_valid_engine) {
                SLOG(LOG_DEBUG, stt_tag(), "[Config] Engine changed");
-               SECURE_SLOG(LOG_DEBUG, stt_tag(), "  Engine : %s", g_config_info->engine_id);
-               SECURE_SLOG(LOG_DEBUG, stt_tag(), "  Setting : %s", g_config_info->setting);
-               SECURE_SLOG(LOG_DEBUG, stt_tag(), "  language : %s", g_config_info->language);
-               SECURE_SLOG(LOG_DEBUG, stt_tag(), "  Silence detection : %s", g_config_info->silence_detection ? "on" : "off");
+               SLOG(LOG_DEBUG, stt_tag(), "  Engine : %s", g_config_info->engine_id);
+               SLOG(LOG_DEBUG, stt_tag(), "  Setting : %s", g_config_info->setting);
+               SLOG(LOG_DEBUG, stt_tag(), "  language : %s", g_config_info->language);
+               SLOG(LOG_DEBUG, stt_tag(), "  Silence detection : %s", g_config_info->silence_detection ? "on" : "off");
+               SLOG(LOG_DEBUG, stt_tag(), "  Credential : %s", g_config_info->credential ? "true" : "false");
 
                if (0 != stt_parser_set_engine(g_config_info->engine_id, g_config_info->setting, g_config_info->language,
-                       g_config_info->silence_detection)) {
+                       g_config_info->silence_detection, g_config_info->credential)) {
                                SLOG(LOG_ERROR, stt_tag(), " Fail to save config");
                                return STT_CONFIG_ERROR_OPERATION_FAILED;
                }
@@ -1215,8 +1236,8 @@ int stt_config_mgr_get_language_list(const char* engine_id, stt_config_supported
                        /*Get handle data from list*/
                        lang = iter_lang->data;
 
-                       SECURE_SLOG(LOG_DEBUG, stt_tag(), " %s", lang);
                        if (NULL != lang) {
+                               SLOG(LOG_DEBUG, stt_tag(), " %s", lang);
                                if (false == callback(engine_info->uuid, lang, user_data))
                                        break;
                        }
@@ -1464,11 +1485,11 @@ int __stt_config_mgr_print_engine_info()
        while (NULL != iter) {
                engine_info = iter->data;
 
-               SECURE_SLOG(LOG_DEBUG, stt_tag(), "[%dth]", i);
-               SECURE_SLOG(LOG_DEBUG, stt_tag(), " name : %s", engine_info->name);
-               SECURE_SLOG(LOG_DEBUG, stt_tag(), " id   : %s", engine_info->uuid);
-               SECURE_SLOG(LOG_DEBUG, stt_tag(), " setting : %s", engine_info->setting);
-               SECURE_SLOG(LOG_DEBUG, stt_tag(), " agreement : %s", engine_info->agreement);
+               SLOG(LOG_DEBUG, stt_tag(), "[%dth]", i);
+               SLOG(LOG_DEBUG, stt_tag(), " name : %s", engine_info->name);
+               SLOG(LOG_DEBUG, stt_tag(), " id   : %s", engine_info->uuid);
+               SLOG(LOG_DEBUG, stt_tag(), " setting : %s", engine_info->setting);
+               SLOG(LOG_DEBUG, stt_tag(), " agreement : %s", engine_info->agreement);
 
                SLOG(LOG_DEBUG, stt_tag(), " languages");
                GSList *iter_lang = NULL;
@@ -1482,7 +1503,7 @@ int __stt_config_mgr_print_engine_info()
                                /*Get handle data from list*/
                                lang = iter_lang->data;
 
-                               SECURE_SLOG(LOG_DEBUG, stt_tag(), "  [%dth] %s", j, lang);
+                               SLOG(LOG_DEBUG, stt_tag(), "  [%dth] %s", j, lang);
 
                                /*Get next item*/
                                iter_lang = g_slist_next(iter_lang);
@@ -1491,7 +1512,7 @@ int __stt_config_mgr_print_engine_info()
                } else {
                        SLOG(LOG_ERROR, stt_tag(), "  language is NONE");
                }
-               SECURE_SLOG(LOG_DEBUG, stt_tag(), " silence support : %s", 
+               SLOG(LOG_DEBUG, stt_tag(), " silence support : %s",
                        engine_info->support_silence_detection ? "true" : "false");
                iter = g_slist_next(iter);
                i++;
@@ -1521,8 +1542,12 @@ int stt_config_mgr_reset_time_info()
 
                g_time_list = g_slist_remove(g_time_list, data);
                if (NULL != data) {
-                       if (NULL == data->text) free(data->text);
+                       if (NULL != data->text) {
+                               free(data->text);
+                               data->text = NULL;
+                       }
                        free(data);
+                       data = NULL;
                }
 
                /*Get next item*/
@@ -1581,7 +1606,7 @@ int stt_config_mgr_foreach_time_info(stt_config_result_time_cb callback, void* u
        while (NULL != iter) {
                data = iter->data;
 
-               if (false == callback(data->index, data->event, data->text, 
+               if (false == callback(data->index, data->event, data->text,
                        data->start_time, data->end_time, user_data)) {
                        break;
                }
@@ -1598,8 +1623,12 @@ int stt_config_mgr_foreach_time_info(stt_config_result_time_cb callback, void* u
                if (NULL != data) {
                        temp_time = g_slist_remove(temp_time, data);
 
-                       if (NULL == data->text) free(data->text);
+                       if (NULL != data->text) {
+                               free(data->text);
+                               data->text = NULL;
+                       }
                        free(data);
+                       data = NULL;
                }
 
                /*Get next item*/
@@ -1631,4 +1660,4 @@ int stt_config_mgr_remove_time_info_file()
        stt_parser_clear_time_info();
 
        return STT_CONFIG_ERROR_NONE;
-}
\ No newline at end of file
+}