Fix bugs
[platform/core/uifw/stt.git] / common / stt_engine.c
index 3ddc644..0311c51 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
@@ -34,7 +34,7 @@ typedef struct {
 
        int (*sttp_load_engine)(sttpd_funcs_s* pdfuncs, sttpe_funcs_s* pefuncs);
        int (*sttp_unload_engine)();
-}sttengine_s;
+} sttengine_s;
 
 extern const char* stt_tag();
 
@@ -43,14 +43,19 @@ static GSList *g_engine_list;
 
 static const char* __stt_get_engine_error_code(sttp_error_e err)
 {
-       switch(err) {
+       switch (err) {
        case STTP_ERROR_NONE:                   return "STTP_ERROR_NONE";
        case STTP_ERROR_OUT_OF_MEMORY:          return "STTP_ERROR_OUT_OF_MEMORY";
        case STTP_ERROR_IO_ERROR:               return "STTP_ERROR_IO_ERROR";
        case STTP_ERROR_INVALID_PARAMETER:      return "STTP_ERROR_INVALID_PARAMETER";
+       case STTP_ERROR_TIMED_OUT:              return "STTP_ERROR_TIMED_OUT";
+       case STTP_ERROR_RECORDER_BUSY:          return "STTP_ERROR_RECORDER_BUSY";
        case STTP_ERROR_OUT_OF_NETWORK:         return "STTP_ERROR_OUT_OF_NETWORK";
+       case STTP_ERROR_PERMISSION_DENIED:      return "STTP_ERROR_PERMISSION_DENIED";
+       case STTP_ERROR_NOT_SUPPORTED:          return "STTP_ERROR_NOT_SUPPORTED";
        case STTP_ERROR_INVALID_STATE:          return "STTP_ERROR_INVALID_STATE";
        case STTP_ERROR_INVALID_LANGUAGE:       return "STTP_ERROR_INVALID_LANGUAGE";
+       case STTP_ERROR_ENGINE_NOT_FOUND:       return "STTP_ERROR_ENGINE_NOT_FOUND";
        case STTP_ERROR_OPERATION_FAILED:       return "STTP_ERROR_OPERATION_FAILED";
        case STTP_ERROR_NOT_SUPPORTED_FEATURE:  return "STTP_ERROR_NOT_SUPPORTED_FEATURE";
        default:
@@ -88,7 +93,7 @@ static sttengine_s* __get_engine(int engine_id)
 int stt_engine_load(int engine_id, const char* filepath)
 {
        if (NULL == filepath || engine_id < 0) {
-               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid Parameter"); 
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid Parameter");
                return STTP_ERROR_INVALID_PARAMETER;
        }
 
@@ -103,6 +108,10 @@ int stt_engine_load(int engine_id, const char* filepath)
 
        /* allocation memory */
        engine = (sttengine_s*)calloc(1, sizeof(sttengine_s));
+       if (NULL == engine) {
+               SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to allocate memory");
+               return STTP_ERROR_OUT_OF_MEMORY;
+       }
 
        /* load engine */
        char *error;
@@ -115,7 +124,20 @@ int stt_engine_load(int engine_id, const char* filepath)
        }
 
        engine->pefuncs = (sttpe_funcs_s*)calloc(1, sizeof(sttpe_funcs_s));
+       if (NULL == engine->pefuncs) {
+               SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to allocate memory");
+               dlclose(engine->handle);
+               free(engine);
+               return STTP_ERROR_OUT_OF_MEMORY;
+       }
        engine->pdfuncs = (sttpd_funcs_s*)calloc(1, sizeof(sttpd_funcs_s));
+       if (NULL == engine->pdfuncs) {
+               SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to allocate memory");
+               dlclose(engine->handle);
+               free(engine->pefuncs);
+               free(engine);
+               return STTP_ERROR_OUT_OF_MEMORY;
+       }
 
        engine->sttp_unload_engine = NULL;
        engine->sttp_load_engine = NULL;
@@ -130,7 +152,7 @@ int stt_engine_load(int engine_id, const char* filepath)
                return STTP_ERROR_OPERATION_FAILED;
        }
 
-       engine->sttp_load_engine = (int (*)(sttpd_funcs_s*, sttpe_funcs_s*) )dlsym(engine->handle, "sttp_load_engine");
+       engine->sttp_load_engine = (int (*)(sttpd_funcs_s*, sttpe_funcs_s*))dlsym(engine->handle, "sttp_load_engine");
        if (NULL != (error = dlerror()) || NULL == engine->sttp_load_engine) {
                SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail to link daemon to sttp_load_engine() : %s", error);
                dlclose(engine->handle);
@@ -145,8 +167,8 @@ int stt_engine_load(int engine_id, const char* filepath)
 
        engine->pdfuncs->version = 1;
        engine->pdfuncs->size = sizeof(sttpd_funcs_s);
-       
-       int ret = engine->sttp_load_engine(engine->pdfuncs, engine->pefuncs); 
+
+       int ret = engine->sttp_load_engine(engine->pdfuncs, engine->pefuncs);
        if (0 != ret) {
                SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail sttp_load_engine() : %s", __stt_get_engine_error_code(ret));
                dlclose(engine->handle);
@@ -154,7 +176,7 @@ int stt_engine_load(int engine_id, const char* filepath)
                free(engine->pdfuncs);
                free(engine->engine_path);
                free(engine);
-               return STTP_ERROR_OPERATION_FAILED;
+               return ret;
        }
 
        /* engine error check */
@@ -186,10 +208,10 @@ int stt_engine_load(int engine_id, const char* filepath)
                free(engine->engine_path);
                free(engine);
 
-               return STTP_ERROR_OPERATION_FAILED; 
+               return STTP_ERROR_OPERATION_FAILED;
        }
 
-       SECURE_SLOG(LOG_DEBUG, stt_tag(), "[Engine Success] Load engine : version(%d), size(%d)",engine->pefuncs->version, engine->pefuncs->size);
+       SLOG(LOG_DEBUG, stt_tag(), "[Engine Success] Load engine : version(%d), size(%d)", engine->pefuncs->version, engine->pefuncs->size);
 
        g_engine_list = g_slist_append(g_engine_list, engine);
 
@@ -209,7 +231,7 @@ int stt_engine_unload(int engine_id)
        /* unload engine */
        engine->sttp_unload_engine();
        dlclose(engine->handle);
-       
+
        if (NULL != engine->engine_path)        free(engine->engine_path);
        if (NULL != engine->pefuncs)            free(engine->pefuncs);
        if (NULL != engine->pdfuncs)            free(engine->pdfuncs);
@@ -217,7 +239,7 @@ int stt_engine_unload(int engine_id)
        g_engine_list = g_slist_remove(g_engine_list, engine);
 
        free(engine);
-       
+
        return 0;
 }
 
@@ -226,7 +248,7 @@ int stt_engine_unload(int engine_id)
 int stt_engine_initialize(int engine_id, sttpe_result_cb result_cb, sttpe_silence_detected_cb silence_cb)
 {
        if (NULL == result_cb || NULL == silence_cb) {
-               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid Parameter"); 
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid Parameter");
                return STTP_ERROR_INVALID_PARAMETER;
        }
 
@@ -241,10 +263,9 @@ int stt_engine_initialize(int engine_id, sttpe_result_cb result_cb, sttpe_silenc
        ret = engine->pefuncs->initialize(result_cb, silence_cb);
        if (0 != ret) {
                SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail to initialize : %s", __stt_get_engine_error_code(ret));
-               return STTP_ERROR_OPERATION_FAILED;
        }
 
-       return 0;
+       return ret;
 }
 
 int stt_engine_deinitialize(int engine_id)
@@ -262,7 +283,7 @@ int stt_engine_deinitialize(int engine_id)
                SLOG(LOG_WARN, stt_tag(), "[Engine WARNING] Fail to deinitialize : %s", __stt_get_engine_error_code(ret));
        }
 
-       return 0;
+       return ret;
 }
 
 static bool __supported_language_cb(const char* language, void* user_data)
@@ -285,7 +306,7 @@ static bool __supported_language_cb(const char* language, void* user_data)
 int stt_engine_get_supported_langs(int engine_id, GSList** lang_list)
 {
        if (NULL == lang_list) {
-               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid Parameter"); 
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid Parameter");
                return STTP_ERROR_INVALID_PARAMETER;
        }
 
@@ -300,16 +321,15 @@ int stt_engine_get_supported_langs(int engine_id, GSList** lang_list)
        ret = engine->pefuncs->foreach_langs(__supported_language_cb, (void*)lang_list);
        if (0 != ret) {
                SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] get language list error : %s", __stt_get_engine_error_code(ret));
-               return STTP_ERROR_OPERATION_FAILED;
        }
 
-       return 0;
+       return ret;
 }
 
 int stt_engine_is_valid_language(int engine_id, const char* language, bool *is_valid)
 {
        if (NULL == language || NULL == is_valid) {
-               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid Parameter"); 
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid Parameter");
                return STTP_ERROR_INVALID_PARAMETER;
        }
 
@@ -319,7 +339,7 @@ int stt_engine_is_valid_language(int engine_id, const char* language, bool *is_v
                SECURE_SLOG(LOG_WARN, stt_tag(), "[Engine WARNING] engine id(%d) is invalid", engine_id);
                return STTP_ERROR_INVALID_PARAMETER;
        }
-       
+
        bool result;
        result = engine->pefuncs->is_valid_lang(language);
 
@@ -328,10 +348,57 @@ int stt_engine_is_valid_language(int engine_id, const char* language, bool *is_v
        return 0;
 }
 
+int stt_engine_set_private_data(int engine_id, const char* key, const char* data)
+{
+       if (NULL == key || NULL == data) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid Parameter");
+               return STTP_ERROR_INVALID_PARAMETER;
+       }
+
+       sttengine_s* engine = NULL;
+       engine = __get_engine(engine_id);
+       if (NULL == engine) {
+               SECURE_SLOG(LOG_WARN, stt_tag(), "[Engine WARNING] engine id(%d) is invalid", engine_id);
+               return STTP_ERROR_INVALID_PARAMETER;
+       }
+
+       int ret = engine->pefuncs->set_private_data(key, data);
+       if (0 != ret) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail to set private data(%d)", ret);
+       }
+       return ret;
+}
+
+int stt_engine_get_private_data(int engine_id, const char* key, char** data)
+{
+       if (NULL == key || NULL == data) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid Parameter");
+               return STTP_ERROR_INVALID_PARAMETER;
+       }
+
+       sttengine_s* engine = NULL;
+       engine = __get_engine(engine_id);
+       if (NULL == engine) {
+               SECURE_SLOG(LOG_WARN, stt_tag(), "[Engine WARNING] engine id(%d) is invalid", engine_id);
+               return STTP_ERROR_INVALID_PARAMETER;
+       }
+
+       char* temp = NULL;
+       int ret = engine->pefuncs->get_private_data(key, &temp);
+       if (0 != ret) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail to get private data(%d)", ret);
+               return ret;
+       }
+
+       *data = strdup(temp);
+
+       return STTP_ERROR_NONE;
+}
+
 int stt_engine_get_first_language(int engine_id, char** language)
 {
        if (NULL == language) {
-               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid Parameter"); 
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid Parameter");
                return STTP_ERROR_INVALID_PARAMETER;
        }
 
@@ -347,7 +414,7 @@ int stt_engine_get_first_language(int engine_id, char** language)
        ret = engine->pefuncs->foreach_langs(__supported_language_cb, &lang_list);
        if (0 != ret) {
                SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] get language list error : %s", __stt_get_engine_error_code(ret));
-               return STTP_ERROR_OPERATION_FAILED;
+               return ret;
        }
 
        GSList *iter = NULL;
@@ -387,7 +454,7 @@ int stt_engine_get_first_language(int engine_id, char** language)
 int stt_engine_support_silence(int engine_id, bool* support)
 {
        if (NULL == support) {
-               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid Parameter"); 
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid Parameter");
                return STTP_ERROR_INVALID_PARAMETER;
        }
 
@@ -405,10 +472,35 @@ int stt_engine_support_silence(int engine_id, bool* support)
        return 0;
 }
 
+
+int stt_engine_need_app_credential(int engine_id, bool* need)
+{
+       if (NULL == need) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid Parameter");
+               return STTP_ERROR_INVALID_PARAMETER;
+       }
+
+       sttengine_s* engine = NULL;
+       engine = __get_engine(engine_id);
+       if (NULL == engine) {
+               SECURE_SLOG(LOG_WARN, stt_tag(), "[Engine WARNING] engine id(%d) is invalid", engine_id);
+               return STTP_ERROR_INVALID_PARAMETER;
+       }
+
+       bool result;
+       if (NULL != engine->pefuncs->need_app_credential) {
+               result = engine->pefuncs->need_app_credential();
+               *need = result;
+               return STTP_ERROR_NONE;
+       }
+
+       return STTP_ERROR_OPERATION_FAILED;
+}
+
 int stt_engine_support_recognition_type(int engine_id, const char* type, bool* support)
 {
        if (NULL == type || NULL == support) {
-               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid Parameter"); 
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid Parameter");
                return STTP_ERROR_INVALID_PARAMETER;
        }
 
@@ -432,7 +524,7 @@ int stt_engine_support_recognition_type(int engine_id, const char* type, bool* s
 int stt_engine_get_audio_type(int engine_id, sttp_audio_type_e* types, int* rate, int* channels)
 {
        if (NULL == types || NULL == rate || NULL == channels) {
-               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid Parameter"); 
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid Parameter");
                return STTP_ERROR_INVALID_PARAMETER;
        }
 
@@ -447,10 +539,9 @@ int stt_engine_get_audio_type(int engine_id, sttp_audio_type_e* types, int* rate
        ret = engine->pefuncs->get_audio_format(types, rate, channels);
        if (0 != ret) {
                SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail to get audio format : %s", __stt_get_engine_error_code(ret));
-               return STTP_ERROR_OPERATION_FAILED;
        }
 
-       return 0;
+       return ret;
 }
 
 /* Set option */
@@ -465,14 +556,13 @@ int stt_engine_set_silence_detection(int engine_id, bool value)
 
        int ret = engine->pefuncs->set_silence_detection(value);
        if (STTP_ERROR_NOT_SUPPORTED_FEATURE == ret) {
-               SLOG(LOG_WARN, stt_tag(), "[Engine WARNING] Not support silence detection"); 
+               SLOG(LOG_WARN, stt_tag(), "[Engine WARNING] Not support silence detection");
                return STTP_ERROR_NOT_SUPPORTED_FEATURE;
        } else if (0 != ret) {
-               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail to set silence detection : %d", ret); 
-               return STTP_ERROR_OPERATION_FAILED;
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail to set silence detection : %d", ret);
        }
-       
-       return 0;
+
+       return ret;
 }
 
 int stt_engine_check_app_agreed(int engine_id, const char* appid, bool* value)
@@ -494,17 +584,16 @@ int stt_engine_check_app_agreed(int engine_id, const char* appid, bool* value)
        if (0 != ret) {
                SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail to get app agreement : %s", __stt_get_engine_error_code(ret));
                *value = false;
-               return STTP_ERROR_OPERATION_FAILED;
        }
-       
-       return 0;
+
+       return ret;
 }
 
 /* Recognition */
-int stt_engine_recognize_start(int engine_id, const char* lang, const char* recognition_type, void* user_param)
+int stt_engine_recognize_start(int engine_id, const char* lang, const char* recognition_type, const char* credential, void* user_param)
 {
        if (NULL == lang || NULL == recognition_type) {
-               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid Parameter"); 
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid Parameter");
                return STTP_ERROR_INVALID_PARAMETER;
        }
 
@@ -515,19 +604,19 @@ int stt_engine_recognize_start(int engine_id, const char* lang, const char* reco
                return STTP_ERROR_INVALID_PARAMETER;
        }
 
-       int ret = engine->pefuncs->start(lang, recognition_type, user_param);
+       int ret = engine->pefuncs->start(lang, recognition_type, credential, user_param);
        if (0 != ret) {
                SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail to start recognition : %s", __stt_get_engine_error_code(ret));
-               return STTP_ERROR_OPERATION_FAILED;
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail to start recognition : lang(%s), recognition_type(%s), credential(%s)", lang, recognition_type, credential);
        }
 
-       return 0;
+       return ret;
 }
 
 int stt_engine_set_recording_data(int engine_id, const void* data, unsigned int length)
 {
        if (NULL == data) {
-               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid Parameter"); 
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid Parameter");
                return STTP_ERROR_INVALID_PARAMETER;
        }
 
@@ -541,10 +630,9 @@ int stt_engine_set_recording_data(int engine_id, const void* data, unsigned int
        int ret = engine->pefuncs->set_recording(data, length);
        if (0 != ret) {
                SLOG(LOG_WARN, stt_tag(), "[Engine WARNING] Fail to set recording : %s", __stt_get_engine_error_code(ret));
-               return STTP_ERROR_OPERATION_FAILED;
        }
 
-       return 0;
+       return ret;
 }
 
 int stt_engine_recognize_stop(int engine_id)
@@ -559,10 +647,9 @@ int stt_engine_recognize_stop(int engine_id)
        int ret = engine->pefuncs->stop();
        if (0 != ret) {
                SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail to stop : %s", __stt_get_engine_error_code(ret));
-               return STTP_ERROR_OPERATION_FAILED;
        }
 
-       return 0;
+       return ret;
 }
 
 int stt_engine_recognize_cancel(int engine_id)
@@ -577,10 +664,9 @@ int stt_engine_recognize_cancel(int engine_id)
        int ret = engine->pefuncs->cancel();
        if (0 != ret) {
                SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail to cancel : %s", __stt_get_engine_error_code(ret));
-               return STTP_ERROR_OPERATION_FAILED;
        }
 
-       return 0;
+       return ret;
 }
 
 int stt_engine_foreach_result_time(int engine_id, void* time_info, sttpe_result_time_cb callback, void* user_data)
@@ -595,17 +681,16 @@ int stt_engine_foreach_result_time(int engine_id, void* time_info, sttpe_result_
        int ret = engine->pefuncs->foreach_result_time(time_info, callback, user_data);
        if (0 != ret) {
                SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail to foreach result time : %s", __stt_get_engine_error_code(ret));
-               return STTP_ERROR_OPERATION_FAILED;
        }
-       
-       return 0;
+
+       return ret;
 }
 
 int stt_engine_recognize_start_file(int engine_id, const char* lang, const char* recognition_type, 
                                     const char* filepath, sttp_audio_type_e audio_type, int sample_rate, void* user_param)
 {
        if (NULL == filepath || NULL == lang || NULL == recognition_type) {
-               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid Parameter"); 
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid Parameter");
                return STTP_ERROR_INVALID_PARAMETER;
        }
 
@@ -624,10 +709,9 @@ int stt_engine_recognize_start_file(int engine_id, const char* lang, const char*
        int ret = engine->pefuncs->start_file(lang, recognition_type, filepath, audio_type, sample_rate, user_param);
        if (0 != ret) {
                SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail to start file recognition : %s", __stt_get_engine_error_code(ret));
-               return STTP_ERROR_OPERATION_FAILED;
        }
 
-       return 0;
+       return ret;
 }
 
 int stt_engine_recognize_cancel_file(int engine_id)
@@ -647,8 +731,7 @@ int stt_engine_recognize_cancel_file(int engine_id)
        int ret = engine->pefuncs->cancel_file();
        if (0 != ret) {
                SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail to start file recognition : %s", __stt_get_engine_error_code(ret));
-               return STTP_ERROR_OPERATION_FAILED;
        }
 
-       return 0;
-}
\ No newline at end of file
+       return ret;
+}