Merge "Fix to check whether it is possible to access to files" into tizen
[platform/core/uifw/tts.git] / common / tts_config_parser.c
index 135b392..443e2dd 100644 (file)
@@ -43,6 +43,7 @@
 #define TTS_TAG_VOICE_TYPE_MALE                "male"
 #define TTS_TAG_VOICE_TYPE_CHILD       "child"
 
+#define TTS_MAX_TEXT_SIZE      2000
 
 extern char* tts_tag();
 
@@ -58,14 +59,21 @@ int tts_parser_get_engine_info(const char* path, tts_engine_info_s** engine_info
                return -1;
        }
 
+       bool isTextsize = false;
        xmlDocPtr doc = NULL;
        xmlNodePtr cur = NULL;
        xmlChar *key = NULL;
        xmlChar *attr = NULL;
 
-       doc = xmlParseFile(path);
-       if (doc == NULL) {
-               SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to parse xml file");
+       if (0 == access(path, F_OK)) {
+               SLOG(LOG_DEBUG, tts_tag(), "[DEBUG] Success to access to %s", path);
+               doc = xmlParseFile(path);
+               if (doc == NULL) {
+                       SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to parse xml file");
+                       return -1;
+               }
+       } else {
+               SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to access to %s", path);
                return -1;
        }
 
@@ -213,6 +221,7 @@ int tts_parser_get_engine_info(const char* path, tts_engine_info_s** engine_info
                                SLOG(LOG_ERROR, tts_tag(), "[ERROR] <%s> has no content", TTS_TAG_ENGINE_PITCH_SUPPORT);
                        }
                } else if (0 == xmlStrcmp(cur->name, (const xmlChar *)TTS_TAG_ENGINE_TEXT_SIZE)) {
+                       isTextsize = true;
                        key = xmlNodeGetContent(cur);
                        if (NULL != key) {
                                temp->text_size = atoi((char*)key);
@@ -225,10 +234,14 @@ int tts_parser_get_engine_info(const char* path, tts_engine_info_s** engine_info
                cur = cur->next;
        }
 
+       if (false == isTextsize) {
+               temp->text_size = TTS_MAX_TEXT_SIZE;
+       }
+
        xmlFreeDoc(doc);
        doc = NULL;
 
-       if (NULL == temp->name || NULL == temp->uuid) {
+       if (NULL == temp->uuid) {
                /* Invalid engine */
                SECURE_SLOG(LOG_ERROR, tts_tag(), "[ERROR] Invalid engine : %s", path);
                tts_parser_free_engine_info(temp);
@@ -322,7 +335,7 @@ int tts_parser_print_engine_info(tts_engine_info_s* engine_info)
                SLOG(LOG_ERROR, tts_tag(), "  Voice is NONE");
        }
 
-       SLOG(LOG_DEBUG, tts_tag(), "=====================");
+       SLOG(LOG_DEBUG, tts_tag(), "@@@");
 
        return 0;
 }
@@ -363,8 +376,14 @@ int tts_parser_load_config(tts_config_s** config_info)
 
                        if (TTS_RETRY_COUNT == retry_count) {
                                SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to parse file error : %s", TTS_CONFIG);
-                               xmlCleanupParser();
-                               return -1;
+                               doc = xmlParseFile(TTS_DEFAULT_CONFIG);
+                               if (NULL == doc) {
+                                       SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to parse file error : %s", TTS_DEFAULT_CONFIG);
+                                       xmlCleanupParser();
+                                       return -1;
+                               }
+                               is_default_open = true;
+                               break;
                        }
                }
        }
@@ -507,13 +526,23 @@ int tts_parser_load_config(tts_config_s** config_info)
        g_config_doc = doc;
 
        if (true == is_default_open) {
-               int ret = xmlSaveFile(TTS_CONFIG, g_config_doc);
-               if (0 > ret) {
-                       SLOG(LOG_ERROR, tts_tag(), "[ERROR] Save result : %d", ret);
-               }
+               int retry_count = 0;
+               int ret = -1;
+               do {
+                       ret = xmlSaveFile(TTS_CONFIG, g_config_doc);
+                       if (0 < ret)
+                               break;
+                       retry_count++;
+                       usleep(10000);
+
+                       if (TTS_RETRY_COUNT == retry_count) {
+                               SLOG(LOG_ERROR, tts_tag(), "[ERROR] Save result : %d", ret);
+                               return -1;
+                       }
+               } while (0 != ret);
 
                /* Set mode */
-               if (0 > chmod(TTS_CONFIG, 0666)) {
+               if (0 > chmod(TTS_CONFIG, 0600)) {
                        SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to change file mode : %d", ret);
                }
 
@@ -552,19 +581,27 @@ int tts_parser_copy_xml(const char* original, const char* destination)
        }
 
        xmlDocPtr doc = NULL;
-       doc = xmlParseFile(original);
-       if (doc == NULL) {
-               SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to parse file error : %s", original);
+       if (0 == access(original, F_OK)) {
+               SLOG(LOG_DEBUG, tts_tag(), "[DEBUG] Success to access to %s", original);
+               doc = xmlParseFile(original);
+               if (doc == NULL) {
+                       SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to parse file error : %s", original);
+                       return -1;
+               }
+       } else {
+               SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to access to %s", original);
                return -1;
        }
 
        int ret = xmlSaveFile(destination, doc);
        if (0 > ret) {
                SLOG(LOG_ERROR, tts_tag(), "[ERROR] Save result : %d", ret);
+       } else {
+               SLOG(LOG_DEBUG, tts_tag(), "[DEBUG] Success to save %s", destination);
        }
 
        /* Set mode */
-       if (0 > chmod(destination, 0666)) {
+       if (0 > chmod(destination, 0600)) {
                SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to change file mode : %d", ret);
        }
 
@@ -628,6 +665,8 @@ int tts_parser_set_engine(const char* engine_id, const char* setting, const char
        int ret = xmlSaveFile(TTS_CONFIG, g_config_doc);
        if (0 > ret) {
                SLOG(LOG_ERROR, tts_tag(), "[ERROR] Save result : %d", ret);
+       } else {
+               SLOG(LOG_DEBUG, tts_tag(), "[DEBUG] Success to save %s", TTS_CONFIG);
        }
 
        return 0;
@@ -661,7 +700,7 @@ int tts_parser_set_voice(const char* language, int type)
        while (cur != NULL) {
                if (0 == xmlStrcmp(cur->name, (const xmlChar *)TTS_TAG_CONFIG_LANGUAGE)) {
                        xmlNodeSetContent(cur, (const xmlChar *)language);
-               } 
+               }
 
                if (0 == xmlStrcmp(cur->name, (const xmlChar *)TTS_TAG_CONFIG_VOICE_TYPE)) {
                        switch (type) {
@@ -681,6 +720,8 @@ int tts_parser_set_voice(const char* language, int type)
        int ret = xmlSaveFile(TTS_CONFIG, g_config_doc);
        if (0 > ret) {
                SLOG(LOG_ERROR, tts_tag(), "[ERROR] Save result : %d", ret);
+       } else {
+               SLOG(LOG_DEBUG, tts_tag(), "[DEBUG] Success to save %s", TTS_CONFIG);
        }
 
        return 0;
@@ -724,6 +765,8 @@ int tts_parser_set_auto_voice(bool value)
        int ret = xmlSaveFile(TTS_CONFIG, g_config_doc);
        if (0 > ret) {
                SLOG(LOG_ERROR, tts_tag(), "[ERROR] Save result : %d", ret);
+       } else {
+               SLOG(LOG_DEBUG, tts_tag(), "[DEBUG] Success to save %s", TTS_CONFIG);
        }
 
        return 0;
@@ -767,6 +810,8 @@ int tts_parser_set_speech_rate(int value)
        int ret = xmlSaveFile(TTS_CONFIG, g_config_doc);
        if (0 > ret) {
                SLOG(LOG_ERROR, tts_tag(), "[ERROR] Save result : %d", ret);
+       } else {
+               SLOG(LOG_DEBUG, tts_tag(), "[DEBUG] Success to save %s", TTS_CONFIG);
        }
 
        return 0;
@@ -799,7 +844,7 @@ int tts_parser_set_pitch(int value)
                        snprintf(temp, 10, "%d", value);
                        xmlNodeSetContent(cur, (const xmlChar *)temp);
                        break;
-               } 
+               }
 
                cur = cur->next;
        }
@@ -807,6 +852,8 @@ int tts_parser_set_pitch(int value)
        int ret = xmlSaveFile(TTS_CONFIG, g_config_doc);
        if (0 > ret) {
                SLOG(LOG_ERROR, tts_tag(), "[ERROR] Save result : %d", ret);
+       } else {
+               SLOG(LOG_DEBUG, tts_tag(), "[DEBUG] Success to save %s", TTS_CONFIG);
        }
 
        return 0;
@@ -829,9 +876,12 @@ int tts_parser_find_config_changed(char** engine, char**setting, bool* auto_voic
 
        int retry_count = 0;
        while (NULL == doc) {
-               doc = xmlParseFile(TTS_CONFIG);
-               if (NULL != doc) {
-                       break;
+               if (0 == access(TTS_CONFIG, F_OK)) {
+                       SLOG(LOG_DEBUG, tts_tag(), "[DEBUG] Success to access to %s", TTS_CONFIG);
+                       doc = xmlParseFile(TTS_CONFIG);
+                       if (NULL != doc) {
+                               break;
+                       }
                }
                retry_count++;
                usleep(10000);
@@ -1049,3 +1099,26 @@ int tts_parser_find_config_changed(char** engine, char**setting, bool* auto_voic
 
        return 0;
 }
+
+int tts_parser_reset()
+{
+       SLOG(LOG_DEBUG, tts_tag(), "[DEBUG] Reset g_config_doc as %s", TTS_DEFAULT_CONFIG);
+
+       if (NULL != g_config_doc) {
+               xmlFreeDoc(g_config_doc);
+               g_config_doc = NULL;
+       }
+
+       g_config_doc = xmlParseFile(TTS_DEFAULT_CONFIG);
+       if (NULL == g_config_doc) {
+               SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to parse %s", TTS_DEFAULT_CONFIG);
+               return -1;
+       }
+
+       int ret = xmlSaveFile(TTS_CONFIG, g_config_doc);
+       if (0 > ret) {
+               SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to save %s", TTS_CONFIG);
+       }
+
+       return 0;
+}