Add bux2ctl_get for getting buxton key and setting an engine by users 33/89933/8 accepted/tizen/common/20160928.164459 submit/tizen/20160928.123210
authorsooyeon.kim <sooyeon.kim@samsung.com>
Tue, 27 Sep 2016 13:01:08 +0000 (22:01 +0900)
committersooyeon.kim <sooyeon.kim@samsung.com>
Wed, 28 Sep 2016 12:19:58 +0000 (21:19 +0900)
Change-Id: I1e1fb105feb7339c2fef37c3426c0105a876374c
Signed-off-by: sooyeon.kim <sooyeon.kim@samsung.com>
15 files changed:
CMakeLists.txt
bin/aarch64/voice_getengine [new file with mode: 0755]
bin/armv7l/voice_getengine [new file with mode: 0755]
bin/i586/voice_getengine [new file with mode: 0755]
bin/x86_64/voice_getengine [new file with mode: 0755]
client/stt.c
client/stt_dbus.c
client/stt_dbus.h
common/stt_config_mgr.c
common/stt_defs.h
include/stt.h
org.tizen.voice.sttserver.service
org.tizen.voice.sttservercustom.service [new file with mode: 0644]
packaging/stt.spec
server/sttd_dbus.c

index 6ef8f9b..767b057 100644 (file)
@@ -25,6 +25,9 @@ SET(PREFIX ${CMAKE_INSTALL_PREFIX})
 SET(EXEC_PREFIX "${PREFIX}")
 SET(VERSION 0.2.56)
 
+FIND_PROGRAM(UNAME NAMES uname)
+EXEC_PROGRAM("${UNAME}" ARGS "-m" OUTPUT_VARIABLE "ARCH")
+
 ADD_DEFINITIONS("-DSTT_LIBDIR=\"${LIBDIR}\"")
 ADD_DEFINITIONS("-Werror")
 
@@ -37,12 +40,12 @@ INCLUDE(FindPkgConfig)
 IF("${_TV_PRODUCT}" STREQUAL "TRUE")
 pkg_check_modules(pkgs REQUIRED 
        aul capi-media-audio-io capi-media-wav-player capi-network-bluetooth capi-system-info cynara-client cynara-session
-       dbus-1 dlog ecore glib-2.0 libtzplatform-config libxml-2.0 vconf vconf-internal-keys
+       dbus-1 dlog ecore glib-2.0 libtzplatform-config libxml-2.0 vconf vconf-internal-keys buxton2
 )
 ELSE()
 pkg_check_modules(pkgs REQUIRED 
        aul capi-media-audio-io capi-media-wav-player capi-system-info cynara-client cynara-session
-       dbus-1 dlog ecore glib-2.0 libtzplatform-config libxml-2.0 vconf vconf-internal-keys
+       dbus-1 dlog ecore glib-2.0 libtzplatform-config libxml-2.0 vconf vconf-internal-keys buxton2
 )
 ENDIF()
 
@@ -70,7 +73,22 @@ INSTALL(FILES ${CMAKE_SOURCE_DIR}/stt-config.xml DESTINATION ${TZ_SYS_RO_SHARE}/
 
 ## Dbus service ##
 INSTALL(FILES ${CMAKE_SOURCE_DIR}/org.tizen.voice.sttserver.service DESTINATION ${TZ_SYS_RO_SHARE}/dbus-1/services)
+INSTALL(FILES ${CMAKE_SOURCE_DIR}/org.tizen.voice.sttservercustom.service DESTINATION ${TZ_SYS_RO_SHARE}/dbus-1/services)
 
 INSTALL(FILES ${CMAKE_SOURCE_DIR}/stt-server.conf DESTINATION /etc/dbus-1/session.d)
 INSTALL(FILES ${CMAKE_SOURCE_DIR}/500.stt_upgrade_24to30.sh DESTINATION ${TZ_SYS_RO_SHARE}/upgrade/scripts)
 
+## voice_getengine ##
+IF("${ARCH}" MATCHES "^arm.*")
+INSTALL(PROGRAMS ${CMAKE_SOURCE_DIR}/bin/armv7l/voice_getengine DESTINATION ${TZ_SYS_BIN})
+ELSEIF("${ARCH}" MATCHES "^i586.*")
+INSTALL(PROGRAMS ${CMAKE_SOURCE_DIR}/bin/i586/voice_getengine DESTINATION ${TZ_SYS_BIN})
+ELSEIF("${ARCH}" MATCHES "^i686.*")
+INSTALL(PROGRAMS ${CMAKE_SOURCE_DIR}/bin/i586/voice_getengine DESTINATION ${TZ_SYS_BIN})
+ELSEIF("${ARCH}" MATCHES "^aarch64.*")
+INSTALL(PROGRAMS ${CMAKE_SOURCE_DIR}/bin/aarch64/voice_getengine DESTINATION ${TZ_SYS_BIN})
+ELSEIF("${ARCH}" MATCHES "^x86_64.*")
+INSTALL(PROGRAMS ${CMAKE_SOURCE_DIR}/bin/x86_64/voice_getengine DESTINATION ${TZ_SYS_BIN})
+ENDIF()
+
+
diff --git a/bin/aarch64/voice_getengine b/bin/aarch64/voice_getengine
new file mode 100755 (executable)
index 0000000..9b9c2de
Binary files /dev/null and b/bin/aarch64/voice_getengine differ
diff --git a/bin/armv7l/voice_getengine b/bin/armv7l/voice_getengine
new file mode 100755 (executable)
index 0000000..c101a5f
Binary files /dev/null and b/bin/armv7l/voice_getengine differ
diff --git a/bin/i586/voice_getengine b/bin/i586/voice_getengine
new file mode 100755 (executable)
index 0000000..b01c05b
Binary files /dev/null and b/bin/i586/voice_getengine differ
diff --git a/bin/x86_64/voice_getengine b/bin/x86_64/voice_getengine
new file mode 100755 (executable)
index 0000000..a4e2f60
Binary files /dev/null and b/bin/x86_64/voice_getengine differ
index 163d67a..5135afe 100644 (file)
@@ -24,6 +24,7 @@
 #include <sys/wait.h>
 #include <system_info.h>
 #include <unistd.h>
+#include <buxton2.h>
 
 #include "stt.h"
 #include "stt_client.h"
@@ -505,6 +506,61 @@ int stt_get_engine(stt_h stt, char** engine_id)
        return ret;
 }
 
+int __stt_set_buxtonkey(const char* engine_id)
+{
+       /* Set vconfkey */
+       struct buxton_client * bux_cli;
+       struct buxton_layer * bux_layer;
+       struct buxton_value * bux_val;
+
+       int ret = buxton_open(&bux_cli, NULL, NULL);
+       if (0 != ret) {
+               SLOG(LOG_ERROR, stt_tag(), "[DBUS-BUXTON2] Fail to open buxton client");
+               return STT_ERROR_OPERATION_FAILED;
+       }
+       SLOG(LOG_DEBUG, stt_tag(), "[DBUS-BUXTON2] buxton_open: %d", ret);
+       bux_layer = buxton_create_layer("user");
+       if (NULL == bux_layer) {
+               SLOG(LOG_ERROR, stt_tag(), "[DBUS-BUXTON2] buxton_create_layer FAIL");
+               buxton_close(bux_cli);
+               bux_cli = NULL;
+               return STT_ERROR_OPERATION_FAILED;
+       }
+       bux_val = buxton_value_create_string(engine_id);
+       if (NULL == bux_val) {
+               SLOG(LOG_ERROR, stt_tag(), "[DBUS-BUXTON2] buxton_value_create_string FAIL");
+               buxton_free_layer(bux_layer);
+               buxton_close(bux_cli);
+               bux_layer = NULL;
+               bux_cli = NULL;
+               return STT_ERROR_OPERATION_FAILED;
+       }
+
+       ret = buxton_set_value_sync(bux_cli, bux_layer, STT_ENGINE_DB_CUSTOM, bux_val);
+       if (0 != ret) {
+               SLOG(LOG_ERROR, stt_tag(), "[DBUS-BUXTON2] Fail to set value sync");
+               buxton_value_free(bux_val);
+               buxton_free_layer(bux_layer);
+               buxton_close(bux_cli);
+
+               bux_cli = NULL;
+               bux_layer = NULL;
+               bux_val = NULL;
+               return STT_ERROR_OPERATION_FAILED;
+       }
+       SLOG(LOG_DEBUG, stt_tag(), "[DBUS-BUXTON2] buxton_set_value_sync: %d, %s", ret, STT_ENGINE_DB_CUSTOM);
+
+       buxton_value_free(bux_val);
+       buxton_free_layer(bux_layer);
+       buxton_close(bux_cli);
+
+       bux_cli = NULL;
+       bux_layer = NULL;
+       bux_val = NULL;
+
+       return STT_ERROR_NONE;
+}
+
 int stt_set_engine(stt_h stt, const char* engine_id)
 {
        stt_client_s* client = NULL;
@@ -540,6 +596,13 @@ int stt_set_engine(stt_h stt, const char* engine_id)
 
        client->current_engine_id = strdup(engine_id);
 
+       /* Set vconfkey */
+       int ret = __stt_set_buxtonkey(engine_id);
+       if (0 != ret) {
+               SLOG(LOG_ERROR, TAG_STTC, "[ERROR] set buxtonkey Failed!!!");
+               return ret;
+       }
+
        SLOG(LOG_DEBUG, TAG_STTC, "=====");
        SLOG(LOG_DEBUG, TAG_STTC, " ");
 
@@ -704,7 +767,7 @@ static Eina_Bool __stt_connect_daemon(void *data)
 
        /* Send hello */
        int ret = -1;
-       ret = stt_dbus_request_hello();
+       ret = stt_dbus_request_hello(client->uid);
 
        if (0 != ret) {
                if (STT_ERROR_INVALID_STATE == ret) {
index e64a8cb..e5e7e3b 100644 (file)
 
 #include "stt_client.h"
 
+#include <vconf/vconf.h>
+#include <buxton2.h>
+
 static int g_waiting_time = 3000;
 static int g_waiting_short_time = 500;
 
+static char* g_server_service_name = NULL;
+static char* g_server_service_object = NULL;
+static char* g_server_service_interface = NULL;
+
 static Ecore_Fd_Handler* g_fd_handler = NULL;
 
 static DBusConnection* g_conn_sender = NULL;
 static DBusConnection* g_conn_listener = NULL;
 
+void __stt_dbus_service_free();
 
 extern int __stt_cb_error(int uid, int reason, char* err_msg);
 
@@ -35,6 +43,318 @@ extern int __stt_cb_set_state(int uid, int state);
 
 extern int __stt_cb_set_volume(int uid, float volume);
 
+char* __stt_get_service_name(char* engine_id)
+{
+       char* service_name = NULL;
+       const char* engine_default = NULL;
+
+       struct buxton_client * bux_cli;
+       struct buxton_layer * bux_layer;
+       struct buxton_value * bux_val;
+
+       int ret = buxton_open(&bux_cli, NULL, NULL);
+       if (0 != ret) {
+               SLOG(LOG_ERROR, TAG_STTC, "[DBUS-BUXTON2] Fail to open buxton client, ret(%d)", ret);
+               return NULL;
+       }
+       SLOG(LOG_DEBUG, TAG_STTC, "[DBUS-BUXTON2] buxton_open: %d", ret);
+       bux_layer = buxton_create_layer("user");
+       if (NULL == bux_layer) {
+               SLOG(LOG_ERROR, TAG_STTC, "[DBUS-BUXTON2] buxton_create_layer FAIL");
+               buxton_close(bux_cli);
+               bux_cli = NULL;
+               return NULL;
+       }
+
+       bux_val = buxton_value_create_string("stt-engine-default");
+       if (NULL == bux_val) {
+               SLOG(LOG_ERROR, TAG_STTC, "[DBUS-BUXTON2] buxton_value_create_string FAIL");
+               buxton_free_layer(bux_layer);
+               buxton_close(bux_cli);
+               bux_layer = NULL;
+               bux_cli = NULL;
+               return NULL;
+       }
+
+       ret = buxton_get_value_sync(bux_cli, bux_layer, STT_ENGINE_DB_DEFAULT, &bux_val);
+       if (0 != ret) {
+               SLOG(LOG_ERROR, TAG_STTC, "[DBUS-BUXTON2] Fail to get value sync, ret(%d)", ret);
+               buxton_value_free(bux_val);
+               buxton_free_layer(bux_layer);
+               buxton_close(bux_cli);
+
+               bux_cli = NULL;
+               bux_layer = NULL;
+               bux_val = NULL;
+               return NULL;
+       }
+       ret = buxton_value_get_string(bux_val, &engine_default);
+       if (0 != ret) {
+               SLOG(LOG_ERROR, TAG_STTC, "[DBUS-BUXTON2] Fail to get value string, ret(%d)", ret);
+               buxton_value_free(bux_val);
+               buxton_free_layer(bux_layer);
+               buxton_close(bux_cli);
+
+               bux_cli = NULL;
+               bux_layer = NULL;
+               bux_val = NULL;
+               return NULL;
+       }
+       SLOG(LOG_DEBUG, TAG_STTC, "[DBUS-BUXTON2] buxton_value_get_string: engine_default: %s", engine_default);
+
+
+       if (NULL == engine_id || NULL == engine_default || 0 == strncmp(engine_id, engine_default, strlen(engine_id))) {
+               service_name = (char*)calloc(strlen(STT_SERVER_SERVICE_NAME) + 1, sizeof(char));
+               if (NULL == service_name) {
+                       SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Memory allocation Failed!!");
+                       buxton_value_free(bux_val);
+                       buxton_free_layer(bux_layer);
+                       buxton_close(bux_cli);
+
+                       bux_cli = NULL;
+                       bux_layer = NULL;
+                       bux_val = NULL;
+                       return NULL;
+               }
+               snprintf(service_name, strlen(STT_SERVER_SERVICE_NAME) + 1, "%s", STT_SERVER_SERVICE_NAME);
+       } else {
+               service_name = (char*)calloc(strlen(STT_SERVER_SERVICE_NAME) + strlen(engine_id) - 8, sizeof(char));
+               if (NULL == service_name) {
+                       SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Memory allocation Failed!!");
+                       buxton_value_free(bux_val);
+                       buxton_free_layer(bux_layer);
+                       buxton_close(bux_cli);
+
+                       bux_cli = NULL;
+                       bux_layer = NULL;
+                       bux_val = NULL;
+                       return NULL;
+               }
+               snprintf(service_name, strlen(STT_SERVER_SERVICE_NAME) + strlen(engine_id) - 8, "%s%s%s", STT_SERVER_SERVICE_NAME, ".", (engine_id + 10));
+       }
+
+       buxton_value_free(bux_val);
+       buxton_free_layer(bux_layer);
+       buxton_close(bux_cli);
+
+       bux_cli = NULL;
+       bux_layer = NULL;
+       bux_val = NULL;
+
+       SLOG(LOG_DEBUG, TAG_STTC, "[get_service_name] FINISH!! service name: %s", service_name);
+
+       return service_name;
+}
+
+char* __stt_get_service_object(char* engine_id)
+{
+       char* service_object = NULL;
+       const char* engine_default = NULL;
+
+       struct buxton_client * bux_cli;
+       struct buxton_layer * bux_layer;
+       struct buxton_value * bux_val;
+
+       int ret = buxton_open(&bux_cli, NULL, NULL);
+       if (0 != ret) {
+               SLOG(LOG_ERROR, TAG_STTC, "[DBUS-BUXTON2] Fail to open buxton client, ret(%d)", ret);
+               return NULL;
+       }
+       bux_layer = buxton_create_layer("user");
+       if (NULL == bux_layer) {
+               SLOG(LOG_DEBUG, TAG_STTC, "[DBUS-BUXTON2] buxton_create_layer FAIL");
+               buxton_close(bux_cli);
+               bux_cli = NULL;
+               return NULL;
+       }
+
+       bux_val = buxton_value_create_string("stt-engine-default");
+       if (NULL == bux_val) {
+               SLOG(LOG_ERROR, TAG_STTC, "[DBUS-BUXTON2] buxton_value_create_string FAIL");
+               buxton_free_layer(bux_layer);
+               buxton_close(bux_cli);
+               bux_layer = NULL;
+               bux_cli = NULL;
+               return NULL;
+       }
+
+       ret = buxton_get_value_sync(bux_cli, bux_layer, STT_ENGINE_DB_DEFAULT, &bux_val);
+       if (0 != ret) {
+               SLOG(LOG_ERROR, TAG_STTC, "[DBUS-BUXTON2] Fail to get value sync, ret(%d)", ret);
+               buxton_value_free(bux_val);
+               buxton_free_layer(bux_layer);
+               buxton_close(bux_cli);
+
+               bux_cli = NULL;
+               bux_layer = NULL;
+               bux_val = NULL;
+               return NULL;
+       }
+       ret = buxton_value_get_string(bux_val, &engine_default);
+       if (0 != ret) {
+               SLOG(LOG_ERROR, TAG_STTC, "[DBUS-BUXTON2] Fail to get string, ret(%d)", ret);
+               buxton_value_free(bux_val);
+               buxton_free_layer(bux_layer);
+               buxton_close(bux_cli);
+
+               bux_cli = NULL;
+               bux_layer = NULL;
+               bux_val = NULL;
+               return NULL;
+       }
+       SLOG(LOG_DEBUG, TAG_STTC, "[DBUS-BUXTON2] buxton_value_get_string: engine_default: %s", engine_default);
+
+       if (NULL == engine_id || NULL == engine_default || 0 == strncmp(engine_id, engine_default, strlen(engine_id))) {
+               service_object = (char*)calloc(strlen(STT_SERVER_SERVICE_OBJECT_PATH) + 1, sizeof(char));
+               if (NULL == service_object) {
+                       SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Memory allocation Failed!!");
+                       buxton_value_free(bux_val);
+                       buxton_free_layer(bux_layer);
+                       buxton_close(bux_cli);
+
+                       bux_cli = NULL;
+                       bux_layer = NULL;
+                       bux_val = NULL;
+                       return NULL;
+               }
+               snprintf(service_object, strlen(STT_SERVER_SERVICE_OBJECT_PATH) + 1, "%s", STT_SERVER_SERVICE_OBJECT_PATH);
+       } else {
+               service_object = (char*)calloc(strlen(STT_SERVER_SERVICE_OBJECT_PATH) + strlen(engine_id) - 8, sizeof(char));
+               if (NULL == service_object) {
+                       SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Memory allocation Failed!!");
+                       buxton_value_free(bux_val);
+                       buxton_free_layer(bux_layer);
+                       buxton_close(bux_cli);
+
+                       bux_cli = NULL;
+                       bux_layer = NULL;
+                       bux_val = NULL;
+                       return NULL;
+               }
+               snprintf(service_object, strlen(STT_SERVER_SERVICE_OBJECT_PATH) + strlen(engine_id) - 8, "%s%s%s", STT_SERVER_SERVICE_OBJECT_PATH, "/", (engine_id + 10));
+       }
+
+       buxton_value_free(bux_val);
+       buxton_free_layer(bux_layer);
+       buxton_close(bux_cli);
+
+       bux_cli = NULL;
+       bux_layer = NULL;
+       bux_val = NULL;
+
+       SLOG(LOG_DEBUG, TAG_STTC, "[get_service_object] FINISH!! service object: %s", service_object);
+
+       return service_object;
+}
+
+char* __stt_get_service_interface(char* engine_id)
+{
+       char* service_interface = NULL;
+       const char* engine_default = NULL;
+
+       struct buxton_client * bux_cli;
+       struct buxton_layer * bux_layer;
+       struct buxton_value * bux_val;
+
+       int ret = buxton_open(&bux_cli, NULL, NULL);
+       if (0 != ret) {
+               SLOG(LOG_ERROR, TAG_STTC, "[DBUS-BUXTON2] Fail to open buxton client, ret(%d)", ret);
+               return NULL;
+       }
+       bux_layer = buxton_create_layer("user");
+       if (NULL == bux_layer) {
+               SLOG(LOG_ERROR, TAG_STTC, "[DBUS-BUXTON2] buxton_create_layer FAIL");
+               buxton_close(bux_cli);
+               bux_cli = NULL;
+               return NULL;
+       }
+
+       bux_val = buxton_value_create_string("stt-engine-default");
+       if (NULL == bux_val) {
+               SLOG(LOG_ERROR, TAG_STTC, "[DBUS-BUXTON2] buxton_value_create_string FAIL");
+               buxton_free_layer(bux_layer);
+               buxton_close(bux_cli);
+               bux_layer = NULL;
+               bux_cli = NULL;
+               return NULL;
+       }
+
+       ret = buxton_get_value_sync(bux_cli, bux_layer, STT_ENGINE_DB_DEFAULT, &bux_val);
+       if (0 != ret) {
+               SLOG(LOG_ERROR, TAG_STTC, "[DBUS-BUXTON2] Fail to get value sync, ret(%d)", ret);
+               buxton_value_free(bux_val);
+               buxton_free_layer(bux_layer);
+               buxton_close(bux_cli);
+
+               bux_cli = NULL;
+               bux_layer = NULL;
+               bux_val = NULL;
+               return NULL;
+       }
+       ret = buxton_value_get_string(bux_val, &engine_default);
+       if (0 != ret) {
+               SLOG(LOG_ERROR, TAG_STTC, "[DBUS-BUXTON2] Fail to get string, ret(%d)", ret);
+               buxton_value_free(bux_val);
+               buxton_free_layer(bux_layer);
+               buxton_close(bux_cli);
+
+               bux_cli = NULL;
+               bux_layer = NULL;
+               bux_val = NULL;
+               return NULL;
+       }
+       SLOG(LOG_DEBUG, TAG_STTC, "[DBUS-BUXTON2] buxton_value_get_string: engine_default: %s", engine_default);
+
+       if (NULL == engine_id || NULL == engine_default || 0 == strncmp(engine_id, engine_default, strlen(engine_id))) {
+               service_interface = (char*)calloc(strlen(STT_SERVER_SERVICE_INTERFACE) + 1, sizeof(char));
+               if (NULL == service_interface) {
+                       SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Memory allocation Failed!!");
+                       buxton_value_free(bux_val);
+                       buxton_free_layer(bux_layer);
+                       buxton_close(bux_cli);
+
+                       bux_cli = NULL;
+                       bux_layer = NULL;
+                       bux_val = NULL;
+                       return NULL;
+               }
+               snprintf(service_interface, strlen(STT_SERVER_SERVICE_INTERFACE) + 1, "%s", STT_SERVER_SERVICE_INTERFACE);
+       } else {
+               service_interface = (char*)calloc(strlen(STT_SERVER_SERVICE_INTERFACE) + strlen(engine_id) - 8, sizeof(char));
+               if (NULL == service_interface) {
+                       SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Memory allocation Failed!!");
+                       buxton_value_free(bux_val);
+                       buxton_free_layer(bux_layer);
+                       buxton_close(bux_cli);
+
+                       bux_cli = NULL;
+                       bux_layer = NULL;
+                       bux_val = NULL;
+                       return NULL;
+               }
+               snprintf(service_interface, strlen(STT_SERVER_SERVICE_INTERFACE) + strlen(engine_id) - 8, "%s%s%s", STT_SERVER_SERVICE_INTERFACE, ".", (engine_id + 10));
+       }
+
+       char* ret_char = strchr(service_interface, '-');
+       while(NULL != ret_char) {
+               ret_char[0] = '_';
+               ret_char = strchr(service_interface, '-');
+       }
+
+       buxton_value_free(bux_val);
+       buxton_free_layer(bux_layer);
+       ret = buxton_close(bux_cli);
+
+       bux_cli = NULL;
+       bux_layer = NULL;
+       bux_val = NULL;
+
+       SLOG(LOG_DEBUG, TAG_STTC, "[get_service_interface] FINISH!! service interface: %s", service_interface);
+
+       return service_interface;
+}
+
+
 static Eina_Bool listener_event_callback(void* data, Ecore_Fd_Handler *fd_handler)
 {
        if (NULL == g_conn_listener)    return ECORE_CALLBACK_RENEW;
@@ -399,6 +719,8 @@ int stt_dbus_close_connection()
        g_conn_sender = NULL;
        g_conn_listener = NULL;
 
+       __stt_dbus_service_free();
+
        return 0;
 }
 
@@ -423,26 +745,107 @@ int stt_dbus_reconnect()
        return 0;
 }
 
-int stt_dbus_request_hello()
+void __stt_dbus_service_free()
 {
-       DBusMessage* msg;
+       if (NULL != g_server_service_name) {
+               free(g_server_service_name);
+               g_server_service_name = NULL;
+       }
+       if (NULL != g_server_service_object) {
+               free(g_server_service_object);
+               g_server_service_object = NULL;
+       }
+       if (NULL != g_server_service_interface) {
+               free(g_server_service_interface);
+               g_server_service_interface = NULL;
+       }
+}
 
-       msg = dbus_message_new_method_call(
-               STT_SERVER_SERVICE_NAME, 
-               STT_SERVER_SERVICE_OBJECT_PATH, 
-               STT_SERVER_SERVICE_INTERFACE, 
-               STT_METHOD_HELLO);
+int stt_dbus_request_hello(int uid)
+{
+       stt_client_s* client = stt_client_get_by_uid(uid);
+
+       /* Check whether there is any dbus whose name has owner or not */
+       dbus_bool_t is_exist = FALSE;
+       DBusError err;
+       dbus_error_init(&err);
+
+       DBusMessage* msg = NULL;
+       DBusMessage* result_msg = NULL;
+       int result = 0;
+
+       if (g_conn_sender) {
+               if(NULL != client) {
+                       __stt_dbus_service_free();
+
+                       if (NULL == client->current_engine_id) {
+                               /* Default engine */
+                               g_server_service_name = strdup(STT_SERVER_SERVICE_NAME);
+                               if (NULL == g_server_service_name) {
+                                       SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to allocate memory");
+                                       return STT_ERROR_OUT_OF_MEMORY;
+                               }
+                               g_server_service_object = strdup(STT_SERVER_SERVICE_OBJECT_PATH);
+                               if (NULL == g_server_service_name) {
+                                       SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to allocate memory");
+                                       return STT_ERROR_OUT_OF_MEMORY;
+                               }
+                               g_server_service_interface = strdup(STT_SERVER_SERVICE_INTERFACE);
+                               if (NULL == g_server_service_name) {
+                                       SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to allocate memory");
+                                       return STT_ERROR_OUT_OF_MEMORY;
+                               }
+                               SLOG(LOG_DEBUG, TAG_STTC, "[DBUS] service name: %s, object path: %s, interface: %s", g_server_service_name, g_server_service_object, g_server_service_interface);
+
+                               msg = dbus_message_new_method_call(
+                                       STT_SERVER_SERVICE_NAME,
+                                       STT_SERVER_SERVICE_OBJECT_PATH,
+                                       STT_SERVER_SERVICE_INTERFACE,
+                                       STT_METHOD_HELLO);
+                       } else {
+                               /* Get service name, object, interface */
+                               SLOG(LOG_DEBUG, TAG_STTC, "[DBUS] current_engine_id: %s", client->current_engine_id);
+
+                               g_server_service_name = __stt_get_service_name(client->current_engine_id);
+                               g_server_service_object = __stt_get_service_object(client->current_engine_id);
+                               g_server_service_interface = __stt_get_service_interface(client->current_engine_id);
+
+                               if (NULL == g_server_service_name || NULL == g_server_service_object || NULL == g_server_service_interface) {
+                                       SLOG(LOG_ERROR, TAG_STTC, "[ERROR] dbus service info invalid");
+                                       return STT_ERROR_OPERATION_FAILED;
+                               }
+
+                               SLOG(LOG_DEBUG, TAG_STTC, "[DBUS] service name: %s, object path: %s, interface: %s", g_server_service_name, g_server_service_object, g_server_service_interface);
+
+                               /* Custom engine */
+                               is_exist = dbus_bus_name_has_owner(g_conn_sender, g_server_service_name, &err);
+                               SLOG(LOG_DEBUG, TAG_STTC, "[DBUS] is there dbus name has owner??: %s (g_server_service_name: %s)", (is_exist == TRUE) ? "True" : "False", g_server_service_name);
+
+                               if (TRUE == is_exist) {
+                                       SLOG(LOG_DEBUG, TAG_STTC, "[DBUS] dbus: is_exist: True");
+                                       msg = dbus_message_new_method_call(
+                                               g_server_service_name,
+                                               g_server_service_object,
+                                               g_server_service_interface,
+                                               STT_METHOD_HELLO);
+                               } else {
+                                       SLOG(LOG_DEBUG, TAG_STTC, "[DBUS] dbus: is_exist: False");
+                                       msg = dbus_message_new_method_call(
+                                               STT_SERVER_CUSTOM_SERVICE_NAME, 
+                                               STT_SERVER_CUSTOM_SERVICE_OBJECT_PATH, 
+                                               STT_SERVER_CUSTOM_SERVICE_INTERFACE, 
+                                               STT_METHOD_HELLO);
+                               }
+                       }
+               }
+       }
 
        if (NULL == msg) {
                SLOG(LOG_ERROR, TAG_STTC, ">>>> Request stt hello : Fail to make message");
                return STT_ERROR_OPERATION_FAILED;
        }
 
-       DBusError err;
-       dbus_error_init(&err);
 
-       DBusMessage* result_msg = NULL;
-       int result = 0;
 
        if (g_conn_sender) {
                result_msg = dbus_connection_send_with_reply_and_block(g_conn_sender, msg, g_waiting_short_time, &err);
@@ -483,9 +886,9 @@ int stt_dbus_request_initialize(int uid, bool* silence_supported, bool* credenti
        DBusMessage* msg;
 
        msg = dbus_message_new_method_call(
-               STT_SERVER_SERVICE_NAME, 
-               STT_SERVER_SERVICE_OBJECT_PATH, 
-               STT_SERVER_SERVICE_INTERFACE, 
+               g_server_service_name,
+               g_server_service_object,
+               g_server_service_interface,
                STT_METHOD_INITIALIZE);
 
        if (NULL == msg) {
@@ -553,10 +956,12 @@ int stt_dbus_request_finalize(int uid)
 {
        DBusMessage* msg;
 
+       SLOG(LOG_DEBUG, TAG_STTC, "[dbus_info] service name: %s, service object: %s, service interface: %s", g_server_service_name, g_server_service_object, g_server_service_interface);
+
        msg = dbus_message_new_method_call(
-               STT_SERVER_SERVICE_NAME
-               STT_SERVER_SERVICE_OBJECT_PATH
-               STT_SERVER_SERVICE_INTERFACE
+               g_server_service_name
+               g_server_service_object
+               g_server_service_interface
                STT_METHOD_FINALIZE);
 
        if (NULL == msg) {
@@ -613,11 +1018,12 @@ int stt_dbus_request_set_current_engine(int uid, const char* engine_id, bool* si
        DBusMessage* msg;
 
        msg = dbus_message_new_method_call(
-               STT_SERVER_SERVICE_NAME
-               STT_SERVER_SERVICE_OBJECT_PATH
-               STT_SERVER_SERVICE_INTERFACE
+               g_server_service_name
+               g_server_service_object
+               g_server_service_interface
                STT_METHOD_SET_CURRENT_ENGINE);
 
+
        if (NULL == msg) {
                SLOG(LOG_ERROR, TAG_STTC, ">>>> stt set engine : Fail to make message");
                return STT_ERROR_OPERATION_FAILED;
@@ -683,9 +1089,9 @@ int stt_dbus_request_check_app_agreed(int uid, const char* appid, bool* value)
        DBusMessage* msg;
 
        msg = dbus_message_new_method_call(
-               STT_SERVER_SERVICE_NAME
-               STT_SERVER_SERVICE_OBJECT_PATH
-               STT_SERVER_SERVICE_INTERFACE
+               g_server_service_name
+               g_server_service_object
+               g_server_service_interface
                STT_METHOD_CHECK_APP_AGREED);
 
        if (NULL == msg) {
@@ -752,9 +1158,9 @@ int stt_dbus_request_get_support_langs(int uid, stt_h stt, stt_supported_languag
        DBusMessage* msg;
 
        msg = dbus_message_new_method_call(
-               STT_SERVER_SERVICE_NAME
-               STT_SERVER_SERVICE_OBJECT_PATH
-               STT_SERVER_SERVICE_INTERFACE
+               g_server_service_name
+               g_server_service_object
+               g_server_service_interface
                STT_METHOD_GET_SUPPORT_LANGS);
 
        if (NULL == msg) {
@@ -837,9 +1243,9 @@ int stt_dbus_request_get_default_lang(int uid, char** language)
        DBusMessage* msg;
 
        msg = dbus_message_new_method_call(
-               STT_SERVER_SERVICE_NAME
-               STT_SERVER_SERVICE_OBJECT_PATH
-               STT_SERVER_SERVICE_INTERFACE
+               g_server_service_name
+               g_server_service_object
+               g_server_service_interface
                STT_METHOD_GET_CURRENT_LANG);
 
        if (NULL == msg) {
@@ -905,9 +1311,9 @@ int stt_dbus_request_set_private_data(int uid, const char* key, const char* data
        DBusMessage* msg;
 
        msg = dbus_message_new_method_call(
-               STT_SERVER_SERVICE_NAME,
-               STT_SERVER_SERVICE_OBJECT_PATH,
-               STT_SERVER_SERVICE_INTERFACE,
+               g_server_service_name, 
+               g_server_service_object, 
+               g_server_service_interface, 
                STT_METHOD_SET_PRIVATE_DATA);
 
        if (NULL == msg) {
@@ -975,9 +1381,9 @@ int stt_dbus_request_get_private_data(int uid, const char* key, char** data)
        DBusMessage* msg;
 
        msg = dbus_message_new_method_call(
-               STT_SERVER_SERVICE_NAME,
-               STT_SERVER_SERVICE_OBJECT_PATH,
-               STT_SERVER_SERVICE_INTERFACE,
+               g_server_service_name, 
+               g_server_service_object, 
+               g_server_service_interface, 
                STT_METHOD_GET_PRIVATE_DATA);
 
        if (NULL == msg) {
@@ -1051,10 +1457,10 @@ int stt_dbus_request_is_recognition_type_supported(int uid, const char* type, bo
        DBusMessage* msg;
 
        msg = dbus_message_new_method_call(
-                  STT_SERVER_SERVICE_NAME
-                  STT_SERVER_SERVICE_OBJECT_PATH
-                  STT_SERVER_SERVICE_INTERFACE
-                  STT_METHOD_IS_TYPE_SUPPORTED);
+               g_server_service_name
+               g_server_service_object
+               g_server_service_interface
+               STT_METHOD_IS_TYPE_SUPPORTED);
 
        if (NULL == msg) {
                SLOG(LOG_ERROR, TAG_STTC, ">>>> stt is partial result supported : Fail to make message");
@@ -1120,10 +1526,10 @@ int stt_dbus_request_set_start_sound(int uid, const char* file)
        DBusMessage* msg;
 
        msg = dbus_message_new_method_call(
-                  STT_SERVER_SERVICE_NAME
-                  STT_SERVER_SERVICE_OBJECT_PATH
-                  STT_SERVER_SERVICE_INTERFACE
-                  STT_METHOD_SET_START_SOUND);
+               g_server_service_name
+               g_server_service_object
+               g_server_service_interface
+               STT_METHOD_SET_START_SOUND);
 
        if (NULL == msg) {
                SLOG(LOG_ERROR, TAG_STTC, ">>>> stt set start sound : Fail to make message");
@@ -1181,10 +1587,10 @@ int stt_dbus_request_unset_start_sound(int uid)
        DBusMessage* msg;
 
        msg = dbus_message_new_method_call(
-                  STT_SERVER_SERVICE_NAME
-                  STT_SERVER_SERVICE_OBJECT_PATH
-                  STT_SERVER_SERVICE_INTERFACE
-                  STT_METHOD_UNSET_START_SOUND);
+               g_server_service_name
+               g_server_service_object
+               g_server_service_interface
+               STT_METHOD_UNSET_START_SOUND);
 
        if (NULL == msg) {
                SLOG(LOG_ERROR, TAG_STTC, ">>>> stt unset start sound : Fail to make message");
@@ -1246,10 +1652,10 @@ int stt_dbus_request_set_stop_sound(int uid, const char* file)
        DBusMessage* msg;
 
        msg = dbus_message_new_method_call(
-                  STT_SERVER_SERVICE_NAME
-                  STT_SERVER_SERVICE_OBJECT_PATH
-                  STT_SERVER_SERVICE_INTERFACE
-                  STT_METHOD_SET_STOP_SOUND);
+               g_server_service_name
+               g_server_service_object
+               g_server_service_interface
+               STT_METHOD_SET_STOP_SOUND);
 
        if (NULL == msg) {
                SLOG(LOG_ERROR, TAG_STTC, ">>>> stt set stop sound : Fail to make message");
@@ -1307,10 +1713,10 @@ int stt_dbus_request_unset_stop_sound(int uid)
        DBusMessage* msg;
 
        msg = dbus_message_new_method_call(
-                  STT_SERVER_SERVICE_NAME
-                  STT_SERVER_SERVICE_OBJECT_PATH
-                  STT_SERVER_SERVICE_INTERFACE
-                  STT_METHOD_UNSET_STOP_SOUND);
+               g_server_service_name
+               g_server_service_object
+               g_server_service_interface
+               STT_METHOD_UNSET_STOP_SOUND);
 
        if (NULL == msg) {
                SLOG(LOG_ERROR, TAG_STTC, ">>>> stt unset stop sound : Fail to make message");
@@ -1373,9 +1779,9 @@ int stt_dbus_request_start(int uid, const char* lang, const char* type, int sile
 
        /* create a signal & check for errors */
        msg = dbus_message_new_method_call(
-               STT_SERVER_SERVICE_NAME,
-               STT_SERVER_SERVICE_OBJECT_PATH,
-               STT_SERVER_SERVICE_INTERFACE,
+               g_server_service_name, 
+               g_server_service_object, 
+               g_server_service_interface, 
                STT_METHOD_START);
 
        if (NULL == msg) {
@@ -1478,9 +1884,9 @@ int stt_dbus_request_stop(int uid)
 
        /* create a signal & check for errors */
        msg = dbus_message_new_method_call(
-               STT_SERVER_SERVICE_NAME,
-               STT_SERVER_SERVICE_OBJECT_PATH,
-               STT_SERVER_SERVICE_INTERFACE,
+               g_server_service_name, 
+               g_server_service_object, 
+               g_server_service_interface, 
                STT_METHOD_STOP);
 
        if (NULL == msg) {
@@ -1558,10 +1964,10 @@ int stt_dbus_request_cancel(int uid)
 
        /* create a signal & check for errors */
        msg = dbus_message_new_method_call(
-               STT_SERVER_SERVICE_NAME,
-               STT_SERVER_SERVICE_OBJECT_PATH, /* object name of the signal */
-               STT_SERVER_SERVICE_INTERFACE,   /* interface name of the signal */
-               STT_METHOD_CANCEL);     /* name of the signal */
+               g_server_service_name, 
+               g_server_service_object, 
+               g_server_service_interface, 
+               STT_METHOD_CANCEL);
 
        if (NULL == msg) {
                SLOG(LOG_ERROR, TAG_STTC, ">>>> stt cancel : Fail to make message");
index 5330b99..4564d41 100644 (file)
@@ -27,7 +27,7 @@ int stt_dbus_open_connection();
 int stt_dbus_close_connection();
 
 
-int stt_dbus_request_hello();
+int stt_dbus_request_hello(int uid);
 
 int stt_dbus_request_initialize(int uid, bool* silence_supported, bool* credential_needed);
 
index f5ba157..b8162e8 100644 (file)
@@ -19,6 +19,7 @@
 #include <unistd.h>
 #include <sys/inotify.h>
 #include <vconf.h>
+#include <buxton2.h>
 
 #include "stt_config_mgr.h"
 #include "stt_defs.h"
@@ -1060,6 +1061,62 @@ int stt_config_mgr_get_engine(char** engine)
        return STT_CONFIG_ERROR_NONE;
 }
 
+int __stt_config_set_buxtonkey(const char* engine)
+{
+       /* Set vconfkey */
+       struct buxton_client * bux_cli;
+       struct buxton_layer * bux_layer;
+       struct buxton_value * bux_val;
+
+       int ret = buxton_open(&bux_cli, NULL, NULL);
+       if (0 != ret) {
+               SLOG(LOG_ERROR, stt_tag(), "[DBUS-BUXTON2] Fail to open buxton client, ret(%d)", ret);
+               return STT_CONFIG_ERROR_OPERATION_FAILED;
+       }
+       bux_layer = buxton_create_layer("user");
+       if (NULL == bux_layer) {
+               SLOG(LOG_ERROR, stt_tag(), "[DBUS-BUXTON2] buxton_create_layer FAIL");
+               buxton_close(bux_cli);
+               bux_cli = NULL;
+               return STT_CONFIG_ERROR_OPERATION_FAILED;
+       }
+       bux_val = buxton_value_create_string(engine);
+       if (NULL == bux_val) {
+               SLOG(LOG_ERROR, stt_tag(), "[DBUS-BUXTON2] buxton_value_create_string FAIL");
+               buxton_free_layer(bux_layer);
+               buxton_close(bux_cli);
+               bux_layer = NULL;
+               bux_cli = NULL;
+               return STT_CONFIG_ERROR_OPERATION_FAILED;
+       } else {
+               SLOG(LOG_DEBUG, stt_tag(), "[DBUS-BUXTON2] layer: %s", buxton_layer_get_name(bux_layer));
+       }
+
+       ret = buxton_set_value_sync(bux_cli, bux_layer, STT_ENGINE_DB_DEFAULT, bux_val);
+       if (0 != ret) {
+               SLOG(LOG_ERROR, stt_tag(), "[DBUS-BUXTON2] Fail to set value sync, ret(%d)", ret);
+               buxton_value_free(bux_val);
+               buxton_free_layer(bux_layer);
+               buxton_close(bux_cli);
+
+               bux_cli = NULL;
+               bux_layer = NULL;
+               bux_val = NULL;
+               return STT_CONFIG_ERROR_OPERATION_FAILED;
+       }
+       SLOG(LOG_DEBUG, stt_tag(), "[DBUS-BUXTON2] buxton_set_value_sync: %s", STT_ENGINE_DB_DEFAULT);
+
+       buxton_value_free(bux_val);
+       buxton_free_layer(bux_layer);
+       buxton_close(bux_cli);
+
+       bux_cli = NULL;
+       bux_layer = NULL;
+       bux_val = NULL;
+
+       return STT_CONFIG_ERROR_NONE;
+}
+
 int stt_config_mgr_set_engine(const char* engine)
 {
        if (0 >= g_slist_length(g_config_client_list)) {
@@ -1082,6 +1139,12 @@ int stt_config_mgr_set_engine(const char* engine)
 
        SLOG(LOG_DEBUG, stt_tag(), "New engine id : %s", engine);
 
+       int ret = __stt_config_set_buxtonkey(engine);
+       if (0 != ret) {
+               SLOG(LOG_ERROR, stt_tag(), "[ERROR] set buxtonkey Failed!!!");
+               return ret;
+       }
+
        GSList *iter = NULL;
        stt_engine_info_s *engine_info = NULL;
        bool is_valid_engine = false;
index 1761eee..08126c4 100644 (file)
@@ -33,6 +33,16 @@ extern "C" {
 #define STT_SERVER_SERVICE_OBJECT_PATH  "/org/tizen/voice/sttserver"
 #define STT_SERVER_SERVICE_INTERFACE    "org.tizen.voice.sttserver"
 
+#define STT_SERVER_CUSTOM_SERVICE_NAME         "org.tizen.voice.sttservercustom"
+#define STT_SERVER_CUSTOM_SERVICE_OBJECT_PATH  "/org/tizen/voice/sttservercustom"
+#define STT_SERVER_CUSTOM_SERVICE_INTERFACE    "org.tizen.voice.sttservercustom"
+
+/******************************************************************************************
+* Definitions for Vconf Keys
+*******************************************************************************************/
+
+#define STT_ENGINE_DB_DEFAULT          "db/voice/stt/engine/default"
+#define STT_ENGINE_DB_CUSTOM           "db/voice/stt/engine/custom"
 
 /******************************************************************************************
 * Message Definition for Client
index 3049dd9..853d961 100755 (executable)
@@ -417,6 +417,7 @@ int stt_get_engine(stt_h stt, char** engine_id);
  * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  * @privlevel public
  * @privilege %http://tizen.org/privilege/recorder
+ * @privilege %http://tizen.org/privilege/appmanager.launch
  *
  * @param[in] stt The STT handle
  * @param[in] engine_id Engine id
index a5d7f48..dc7e2d4 100644 (file)
@@ -1,4 +1,4 @@
 [D-BUS Service]
 Name=org.tizen.voice.sttserver
-Exec=/bin/sh -c "launch_app org.tizen.stt-engine-default"
-
+#Exec=/bin/sh -c "launch_app org.tizen.stt-engine-default"
+Exec=/bin/sh -c "voice_getengine get user db/voice/stt/engine/default | awk '{print$5}' | xargs -t -i launch_app {}"
diff --git a/org.tizen.voice.sttservercustom.service b/org.tizen.voice.sttservercustom.service
new file mode 100644 (file)
index 0000000..87509eb
--- /dev/null
@@ -0,0 +1,4 @@
+[D-BUS Service]
+Name=org.tizen.voice.sttservercustom
+Exec=/bin/sh -c "voice_getengine get user db/voice/stt/engine/custom | awk '{print$5}' | xargs -t -i launch_app {}"
+
index 97125bf..8ce6024 100644 (file)
@@ -8,9 +8,11 @@ Source0:    %{name}-%{version}.tar.gz
 Source1001: %{name}.manifest
 Source1002: %{name}-devel.manifest
 Requires(post): /sbin/ldconfig
+Requires(post): /usr/bin/buxton2ctl
 Requires(postun): /sbin/ldconfig
 BuildRequires:  pkgconfig(aul)
 BuildRequires:  pkgconfig(capi-appfw-app-manager)
+BuildRequires: pkgconfig(buxton2)
 BuildRequires:  pkgconfig(capi-base-common)
 BuildRequires:  pkgconfig(capi-media-audio-io)
 BuildRequires:  pkgconfig(capi-media-wav-player)
@@ -84,10 +86,10 @@ export CXXFLAGS="$CXXFLAGS -DTIZEN_DEBUG_ENABLE"
 export FFLAGS="$FFLAGS -DTIZEN_DEBUG_ENABLE"
 %if "%{PRODUCT_TYPE}" == "TV"
 export CFLAGS="$CFLAGS -DTV_PRODUCT"
-cmake . -DCMAKE_INSTALL_PREFIX=/usr -DLIBDIR=%{_libdir} -DINCLUDEDIR=%{_includedir} \
+cmake . -DCMAKE_INSTALL_PREFIX=/usr -DLIBDIR=%{_libdir} -DBINDIR=%{_bindir} -DINCLUDEDIR=%{_includedir} \
         -DTZ_SYS_RO_SHARE=%TZ_SYS_RO_SHARE -DTZ_SYS_BIN=%TZ_SYS_BIN -D_TV_PRODUCT=TRUE
 %else
-cmake . -DCMAKE_INSTALL_PREFIX=/usr -DLIBDIR=%{_libdir} -DINCLUDEDIR=%{_includedir} \
+cmake . -DCMAKE_INSTALL_PREFIX=/usr -DLIBDIR=%{_libdir} -DBINDIR=%{_bindir} -DINCLUDEDIR=%{_includedir} \
         -DTZ_SYS_RO_SHARE=%TZ_SYS_RO_SHARE -DTZ_SYS_BIN=%TZ_SYS_BIN
 %endif
 
@@ -111,6 +113,11 @@ mkdir -p %{_libdir}/voice/
 
 mkdir -p %{TZ_SYS_RO_SHARE}/voice/test
 
+# buxton2ctl create-string #
+#buxton2ctl create-string "user" "db/voice/stt/engine/default" "org.tizen.stt-engine-default" "http://tizen.org/privilege/internal/buxton" "http://tizen.org/privilege/internal/buxton"
+buxton2ctl create-string "user" "db/voice/stt/engine/default" "org.tizen.stt-engine-default" "http://tizen.org/privilege/internal/default/public" "http://tizen.org/privilege/internal/default/platform"
+buxton2ctl create-string "user" "db/voice/stt/engine/custom" "org.tizen.stt-engine-default" "http://tizen.org/privilege/internal/default/public" "http://tizen.org/privilege/recorder"
+#buxton2ctl create-string "user" "db/voice/stt/engine/custom" "org.tizen.stt-engine-default" "http://tizen.org/privilege/internal/buxton" "http://tizen.org/privilege/internal/buxton"
 
 %postun -p /sbin/ldconfig
 
@@ -123,8 +130,11 @@ mkdir -p %{TZ_SYS_RO_SHARE}/voice/test
 %{TZ_SYS_RO_SHARE}/upgrade/scripts/500.stt_upgrade_24to30.sh
 %{TZ_SYS_RO_SHARE}/voice/stt/1.0/stt-config.xml
 %{TZ_SYS_RO_SHARE}/dbus-1/services/org.tizen.voice.sttserver.service
+%{TZ_SYS_RO_SHARE}/dbus-1/services/org.tizen.voice.sttservercustom.service
 %{TZ_SYS_RO_SHARE}/voice/test/stt-test
 %{TZ_SYS_RO_SHARE}/license/%{name}
+#%{TZ_SYS_BIN}/*
+%{_bindir}/voice_getengine
 %{TZ_SYS_RO_ETC}/package-manager/parserlib/metadata/libstt-engine-parser.so*
 
 %files devel
index b30a35a..b4d7d10 100644 (file)
@@ -20,6 +20,9 @@
 #include "sttd_client_data.h"
 #include "sttd_dbus_server.h"
 #include "stt_defs.h"
+#include <aul.h>
+#include <vconf.h>
+#include <buxton2.h>
 
 static DBusConnection* g_conn_sender = NULL;
 static DBusConnection* g_conn_listener = NULL;
@@ -30,6 +33,12 @@ static int g_waiting_time = 3000;
 
 static int g_internal_result_id = 0;
 
+static char* g_server_service_name = NULL;
+static char* g_server_service_object = NULL;
+static char* g_server_service_interface = NULL;
+
+void __sttd_dbus_service_free();
+
 int sttdc_send_hello(int uid)
 {
        int pid = sttd_client_get_pid(uid);
@@ -345,6 +354,8 @@ int sttdc_send_error_signal(int uid, int reason, const char *err_msg)
 
 static Eina_Bool listener_event_callback(void* data, Ecore_Fd_Handler *fd_handler)
 {
+       SLOG(LOG_DEBUG, TAG_STTD, "[Dbus] listener_event_callback is called!!!");
+
        if (NULL == g_conn_listener)    return ECORE_CALLBACK_RENEW;
 
        dbus_connection_read_write_dispatch(g_conn_listener, 50);
@@ -362,58 +373,61 @@ static Eina_Bool listener_event_callback(void* data, Ecore_Fd_Handler *fd_handle
                return ECORE_CALLBACK_RENEW;
        }
 
+       SLOG(LOG_DEBUG, TAG_STTD, "[Dbus info] service name: %s, service object: %s, service interface: %s", (NULL == g_server_service_name) ? "NULL" : g_server_service_name,
+                       (NULL == g_server_service_object) ? "NULL" : g_server_service_object, (NULL == g_server_service_interface) ? "NULL" : g_server_service_interface);
+
        /* client event */
-       if (dbus_message_is_method_call(msg, STT_SERVER_SERVICE_INTERFACE, STT_METHOD_HELLO))
+       if (dbus_message_is_method_call(msg, g_server_service_interface, STT_METHOD_HELLO))
                sttd_dbus_server_hello(g_conn_listener, msg);
 
-       else if (dbus_message_is_method_call(msg, STT_SERVER_SERVICE_INTERFACE, STT_METHOD_INITIALIZE))
+       else if (dbus_message_is_method_call(msg, g_server_service_interface, STT_METHOD_INITIALIZE))
                sttd_dbus_server_initialize(g_conn_listener, msg);
 
-       else if (dbus_message_is_method_call(msg, STT_SERVER_SERVICE_INTERFACE, STT_METHOD_FINALIZE))
+       else if (dbus_message_is_method_call(msg, g_server_service_interface, STT_METHOD_FINALIZE))
                sttd_dbus_server_finalize(g_conn_listener, msg);
 
-       else if (dbus_message_is_method_call(msg, STT_SERVER_SERVICE_INTERFACE, STT_METHOD_SET_CURRENT_ENGINE))
+       else if (dbus_message_is_method_call(msg, g_server_service_interface, STT_METHOD_SET_CURRENT_ENGINE))
                sttd_dbus_server_set_current_engine(g_conn_listener, msg);
 
-       else if (dbus_message_is_method_call(msg, STT_SERVER_SERVICE_INTERFACE, STT_METHOD_CHECK_APP_AGREED))
+       else if (dbus_message_is_method_call(msg, g_server_service_interface, STT_METHOD_CHECK_APP_AGREED))
                sttd_dbus_server_check_app_agreed(g_conn_listener, msg);
 
-       else if (dbus_message_is_method_call(msg, STT_SERVER_SERVICE_INTERFACE, STT_METHOD_GET_SUPPORT_LANGS))
+       else if (dbus_message_is_method_call(msg, g_server_service_interface, STT_METHOD_GET_SUPPORT_LANGS))
                sttd_dbus_server_get_support_lang(g_conn_listener, msg);
 
-       else if (dbus_message_is_method_call(msg, STT_SERVER_SERVICE_INTERFACE, STT_METHOD_GET_CURRENT_LANG))
+       else if (dbus_message_is_method_call(msg, g_server_service_interface, STT_METHOD_GET_CURRENT_LANG))
                sttd_dbus_server_get_default_lang(g_conn_listener, msg);
 
-       else if (dbus_message_is_method_call(msg, STT_SERVER_SERVICE_INTERFACE, STT_METHOD_SET_PRIVATE_DATA))
+       else if (dbus_message_is_method_call(msg, g_server_service_interface, STT_METHOD_SET_PRIVATE_DATA))
                sttd_dbus_server_set_private_data(g_conn_listener, msg);
 
-       else if (dbus_message_is_method_call(msg, STT_SERVER_SERVICE_INTERFACE, STT_METHOD_GET_PRIVATE_DATA))
+       else if (dbus_message_is_method_call(msg, g_server_service_interface, STT_METHOD_GET_PRIVATE_DATA))
                sttd_dbus_server_get_private_data(g_conn_listener, msg);
 
-       else if (dbus_message_is_method_call(msg, STT_SERVER_SERVICE_INTERFACE, STT_METHOD_IS_TYPE_SUPPORTED))
+       else if (dbus_message_is_method_call(msg, g_server_service_interface, STT_METHOD_IS_TYPE_SUPPORTED))
                sttd_dbus_server_is_recognition_type_supported(g_conn_listener, msg);
 
 
-       else if (dbus_message_is_method_call(msg, STT_SERVER_SERVICE_INTERFACE, STT_METHOD_SET_START_SOUND))
+       else if (dbus_message_is_method_call(msg, g_server_service_interface, STT_METHOD_SET_START_SOUND))
                sttd_dbus_server_set_start_sound(g_conn_listener, msg);
 
-       else if (dbus_message_is_method_call(msg, STT_SERVER_SERVICE_INTERFACE, STT_METHOD_UNSET_START_SOUND))
+       else if (dbus_message_is_method_call(msg, g_server_service_interface, STT_METHOD_UNSET_START_SOUND))
                sttd_dbus_server_unset_start_sound(g_conn_listener, msg);
 
-       else if (dbus_message_is_method_call(msg, STT_SERVER_SERVICE_INTERFACE, STT_METHOD_SET_STOP_SOUND))
+       else if (dbus_message_is_method_call(msg, g_server_service_interface, STT_METHOD_SET_STOP_SOUND))
                sttd_dbus_server_set_stop_sound(g_conn_listener, msg);
 
-       else if (dbus_message_is_method_call(msg, STT_SERVER_SERVICE_INTERFACE, STT_METHOD_UNSET_STOP_SOUND))
+       else if (dbus_message_is_method_call(msg, g_server_service_interface, STT_METHOD_UNSET_STOP_SOUND))
                sttd_dbus_server_unset_stop_sound(g_conn_listener, msg);
 
 
-       else if (dbus_message_is_method_call(msg, STT_SERVER_SERVICE_INTERFACE, STT_METHOD_START))
+       else if (dbus_message_is_method_call(msg, g_server_service_interface, STT_METHOD_START))
                sttd_dbus_server_start(g_conn_listener, msg);
 
-       else if (dbus_message_is_method_call(msg, STT_SERVER_SERVICE_INTERFACE, STT_METHOD_STOP))
+       else if (dbus_message_is_method_call(msg, g_server_service_interface, STT_METHOD_STOP))
                sttd_dbus_server_stop(g_conn_listener, msg);
 
-       else if (dbus_message_is_method_call(msg, STT_SERVER_SERVICE_INTERFACE, STT_METHOD_CANCEL))
+       else if (dbus_message_is_method_call(msg, g_server_service_interface, STT_METHOD_CANCEL))
                sttd_dbus_server_cancel(g_conn_listener, msg);
 
 
@@ -423,6 +437,138 @@ static Eina_Bool listener_event_callback(void* data, Ecore_Fd_Handler *fd_handle
        return ECORE_CALLBACK_RENEW;
 }
 
+void __sttd_dbus_service_free()
+{
+       if (NULL != g_server_service_name) {
+               free(g_server_service_name);
+               g_server_service_name = NULL;
+       }
+
+       if (NULL != g_server_service_object) {
+               free(g_server_service_object);
+               g_server_service_object = NULL;
+       }
+
+       if (NULL != g_server_service_interface) {
+               free(g_server_service_interface);
+               g_server_service_interface = NULL;
+       }
+}
+
+int __sttd_get_buxtonkey()
+{
+       /* request our name on the bus and check for errors */
+       int pid = getpid();
+       char engine_appid[2048] = {0, };
+       const char* engine_default = NULL;
+
+       struct buxton_client * bux_cli;
+       struct buxton_layer * bux_layer;
+       struct buxton_value * bux_val;
+
+       int ret = buxton_open(&bux_cli, NULL, NULL);
+       if (0 != ret) {
+               SLOG(LOG_ERROR, TAG_STTD, "[DBUS-BUXTON2] Fail to open buxton client, ret(%d)", ret);
+               return STTD_ERROR_OPERATION_FAILED;
+       }
+       bux_layer = buxton_create_layer("user");
+       if (NULL == bux_layer) {
+               SLOG(LOG_ERROR, TAG_STTD, "[DBUS-BUXTON2] buxton_create_layer FAIL");
+               buxton_close(bux_cli);
+               bux_cli = NULL;
+               return STTD_ERROR_OPERATION_FAILED;
+       }
+       bux_val = buxton_value_create_string("stt-engine-default");
+       if (NULL == bux_val) {
+               SLOG(LOG_ERROR, TAG_STTD, "[DBUS-BUXTON2] buxton_value_create_string FAIL");
+               buxton_free_layer(bux_layer);
+               buxton_close(bux_cli);
+               bux_layer = NULL;
+               bux_cli = NULL;
+               return STTD_ERROR_OPERATION_FAILED;
+       } else {
+               SLOG(LOG_DEBUG, TAG_STTD, "[DBUS-BUXTON2] layer: %s", buxton_layer_get_name(bux_layer));
+       }
+       ret = buxton_get_value_sync(bux_cli, bux_layer, STT_ENGINE_DB_DEFAULT, &bux_val);
+       if (0 != ret) {
+               SLOG(LOG_ERROR, TAG_STTD, "[DBUS-BUXTON2] Fail to get value sync, ret(%d)", ret);
+               buxton_value_free(bux_val);
+               buxton_free_layer(bux_layer);
+               buxton_close(bux_cli);
+
+               bux_cli = NULL;
+               bux_layer = NULL;
+               bux_val = NULL;
+               return STTD_ERROR_OPERATION_FAILED;
+       }
+       ret = buxton_value_get_string(bux_val, &engine_default);
+       if (0 != ret) {
+               SLOG(LOG_ERROR, TAG_STTD, "[DBUS-BUXTON2] Fail to get value string, ret(%d)", ret);
+               buxton_value_free(bux_val);
+               buxton_free_layer(bux_layer);
+               buxton_close(bux_cli);
+
+               bux_cli = NULL;
+               bux_layer = NULL;
+               bux_val = NULL;
+               return STTD_ERROR_OPERATION_FAILED;
+       }
+       SLOG(LOG_DEBUG, TAG_STTD, "[DBUS-BUXTON2] buxton_value_get_string: engine_default: %s", engine_default);
+
+       ret = aul_app_get_appid_bypid(pid, engine_appid, sizeof(engine_appid));
+
+       __sttd_dbus_service_free();
+
+       if (NULL == engine_appid || NULL == engine_default || 0 == strncmp(engine_appid, engine_default, strlen(engine_appid))) {
+               g_server_service_name = (char*)calloc(strlen(STT_SERVER_SERVICE_NAME) + 1, sizeof(char));
+               snprintf(g_server_service_name, strlen(STT_SERVER_SERVICE_NAME) + 1, "%s", STT_SERVER_SERVICE_NAME);
+               g_server_service_object = (char*)calloc(strlen(STT_SERVER_SERVICE_OBJECT_PATH) + 1, sizeof(char));
+               snprintf(g_server_service_object, strlen(STT_SERVER_SERVICE_OBJECT_PATH) + 1, "%s", STT_SERVER_SERVICE_OBJECT_PATH);
+               g_server_service_interface = (char*)calloc(strlen(STT_SERVER_SERVICE_INTERFACE) + 1, sizeof(char));
+               snprintf(g_server_service_interface, strlen(STT_SERVER_SERVICE_INTERFACE) + 1, "%s", STT_SERVER_SERVICE_INTERFACE);
+       } else {
+               g_server_service_name = (char*)calloc(strlen(STT_SERVER_SERVICE_NAME) + strlen(engine_appid) - 8, sizeof(char));
+               snprintf(g_server_service_name, strlen(STT_SERVER_SERVICE_NAME) + strlen(engine_appid) - 8, "%s%s%s", STT_SERVER_SERVICE_NAME, ".", (engine_appid + 10));
+               g_server_service_object = (char*)calloc(strlen(STT_SERVER_SERVICE_OBJECT_PATH) + strlen(engine_appid) - 8, sizeof(char));
+               snprintf(g_server_service_object, strlen(STT_SERVER_SERVICE_OBJECT_PATH) + strlen(engine_appid) - 8, "%s%s%s", STT_SERVER_SERVICE_OBJECT_PATH, "/", (engine_appid + 10));
+               g_server_service_interface = (char*)calloc(strlen(STT_SERVER_SERVICE_INTERFACE) + strlen(engine_appid) - 8, sizeof(char));
+               snprintf(g_server_service_interface, strlen(STT_SERVER_SERVICE_INTERFACE) + strlen(engine_appid) - 8, "%s%s%s", STT_SERVER_SERVICE_INTERFACE, ".", (engine_appid + 10));
+       }
+
+       if (NULL == g_server_service_name || NULL == g_server_service_object || NULL == g_server_service_interface) {
+               SLOG(LOG_ERROR, TAG_STTD, "[ERROR] dbus info invalid");
+               buxton_value_free(bux_val);
+               buxton_free_layer(bux_layer);
+               buxton_close(bux_cli);
+
+               bux_cli = NULL;
+               bux_layer = NULL;
+               bux_val = NULL;
+               return STTD_ERROR_OPERATION_FAILED;
+       }
+
+       char* ret_char = strchr(g_server_service_interface, '-');
+       while(NULL != ret_char) {
+               ret_char[0] = '_';
+               ret_char = strchr(g_server_service_interface, '-');
+       }
+
+       SLOG(LOG_DEBUG, TAG_STTD, "[get_service_interface] service interface: %s", g_server_service_interface);
+
+       buxton_value_free(bux_val);
+       buxton_free_layer(bux_layer);
+       buxton_close(bux_cli);
+
+       bux_cli = NULL;
+       bux_layer = NULL;
+       bux_val = NULL;
+
+       SLOG(LOG_DEBUG, TAG_STTD, "[get_service_name] FINISH!! service name: %s", g_server_service_name);
+
+       return STTD_ERROR_NONE;
+
+}
+
 int sttd_dbus_open_connection()
 {
        DBusError err;
@@ -455,8 +601,14 @@ int sttd_dbus_open_connection()
                return STTD_ERROR_OPERATION_FAILED;
        }
 
-       /* request our name on the bus and check for errors */
-       ret = dbus_bus_request_name(g_conn_listener, STT_SERVER_SERVICE_NAME, DBUS_NAME_FLAG_REPLACE_EXISTING, &err);
+       /* Get buxton key */
+       ret = __sttd_get_buxtonkey();
+       if (0 != ret) {
+               SLOG(LOG_ERROR, TAG_STTD, "[Dbus ERROR] Fail to get buxton key");
+               return ret;
+       }
+
+       ret = dbus_bus_request_name(g_conn_listener, g_server_service_name, DBUS_NAME_FLAG_REPLACE_EXISTING, &err);
 
        if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) {
                SLOG(LOG_ERROR, TAG_STTD, "[Dbus ERROR] Fail to be primary owner");
@@ -471,7 +623,7 @@ int sttd_dbus_open_connection()
 
        /* add a rule for getting signal */
        char rule[128];
-       snprintf(rule, 128, "type='signal',interface='%s'", STT_SERVER_SERVICE_INTERFACE);
+       snprintf(rule, 128, "type='signal',interface='%s'", g_server_service_interface);
 
        /* add a rule for which messages we want to see */
        dbus_bus_add_match(g_conn_listener, rule, &err); /* see signals from the given interface */
@@ -505,7 +657,7 @@ int sttd_dbus_close_connection()
                g_dbus_fd_handler = NULL;
        }
 
-       dbus_bus_release_name(g_conn_listener, STT_SERVER_SERVICE_NAME, &err);
+       dbus_bus_release_name(g_conn_listener, g_server_service_name, &err);
 
        if (dbus_error_is_set(&err)) {
                SLOG(LOG_ERROR, TAG_STTD, "[Dbus ERROR] dbus_bus_release_name() : %s", err.message);
@@ -521,6 +673,8 @@ int sttd_dbus_close_connection()
        g_conn_listener = NULL;
        g_conn_sender = NULL;
 
+       __sttd_dbus_service_free();
+
        SLOG(LOG_DEBUG, TAG_STTD, "[Server] Close dbus connection");
 
        return 0;