Update hello protocol
[platform/core/uifw/tts.git] / common / tts_config_parser.c
index 42cfad0..51ff971 100644 (file)
@@ -39,6 +39,7 @@
 #define TTS_TAG_CONFIG_LANGUAGE                "language"
 #define TTS_TAG_CONFIG_SPEECH_RATE     "speech-rate"
 #define TTS_TAG_CONFIG_PITCH           "pitch"
+#define TTS_TAG_CONFIG_BACKGROUND_VOLUME_RATIO         "background-volume-ratio"
 #define TTS_TAG_VOICE_TYPE_FEMALE      "female"
 #define TTS_TAG_VOICE_TYPE_MALE                "male"
 #define TTS_TAG_VOICE_TYPE_CHILD       "child"
@@ -77,14 +78,14 @@ int tts_parser_get_engine_info(const char* path, tts_engine_info_s** engine_info
 
        cur = xmlDocGetRootElement(doc);
        if (cur == NULL) {
-               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Empty document");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Empty document. doc path(%s, %p)", path, doc);
                xmlFreeDoc(doc);
                doc = NULL;
                return -1;
        }
 
        if (xmlStrcmp(cur->name, (const xmlChar *)TTS_TAG_ENGINE_BASE_TAG)) {
-               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] The wrong type, root node is NOT 'tts-engine'");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] The wrong type, root node is NOT 'tts-engine'. doc path(%s, %p)", path, doc);
                xmlFreeDoc(doc);
                doc = NULL;
                return -1;
@@ -92,7 +93,7 @@ int tts_parser_get_engine_info(const char* path, tts_engine_info_s** engine_info
 
        cur = cur->xmlChildrenNode;
        if (cur == NULL) {
-               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Empty document");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Empty document. doc path(%s, %p)", path, doc);
                xmlFreeDoc(doc);
                doc = NULL;
                return -1;
@@ -102,7 +103,7 @@ int tts_parser_get_engine_info(const char* path, tts_engine_info_s** engine_info
        tts_engine_info_s* temp;
        temp = (tts_engine_info_s*)calloc(1, sizeof(tts_engine_info_s));
        if (NULL == temp) {
-               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Out of memory");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Out of memory. doc path(%s, %p)", path, doc);
                xmlFreeDoc(doc);
                doc = NULL;
                return -1;
@@ -236,8 +237,11 @@ int tts_parser_get_engine_info(const char* path, tts_engine_info_s** engine_info
                temp->text_size = TTS_MAX_TEXT_SIZE;
        }
 
-       xmlFreeDoc(doc);
-       doc = NULL;
+       if (NULL != doc) {
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[DEBUG] doc path(%s, %p)", path, doc);
+               xmlFreeDoc(doc);
+               doc = NULL;
+       }
 
        if (NULL == temp->uuid) {
                /* Invalid engine */
@@ -388,7 +392,7 @@ int tts_parser_load_config(tts_config_s** config_info)
 
        cur = xmlDocGetRootElement(doc);
        if (cur == NULL) {
-               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Empty document");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Empty document(%p)", doc);
                xmlFreeDoc(doc);
                doc = NULL;
                xmlCleanupParser();
@@ -396,7 +400,7 @@ int tts_parser_load_config(tts_config_s** config_info)
        }
 
        if (xmlStrcmp(cur->name, (const xmlChar *) TTS_TAG_CONFIG_BASE_TAG)) {
-               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] The wrong type, root node is NOT %s", TTS_TAG_CONFIG_BASE_TAG);
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] The wrong type, root node is NOT %s. doc(%p)", TTS_TAG_CONFIG_BASE_TAG, doc);
                xmlFreeDoc(doc);
                doc = NULL;
                xmlCleanupParser();
@@ -405,7 +409,7 @@ int tts_parser_load_config(tts_config_s** config_info)
 
        cur = cur->xmlChildrenNode;
        if (cur == NULL) {
-               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Empty document");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Empty document(%p)", doc);
                xmlFreeDoc(doc);
                doc = NULL;
                xmlCleanupParser();
@@ -416,7 +420,7 @@ int tts_parser_load_config(tts_config_s** config_info)
        tts_config_s* temp;
        temp = (tts_config_s*)calloc(1, sizeof(tts_config_s));
        if (NULL == temp) {
-               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Out of memory");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Out of memory(%p)", doc);
                xmlFreeDoc(doc);
                doc = NULL;
                xmlCleanupParser();
@@ -513,6 +517,15 @@ int tts_parser_load_config(tts_config_s** config_info)
                        } else {
                                SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Pitch is NULL");
                        }
+               } else if (0 == xmlStrcmp(cur->name, (const xmlChar *)TTS_TAG_CONFIG_BACKGROUND_VOLUME_RATIO)) {
+                       key = xmlNodeGetContent(cur);
+                       if (NULL != key) {
+                               temp->bg_volume_ratio = atof((char*)key);
+                               xmlFree(key);
+                               key = NULL;
+                       } else {
+                               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Background volume ratio is NULL");
+                       }
                } else {
 
                }
@@ -557,10 +570,12 @@ int tts_parser_load_config(tts_config_s** config_info)
 int tts_parser_unload_config(tts_config_s* config_info)
 {
        if (NULL != g_config_doc) {
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[DEBUG] Free g_config_doc(%p)", g_config_doc);
                xmlFreeDoc(g_config_doc);
                g_config_doc = NULL;
        }
        if (NULL != config_info) {
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[DEBUG] Free config_info(%p)", config_info);
                free(config_info);
                config_info = NULL;
        }
@@ -614,8 +629,12 @@ int tts_parser_copy_xml(const char* original, const char* destination)
                SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to change file mode : %d", ret);
        }
 
-       xmlFreeDoc(doc);
-       doc = NULL;
+       if (NULL != doc) {
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[DEBUG] doc(%p)", doc);
+               xmlFreeDoc(doc);
+               doc = NULL;
+       }
+
        SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[SUCCESS] Copying xml");
 
        return 0;
@@ -942,8 +961,65 @@ int tts_parser_set_pitch(int value)
        return 0;
 }
 
+int tts_parser_set_bg_volume_ratio(double value)
+{
+       xmlNodePtr cur = NULL;
+       cur = xmlDocGetRootElement(g_config_doc);
+       if (cur == NULL) {
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Empty document");
+               return -1;
+       }
+
+       if (xmlStrcmp(cur->name, (const xmlChar *) TTS_TAG_CONFIG_BASE_TAG)) {
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] The wrong type, root node is NOT %s", TTS_TAG_CONFIG_BASE_TAG);
+               return -1;
+       }
+
+       cur = cur->xmlChildrenNode;
+       if (cur == NULL) {
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Empty document");
+               return -1;
+       }
+
+       while (cur != NULL) {
+               if (0 == xmlStrcmp(cur->name, (const xmlChar *)TTS_TAG_CONFIG_BACKGROUND_VOLUME_RATIO)) {
+                       char temp[10];
+                       memset(temp, '\0', 10);
+                       snprintf(temp, 10, "%lf", value);
+                       xmlNodeSetContent(cur, (const xmlChar *)temp);
+                       break;
+               }
+
+               cur = cur->next;
+       }
+
+       if (0 == access(TTS_CONFIG, F_OK)) {
+               int ret = xmlSaveFile(TTS_CONFIG, g_config_doc);
+               if (0 > ret) {
+                       SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Save result : %d", ret);
+               } else {
+                       static FILE* pFile;
+                       pFile = fopen(TTS_CONFIG, "r");
+                       int fd = -1;
+                       if (NULL == pFile) {
+                               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to open file %s", TTS_CONFIG);
+                       } else {
+                               fd = fileno(pFile);
+                               fsync(fd);
+                               fclose(pFile);
+                               SLOG(LOG_INFO, TAG_TTSCONFIG, "[DEBUG] Success to fsync %s", TTS_CONFIG);
+                       }
+                       SLOG(LOG_ERROR, TAG_TTSCONFIG, "[DEBUG] Success to save %s", TTS_CONFIG);
+               }
+       } else {
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to access to %s", TTS_CONFIG);
+       }
+
+       return 0;
+}
+
 int tts_parser_find_config_changed(char** engine, char**setting, bool* auto_voice, char** language, int* voice_type, 
-                                  int* speech_rate, int* pitch)
+                                  int* speech_rate, int* pitch, double* bg_volume_ratio)
 {
        if (NULL == engine || NULL == setting || NULL == language || NULL == voice_type || NULL == speech_rate) {
                SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Input parameter is NULL");
@@ -978,7 +1054,7 @@ int tts_parser_find_config_changed(char** engine, char**setting, bool* auto_voic
        cur_new = xmlDocGetRootElement(doc);
        cur_old = xmlDocGetRootElement(g_config_doc);
        if (cur_new == NULL || cur_old == NULL) {
-               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Empty document");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Empty document(%p)", doc);
                xmlFreeDoc(doc);
                doc = NULL;
                return -1;
@@ -986,7 +1062,7 @@ int tts_parser_find_config_changed(char** engine, char**setting, bool* auto_voic
 
        if (xmlStrcmp(cur_new->name, (const xmlChar*)TTS_TAG_CONFIG_BASE_TAG) || 
        xmlStrcmp(cur_old->name, (const xmlChar*)TTS_TAG_CONFIG_BASE_TAG)) {
-               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] The wrong type, root node is NOT %s", TTS_TAG_CONFIG_BASE_TAG);
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] The wrong type, root node is NOT %s. doc(%p)", TTS_TAG_CONFIG_BASE_TAG, doc);
                xmlFreeDoc(doc);
                doc = NULL;
                return -1;
@@ -995,7 +1071,7 @@ int tts_parser_find_config_changed(char** engine, char**setting, bool* auto_voic
        cur_new = cur_new->xmlChildrenNode;
        cur_old = cur_old->xmlChildrenNode;
        if (cur_new == NULL || cur_old == NULL) {
-               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Empty document");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Empty document(%p)", doc);
                xmlFreeDoc(doc);
                doc = NULL;
                return -1;
@@ -1166,6 +1242,26 @@ int tts_parser_find_config_changed(char** engine, char**setting, bool* auto_voic
                        } else {
                                SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] old config and new config are different");
                        }
+               } else if (0 == xmlStrcmp(cur_new->name, (const xmlChar*)TTS_TAG_CONFIG_BACKGROUND_VOLUME_RATIO)) {
+                       if (0 == xmlStrcmp(cur_old->name, (const xmlChar*)TTS_TAG_CONFIG_BACKGROUND_VOLUME_RATIO)) {
+                               key_old = xmlNodeGetContent(cur_old);
+                               if (NULL != key_old) {
+                                       key_new = xmlNodeGetContent(cur_new);
+                                       if (NULL != key_new) {
+                                               if (0 != xmlStrcmp(key_old, key_new)) {
+                                                       SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Old bg volume ratio(%s), New bg volume ratio(%s)", 
+                                                               (char*)key_old, (char*)key_new);
+                                                       *bg_volume_ratio = atof((char*)key_new);
+                                               }
+                                               xmlFree(key_new);
+                                               key_new = NULL;
+                                       }
+                                       xmlFree(key_old);
+                                       key_old = NULL;
+                               }
+                       } else {
+                               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] old config and new config are different");
+                       }
                } else {
 
                }
@@ -1175,6 +1271,7 @@ int tts_parser_find_config_changed(char** engine, char**setting, bool* auto_voic
        }
 
        if (NULL != g_config_doc) {
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[DEBUG] Free g_config_doc(%p)", g_config_doc);
                xmlFreeDoc(g_config_doc);
                g_config_doc = NULL;
        }
@@ -1188,6 +1285,7 @@ int tts_parser_reset()
        SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[DEBUG] Reset g_config_doc as %s", TTS_DEFAULT_CONFIG);
 
        if (NULL != g_config_doc) {
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[DEBUG] Free g_config_doc(%p)", g_config_doc);
                xmlFreeDoc(g_config_doc);
                g_config_doc = NULL;
        }