From 8382245a3d2b7eff5194b5303a4f22b1947c89d1 Mon Sep 17 00:00:00 2001 From: "ky85.kim" Date: Wed, 8 Jul 2015 20:31:54 +0900 Subject: [PATCH] Update IPC Add dbus config Add daemon activation by dbus Change-Id: I043bf1750e3bc2860f97a26ea0bee5de72186fcb --- CMakeLists.txt | 6 +- changelog | 6 + client/vc.c | 31 +-- client/vc_dbus.c | 145 ++++++++------ client/vc_mgr.c | 42 ---- client/vc_mgr_dbus.c | 387 +++++++++++------------------------- client/vc_mgr_dbus.h | 4 - client/vc_setting.c | 15 -- client/vc_widget.c | 32 --- client/vc_widget_dbus.c | 151 ++++++-------- common/vc_command.c | 2 - common/vc_defs.h | 20 +- doc/uix_vc_doc.h | 10 - include/voice-control-manager.pc.in | 1 + include/voice-control-setting.pc.in | 1 + include/voice-control-widget.pc.in | 1 + include/voice-control.pc.in | 1 + include/voice_control_command.h | 5 +- include/voice_control_common.h | 2 +- org.tizen.voice.vcserver.service | 5 + packaging/voice-control.spec | 7 +- server/vcd_client_data.c | 2 - server/vcd_client_data.h | 1 - server/vcd_dbus.c | 363 ++++++++++++--------------------- server/vcd_dbus_server.c | 3 - vc-server.conf | 97 +++++++++ 26 files changed, 515 insertions(+), 825 deletions(-) create mode 100644 org.tizen.voice.vcserver.service create mode 100644 vc-server.conf diff --git a/CMakeLists.txt b/CMakeLists.txt index ae46760..1cbe38c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,7 +26,7 @@ PROJECT(vc) SET(PREFIX ${CMAKE_INSTALL_PREFIX}) SET(EXEC_PREFIX "${PREFIX}") -SET(VERSION 0.2.7) +SET(VERSION 0.2.8) # pkg config tool INCLUDE(FindPkgConfig) @@ -53,3 +53,7 @@ ADD_SUBDIRECTORY(server) ## config ## INSTALL(FILES ${CMAKE_SOURCE_DIR}/vc-config.xml DESTINATION /usr/lib/voice/vc/1.0) + +INSTALL(FILES ${CMAKE_SOURCE_DIR}/vc-server.conf DESTINATION /etc/dbus-1/system.d) + +INSTALL(FILES ${CMAKE_SOURCE_DIR}/org.tizen.voice.vcserver.service DESTINATION /usr/share/dbus-1/system-services) diff --git a/changelog b/changelog index fa7af77..62b7c06 100644 --- a/changelog +++ b/changelog @@ -1,8 +1,14 @@ +voice-control (0.2.8) -- Thu, 18 Jun 2015 + + * Update IPC and remove volume file (Dongyeol Lee ) + * Add daemon activation by dbus (Kwangyoun Kim ) + vc (0.2.7) -- Wed, 21 Jan 2015 * Add result message from engine (Wonnam Jang ) * Change sequence for engine and recorder stop (Kwangyoun Kim ) * Add authority feature (Kwangyoun Kim ) + * Remove unused smack label (Kwangyoun Kim ) vc (0.2.6) -- Mon, 08 Dec 2014 diff --git a/client/vc.c b/client/vc.c index a1a2f73..e517c9e 100644 --- a/client/vc.c +++ b/client/vc.c @@ -27,7 +27,6 @@ #include "voice_control_command_expand.h" -static bool g_is_daemon_started = false; static Ecore_Timer* g_connect_timer = NULL; @@ -206,7 +205,6 @@ static void __vc_internal_unprepare() SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Fail to request finalize : %s", __vc_get_error_code(ret)); } - g_is_daemon_started = false; #if 0 ecore_event_handler_del(g_focus_in_hander); @@ -368,36 +366,10 @@ static Eina_Bool __vc_x_event_window_focus_out(void *data, int type, void *event } #endif -static void __vc_fork_vc_daemon() -{ - int pid, i; - pid = fork(); - - switch(pid) { - case -1: - SLOG(LOG_ERROR, TAG_VCC, "Fail to create daemon"); - break; - case 0: - setsid(); - for (i = 0;i < _NSIG;i++) - signal(i, SIG_DFL); - - execl(VC_DAEMON_PATH, VC_DAEMON_PATH, NULL); - break; - default: - break; - } - return; -} - static Eina_Bool __vc_connect_daemon(void *data) { /* Send hello */ if (0 != vc_dbus_request_hello()) { - if (false == g_is_daemon_started) { - g_is_daemon_started = true; - __vc_fork_vc_daemon(); - } return EINA_TRUE; } @@ -468,7 +440,6 @@ int vc_prepare() return VC_ERROR_INVALID_STATE; } - g_is_daemon_started = false; g_connect_timer = ecore_timer_add(0, __vc_connect_daemon, NULL); @@ -819,7 +790,7 @@ int vc_set_command_list(vc_cmd_list_h vc_cmd_list, int type) SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid command type: input type is %d", type); SLOG(LOG_DEBUG, TAG_VCC, "====="); SLOG(LOG_DEBUG, TAG_VCC, " "); - return VC_ERROR_INVALID_STATE; + return VC_ERROR_INVALID_PARAMETER; } vc_cmd_list_s* list = NULL; diff --git a/client/vc_dbus.c b/client/vc_dbus.c index d88e0cd..8441f66 100644 --- a/client/vc_dbus.c +++ b/client/vc_dbus.c @@ -24,8 +24,8 @@ static int g_waiting_time = 3000; static Ecore_Fd_Handler* g_fd_handler = NULL; -static DBusConnection* g_conn = NULL; - +static DBusConnection* g_conn_sender = NULL; +static DBusConnection* g_conn_listener = NULL; extern int __vc_cb_error(int pid, int reason); @@ -34,16 +34,12 @@ extern void __vc_cb_result(); static Eina_Bool listener_event_callback(void* data, Ecore_Fd_Handler *fd_handler) { - DBusConnection* conn = (DBusConnection*)data; - DBusMessage* msg = NULL; - DBusMessage *reply = NULL; - - if (NULL == conn) - return ECORE_CALLBACK_RENEW; + if (NULL == g_conn_listener) return ECORE_CALLBACK_RENEW; - dbus_connection_read_write_dispatch(conn, 50); + dbus_connection_read_write_dispatch(g_conn_listener, 50); - msg = dbus_connection_pop_message(conn); + DBusMessage* msg = NULL; + msg = dbus_connection_pop_message(g_conn_listener); /* loop again if we haven't read a message */ if (NULL == msg) { @@ -54,7 +50,7 @@ static Eina_Bool listener_event_callback(void* data, Ecore_Fd_Handler *fd_handle dbus_error_init(&err); char if_name[64]; - snprintf(if_name, 64, "%s%d", VC_CLIENT_SERVICE_INTERFACE, getpid()); + snprintf(if_name, 64, "%s", VC_CLIENT_SERVICE_INTERFACE); if (dbus_message_is_method_call(msg, if_name, VCD_METHOD_HELLO)) { SLOG(LOG_DEBUG, TAG_VCC, "===== Get Hello"); @@ -76,18 +72,19 @@ static Eina_Bool listener_event_callback(void* data, Ecore_Fd_Handler *fd_handle SLOG(LOG_ERROR, TAG_VCC, "<<<< vc get hello : invalid pid "); } + DBusMessage* reply = NULL; reply = dbus_message_new_method_return(msg); if (NULL != reply) { dbus_message_append_args(reply, DBUS_TYPE_INT32, &response, DBUS_TYPE_INVALID); - if (!dbus_connection_send(conn, reply, NULL)) + if (!dbus_connection_send(g_conn_listener, reply, NULL)) SLOG(LOG_ERROR, TAG_VCC, ">>>> vc get hello : fail to send reply"); else SLOG(LOG_DEBUG, TAG_VCC, ">>>> vc get hello : result(%d)", response); - dbus_connection_flush(conn); - dbus_message_unref(reply); + dbus_connection_flush(g_conn_listener); + dbus_message_unref(reply); } else { SLOG(LOG_ERROR, TAG_VCC, ">>>> vc get hello : fail to create reply message"); } @@ -105,13 +102,13 @@ static Eina_Bool listener_event_callback(void* data, Ecore_Fd_Handler *fd_handle reply = dbus_message_new_method_return(msg); if (NULL != reply) { - if (!dbus_connection_send(conn, reply, NULL)) + if (!dbus_connection_send(g_conn_listener, reply, NULL)) SLOG(LOG_ERROR, TAG_VCC, ">>>> vc get result : fail to send reply"); else SLOG(LOG_DEBUG, TAG_VCC, ">>>> vc get result"); - dbus_connection_flush(conn); - dbus_message_unref(reply); + dbus_connection_flush(g_conn_listener); + dbus_message_unref(reply); } else { SLOG(LOG_ERROR, TAG_VCC, ">>>> vc get result : fail to create reply message"); } @@ -146,13 +143,13 @@ static Eina_Bool listener_event_callback(void* data, Ecore_Fd_Handler *fd_handle reply = dbus_message_new_method_return(msg); if (NULL != reply) { - if (!dbus_connection_send(conn, reply, NULL)) + if (!dbus_connection_send(g_conn_listener, reply, NULL)) SLOG(LOG_ERROR, TAG_VCC, ">>>> vc Error message : fail to send reply"); else SLOG(LOG_DEBUG, TAG_VCC, ">>>> vc Error message"); - dbus_connection_flush(conn); - dbus_message_unref(reply); + dbus_connection_flush(g_conn_listener); + dbus_message_unref(reply); } else { SLOG(LOG_ERROR, TAG_VCC, ">>>> vc Error message : fail to create reply message"); } @@ -170,7 +167,7 @@ static Eina_Bool listener_event_callback(void* data, Ecore_Fd_Handler *fd_handle int vc_dbus_open_connection() { - if (NULL != g_conn) { + if (NULL != g_conn_sender && NULL != g_conn_listener) { SLOG(LOG_WARN, TAG_VCC, "already existed connection "); return 0; } @@ -182,28 +179,40 @@ int vc_dbus_open_connection() dbus_error_init(&err); /* connect to the DBUS system bus, and check for errors */ - g_conn = dbus_bus_get_private(DBUS_BUS_SYSTEM, &err); + g_conn_sender = dbus_bus_get_private(DBUS_BUS_SYSTEM, &err); if (dbus_error_is_set(&err)) { SLOG(LOG_ERROR, TAG_VCC, "Dbus Connection Error (%s)", err.message); dbus_error_free(&err); } - if (NULL == g_conn) { + if (NULL == g_conn_sender) { SLOG(LOG_ERROR, TAG_VCC, "Fail to get dbus connection "); - return VC_ERROR_OPERATION_FAILED; + return VC_ERROR_OPERATION_FAILED; + } + + g_conn_listener = dbus_bus_get_private(DBUS_BUS_SYSTEM, &err); + + if (dbus_error_is_set(&err)) { + SLOG(LOG_ERROR, TAG_VCC, "Dbus Connection Error (%s)", err.message); + dbus_error_free(&err); + } + + if (NULL == g_conn_listener) { + SLOG(LOG_ERROR, TAG_VCC, "Fail to get dbus connection "); + return VC_ERROR_OPERATION_FAILED; } int pid = getpid(); char service_name[64]; memset(service_name, '\0', 64); - snprintf(service_name, 64, "%s%d", VC_CLIENT_SERVICE_NAME, pid); + snprintf(service_name, 64, "%s", VC_CLIENT_SERVICE_NAME); SLOG(LOG_DEBUG, TAG_VCC, "service name is %s", service_name); /* register our name on the bus, and check for errors */ - ret = dbus_bus_request_name(g_conn, service_name, DBUS_NAME_FLAG_REPLACE_EXISTING , &err); + ret = dbus_bus_request_name(g_conn_listener, service_name, DBUS_NAME_FLAG_REPLACE_EXISTING, &err); if (dbus_error_is_set(&err)) { SLOG(LOG_ERROR, TAG_VCC, "Name Error (%s)", err.message); @@ -221,11 +230,11 @@ int vc_dbus_open_connection() } char rule[128]; - snprintf(rule, 128, "type='signal',interface='%s%d'", VC_CLIENT_SERVICE_INTERFACE, pid); + snprintf(rule, 128, "type='signal',interface='%s'", VC_CLIENT_SERVICE_INTERFACE); /* add a rule for which messages we want to see */ - dbus_bus_add_match(g_conn, rule, &err); - dbus_connection_flush(g_conn); + dbus_bus_add_match(g_conn_listener, rule, &err); + dbus_connection_flush(g_conn_listener); if (dbus_error_is_set(&err)) { @@ -235,15 +244,14 @@ int vc_dbus_open_connection() } int fd = 0; - if (1 != dbus_connection_get_unix_fd(g_conn, &fd)) { + if (1 != dbus_connection_get_unix_fd(g_conn_listener, &fd)) { SLOG(LOG_ERROR, TAG_VCC, "fail to get fd from dbus "); return VC_ERROR_OPERATION_FAILED; } else { SLOG(LOG_DEBUG, TAG_VCC, "Get fd from dbus : %d", fd); } - g_fd_handler = ecore_main_fd_handler_add(fd, ECORE_FD_READ, (Ecore_Fd_Cb)listener_event_callback, g_conn, NULL, NULL); - + g_fd_handler = ecore_main_fd_handler_add(fd, ECORE_FD_READ, (Ecore_Fd_Cb)listener_event_callback, g_conn_listener, NULL, NULL); if (NULL == g_fd_handler) { SLOG(LOG_ERROR, TAG_VCC, "fail to get fd handler from ecore "); return VC_ERROR_OPERATION_FAILED; @@ -257,33 +265,38 @@ int vc_dbus_close_connection() DBusError err; dbus_error_init(&err); + if (NULL != g_fd_handler) { + ecore_main_fd_handler_del(g_fd_handler); + g_fd_handler = NULL; + } + int pid = getpid(); char service_name[64]; memset(service_name, '\0', 64); - snprintf(service_name, 64, "%s%d", VC_CLIENT_SERVICE_NAME, pid); + snprintf(service_name, 64, "%s", VC_CLIENT_SERVICE_NAME); - dbus_bus_release_name (g_conn, service_name, &err); + dbus_bus_release_name(g_conn_listener, service_name, &err); if (dbus_error_is_set(&err)) { SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Dbus Error (%s)", err.message); dbus_error_free(&err); } - dbus_connection_close(g_conn); - - g_fd_handler = NULL; - g_conn = NULL; + g_conn_sender = NULL; + g_conn_listener = NULL; return 0; } int vc_dbus_reconnect() { - bool connected = dbus_connection_get_is_connected(g_conn); - SECURE_SLOG(LOG_DEBUG, TAG_VCC, "[DBUS] %s", connected ? "Connected" : "Not connected"); + bool sender_connected = dbus_connection_get_is_connected(g_conn_sender); + bool listener_connected = dbus_connection_get_is_connected(g_conn_listener); + SLOG(LOG_DEBUG, TAG_VCC, "[DBUS] Sender(%s) Listener(%s)", + sender_connected ? "Connected" : "Not connected", listener_connected ? "Connected" : "Not connected"); - if (false == connected) { + if (false == sender_connected || false == listener_connected) { vc_dbus_close_connection(); if (0 != vc_dbus_open_connection()) { @@ -317,8 +330,8 @@ int vc_dbus_request_hello() DBusMessage* result_msg = NULL; int result = 0; - result_msg = dbus_connection_send_with_reply_and_block(g_conn, msg, 500, &err); - + result_msg = dbus_connection_send_with_reply_and_block(g_conn_sender, msg, 500, &err); + if (dbus_error_is_set(&err)) { dbus_error_free(&err); } @@ -363,7 +376,7 @@ int vc_dbus_request_initialize(int pid, int* mgr_pid) DBusMessage* result_msg; int result = VC_ERROR_OPERATION_FAILED; - result_msg = dbus_connection_send_with_reply_and_block(g_conn, msg, g_waiting_time, &err); + result_msg = dbus_connection_send_with_reply_and_block(g_conn_sender, msg, g_waiting_time, &err); dbus_message_unref(msg); if (dbus_error_is_set(&err)) { @@ -426,7 +439,7 @@ int vc_dbus_request_finalize(int pid) DBusMessage* result_msg; int result = VC_ERROR_OPERATION_FAILED; - result_msg = dbus_connection_send_with_reply_and_block(g_conn, msg, g_waiting_time, &err); + result_msg = dbus_connection_send_with_reply_and_block(g_conn_sender, msg, g_waiting_time, &err); dbus_message_unref(msg); if (dbus_error_is_set(&err)) { @@ -491,7 +504,7 @@ int vc_dbus_request_set_exclusive_command(int pid, bool value) DBusMessage* result_msg; int result = VC_ERROR_OPERATION_FAILED; - result_msg = dbus_connection_send_with_reply_and_block(g_conn, msg, g_waiting_time, &err); + result_msg = dbus_connection_send_with_reply_and_block(g_conn_sender, msg, g_waiting_time, &err); dbus_message_unref(msg); if (dbus_error_is_set(&err)) { @@ -553,7 +566,7 @@ int vc_dbus_request_set_command(int pid, vc_cmd_type_e cmd_type) DBusMessage* result_msg; int result = VC_ERROR_OPERATION_FAILED; - result_msg = dbus_connection_send_with_reply_and_block(g_conn, msg, g_waiting_time, &err); + result_msg = dbus_connection_send_with_reply_and_block(g_conn_sender, msg, g_waiting_time, &err); dbus_message_unref(msg); if (dbus_error_is_set(&err)) { @@ -615,7 +628,7 @@ int vc_dbus_request_unset_command(int pid, vc_cmd_type_e cmd_type) DBusMessage* result_msg; int result = VC_ERROR_OPERATION_FAILED; - result_msg = dbus_connection_send_with_reply_and_block(g_conn, msg, g_waiting_time, &err); + result_msg = dbus_connection_send_with_reply_and_block(g_conn_sender, msg, g_waiting_time, &err); dbus_message_unref(msg); if (dbus_error_is_set(&err)) { @@ -681,7 +694,7 @@ int vc_dbus_request_start(int pid, int silence) DBusMessage* result_msg; int result = VC_ERROR_OPERATION_FAILED; - result_msg = dbus_connection_send_with_reply_and_block(g_conn, msg, g_waiting_time, &err); + result_msg = dbus_connection_send_with_reply_and_block(g_conn_sender, msg, g_waiting_time, &err); dbus_message_unref(msg); if (dbus_error_is_set(&err)) { @@ -743,7 +756,7 @@ int vc_dbus_request_stop(int pid) DBusMessage* result_msg; int result = VC_ERROR_OPERATION_FAILED; - result_msg = dbus_connection_send_with_reply_and_block(g_conn, msg, g_waiting_time, &err); + result_msg = dbus_connection_send_with_reply_and_block(g_conn_sender, msg, g_waiting_time, &err); dbus_message_unref(msg); if (dbus_error_is_set(&err)) { @@ -805,7 +818,7 @@ int vc_dbus_request_cancel(int pid) DBusMessage* result_msg; int result = VC_ERROR_OPERATION_FAILED; - result_msg = dbus_connection_send_with_reply_and_block(g_conn, msg, g_waiting_time, &err); + result_msg = dbus_connection_send_with_reply_and_block(g_conn_sender, msg, g_waiting_time, &err); dbus_message_unref(msg); if (dbus_error_is_set(&err)) { @@ -849,9 +862,9 @@ int vc_dbus_request_auth_enable(int pid, int mgr_pid) char object_path[64] = {0,}; char target_if_name[128] = {0,}; - snprintf(service_name, 64, "%s%d", VC_MANAGER_SERVICE_NAME, mgr_pid); + snprintf(service_name, 64, "%s", VC_MANAGER_SERVICE_NAME); snprintf(object_path, 64, "%s", VC_MANAGER_SERVICE_OBJECT_PATH); - snprintf(target_if_name, 128, "%s%d", VC_MANAGER_SERVICE_INTERFACE, mgr_pid); + snprintf(target_if_name, 128, "%s", VC_MANAGER_SERVICE_INTERFACE); /* create a signal & check for errors */ msg = dbus_message_new_method_call( @@ -877,7 +890,7 @@ int vc_dbus_request_auth_enable(int pid, int mgr_pid) DBusMessage* result_msg; int result = VC_ERROR_OPERATION_FAILED; - result_msg = dbus_connection_send_with_reply_and_block(g_conn, msg, g_waiting_time, &err); + result_msg = dbus_connection_send_with_reply_and_block(g_conn_sender, msg, g_waiting_time, &err); dbus_message_unref(msg); if (dbus_error_is_set(&err)) { @@ -919,9 +932,9 @@ int vc_dbus_request_auth_disable(int pid, int mgr_pid) char object_path[64] = {0,}; char target_if_name[128] = {0,}; - snprintf(service_name, 64, "%s%d", VC_MANAGER_SERVICE_NAME, mgr_pid); + snprintf(service_name, 64, "%s", VC_MANAGER_SERVICE_NAME); snprintf(object_path, 64, "%s", VC_MANAGER_SERVICE_OBJECT_PATH); - snprintf(target_if_name, 128, "%s%d", VC_MANAGER_SERVICE_INTERFACE, mgr_pid); + snprintf(target_if_name, 128, "%s", VC_MANAGER_SERVICE_INTERFACE); /* create a signal & check for errors */ msg = dbus_message_new_method_call( @@ -947,7 +960,7 @@ int vc_dbus_request_auth_disable(int pid, int mgr_pid) DBusMessage* result_msg; int result = VC_ERROR_OPERATION_FAILED; - result_msg = dbus_connection_send_with_reply_and_block(g_conn, msg, g_waiting_time, &err); + result_msg = dbus_connection_send_with_reply_and_block(g_conn_sender, msg, g_waiting_time, &err); dbus_message_unref(msg); if (dbus_error_is_set(&err)) { @@ -989,9 +1002,9 @@ int vc_dbus_request_auth_start(int pid, int mgr_pid) char object_path[64] = {0,}; char target_if_name[128] = {0,}; - snprintf(service_name, 64, "%s%d", VC_MANAGER_SERVICE_NAME, mgr_pid); + snprintf(service_name, 64, "%s", VC_MANAGER_SERVICE_NAME); snprintf(object_path, 64, "%s", VC_MANAGER_SERVICE_OBJECT_PATH); - snprintf(target_if_name, 128, "%s%d", VC_MANAGER_SERVICE_INTERFACE, mgr_pid); + snprintf(target_if_name, 128, "%s", VC_MANAGER_SERVICE_INTERFACE); /* create a signal & check for errors */ msg = dbus_message_new_method_call( @@ -1019,7 +1032,7 @@ int vc_dbus_request_auth_start(int pid, int mgr_pid) DBusMessage* result_msg; int result = VC_ERROR_OPERATION_FAILED; - result_msg = dbus_connection_send_with_reply_and_block(g_conn, msg, g_waiting_time, &err); + result_msg = dbus_connection_send_with_reply_and_block(g_conn_sender, msg, g_waiting_time, &err); dbus_message_unref(msg); if (dbus_error_is_set(&err)) { @@ -1061,9 +1074,9 @@ int vc_dbus_request_auth_stop(int pid, int mgr_pid) char object_path[64] = {0,}; char target_if_name[128] = {0,}; - snprintf(service_name, 64, "%s%d", VC_MANAGER_SERVICE_NAME, mgr_pid); + snprintf(service_name, 64, "%s", VC_MANAGER_SERVICE_NAME); snprintf(object_path, 64, "%s", VC_MANAGER_SERVICE_OBJECT_PATH); - snprintf(target_if_name, 128, "%s%d", VC_MANAGER_SERVICE_INTERFACE, mgr_pid); + snprintf(target_if_name, 128, "%s", VC_MANAGER_SERVICE_INTERFACE); /* create a signal & check for errors */ msg = dbus_message_new_method_call( @@ -1089,7 +1102,7 @@ int vc_dbus_request_auth_stop(int pid, int mgr_pid) DBusMessage* result_msg; int result = VC_ERROR_OPERATION_FAILED; - result_msg = dbus_connection_send_with_reply_and_block(g_conn, msg, g_waiting_time, &err); + result_msg = dbus_connection_send_with_reply_and_block(g_conn_sender, msg, g_waiting_time, &err); dbus_message_unref(msg); if (dbus_error_is_set(&err)) { @@ -1131,9 +1144,9 @@ int vc_dbus_request_auth_cancel(int pid, int mgr_pid) char object_path[64] = {0,}; char target_if_name[128] = {0,}; - snprintf(service_name, 64, "%s%d", VC_MANAGER_SERVICE_NAME, mgr_pid); + snprintf(service_name, 64, "%s", VC_MANAGER_SERVICE_NAME); snprintf(object_path, 64, "%s", VC_MANAGER_SERVICE_OBJECT_PATH); - snprintf(target_if_name, 128, "%s%d", VC_MANAGER_SERVICE_INTERFACE, mgr_pid); + snprintf(target_if_name, 128, "%s", VC_MANAGER_SERVICE_INTERFACE); /* create a signal & check for errors */ msg = dbus_message_new_method_call( @@ -1159,7 +1172,7 @@ int vc_dbus_request_auth_cancel(int pid, int mgr_pid) DBusMessage* result_msg; int result = VC_ERROR_OPERATION_FAILED; - result_msg = dbus_connection_send_with_reply_and_block(g_conn, msg, g_waiting_time, &err); + result_msg = dbus_connection_send_with_reply_and_block(g_conn_sender, msg, g_waiting_time, &err); dbus_message_unref(msg); if (dbus_error_is_set(&err)) { diff --git a/client/vc_mgr.c b/client/vc_mgr.c index f1d7121..40c74ca 100644 --- a/client/vc_mgr.c +++ b/client/vc_mgr.c @@ -31,15 +31,12 @@ #define VC_MANAGER_CONFIG_HANDLE 100000 -static bool g_m_is_daemon_started = false; - static Ecore_Timer* g_m_connect_timer = NULL; static vc_h g_vc_m = NULL; static GSList* g_demandable_client_list = NULL; - static Eina_Bool __vc_mgr_notify_state_changed(void *data); static Eina_Bool __vc_mgr_notify_error(void *data); static Eina_Bool __vc_mgr_notify_result(void *data); @@ -204,7 +201,6 @@ static void __vc_mgr_internal_unprepare() SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request finalize : %s", __vc_mgr_get_error_code(ret)); } - g_m_is_daemon_started = false; vc_cmd_parser_delete_file(getpid(), VC_COMMAND_TYPE_SYSTEM); vc_cmd_parser_delete_file(getpid(), VC_COMMAND_TYPE_EXCLUSIVE); @@ -263,47 +259,10 @@ int vc_mgr_deinitialize() return VC_ERROR_NONE; } -static void* __fork_vc_daemon() -{ - int pid, i; - pid = fork(); - - switch(pid) { - case -1: - SLOG(LOG_ERROR, TAG_VCM, "Fail to create daemon"); - break; - case 0: - setsid(); - for (i = 0;i < _NSIG;i++) - signal(i, SIG_DFL); - - execl(VC_DAEMON_PATH, VC_DAEMON_PATH, NULL); - break; - default: - break; - } - - return (void*) 1; -} - static Eina_Bool __vc_mgr_connect_daemon(void *data) { /* Send hello */ if (0 != vc_mgr_dbus_request_hello()) { - if (false == g_m_is_daemon_started) { - g_m_is_daemon_started = true; - - pthread_t thread; - int thread_id; - thread_id = pthread_create(&thread, NULL, __fork_vc_daemon, NULL); - if (thread_id < 0) { - SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to make thread"); - g_m_connect_timer = NULL; - return EINA_FALSE; - } - - pthread_detach(thread); - } return EINA_TRUE; } @@ -380,7 +339,6 @@ int vc_mgr_prepare() return VC_ERROR_INVALID_STATE; } - g_m_is_daemon_started = false; g_m_connect_timer = ecore_timer_add(0, __vc_mgr_connect_daemon, NULL); diff --git a/client/vc_mgr_dbus.c b/client/vc_mgr_dbus.c index be13390..5121870 100644 --- a/client/vc_mgr_dbus.c +++ b/client/vc_mgr_dbus.c @@ -25,7 +25,8 @@ static int g_m_waiting_time = 3000; static Ecore_Fd_Handler* g_m_fd_handler = NULL; -static DBusConnection* g_m_conn = NULL; +static DBusConnection* g_m_conn_sender = NULL; +static DBusConnection* g_m_conn_listener = NULL; extern void __vc_mgr_cb_all_result(); @@ -49,16 +50,12 @@ extern int __vc_mgr_request_auth_cancel(int pid); static Eina_Bool vc_mgr_listener_event_callback(void* data, Ecore_Fd_Handler *fd_handler) { - DBusConnection* conn = (DBusConnection*)data; - DBusMessage* msg = NULL; - DBusMessage *reply = NULL; - - if (NULL == conn) - return ECORE_CALLBACK_RENEW; + if (NULL == g_m_conn_listener) return ECORE_CALLBACK_RENEW; - dbus_connection_read_write_dispatch(conn, 50); + dbus_connection_read_write_dispatch(g_m_conn_listener, 50); - msg = dbus_connection_pop_message(conn); + DBusMessage* msg = NULL; + msg = dbus_connection_pop_message(g_m_conn_listener); /* loop again if we haven't read a message */ if (NULL == msg) { @@ -69,7 +66,7 @@ static Eina_Bool vc_mgr_listener_event_callback(void* data, Ecore_Fd_Handler *fd dbus_error_init(&err); char if_name[64]; - snprintf(if_name, 64, "%s%d", VC_MANAGER_SERVICE_NAME, getpid()); + snprintf(if_name, 64, "%s", VC_MANAGER_SERVICE_NAME); if (dbus_message_is_method_call(msg, if_name, VCD_MANAGER_METHOD_HELLO)) { SLOG(LOG_DEBUG, TAG_VCM, "===== Get Hello"); @@ -83,26 +80,27 @@ static Eina_Bool vc_mgr_listener_event_callback(void* data, Ecore_Fd_Handler *fd } if (pid > 0) { - SLOG(LOG_DEBUG, TAG_VCM, "<<<< vc get hello : pid(%d) ", pid); + SLOG(LOG_DEBUG, TAG_VCM, "<<<< vc mgr get hello : pid(%d) ", pid); response = 1; } else { - SLOG(LOG_ERROR, TAG_VCM, "<<<< vc get hello : invalid pid "); + SLOG(LOG_ERROR, TAG_VCM, "<<<< vc mgr get hello : invalid pid "); } + DBusMessage *reply = NULL; reply = dbus_message_new_method_return(msg); if (NULL != reply) { dbus_message_append_args(reply, DBUS_TYPE_INT32, &response, DBUS_TYPE_INVALID); - if (!dbus_connection_send(conn, reply, NULL)) + if (!dbus_connection_send(g_m_conn_listener, reply, NULL)) SLOG(LOG_ERROR, TAG_VCM, ">>>> vc get hello : fail to send reply"); else SLOG(LOG_DEBUG, TAG_VCM, ">>>> vc get hello : result(%d)", response); - dbus_connection_flush(conn); - dbus_message_unref(reply); + dbus_connection_flush(g_m_conn_listener); + dbus_message_unref(reply); } else { - SLOG(LOG_ERROR, TAG_VCM, ">>>> vc get hello : fail to create reply message"); + SLOG(LOG_ERROR, TAG_VCM, ">>>> vc mgr get hello : fail to create reply message"); } SLOG(LOG_DEBUG, TAG_VCM, "====="); @@ -114,22 +112,6 @@ static Eina_Bool vc_mgr_listener_event_callback(void* data, Ecore_Fd_Handler *fd __vc_mgr_cb_speech_detected(); - /* - reply = dbus_message_new_method_return(msg); - - if (NULL != reply) { - if (!dbus_connection_send(conn, reply, NULL)) - SLOG(LOG_ERROR, TAG_VCM, ">>>> vc mgr get speech detected : fail to send reply"); - else - SLOG(LOG_DEBUG, TAG_VCM, ">>>> vc mgr get speech detected"); - - dbus_connection_flush(conn); - dbus_message_unref(reply); - } else { - SLOG(LOG_ERROR, TAG_VCM, ">>>> vc mgr get speech detected : fail to create reply message"); - } - */ - SLOG(LOG_DEBUG, TAG_VCM, "====="); SLOG(LOG_DEBUG, TAG_VCM, " "); @@ -140,22 +122,6 @@ static Eina_Bool vc_mgr_listener_event_callback(void* data, Ecore_Fd_Handler *fd __vc_mgr_cb_all_result(); - /* - reply = dbus_message_new_method_return(msg); - - if (NULL != reply) { - if (!dbus_connection_send(conn, reply, NULL)) - SLOG(LOG_ERROR, TAG_VCM, ">>>> vc mgr get all result : fail to send reply"); - else - SLOG(LOG_DEBUG, TAG_VCM, ">>>> vc mgr get all result"); - - dbus_connection_flush(conn); - dbus_message_unref(reply); - } else { - SLOG(LOG_ERROR, TAG_VCM, ">>>> vc mgr get all result : fail to create reply message"); - } - */ - SLOG(LOG_DEBUG, TAG_VCM, "====="); SLOG(LOG_DEBUG, TAG_VCM, " "); @@ -166,22 +132,6 @@ static Eina_Bool vc_mgr_listener_event_callback(void* data, Ecore_Fd_Handler *fd __vc_mgr_cb_system_result(); - /* - reply = dbus_message_new_method_return(msg); - - if (NULL != reply) { - if (!dbus_connection_send(conn, reply, NULL)) - SLOG(LOG_ERROR, TAG_VCM, ">>>> vc mgr get system result : fail to send reply"); - else - SLOG(LOG_DEBUG, TAG_VCM, ">>>> vc mgr get system result"); - - dbus_connection_flush(conn); - dbus_message_unref(reply); - } else { - SLOG(LOG_ERROR, TAG_VCM, ">>>> vc mgr get system result : fail to create reply message"); - } - */ - SLOG(LOG_DEBUG, TAG_VCM, "====="); SLOG(LOG_DEBUG, TAG_VCM, " "); @@ -200,29 +150,13 @@ static Eina_Bool vc_mgr_listener_event_callback(void* data, Ecore_Fd_Handler *fd DBUS_TYPE_INVALID); if (dbus_error_is_set(&err)) { - SLOG(LOG_ERROR, TAG_VCM, "<<<< vc Get Error message : Get arguments error (%s)", err.message); + SLOG(LOG_ERROR, TAG_VCM, "<<<< vc mgr Get Error message : Get arguments error (%s)", err.message); dbus_error_free(&err); } else { - SLOG(LOG_DEBUG, TAG_VCM, "<<<< vc Get Error message : pid(%d), reason(%d), msg(%s)", pid, reason, err_msg); + SLOG(LOG_DEBUG, TAG_VCM, "<<<< vc mgr Get Error message : pid(%d), reason(%d), msg(%s)", pid, reason, err_msg); __vc_mgr_cb_error(pid, reason); } - /* - reply = dbus_message_new_method_return(msg); - - if (NULL != reply) { - if (!dbus_connection_send(conn, reply, NULL)) - SLOG(LOG_ERROR, TAG_VCM, ">>>> vc Error message : fail to send reply"); - else - SLOG(LOG_DEBUG, TAG_VCM, ">>>> vc Error message"); - - dbus_connection_flush(conn); - dbus_message_unref(reply); - } else { - SLOG(LOG_ERROR, TAG_VCM, ">>>> vc Error message : fail to create reply message"); - } - */ - SLOG(LOG_DEBUG, TAG_VCM, "====="); SLOG(LOG_DEBUG, TAG_VCM, " "); }/* VCD_MANAGER_METHOD_ERROR */ @@ -238,27 +172,28 @@ static Eina_Bool vc_mgr_listener_event_callback(void* data, Ecore_Fd_Handler *fd DBUS_TYPE_INVALID); if (dbus_error_is_set(&err)) { - SLOG(LOG_ERROR, TAG_VCM, "<<<< vc request auth enable : Get arguments error (%s)", err.message); + SLOG(LOG_ERROR, TAG_VCM, "<<<< vc mgr request auth enable : Get arguments error (%s)", err.message); dbus_error_free(&err); } else { - SLOG(LOG_DEBUG, TAG_VCM, "<<<< vc request auth enable : pid(%d)", pid); + SLOG(LOG_DEBUG, TAG_VCM, "<<<< vc mgr request auth enable : pid(%d)", pid); ret = __vc_mgr_request_auth_enable(pid); } + DBusMessage *reply = NULL; reply = dbus_message_new_method_return(msg); if (NULL != reply) { dbus_message_append_args(reply, - DBUS_TYPE_INT32, &ret, - DBUS_TYPE_INVALID); - if (!dbus_connection_send(conn, reply ,NULL)) - SLOG(LOG_ERROR, TAG_VCM, ">>>> vc request auth enable : fail to send reply"); + DBUS_TYPE_INT32, &ret, + DBUS_TYPE_INVALID); + if (!dbus_connection_send(g_m_conn_listener, reply, NULL)) + SLOG(LOG_ERROR, TAG_VCM, ">>>> vc mgr request auth enable : fail to send reply"); else - SLOG(LOG_DEBUG, TAG_VCM, ">>>> vc request auth enable : ret(%d)", ret); - dbus_connection_flush(conn); + SLOG(LOG_DEBUG, TAG_VCM, ">>>> vc mgr request auth enable : ret(%d)", ret); + dbus_connection_flush(g_m_conn_listener); dbus_message_unref(reply); } else { - SLOG(LOG_ERROR, TAG_VCM, ">>>> vc request auth enable : fail to create reply message"); + SLOG(LOG_ERROR, TAG_VCM, ">>>> vc mgr request auth enable : fail to create reply message"); } SLOG(LOG_DEBUG, TAG_VCM, "====="); @@ -275,27 +210,28 @@ static Eina_Bool vc_mgr_listener_event_callback(void* data, Ecore_Fd_Handler *fd DBUS_TYPE_INVALID); if (dbus_error_is_set(&err)) { - SLOG(LOG_ERROR, TAG_VCM, "<<<< vc request auth disable : Get arguments error (%s)", err.message); + SLOG(LOG_ERROR, TAG_VCM, "<<<< vc mgr request auth disable : Get arguments error (%s)", err.message); dbus_error_free(&err); } else { - SLOG(LOG_DEBUG, TAG_VCM, "<<<< vc request auth disable : pid(%d)", pid); + SLOG(LOG_DEBUG, TAG_VCM, "<<<< vc mgr request auth disable : pid(%d)", pid); ret = __vc_mgr_request_auth_disable(pid); } + DBusMessage *reply = NULL; reply = dbus_message_new_method_return(msg); if (NULL != reply) { dbus_message_append_args(reply, DBUS_TYPE_INT32, &ret, DBUS_TYPE_INVALID); - if (!dbus_connection_send(conn, reply, NULL)) - SLOG(LOG_ERROR, TAG_VCM, ">>>> vc request auth disable : fail to send reply"); + if (!dbus_connection_send(g_m_conn_listener, reply, NULL)) + SLOG(LOG_ERROR, TAG_VCM, ">>>> vc mgr request auth disable : fail to send reply"); else - SLOG(LOG_DEBUG, TAG_VCM, ">>>> vc request auth disable : ret(%d)", ret); - dbus_connection_flush(conn); + SLOG(LOG_DEBUG, TAG_VCM, ">>>> vc mgr request auth disable : ret(%d)", ret); + dbus_connection_flush(g_m_conn_listener); dbus_message_unref(reply); } else { - SLOG(LOG_ERROR, TAG_VCM, ">>>> vc request auth disable : fail to create reply message"); + SLOG(LOG_ERROR, TAG_VCM, ">>>> vc mgr request auth disable : fail to create reply message"); } SLOG(LOG_DEBUG, TAG_VCM, "====="); @@ -312,27 +248,28 @@ static Eina_Bool vc_mgr_listener_event_callback(void* data, Ecore_Fd_Handler *fd DBUS_TYPE_INVALID); if (dbus_error_is_set(&err)) { - SLOG(LOG_ERROR, TAG_VCM, "<<<< vc request auth start : Get arguments error (%s)", err.message); + SLOG(LOG_ERROR, TAG_VCM, "<<<< vc mgr request auth start : Get arguments error (%s)", err.message); dbus_error_free(&err); } else { - SLOG(LOG_DEBUG, TAG_VCM, "<<<< vc request auth start : pid(%d)", pid); + SLOG(LOG_DEBUG, TAG_VCM, "<<<< vc mgr request auth start : pid(%d)", pid); ret = __vc_mgr_request_auth_start(pid); } + DBusMessage *reply = NULL; reply = dbus_message_new_method_return(msg); if (NULL != reply) { dbus_message_append_args(reply, DBUS_TYPE_INT32, &ret, DBUS_TYPE_INVALID); - if (!dbus_connection_send(conn, reply, NULL)) - SLOG(LOG_ERROR, TAG_VCM, ">>>> vc request auth start : fail to send reply"); + if (!dbus_connection_send(g_m_conn_listener, reply, NULL)) + SLOG(LOG_ERROR, TAG_VCM, ">>>> vc mgr request auth start : fail to send reply"); else - SLOG(LOG_DEBUG, TAG_VCM, ">>>> vc request auth start : ret(%d)", ret); - dbus_connection_flush(conn); + SLOG(LOG_DEBUG, TAG_VCM, ">>>> vc mgr request auth start : ret(%d)", ret); + dbus_connection_flush(g_m_conn_listener); dbus_message_unref(reply); } else { - SLOG(LOG_ERROR, TAG_VCM, ">>>> vc request auth start : fail to create reply message"); + SLOG(LOG_ERROR, TAG_VCM, ">>>> vc mgr request auth start : fail to create reply message"); } SLOG(LOG_DEBUG, TAG_VCM, "====="); @@ -349,27 +286,28 @@ static Eina_Bool vc_mgr_listener_event_callback(void* data, Ecore_Fd_Handler *fd DBUS_TYPE_INVALID); if (dbus_error_is_set(&err)) { - SLOG(LOG_ERROR, TAG_VCM, "<<<< vc request auth stop : Get arguments error (%s)", err.message); + SLOG(LOG_ERROR, TAG_VCM, "<<<< vc mgr request auth stop : Get arguments error (%s)", err.message); dbus_error_free(&err); } else { - SLOG(LOG_DEBUG, TAG_VCM, "<<<< vc request auth stop : pid(%d)", pid); + SLOG(LOG_DEBUG, TAG_VCM, "<<<< vc mgr request auth stop : pid(%d)", pid); ret = __vc_mgr_request_auth_stop(pid); } + DBusMessage *reply = NULL; reply = dbus_message_new_method_return(msg); if (NULL != reply) { dbus_message_append_args(reply, DBUS_TYPE_INT32, &ret, DBUS_TYPE_INVALID); - if (!dbus_connection_send(conn, reply, NULL)) - SLOG(LOG_ERROR, TAG_VCM, ">>>> vc request auth stop : fail to send reply"); + if (!dbus_connection_send(g_m_conn_listener, reply, NULL)) + SLOG(LOG_ERROR, TAG_VCM, ">>>> vc mgr request auth stop : fail to send reply"); else - SLOG(LOG_DEBUG, TAG_VCM, ">>>> vc request auth stop : ret(%d)", ret); - dbus_connection_flush(conn); + SLOG(LOG_DEBUG, TAG_VCM, ">>>> vc mgr request auth stop : ret(%d)", ret); + dbus_connection_flush(g_m_conn_listener); dbus_message_unref(reply); } else { - SLOG(LOG_ERROR, TAG_VCM, ">>>> vc request auth stop : fail to create reply message"); + SLOG(LOG_ERROR, TAG_VCM, ">>>> vc mgr request auth stop : fail to create reply message"); } SLOG(LOG_DEBUG, TAG_VCM, "====="); @@ -386,27 +324,28 @@ static Eina_Bool vc_mgr_listener_event_callback(void* data, Ecore_Fd_Handler *fd DBUS_TYPE_INVALID); if (dbus_error_is_set(&err)) { - SLOG(LOG_ERROR, TAG_VCM, "<<<< vc request auth cancel : Get arguments error (%s)", err.message); + SLOG(LOG_ERROR, TAG_VCM, "<<<< vc mgr request auth cancel : Get arguments error (%s)", err.message); dbus_error_free(&err); } else { - SLOG(LOG_DEBUG, TAG_VCM, "<<<< vc request auth cancel : pid(%d)", pid); + SLOG(LOG_DEBUG, TAG_VCM, "<<<< vc mgr request auth cancel : pid(%d)", pid); ret = __vc_mgr_request_auth_cancel(pid); } + DBusMessage *reply = NULL; reply = dbus_message_new_method_return(msg); if (NULL != reply) { dbus_message_append_args(reply, DBUS_TYPE_INT32, &ret, DBUS_TYPE_INVALID); - if (!dbus_connection_send(conn, reply, NULL)) + if (!dbus_connection_send(g_m_conn_listener, reply, NULL)) SLOG(LOG_ERROR, TAG_VCM, ">>>> vc request auth cancel : fail to send reply"); else SLOG(LOG_DEBUG, TAG_VCM, ">>>> vc request auth cancel : ret(%d)", ret); - dbus_connection_flush(conn); + dbus_connection_flush(g_m_conn_listener); dbus_message_unref(reply); } else { - SLOG(LOG_ERROR, TAG_VCM, ">>>> vc request auth cancel : fail to create reply message"); + SLOG(LOG_ERROR, TAG_VCM, ">>>> vc mgr request auth cancel : fail to create reply message"); } SLOG(LOG_DEBUG, TAG_VCM, "====="); @@ -421,7 +360,7 @@ static Eina_Bool vc_mgr_listener_event_callback(void* data, Ecore_Fd_Handler *fd int vc_mgr_dbus_open_connection() { - if (NULL != g_m_conn) { + if (NULL != g_m_conn_sender && NULL != g_m_conn_listener) { SLOG(LOG_WARN, TAG_VCM, "already existed connection "); return 0; } @@ -433,14 +372,27 @@ int vc_mgr_dbus_open_connection() dbus_error_init(&err); /* connect to the DBUS system bus, and check for errors */ - g_m_conn = dbus_bus_get_private(DBUS_BUS_SYSTEM, &err); + g_m_conn_sender = dbus_bus_get_private(DBUS_BUS_SYSTEM, &err); + + if (dbus_error_is_set(&err)) { + SLOG(LOG_ERROR, TAG_VCM, "Dbus Connection Error (%s)", err.message); + dbus_error_free(&err); + } + + if (NULL == g_m_conn_sender) { + SLOG(LOG_ERROR, TAG_VCM, "Fail to get dbus connection "); + return VC_ERROR_OPERATION_FAILED; + } + + /* connect to the DBUS system bus, and check for errors */ + g_m_conn_listener = dbus_bus_get_private(DBUS_BUS_SYSTEM, &err); if (dbus_error_is_set(&err)) { SLOG(LOG_ERROR, TAG_VCM, "Dbus Connection Error (%s)", err.message); dbus_error_free(&err); } - if (NULL == g_m_conn) { + if (NULL == g_m_conn_listener) { SLOG(LOG_ERROR, TAG_VCM, "Fail to get dbus connection "); return VC_ERROR_OPERATION_FAILED; } @@ -449,12 +401,12 @@ int vc_mgr_dbus_open_connection() char service_name[64]; memset(service_name, '\0', 64); - snprintf(service_name, 64, "%s%d", VC_MANAGER_SERVICE_NAME, pid); + snprintf(service_name, 64, "%s", VC_MANAGER_SERVICE_NAME); SLOG(LOG_DEBUG, TAG_VCM, "service name is %s", service_name); /* register our name on the bus, and check for errors */ - ret = dbus_bus_request_name(g_m_conn, service_name, DBUS_NAME_FLAG_REPLACE_EXISTING , &err); + ret = dbus_bus_request_name(g_m_conn_listener, service_name, DBUS_NAME_FLAG_REPLACE_EXISTING, &err); if (dbus_error_is_set(&err)) { SLOG(LOG_ERROR, TAG_VCM, "Name Error (%s)", err.message); @@ -472,11 +424,11 @@ int vc_mgr_dbus_open_connection() } char rule[128]; - snprintf(rule, 128, "type='signal',interface='%s%d'", VC_MANAGER_SERVICE_INTERFACE, pid); + snprintf(rule, 128, "type='signal',interface='%s'", VC_MANAGER_SERVICE_INTERFACE); /* add a rule for which messages we want to see */ - dbus_bus_add_match(g_m_conn, rule, &err); - dbus_connection_flush(g_m_conn); + dbus_bus_add_match(g_m_conn_listener, rule, &err); + dbus_connection_flush(g_m_conn_listener); if (dbus_error_is_set(&err)) { @@ -486,14 +438,14 @@ int vc_mgr_dbus_open_connection() } int fd = 0; - if (1 != dbus_connection_get_unix_fd(g_m_conn, &fd)) { + if (1 != dbus_connection_get_unix_fd(g_m_conn_listener, &fd)) { SLOG(LOG_ERROR, TAG_VCM, "fail to get fd from dbus "); return VC_ERROR_OPERATION_FAILED; } else { SLOG(LOG_DEBUG, TAG_VCM, "Get fd from dbus : %d", fd); } - g_m_fd_handler = ecore_main_fd_handler_add(fd, ECORE_FD_READ, (Ecore_Fd_Cb)vc_mgr_listener_event_callback, g_m_conn, NULL, NULL); + g_m_fd_handler = ecore_main_fd_handler_add(fd, ECORE_FD_READ, (Ecore_Fd_Cb)vc_mgr_listener_event_callback, g_m_conn_listener, NULL, NULL); if (NULL == g_m_fd_handler) { SLOG(LOG_ERROR, TAG_VCM, "fail to get fd handler from ecore "); @@ -508,33 +460,39 @@ int vc_mgr_dbus_close_connection() DBusError err; dbus_error_init(&err); + if (NULL != g_m_fd_handler) { + ecore_main_fd_handler_del(g_m_fd_handler); + g_m_fd_handler = NULL; + } + int pid = getpid(); char service_name[64]; memset(service_name, '\0', 64); - snprintf(service_name, 64, "%s%d", VC_MANAGER_SERVICE_NAME, pid); + snprintf(service_name, 64, "%s", VC_MANAGER_SERVICE_NAME); - dbus_bus_release_name (g_m_conn, service_name, &err); + dbus_bus_release_name(g_m_conn_listener, service_name, &err); if (dbus_error_is_set(&err)) { SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Dbus Error (%s)", err.message); dbus_error_free(&err); } - dbus_connection_close(g_m_conn); - - g_m_fd_handler = NULL; - g_m_conn = NULL; + g_m_conn_sender = NULL; + g_m_conn_listener = NULL; return 0; } int vc_mgr_dbus_reconnect() { - bool connected = dbus_connection_get_is_connected(g_m_conn); - SECURE_SLOG(LOG_DEBUG, TAG_VCM, "[DBUS] %s", connected ? "Connected" : "Not connected"); + bool sender_connected = dbus_connection_get_is_connected(g_m_conn_sender); + bool listener_connected = dbus_connection_get_is_connected(g_m_conn_listener); + + SLOG(LOG_DEBUG, TAG_VCM, "[DBUS] Sender(%s) Listener(%s)", + sender_connected ? "Connected" : "Not connected", listener_connected ? "Connected" : "Not connected"); - if (false == connected) { + if (false == sender_connected || false == listener_connected) { vc_mgr_dbus_close_connection(); if (0 != vc_mgr_dbus_open_connection()) { @@ -544,6 +502,7 @@ int vc_mgr_dbus_reconnect() SLOG(LOG_DEBUG, TAG_VCM, "[DBUS] Reconnect"); } + return 0; } @@ -568,7 +527,7 @@ int vc_mgr_dbus_request_hello() DBusMessage* result_msg = NULL; int result = 0; - result_msg = dbus_connection_send_with_reply_and_block(g_m_conn, msg, 500, &err); + result_msg = dbus_connection_send_with_reply_and_block(g_m_conn_sender, msg, 500, &err); if (dbus_error_is_set(&err)) { dbus_error_free(&err); @@ -614,7 +573,7 @@ int vc_mgr_dbus_request_initialize(int pid) DBusMessage* result_msg; int result = VC_ERROR_OPERATION_FAILED; - result_msg = dbus_connection_send_with_reply_and_block(g_m_conn, msg, g_m_waiting_time, &err); + result_msg = dbus_connection_send_with_reply_and_block(g_m_conn_sender, msg, g_m_waiting_time, &err); dbus_message_unref(msg); if (dbus_error_is_set(&err)) { @@ -674,7 +633,7 @@ int vc_mgr_dbus_request_finalize(int pid) DBusMessage* result_msg; int result = VC_ERROR_OPERATION_FAILED; - result_msg = dbus_connection_send_with_reply_and_block(g_m_conn, msg, g_m_waiting_time, &err); + result_msg = dbus_connection_send_with_reply_and_block(g_m_conn_sender, msg, g_m_waiting_time, &err); dbus_message_unref(msg); if (dbus_error_is_set(&err)) { @@ -736,7 +695,7 @@ int vc_mgr_dbus_request_set_command(int pid) DBusMessage* result_msg; int result = VC_ERROR_OPERATION_FAILED; - result_msg = dbus_connection_send_with_reply_and_block(g_m_conn, msg, g_m_waiting_time, &err); + result_msg = dbus_connection_send_with_reply_and_block(g_m_conn_sender, msg, g_m_waiting_time, &err); dbus_message_unref(msg); if (dbus_error_is_set(&err)) { @@ -797,7 +756,7 @@ int vc_mgr_dbus_request_unset_command(int pid) DBusMessage* result_msg; int result = VC_ERROR_OPERATION_FAILED; - result_msg = dbus_connection_send_with_reply_and_block(g_m_conn, msg, g_m_waiting_time, &err); + result_msg = dbus_connection_send_with_reply_and_block(g_m_conn_sender, msg, g_m_waiting_time, &err); dbus_message_unref(msg); if (dbus_error_is_set(&err)) { @@ -858,7 +817,7 @@ int vc_mgr_dbus_request_demandable_client(int pid) DBusMessage* result_msg; int result = VC_ERROR_OPERATION_FAILED; - result_msg = dbus_connection_send_with_reply_and_block(g_m_conn, msg, g_m_waiting_time, &err); + result_msg = dbus_connection_send_with_reply_and_block(g_m_conn_sender, msg, g_m_waiting_time, &err); dbus_message_unref(msg); if (dbus_error_is_set(&err)) { @@ -921,7 +880,7 @@ int vc_mgr_dbus_request_set_audio_type(int pid, const char* audio_type) DBusMessage* result_msg; int result = VC_ERROR_OPERATION_FAILED; - result_msg = dbus_connection_send_with_reply_and_block(g_m_conn, msg, g_m_waiting_time, &err); + result_msg = dbus_connection_send_with_reply_and_block(g_m_conn_sender, msg, g_m_waiting_time, &err); dbus_message_unref(msg); if (dbus_error_is_set(&err)) { @@ -984,7 +943,7 @@ int vc_mgr_dbus_request_get_audio_type(int pid, char** audio_type) int result = VC_ERROR_OPERATION_FAILED; char* temp = NULL; - result_msg = dbus_connection_send_with_reply_and_block(g_m_conn, msg, g_m_waiting_time, &err); + result_msg = dbus_connection_send_with_reply_and_block(g_m_conn_sender, msg, g_m_waiting_time, &err); dbus_message_unref(msg); if (dbus_error_is_set(&err)) { @@ -1050,7 +1009,7 @@ int vc_mgr_dbus_request_set_client_info(int pid) DBusMessage* result_msg; int result = VC_ERROR_OPERATION_FAILED; - result_msg = dbus_connection_send_with_reply_and_block(g_m_conn, msg, g_m_waiting_time, &err); + result_msg = dbus_connection_send_with_reply_and_block(g_m_conn_sender, msg, g_m_waiting_time, &err); dbus_message_unref(msg); if (dbus_error_is_set(&err)) { @@ -1084,75 +1043,6 @@ int vc_mgr_dbus_request_set_client_info(int pid) return result; } -#if 0 -int vc_mgr_dbus_request_start(int pid, int silence, bool exclusive_command_option) -{ - DBusMessage* msg; - - /* create a signal & check for errors */ - msg = dbus_message_new_method_call( - VC_SERVER_SERVICE_NAME, - VC_SERVER_SERVICE_OBJECT_PATH, - VC_SERVER_SERVICE_INTERFACE, - VC_MANAGER_METHOD_START); - - if (NULL == msg) { - SLOG(LOG_ERROR, TAG_VCM, ">>>> vc mgr start : Fail to make message "); - return VC_ERROR_OPERATION_FAILED; - } else { - SLOG(LOG_DEBUG, TAG_VCM, ">>>> vc mgr start : pid(%d), silence(%d) exclusive(%d)", - pid, silence, exclusive_command_option); - } - - int temp = exclusive_command_option; - - dbus_message_append_args(msg, - DBUS_TYPE_INT32, &pid, - DBUS_TYPE_INT32, &(silence), - DBUS_TYPE_INT32, &(temp), - DBUS_TYPE_INVALID); - - DBusError err; - dbus_error_init(&err); - - DBusMessage* result_msg; - int result = VC_ERROR_OPERATION_FAILED; - - result_msg = dbus_connection_send_with_reply_and_block(g_m_conn, msg, g_m_waiting_time, &err); - dbus_message_unref(msg); - - if (dbus_error_is_set(&err)) { - SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Dbus Error (%s)", err.message); - dbus_error_free(&err); - } - - if (NULL != result_msg) { - dbus_message_get_args(result_msg, &err, - DBUS_TYPE_INT32, &result, - DBUS_TYPE_INVALID); - - if (dbus_error_is_set(&err)) { - SLOG(LOG_ERROR, TAG_VCM, "<<<< Get arguments error (%s)", err.message); - dbus_error_free(&err); - result = VC_ERROR_OPERATION_FAILED; - } - dbus_message_unref(result_msg); - - if (0 == result) { - SLOG(LOG_DEBUG, TAG_VCM, "<<<< vc mgr start : result = %d", result); - } else { - SLOG(LOG_ERROR, TAG_VCM, "<<<< vc mgr start : result = %d", result); - } - } else { - SLOG(LOG_DEBUG, TAG_VCM, "<<<< Result Message is NULL"); - vc_mgr_dbus_reconnect(); - result = VC_ERROR_TIMED_OUT; - } - - return result; -} -#endif - int vc_mgr_dbus_request_start(int pid, int silence, bool exclusive_command_option, bool start_by_client) { DBusMessage* msg; @@ -1188,7 +1078,7 @@ int vc_mgr_dbus_request_start(int pid, int silence, bool exclusive_command_optio DBusMessage* result_msg; int result = VC_ERROR_OPERATION_FAILED; - result_msg = dbus_connection_send_with_reply_and_block(g_m_conn, msg, g_m_waiting_time, &err); + result_msg = dbus_connection_send_with_reply_and_block(g_m_conn_sender, msg, g_m_waiting_time, &err); dbus_message_unref(msg); if (dbus_error_is_set(&err)) { @@ -1250,7 +1140,7 @@ int vc_mgr_dbus_request_stop(int pid) DBusMessage* result_msg; int result = VC_ERROR_OPERATION_FAILED; - result_msg = dbus_connection_send_with_reply_and_block(g_m_conn, msg, g_m_waiting_time, &err); + result_msg = dbus_connection_send_with_reply_and_block(g_m_conn_sender, msg, g_m_waiting_time, &err); dbus_message_unref(msg); if (dbus_error_is_set(&err)) { @@ -1312,7 +1202,7 @@ int vc_mgr_dbus_request_cancel(int pid) DBusMessage* result_msg; int result = VC_ERROR_OPERATION_FAILED; - result_msg = dbus_connection_send_with_reply_and_block(g_m_conn, msg, g_m_waiting_time, &err); + result_msg = dbus_connection_send_with_reply_and_block(g_m_conn_sender, msg, g_m_waiting_time, &err); dbus_message_unref(msg); if (dbus_error_is_set(&err)) { @@ -1357,13 +1247,14 @@ static DBusMessage* __get_message(int pid, const char* method, int type) memset(target_if_name, '\0', 128); if (VC_COMMAND_TYPE_FOREGROUND == type || VC_COMMAND_TYPE_BACKGROUND == type) { - snprintf(service_name, 64, "%s%d", VC_CLIENT_SERVICE_NAME, pid); + snprintf(service_name, 64, "%s", VC_CLIENT_SERVICE_NAME); snprintf(object_path, 64, "%s", VC_CLIENT_SERVICE_OBJECT_PATH); - snprintf(target_if_name, 128, "%s%d", VC_CLIENT_SERVICE_NAME, pid); + snprintf(target_if_name, 128, "%s", VC_CLIENT_SERVICE_NAME); + } else if (VC_COMMAND_TYPE_WIDGET == type) { - snprintf(service_name, 64, "%s%d", VC_WIDGET_SERVICE_NAME, pid); + snprintf(service_name, 64, "%s", VC_WIDGET_SERVICE_NAME); snprintf(object_path, 64, "%s", VC_WIDGET_SERVICE_OBJECT_PATH); - snprintf(target_if_name, 128, "%s%d", VC_WIDGET_SERVICE_INTERFACE, pid); + snprintf(target_if_name, 128, "%s", VC_WIDGET_SERVICE_INTERFACE); } else { return NULL; } @@ -1398,12 +1289,12 @@ int vc_mgr_dbus_send_result(int pid, int cmd_type, int result_id) dbus_message_set_no_reply(msg, TRUE); /* send the message and flush the connection */ - if (!dbus_connection_send(g_m_conn, msg, NULL)) { - SLOG(LOG_ERROR, TAG_VCM, "[Dbus ERROR] Fail to send result message"); + if (!dbus_connection_send(g_m_conn_sender, msg, NULL)) { + SLOG(LOG_ERROR, TAG_VCM, "[Dbus ERROR] Fail to send result message"); } else { SLOG(LOG_DEBUG, TAG_VCM, "[Dbus] Success to send result"); - dbus_connection_flush(g_m_conn); + dbus_connection_flush(g_m_conn_sender); } dbus_message_unref(msg); @@ -1434,54 +1325,14 @@ int vc_mgr_dbus_send_result_selection(int pid) DBUS_TYPE_INVALID); dbus_message_set_no_reply(msg, TRUE); - - if (1 != dbus_connection_send(g_m_conn, msg, NULL)) { + + if (1 != dbus_connection_send(g_m_conn_sender, msg, NULL)) { SLOG(LOG_ERROR, TAG_VCM, "[Dbus ERROR] Fail to Send"); return -1; } else { SLOG(LOG_DEBUG, TAG_VCM, "[Dbus] SUCCESS Send"); - dbus_connection_flush(g_m_conn); - return 0; - } - - /* - DBusError err; - dbus_error_init(&err); - - DBusMessage* result_msg; - int result = VC_ERROR_OPERATION_FAILED; - - result_msg = dbus_connection_send_with_reply_and_block(g_m_conn, msg, g_m_waiting_time, &err); - dbus_message_unref(msg); - - if (dbus_error_is_set(&err)) { - SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Dbus Error (%s)", err.message); - dbus_error_free(&err); + dbus_connection_flush(g_m_conn_sender); } - if (NULL != result_msg) { - dbus_message_get_args(result_msg, &err, - DBUS_TYPE_INT32, &result, - DBUS_TYPE_INVALID); - - if (dbus_error_is_set(&err)) { - SLOG(LOG_ERROR, TAG_VCM, "<<<< Get arguments error (%s)", err.message); - dbus_error_free(&err); - result = VC_ERROR_OPERATION_FAILED; - } - dbus_message_unref(result_msg); - - if (0 == result) { - SLOG(LOG_DEBUG, TAG_VCM, "<<<< vc result selection : result = %d", result); - } else { - SLOG(LOG_ERROR, TAG_VCM, "<<<< vc result selection : result = %d", result); - } - } else { - SLOG(LOG_DEBUG, TAG_VCM, "<<<< Result Message is NULL"); - vc_mgr_dbus_reconnect(); - result = VC_ERROR_TIMED_OUT; - } - - return result; - */ + return 0; } diff --git a/client/vc_mgr_dbus.h b/client/vc_mgr_dbus.h index e5bce76..c0608c1 100644 --- a/client/vc_mgr_dbus.h +++ b/client/vc_mgr_dbus.h @@ -46,10 +46,6 @@ int vc_mgr_dbus_request_get_audio_type(int pid, char** audio_type); int vc_mgr_dbus_request_set_client_info(int pid); -#if 0 -int vc_mgr_dbus_request_start(int pid, int silence, bool exclusive_command_option); -#endif - int vc_mgr_dbus_request_start(int pid, int silence, bool exclusive_command_option, bool start_by_client); int vc_mgr_dbus_request_stop(int pid); diff --git a/client/vc_setting.c b/client/vc_setting.c index 7ae5467..64f0453 100644 --- a/client/vc_setting.c +++ b/client/vc_setting.c @@ -102,21 +102,6 @@ int vc_setting_initialize(void) return VC_ERROR_NONE; } -//int vc_setting_finalize() -//{ -// SLOG(LOG_DEBUG, TAG_VCS, "===== Finalize VC Setting"); -// -// vc_config_mgr_unset_lang_cb(getpid() + VC_SETTING_CONFIG_HANDLE); -// vc_config_mgr_finalize(getpid() + VC_SETTING_CONFIG_HANDLE); -// -// g_state = VC_SETTING_STATE_NONE; -// -// SLOG(LOG_DEBUG, TAG_VCS, "====="); -// SLOG(LOG_DEBUG, TAG_VCS, " "); -// -// return VC_ERROR_NONE; -//} - int vc_setting_deinitialize() { SLOG(LOG_DEBUG, TAG_VCS, "===== Deinitialize VC Setting"); diff --git a/client/vc_widget.c b/client/vc_widget.c index d04a545..b7a3537 100644 --- a/client/vc_widget.c +++ b/client/vc_widget.c @@ -28,8 +28,6 @@ #define VC_WIDGET_CONFIG_HANDLE 200000 -static bool g_w_is_daemon_started = false; - static Ecore_Timer* g_w_connect_timer = NULL; static Ecore_Timer* g_w_start_timer = NULL; @@ -195,8 +193,6 @@ static void __vc_widget_internal_unprepare() SLOG(LOG_WARN, TAG_VCW, "[ERROR] Fail to request finalize : %s", __vc_widget_get_error_code(ret)); } - g_w_is_daemon_started = false; - vc_cmd_parser_delete_file(getpid(), VC_COMMAND_TYPE_WIDGET); return; @@ -253,36 +249,10 @@ int vc_widget_deinitialize() return VC_ERROR_NONE; } -static void __vc_widget_fork_vc_daemon() -{ - int pid, i; - pid = fork(); - - switch(pid) { - case -1: - SLOG(LOG_ERROR, TAG_VCW, "Fail to create daemon"); - break; - case 0: - setsid(); - for (i = 0;i < _NSIG;i++) - signal(i, SIG_DFL); - - execl(VC_DAEMON_PATH, VC_DAEMON_PATH, NULL); - break; - default: - break; - } - return; -} - static Eina_Bool __vc_widget_connect_daemon(void *data) { /* Send hello */ if (0 != vc_widget_dbus_request_hello()) { - if (false == g_w_is_daemon_started) { - g_w_is_daemon_started = true; - __vc_widget_fork_vc_daemon(); - } return EINA_TRUE; } @@ -344,8 +314,6 @@ int vc_widget_prepare() return VC_ERROR_INVALID_STATE; } - g_w_is_daemon_started = false; - g_w_connect_timer = ecore_timer_add(0, __vc_widget_connect_daemon, NULL); SLOG(LOG_DEBUG, TAG_VCW, "====="); diff --git a/client/vc_widget_dbus.c b/client/vc_widget_dbus.c index 0b1a11d..0d1df58 100644 --- a/client/vc_widget_dbus.c +++ b/client/vc_widget_dbus.c @@ -24,8 +24,8 @@ static int g_w_waiting_time = 3000; static Ecore_Fd_Handler* g_w_fd_handler = NULL; -static DBusConnection* g_w_conn = NULL; - +static DBusConnection* g_w_conn_sender = NULL; +static DBusConnection* g_w_conn_listener = NULL; extern int __vc_widget_cb_error(int pid, int reason); @@ -36,16 +36,12 @@ extern void __vc_widget_cb_result(); static Eina_Bool widget_listener_event_callback(void* data, Ecore_Fd_Handler *fd_handler) { - DBusConnection* conn = (DBusConnection*)data; - DBusMessage* msg = NULL; - DBusMessage *reply = NULL; - - if (NULL == conn) - return ECORE_CALLBACK_RENEW; + if (NULL == g_w_conn_listener) return ECORE_CALLBACK_RENEW; - dbus_connection_read_write_dispatch(conn, 50); + dbus_connection_read_write_dispatch(g_w_conn_listener, 50); - msg = dbus_connection_pop_message(conn); + DBusMessage* msg = NULL; + msg = dbus_connection_pop_message(g_w_conn_listener); /* loop again if we haven't read a message */ if (NULL == msg) { @@ -56,7 +52,7 @@ static Eina_Bool widget_listener_event_callback(void* data, Ecore_Fd_Handler *fd dbus_error_init(&err); char if_name[64]; - snprintf(if_name, 64, "%s%d", VC_WIDGET_SERVICE_INTERFACE, getpid()); + snprintf(if_name, 64, "%s", VC_WIDGET_SERVICE_INTERFACE); if (dbus_message_is_method_call(msg, if_name, VCD_WIDGET_METHOD_HELLO)) { SLOG(LOG_DEBUG, TAG_VCW, "===== Get widget hello"); @@ -77,18 +73,19 @@ static Eina_Bool widget_listener_event_callback(void* data, Ecore_Fd_Handler *fd SLOG(LOG_ERROR, TAG_VCW, "<<<< vc widget get hello : invalid pid "); } + DBusMessage* reply = NULL; reply = dbus_message_new_method_return(msg); if (NULL != reply) { dbus_message_append_args(reply, DBUS_TYPE_INT32, &response, DBUS_TYPE_INVALID); - if (!dbus_connection_send(conn, reply, NULL)) + if (!dbus_connection_send(g_w_conn_listener, reply, NULL)) SLOG(LOG_ERROR, TAG_VCW, ">>>> vc widget get hello : fail to send reply"); else SLOG(LOG_DEBUG, TAG_VCW, ">>>> vc widget get hello : result(%d)", response); - dbus_connection_flush(conn); - dbus_message_unref(reply); + dbus_connection_flush(g_w_conn_listener); + dbus_message_unref(reply); } else { SLOG(LOG_ERROR, TAG_VCW, ">>>> vc widget get hello : fail to create reply message"); } @@ -120,22 +117,6 @@ static Eina_Bool widget_listener_event_callback(void* data, Ecore_Fd_Handler *fd SLOG(LOG_ERROR, TAG_VCW, "<<<< vc widget show tooltip : invalid pid"); } - /* - reply = dbus_message_new_method_return(msg); - - if (NULL != reply) { - if (!dbus_connection_send(conn, reply, NULL)) - SLOG(LOG_ERROR, TAG_VCW, ">>>> vc widget show tooltip : fail to send reply"); - else - SLOG(LOG_DEBUG, TAG_VCW, ">>>> vc widget show tooltip"); - - dbus_connection_flush(conn); - dbus_message_unref(reply); - } else { - SLOG(LOG_ERROR, TAG_VCW, ">>>> vc widget show tooltip : fail to create reply message"); - } - */ - SLOG(LOG_DEBUG, TAG_VCW, "====="); SLOG(LOG_DEBUG, TAG_VCW, " "); } /* VCD_WIDGET_METHOD_SHOW_TOOLTIP */ @@ -145,22 +126,6 @@ static Eina_Bool widget_listener_event_callback(void* data, Ecore_Fd_Handler *fd __vc_widget_cb_result(); - /* - reply = dbus_message_new_method_return(msg); - - if (NULL != reply) { - if (!dbus_connection_send(conn, reply, NULL)) - SLOG(LOG_ERROR, TAG_VCW, ">>>> vc widget get result : fail to send reply"); - else - SLOG(LOG_DEBUG, TAG_VCW, ">>>> vc widget get result"); - - dbus_connection_flush(conn); - dbus_message_unref(reply); - } else { - SLOG(LOG_ERROR, TAG_VCW, ">>>> vc widget get result : fail to create reply message"); - - */ - SLOG(LOG_DEBUG, TAG_VCW, "====="); SLOG(LOG_DEBUG, TAG_VCW, " "); @@ -186,22 +151,6 @@ static Eina_Bool widget_listener_event_callback(void* data, Ecore_Fd_Handler *fd __vc_widget_cb_error(pid, reason); } - /* - reply = dbus_message_new_method_return(msg); - - if (NULL != reply) { - if (!dbus_connection_send(conn, reply, NULL)) - SLOG(LOG_ERROR, TAG_VCW, ">>>> vc widget error message : fail to send reply"); - else - SLOG(LOG_DEBUG, TAG_VCW, ">>>> vc widget error message"); - - dbus_connection_flush(conn); - dbus_message_unref(reply); - } else { - SLOG(LOG_ERROR, TAG_VCW, ">>>> vc widget error message : fail to create reply message"); - } - */ - SLOG(LOG_DEBUG, TAG_VCW, "====="); SLOG(LOG_DEBUG, TAG_VCW, " "); } /* VCD_WIDGET_METHOD_ERROR */ @@ -214,7 +163,7 @@ static Eina_Bool widget_listener_event_callback(void* data, Ecore_Fd_Handler *fd int vc_widget_dbus_open_connection() { - if (NULL != g_w_conn) { + if (NULL != g_w_conn_sender && NULL != g_w_conn_listener) { SLOG(LOG_WARN, TAG_VCW, "Already existed connection "); return 0; } @@ -226,28 +175,40 @@ int vc_widget_dbus_open_connection() dbus_error_init(&err); /* connect to the DBUS system bus, and check for errors */ - g_w_conn = dbus_bus_get_private(DBUS_BUS_SYSTEM, &err); + g_w_conn_sender = dbus_bus_get_private(DBUS_BUS_SYSTEM, &err); - if (dbus_error_is_set(&err)) { - SLOG(LOG_ERROR, TAG_VCW, "Dbus Connection Error (%s)", err.message); - dbus_error_free(&err); + if (dbus_error_is_set(&err)) { + SLOG(LOG_ERROR, TAG_VCW, "Dbus Connection Error (%s)", err.message); + dbus_error_free(&err); } - if (NULL == g_w_conn) { + if (NULL == g_w_conn_sender) { SLOG(LOG_ERROR, TAG_VCW, "Fail to get dbus connection "); - return VC_ERROR_OPERATION_FAILED; + return VC_ERROR_OPERATION_FAILED; + } + + g_w_conn_listener = dbus_bus_get_private(DBUS_BUS_SYSTEM, &err); + + if (dbus_error_is_set(&err)) { + SLOG(LOG_ERROR, TAG_VCW, "Dbus Connection Error (%s)", err.message); + dbus_error_free(&err); + } + + if (NULL == g_w_conn_listener) { + SLOG(LOG_ERROR, TAG_VCW, "Fail to get dbus connection "); + return VC_ERROR_OPERATION_FAILED; } int pid = getpid(); char service_name[64]; memset(service_name, '\0', 64); - snprintf(service_name, 64, "%s%d", VC_WIDGET_SERVICE_NAME, pid); + snprintf(service_name, 64, "%s", VC_WIDGET_SERVICE_NAME); SLOG(LOG_DEBUG, TAG_VCW, "service name is %s", service_name); /* register our name on the bus, and check for errors */ - ret = dbus_bus_request_name(g_w_conn, service_name, DBUS_NAME_FLAG_REPLACE_EXISTING , &err); + ret = dbus_bus_request_name(g_w_conn_listener, service_name, DBUS_NAME_FLAG_REPLACE_EXISTING , &err); if (dbus_error_is_set(&err)) { SLOG(LOG_ERROR, TAG_VCW, "Name Error (%s)", err.message); @@ -265,11 +226,11 @@ int vc_widget_dbus_open_connection() } char rule[128]; - snprintf(rule, 128, "type='signal',interface='%s%d'", VC_WIDGET_SERVICE_INTERFACE, pid); + snprintf(rule, 128, "type='signal',interface='%s'", VC_WIDGET_SERVICE_INTERFACE); /* add a rule for which messages we want to see */ - dbus_bus_add_match(g_w_conn, rule, &err); - dbus_connection_flush(g_w_conn); + dbus_bus_add_match(g_w_conn_listener, rule, &err); + dbus_connection_flush(g_w_conn_listener); if (dbus_error_is_set(&err)) { @@ -279,14 +240,14 @@ int vc_widget_dbus_open_connection() } int fd = 0; - if (1 != dbus_connection_get_unix_fd(g_w_conn, &fd)) { + if (1 != dbus_connection_get_unix_fd(g_w_conn_listener, &fd)) { SLOG(LOG_ERROR, TAG_VCW, "fail to get fd from dbus "); return VC_ERROR_OPERATION_FAILED; } else { SLOG(LOG_DEBUG, TAG_VCW, "Get fd from dbus : %d", fd); } - g_w_fd_handler = ecore_main_fd_handler_add(fd, ECORE_FD_READ, (Ecore_Fd_Cb)widget_listener_event_callback, g_w_conn, NULL, NULL); + g_w_fd_handler = ecore_main_fd_handler_add(fd, ECORE_FD_READ, (Ecore_Fd_Cb)widget_listener_event_callback, g_w_conn_listener, NULL, NULL); if (NULL == g_w_fd_handler) { SLOG(LOG_ERROR, TAG_VCW, "fail to get fd handler from ecore "); @@ -301,33 +262,38 @@ int vc_widget_dbus_close_connection() DBusError err; dbus_error_init(&err); + if (NULL != g_w_fd_handler) { + ecore_main_fd_handler_del(g_w_fd_handler); + g_w_fd_handler = NULL; + } + int pid = getpid(); char service_name[64]; memset(service_name, '\0', 64); - snprintf(service_name, 64, "%s%d", VC_WIDGET_SERVICE_NAME, pid); + snprintf(service_name, 64, "%s", VC_WIDGET_SERVICE_NAME); - dbus_bus_release_name (g_w_conn, service_name, &err); + dbus_bus_release_name(g_w_conn_listener, service_name, &err); if (dbus_error_is_set(&err)) { SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Dbus Error (%s)", err.message); dbus_error_free(&err); } - dbus_connection_close(g_w_conn); - - g_w_fd_handler = NULL; - g_w_conn = NULL; + g_w_conn_sender = NULL; + g_w_conn_listener = NULL; return 0; } int vc_widget_dbus_reconnect() { - bool connected = dbus_connection_get_is_connected(g_w_conn); - SECURE_SLOG(LOG_DEBUG, TAG_VCW, "[DBUS] %s", connected ? "Connected" : "Not connected"); + bool sender_connected = dbus_connection_get_is_connected(g_w_conn_sender); + bool listener_connected = dbus_connection_get_is_connected(g_w_conn_listener); + SLOG(LOG_DEBUG, TAG_VCW, "[DBUS] Sender(%s) Listener(%s)", + sender_connected ? "Connected" : "Not connected", listener_connected ? "Connected" : "Not connected"); - if (false == connected) { + if (false == sender_connected || false == listener_connected) { vc_widget_dbus_close_connection(); if (0 != vc_widget_dbus_open_connection()) { @@ -337,6 +303,7 @@ int vc_widget_dbus_reconnect() SLOG(LOG_DEBUG, TAG_VCW, "[DBUS] Reconnect"); } + return 0; } @@ -361,7 +328,7 @@ int vc_widget_dbus_request_hello() DBusMessage* result_msg = NULL; int result = 0; - result_msg = dbus_connection_send_with_reply_and_block(g_w_conn, msg, 500, &err); + result_msg = dbus_connection_send_with_reply_and_block(g_w_conn_sender, msg, 500, &err); if (dbus_error_is_set(&err)) { dbus_error_free(&err); @@ -407,7 +374,7 @@ int vc_widget_dbus_request_initialize(int pid) DBusMessage* result_msg; int result = VC_ERROR_OPERATION_FAILED; - result_msg = dbus_connection_send_with_reply_and_block(g_w_conn, msg, g_w_waiting_time, &err); + result_msg = dbus_connection_send_with_reply_and_block(g_w_conn_sender, msg, g_w_waiting_time, &err); dbus_message_unref(msg); if (dbus_error_is_set(&err)) { @@ -467,7 +434,7 @@ int vc_widget_dbus_request_finalize(int pid) DBusMessage* result_msg; int result = VC_ERROR_OPERATION_FAILED; - result_msg = dbus_connection_send_with_reply_and_block(g_w_conn, msg, g_w_waiting_time, &err); + result_msg = dbus_connection_send_with_reply_and_block(g_w_conn_sender, msg, g_w_waiting_time, &err); dbus_message_unref(msg); if (dbus_error_is_set(&err)) { @@ -532,7 +499,7 @@ int vc_widget_dbus_request_start_recording(int pid, bool command) DBusMessage* result_msg; int result = VC_ERROR_OPERATION_FAILED; - result_msg = dbus_connection_send_with_reply_and_block(g_w_conn, msg, g_w_waiting_time, &err); + result_msg = dbus_connection_send_with_reply_and_block(g_w_conn_sender, msg, g_w_waiting_time, &err); dbus_message_unref(msg); if (dbus_error_is_set(&err)) { @@ -595,7 +562,7 @@ int vc_widget_dbus_request_start(int pid, int silence) DBusMessage* result_msg; int result = VC_ERROR_OPERATION_FAILED; - result_msg = dbus_connection_send_with_reply_and_block(g_w_conn, msg, g_w_waiting_time, &err); + result_msg = dbus_connection_send_with_reply_and_block(g_w_conn_sender, msg, g_w_waiting_time, &err); dbus_message_unref(msg); if (dbus_error_is_set(&err)) { @@ -657,7 +624,7 @@ int vc_widget_dbus_request_stop(int pid) DBusMessage* result_msg; int result = VC_ERROR_OPERATION_FAILED; - result_msg = dbus_connection_send_with_reply_and_block(g_w_conn, msg, g_w_waiting_time, &err); + result_msg = dbus_connection_send_with_reply_and_block(g_w_conn_sender, msg, g_w_waiting_time, &err); dbus_message_unref(msg); if (dbus_error_is_set(&err)) { @@ -719,7 +686,7 @@ int vc_widget_dbus_request_cancel(int pid) DBusMessage* result_msg; int result = VC_ERROR_OPERATION_FAILED; - result_msg = dbus_connection_send_with_reply_and_block(g_w_conn, msg, g_w_waiting_time, &err); + result_msg = dbus_connection_send_with_reply_and_block(g_w_conn_sender, msg, g_w_waiting_time, &err); dbus_message_unref(msg); if (dbus_error_is_set(&err)) { diff --git a/common/vc_command.c b/common/vc_command.c index fd501da..7d570a2 100644 --- a/common/vc_command.c +++ b/common/vc_command.c @@ -534,7 +534,6 @@ int vc_cmd_get_unfixed_command(vc_cmd_h vc_command, char** command) return 0; } -//int vc_cmd_set_type(vc_cmd_h vc_command, vc_cmd_type_e type) int vc_cmd_set_type(vc_cmd_h vc_command, int type) { if (NULL == vc_command) { @@ -721,7 +720,6 @@ int vc_cmd_set_result_key(vc_cmd_h vc_command, int key, int modifier) * @see vc_cmd_add_result_key() */ int vc_cmd_get_result_key(vc_cmd_h vc_command, int* key, int* modifier) -//int vc_command_get_result_key(vc_cmd_h vc_command, int* key, int* modifier) { SLOG(LOG_DEBUG, TAG_VCCMD, "===== Get result key"); diff --git a/common/vc_defs.h b/common/vc_defs.h index cc3cd54..7c88337 100644 --- a/common/vc_defs.h +++ b/common/vc_defs.h @@ -27,19 +27,19 @@ extern "C" { * Definition for Dbus *******************************************************************************************/ -#define VC_CLIENT_SERVICE_NAME "org.tizen.voice.vcclient" -#define VC_CLIENT_SERVICE_OBJECT_PATH "/org/tizen/voice/vcclient" -#define VC_CLIENT_SERVICE_INTERFACE "org.tizen.voice.vcclient" +#define VC_CLIENT_SERVICE_NAME "org.tizen.vc.client" +#define VC_CLIENT_SERVICE_OBJECT_PATH "/org/tizen/vc/client" +#define VC_CLIENT_SERVICE_INTERFACE "org.tizen.vc.client" -#define VC_WIDGET_SERVICE_NAME "org.tizen.voice.vcwidget" -#define VC_WIDGET_SERVICE_OBJECT_PATH "/org/tizen/voice/vcwidget" -#define VC_WIDGET_SERVICE_INTERFACE "org.tizen.voice.vcwidget" +#define VC_WIDGET_SERVICE_NAME "org.tizen.vc.widget" +#define VC_WIDGET_SERVICE_OBJECT_PATH "/org/tizen/vc/widget" +#define VC_WIDGET_SERVICE_INTERFACE "org.tizen.vc.widget" -#define VC_MANAGER_SERVICE_NAME "org.tizen.voice.vcmanager" -#define VC_MANAGER_SERVICE_OBJECT_PATH "/org/tizen/voice/vcmanager" -#define VC_MANAGER_SERVICE_INTERFACE "org.tizen.voice.vcmanager" +#define VC_MANAGER_SERVICE_NAME "org.tizen.vc.manager" +#define VC_MANAGER_SERVICE_OBJECT_PATH "/org/tizen/vc/manager" +#define VC_MANAGER_SERVICE_INTERFACE "org.tizen.vc.manager" -#define VC_SERVER_SERVICE_NAME "service.connect.vcserver" +#define VC_SERVER_SERVICE_NAME "org.tizen.voice.vcserver" #define VC_SERVER_SERVICE_OBJECT_PATH "/org/tizen/voice/vcserver" #define VC_SERVER_SERVICE_INTERFACE "org.tizen.voice.vcserver" diff --git a/doc/uix_vc_doc.h b/doc/uix_vc_doc.h index ae2ccca..ba34513 100644 --- a/doc/uix_vc_doc.h +++ b/doc/uix_vc_doc.h @@ -148,16 +148,6 @@ * * * - * vc_set_app_state() - * Ready - * - * - * - * vc_get_app_state() - * Ready - * - * - * * vc_set_command_list() * Ready * diff --git a/include/voice-control-manager.pc.in b/include/voice-control-manager.pc.in index 74ddccf..5165ffe 100644 --- a/include/voice-control-manager.pc.in +++ b/include/voice-control-manager.pc.in @@ -5,6 +5,7 @@ includedir=@INCLUDEDIR@ Name: lib@PROJECT_NAME@_manager Description: Voice control manager client library +Requires: glib-2.0 dbus-1 capi-base-common Version: @VERSION@ Libs: -L${libdir} -l@PROJECT_NAME@_manager Cflags: -I${includedir} diff --git a/include/voice-control-setting.pc.in b/include/voice-control-setting.pc.in index e250626..fa3c9ea 100644 --- a/include/voice-control-setting.pc.in +++ b/include/voice-control-setting.pc.in @@ -5,6 +5,7 @@ includedir=@INCLUDEDIR@ Name: lib@PROJECT_NAME@_setting Description: Voice control setting library +Requires: glib-2.0 capi-base-common Version: @VERSION@ Libs: -L${libdir} -l@PROJECT_NAME@_setting Cflags: -I${includedir} diff --git a/include/voice-control-widget.pc.in b/include/voice-control-widget.pc.in index 51ba1ca..308394a 100644 --- a/include/voice-control-widget.pc.in +++ b/include/voice-control-widget.pc.in @@ -5,6 +5,7 @@ includedir=@INCLUDEDIR@ Name: lib@PROJECT_NAME@_widget Description: Voice control library for widget +Requires: glib-2.0 dbus-1 capi-base-common Version: @VERSION@ Libs: -L${libdir} -l@PROJECT_NAME@_widget Cflags: -I${includedir} diff --git a/include/voice-control.pc.in b/include/voice-control.pc.in index fe29d64..8396172 100644 --- a/include/voice-control.pc.in +++ b/include/voice-control.pc.in @@ -5,6 +5,7 @@ includedir=@INCLUDEDIR@ Name: lib@PROJECT_NAME@ Description: Voice control client library +Requires: glib-2.0 dbus-1 capi-base-common Version: @VERSION@ Libs: -L${libdir} -l@PROJECT_NAME@ Cflags: -I${includedir} diff --git a/include/voice_control_command.h b/include/voice_control_command.h index bbdc847..9e065b3 100644 --- a/include/voice_control_command.h +++ b/include/voice_control_command.h @@ -22,7 +22,10 @@ /** -* @addtogroup Voice_control_command +* @defgroup CAPI_UIX_VOICE_CONTROL_COMMAND_MODULE Voice control command +* @ingroup CAPI_UIX_VOICE_CONTROL_MODULE +* +* @brief The @ref CAPI_UIX_VOICE_CONTROL_COMMAND_MODULE API provides functions for creating/destroying command list and add/remove/retrieve commands of list. * @{ */ diff --git a/include/voice_control_common.h b/include/voice_control_common.h index 7bd8055..861749d 100644 --- a/include/voice_control_common.h +++ b/include/voice_control_common.h @@ -21,7 +21,7 @@ #include /** -* @addtogroup Voice_control_common +* @addtogroup CAPI_UIX_VOICE_CONTROL_MODULE * @{ */ diff --git a/org.tizen.voice.vcserver.service b/org.tizen.voice.vcserver.service new file mode 100644 index 0000000..638d1dc --- /dev/null +++ b/org.tizen.voice.vcserver.service @@ -0,0 +1,5 @@ +[D-BUS Service] +Name=org.tizen.voice.vcserver +Exec=/usr/bin/vc-daemon +User=system +Group=system diff --git a/packaging/voice-control.spec b/packaging/voice-control.spec index 5e3b8c8..dab629a 100644 --- a/packaging/voice-control.spec +++ b/packaging/voice-control.spec @@ -1,6 +1,6 @@ Name: voice-control Summary: Voice control client library and daemon -Version: 0.2.7 +Version: 0.2.8 Release: 1 Group: Graphics & UI Framework/Voice Framework License: Apache-2.0 @@ -97,7 +97,6 @@ install LICENSE %{buildroot}/usr/share/license/%{name} /sbin/ldconfig mkdir -p /usr/share/voice/vc -chsmack -a '_' /usr/share/voice/vc mkdir -p /opt/home/app/.voice/vc chown 5000:5000 /opt/home/app/.voice/vc @@ -112,6 +111,8 @@ chown 5000:5000 /opt/home/app/.voice/vc %{_libdir}/libvc_widget.so %{_libdir}/libvc_manager.so %{_bindir}/vc-daemon +/usr/share/dbus-1/system-services/org.tizen.voice* +/etc/dbus-1/system.d/vc-server.conf /usr/lib/voice/vc/1.0/vc-config.xml /usr/share/license/%{name} @@ -147,8 +148,6 @@ chown 5000:5000 /opt/home/app/.voice/vc %files setting-devel %defattr(-,root,root,-) %{_libdir}/pkgconfig/voice-control-setting.pc -%{_includedir}/voice_control_command.h -%{_includedir}/voice_control_common.h %{_includedir}/voice_control_setting.h %files engine-devel diff --git a/server/vcd_client_data.c b/server/vcd_client_data.c index 8ae7b33..f21b5c5 100644 --- a/server/vcd_client_data.c +++ b/server/vcd_client_data.c @@ -1049,7 +1049,6 @@ int vcd_client_get_list(int** pids, int* pid_count) return 0; } -//int vcd_client_set_command_type(int pid, vcd_client_command_group_type_e type) int vcd_client_set_command_type(int pid, int type) { vc_client_info_s* client_info = NULL; @@ -1075,7 +1074,6 @@ int vcd_client_set_command_type(int pid, int type) return 0; } -//int vcd_client_unset_command_type(int pid, vcd_client_command_group_type_e type) int vcd_client_unset_command_type(int pid, int type) { vc_client_info_s* client_info = NULL; diff --git a/server/vcd_client_data.h b/server/vcd_client_data.h index 6cfc59c..2a826ab 100644 --- a/server/vcd_client_data.h +++ b/server/vcd_client_data.h @@ -74,7 +74,6 @@ int vcd_client_get_length(); int vcd_client_foreach_command(client_foreach_command_cb callback, void* user_data); -//int vcd_client_get_client_info_from_result_id(int* result_id, int** pid, int** cmd_type); int vcd_client_get_cmd_from_result_id(int result_id, vc_cmd_s** result); int vcd_client_get_cmd_info_from_result_id(int result_id, int* pid, int* cmd_type, vc_cmd_s** result); diff --git a/server/vcd_dbus.c b/server/vcd_dbus.c index 9bcc0e3..5afdddf 100644 --- a/server/vcd_dbus.c +++ b/server/vcd_dbus.c @@ -14,8 +14,6 @@ * limitations under the License. */ - - #include #include "vcd_client_data.h" #include "vcd_dbus.h" @@ -23,7 +21,10 @@ #include "vcd_main.h" -static DBusConnection* g_conn; +static DBusConnection* g_conn_sender = NULL; +static DBusConnection* g_conn_listener = NULL; + +static Ecore_Fd_Handler* g_dbus_fd_handler = NULL; static int g_waiting_time = 3000; @@ -35,17 +36,19 @@ static DBusMessage* __get_message(int pid, const char* method, vcd_client_type_e char target_if_name[128] = {0,}; if (VCD_CLIENT_TYPE_NORMAL == type) { - snprintf(service_name, 64, "%s%d", VC_CLIENT_SERVICE_NAME, pid); + snprintf(service_name, 64, "%s", VC_CLIENT_SERVICE_NAME); snprintf(object_path, 64, "%s", VC_CLIENT_SERVICE_OBJECT_PATH); - snprintf(target_if_name, 128, "%s%d", VC_CLIENT_SERVICE_NAME, pid); + snprintf(target_if_name, 128, "%s", VC_CLIENT_SERVICE_NAME); + } else if (VCD_CLIENT_TYPE_WIDGET == type) { - snprintf(service_name, 64, "%s%d", VC_WIDGET_SERVICE_NAME, pid); + snprintf(service_name, 64, "%s", VC_WIDGET_SERVICE_NAME); snprintf(object_path, 64, "%s", VC_WIDGET_SERVICE_OBJECT_PATH); - snprintf(target_if_name, 128, "%s%d", VC_WIDGET_SERVICE_INTERFACE, pid); + snprintf(target_if_name, 128, "%s", VC_WIDGET_SERVICE_INTERFACE); + } else if (VCD_CLIENT_TYPE_MANAGER == type) { - snprintf(service_name, 64, "%s%d", VC_MANAGER_SERVICE_NAME, pid); + snprintf(service_name, 64, "%s", VC_MANAGER_SERVICE_NAME); snprintf(object_path, 64, "%s", VC_MANAGER_SERVICE_OBJECT_PATH); - snprintf(target_if_name, 128, "%s%d", VC_MANAGER_SERVICE_INTERFACE, pid); + snprintf(target_if_name, 128, "%s", VC_MANAGER_SERVICE_INTERFACE); } else { return NULL; } @@ -70,7 +73,7 @@ int vcdc_send_hello(int pid, vcd_client_type_e type) if (NULL == msg) { SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to create message"); - return -1; + return VCD_ERROR_OUT_OF_MEMORY; } dbus_message_append_args(msg, DBUS_TYPE_INT32, &pid, DBUS_TYPE_INVALID); @@ -81,7 +84,7 @@ int vcdc_send_hello(int pid, vcd_client_type_e type) DBusMessage* result_msg; int result = -1; - result_msg = dbus_connection_send_with_reply_and_block(g_conn, msg, g_waiting_time, &err); + result_msg = dbus_connection_send_with_reply_and_block(g_conn_sender, msg, g_waiting_time, &err); dbus_message_unref(msg); if (dbus_error_is_set(&err)) { @@ -95,7 +98,7 @@ int vcdc_send_hello(int pid, vcd_client_type_e type) if (dbus_error_is_set(&err)) { SLOG(LOG_ERROR, TAG_VCD, "[Dbus] Get arguments error (%s)", err.message); dbus_error_free(&err); - result = -1; + result = VCD_ERROR_OPERATION_FAILED; } dbus_message_unref(result_msg); @@ -116,10 +119,10 @@ int vcdc_send_show_tooltip(int pid, bool show) char service_name[64]; memset(service_name, 0, 64); - snprintf(service_name, 64, "%s%d", VC_WIDGET_SERVICE_NAME, pid); + snprintf(service_name, 64, "%s", VC_WIDGET_SERVICE_NAME); char target_if_name[128]; - snprintf(target_if_name, sizeof(target_if_name), "%s%d", VC_WIDGET_SERVICE_INTERFACE, pid); + snprintf(target_if_name, sizeof(target_if_name), "%s", VC_WIDGET_SERVICE_INTERFACE); DBusMessage* msg; @@ -133,7 +136,7 @@ int vcdc_send_show_tooltip(int pid, bool show) if (NULL == msg) { SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to create message"); - return -1; + return VCD_ERROR_OUT_OF_MEMORY; } int temp = (int)show; @@ -146,47 +149,20 @@ int vcdc_send_show_tooltip(int pid, bool show) dbus_message_iter_append_basic(&args, DBUS_TYPE_INT32, &(temp)); dbus_message_set_no_reply(msg, TRUE); - - if (1 != dbus_connection_send(g_conn, msg, NULL)) { + + if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) { SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to Send"); - return -1; + return VCD_ERROR_OPERATION_FAILED; } else { SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] SUCCESS Send"); - dbus_connection_flush(g_conn); - return 0; - } - - /* - DBusError err; - dbus_error_init(&err); - - DBusMessage* result_msg; - - result_msg = dbus_connection_send_with_reply_and_block(g_conn, msg, g_waiting_time, &err); - dbus_message_unref(msg); - - if (NULL != result_msg) { - if (dbus_error_is_set(&err)) { - SLOG(LOG_ERROR, TAG_VCD, "[Dbus] Get arguments error (%s)\n", err.message); - dbus_error_free(&err); - return -1; - } else { - SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] Result response"); - } - } else { - SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] Result message is NULL. Widget is not available"); - - if (dbus_error_is_set(&err)) { - SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] %s", err.message); - dbus_error_free(&err); - } - return -1; + dbus_connection_flush(g_conn_sender); } return 0; - */ } + + int vcdc_send_result(int pid, int cmd_type) { DBusMessage* msg = NULL; @@ -213,58 +189,26 @@ int vcdc_send_result(int pid, int cmd_type) return -1; } - if (NULL == msg) + if (NULL == msg) { SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Message is NULL"); - + return VCD_ERROR_OUT_OF_MEMORY; + } dbus_message_set_no_reply(msg, TRUE); - if (1 != dbus_connection_send(g_conn, msg, NULL)) { + + if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) { SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to Send"); - return -1; + return VCD_ERROR_OPERATION_FAILED; } else { SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] SUCCESS Send"); - dbus_connection_flush(g_conn); - return 0; - } - - /* - DBusError err; - dbus_error_init(&err); - - DBusMessage* result_msg; - - result_msg = dbus_connection_send_with_reply_and_block(g_conn, msg, g_waiting_time, &err); - dbus_message_unref(msg); - - if (NULL != result_msg) { - dbus_message_unref(result_msg); - if (dbus_error_is_set(&err)) { - SLOG(LOG_ERROR, TAG_VCD, "[Dbus] Get arguments error (%s)\n", err.message); - dbus_error_free(&err); - return VCD_ERROR_TIMED_OUT; - } else { - SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] Result response"); - } - } else { - SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] Result message is NULL."); - - if (dbus_error_is_set(&err)) { - SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] %s", err.message); - dbus_error_free(&err); - } - return VCD_ERROR_TIMED_OUT; + dbus_connection_flush(g_conn_sender); } return 0; - */ } int vcdc_send_result_to_manager(int manger_pid) { -// int count = 0; - -// DBusMessage* result_msg = NULL; - DBusError err; dbus_error_init(&err); @@ -272,53 +216,26 @@ int vcdc_send_result_to_manager(int manger_pid) msg = __get_message(manger_pid, VCD_MANAGER_METHOD_ALL_RESULT, VCD_CLIENT_TYPE_MANAGER); - if (NULL == msg) + if (NULL == msg) { SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Message is NULL"); + return VCD_ERROR_OUT_OF_MEMORY; + } dbus_message_set_no_reply(msg, TRUE); - - if (1 != dbus_connection_send(g_conn, msg, NULL)) { + + if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) { SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to Send"); - return -1; + return VCD_ERROR_OPERATION_FAILED; } else { SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] SUCCESS Send"); - dbus_connection_flush(g_conn); - return 0; - } - - /* - result_msg = dbus_connection_send_with_reply_and_block(g_conn, msg, g_waiting_time, &err); - dbus_message_unref(msg); - - if (NULL != result_msg) { - dbus_message_unref(result_msg); - if (dbus_error_is_set(&err)) { - SLOG(LOG_ERROR, TAG_VCD, "[Dbus] Get arguments error (%s)\n", err.message); - dbus_error_free(&err); - return -1; - } else { - SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] Result response"); - } - } else { - SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] Result message is NULL."); - - if (dbus_error_is_set(&err)) { - SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] %s", err.message); - dbus_error_free(&err); - } - return -1; + dbus_connection_flush(g_conn_sender); } - count++; - return 0; - */ } int vcdc_send_speech_detected(int manger_pid) { -// DBusMessage* result_msg = NULL; - DBusError err; dbus_error_init(&err); @@ -326,47 +243,22 @@ int vcdc_send_speech_detected(int manger_pid) msg = __get_message(manger_pid, VCD_MANAGER_METHOD_SPEECH_DETECTED, VCD_CLIENT_TYPE_MANAGER); - if (NULL == msg) + if (NULL == msg) { SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Message is NULL"); + return VCD_ERROR_OUT_OF_MEMORY; + } dbus_message_set_no_reply(msg, TRUE); - if (1 != dbus_connection_send(g_conn, msg, NULL)) { + if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) { SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to Send"); - return -1; + return VCD_ERROR_OPERATION_FAILED; } else { SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] SUCCESS Send"); - dbus_connection_flush(g_conn); - return 0; - } - - /* - result_msg = dbus_connection_send_with_reply_and_block(g_conn, msg, g_waiting_time, &err); - dbus_message_unref(msg); - - if (NULL != result_msg) { - dbus_message_unref(result_msg); - if (dbus_error_is_set(&err)) { - SLOG(LOG_ERROR, TAG_VCD, "[Dbus] Get arguments error (%s)\n", err.message); - dbus_error_free(&err); - return -1; - } - else { - SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] Result response"); - } - } - else { - SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] Result message is NULL."); - - if (dbus_error_is_set(&err)) { - SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] %s", err.message); - dbus_error_free(&err); - } - return -1; + dbus_connection_flush(g_conn_sender); } return 0; - */ } int vcdc_send_error_signal(int pid, int reason, char *err_msg) @@ -378,10 +270,10 @@ int vcdc_send_error_signal(int pid, int reason, char *err_msg) char service_name[64]; memset(service_name, 0, 64); - snprintf(service_name, 64, "%s%d", VC_CLIENT_SERVICE_NAME, pid); + snprintf(service_name, 64, "%s", VC_CLIENT_SERVICE_NAME); char target_if_name[128]; - snprintf(target_if_name, sizeof(target_if_name), "%s%d", VC_CLIENT_SERVICE_INTERFACE, pid); + snprintf(target_if_name, sizeof(target_if_name), "%s", VC_CLIENT_SERVICE_INTERFACE); DBusMessage* msg; SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] send error signal : reason(%d), Error Msg(%s)", reason, err_msg); @@ -394,7 +286,7 @@ int vcdc_send_error_signal(int pid, int reason, char *err_msg) if (NULL == msg) { SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to create message"); - return -1; + return VCD_ERROR_OUT_OF_MEMORY; } dbus_message_append_args(msg, @@ -404,51 +296,26 @@ int vcdc_send_error_signal(int pid, int reason, char *err_msg) DBUS_TYPE_INVALID); dbus_message_set_no_reply(msg, TRUE); - - if (1 != dbus_connection_send(g_conn, msg, NULL)) { + + if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) { SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to Send"); - return -1; + return VCD_ERROR_OPERATION_FAILED; } else { SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] SUCCESS Send"); - dbus_connection_flush(g_conn); - return 0; - } - - /* - DBusError err; - dbus_error_init(&err); - - DBusMessage* result_msg; - - result_msg = dbus_connection_send_with_reply_and_block(g_conn, msg, g_waiting_time, &err); - dbus_message_unref(msg); - - if (dbus_error_is_set(&err)) { - SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] %s", err.message); - dbus_error_free(&err); - } - - if (NULL != result_msg) { - dbus_message_unref(result_msg); - } else { - SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] Result message is NULL."); + dbus_connection_flush(g_conn_sender); } return 0; - */ } static Eina_Bool listener_event_callback(void* data, Ecore_Fd_Handler *fd_handler) { - DBusConnection* conn = (DBusConnection*)data; - DBusMessage* msg = NULL; - - if (NULL == conn) - return ECORE_CALLBACK_RENEW; + if (NULL == g_conn_listener) return ECORE_CALLBACK_RENEW; - dbus_connection_read_write_dispatch(conn, 50); + dbus_connection_read_write_dispatch(g_conn_listener, 50); - msg = dbus_connection_pop_message(conn); + DBusMessage* msg = NULL; + msg = dbus_connection_pop_message(g_conn_listener); /* loop again if we haven't read a message */ if (NULL == msg) { @@ -457,89 +324,89 @@ static Eina_Bool listener_event_callback(void* data, Ecore_Fd_Handler *fd_handle /* Common event */ if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_METHOD_HELLO)) - vcd_dbus_server_hello(conn, msg); + vcd_dbus_server_hello(g_conn_listener, msg); /* manager event */ else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_INITIALIZE)) - vcd_dbus_server_mgr_initialize(conn, msg); + vcd_dbus_server_mgr_initialize(g_conn_listener, msg); else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_FINALIZE)) - vcd_dbus_server_mgr_finalize(conn, msg); + vcd_dbus_server_mgr_finalize(g_conn_listener, msg); else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_SET_COMMAND)) - vcd_dbus_server_mgr_set_command(conn, msg); + vcd_dbus_server_mgr_set_command(g_conn_listener, msg); else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_UNSET_COMMAND)) - vcd_dbus_server_mgr_unset_command(conn, msg); + vcd_dbus_server_mgr_unset_command(g_conn_listener, msg); else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_SET_DEMANDABLE)) - vcd_dbus_server_mgr_set_demandable_client(conn, msg); + vcd_dbus_server_mgr_set_demandable_client(g_conn_listener, msg); else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_SET_AUDIO_TYPE)) - vcd_dbus_server_mgr_set_audio_type(conn, msg); + vcd_dbus_server_mgr_set_audio_type(g_conn_listener, msg); else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_GET_AUDIO_TYPE)) - vcd_dbus_server_mgr_get_audio_type(conn, msg); + vcd_dbus_server_mgr_get_audio_type(g_conn_listener, msg); else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_SET_CLIENT_INFO)) - vcd_dbus_server_mgr_set_client_info(conn, msg); + vcd_dbus_server_mgr_set_client_info(g_conn_listener, msg); - else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_START)) - vcd_dbus_server_mgr_start(conn, msg); + else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_START)) + vcd_dbus_server_mgr_start(g_conn_listener, msg); - else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_STOP)) - vcd_dbus_server_mgr_stop(conn, msg); + else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_STOP)) + vcd_dbus_server_mgr_stop(g_conn_listener, msg); - else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_CANCEL)) - vcd_dbus_server_mgr_cancel(conn, msg); + else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_CANCEL)) + vcd_dbus_server_mgr_cancel(g_conn_listener, msg); - else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_RESULT_SELECTION)) - vcd_dbus_server_mgr_result_selection(conn, msg); + else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_RESULT_SELECTION)) + vcd_dbus_server_mgr_result_selection(g_conn_listener, msg); /* client event */ else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_METHOD_INITIALIZE)) - vcd_dbus_server_initialize(conn, msg); + vcd_dbus_server_initialize(g_conn_listener, msg); else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_METHOD_FINALIZE)) - vcd_dbus_server_finalize(conn, msg); + vcd_dbus_server_finalize(g_conn_listener, msg); #if 0 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_METHOD_SET_EXCLUSIVE_CMD)) - vcd_dbus_server_set_exclusive_command(conn, msg); + vcd_dbus_server_set_exclusive_command(g_conn_listener, msg); #endif else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_METHOD_SET_COMMAND)) - vcd_dbus_server_set_command(conn, msg); + vcd_dbus_server_set_command(g_conn_listener, msg); else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_METHOD_UNSET_COMMAND)) - vcd_dbus_server_unset_command(conn, msg); + vcd_dbus_server_unset_command(g_conn_listener, msg); #if 0 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_METHOD_REQUEST_START)) - vcd_dbus_server_start_request(conn, msg); + vcd_dbus_server_start_request(g_conn_listener, msg); else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_METHOD_REQUEST_STOP)) - vcd_dbus_server_stop_request(conn, msg); + vcd_dbus_server_stop_request(g_conn_listener, msg); else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_METHOD_REQUEST_CANCEL)) - vcd_dbus_server_cancel_request(conn, msg); + vcd_dbus_server_cancel_request(g_conn_listener, msg); #endif /* widget event */ else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_WIDGET_METHOD_INITIALIZE)) - vcd_dbus_server_widget_initialize(conn, msg); + vcd_dbus_server_widget_initialize(g_conn_listener, msg); else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_WIDGET_METHOD_FINALIZE)) - vcd_dbus_server_widget_finalize(conn, msg); + vcd_dbus_server_widget_finalize(g_conn_listener, msg); else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_WIDGET_METHOD_START_RECORDING)) - vcd_dbus_server_widget_start_recording(conn, msg); + vcd_dbus_server_widget_start_recording(g_conn_listener, msg); else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_WIDGET_METHOD_START)) - vcd_dbus_server_widget_start(conn, msg); + vcd_dbus_server_widget_start(g_conn_listener, msg); else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_WIDGET_METHOD_STOP)) - vcd_dbus_server_widget_stop(conn, msg); + vcd_dbus_server_widget_stop(g_conn_listener, msg); else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_WIDGET_METHOD_CANCEL)) - vcd_dbus_server_widget_cancel(conn, msg); + vcd_dbus_server_widget_cancel(g_conn_listener, msg); else return ECORE_CALLBACK_RENEW; @@ -557,32 +424,45 @@ int vcd_dbus_open_connection() int ret; + /* Create connection for sender */ + g_conn_sender = dbus_bus_get(DBUS_BUS_SYSTEM, &err); + + if (dbus_error_is_set(&err)) { + SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail dbus_bus_get : %s", err.message); + dbus_error_free(&err); + } + + if (NULL == g_conn_sender) { + SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to get dbus connection"); + return VCD_ERROR_OPERATION_FAILED; + } + /* connect to the bus and check for errors */ - g_conn = dbus_bus_get(DBUS_BUS_SYSTEM, &err); + g_conn_listener = dbus_bus_get(DBUS_BUS_SYSTEM, &err); if (dbus_error_is_set(&err)) { SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail dbus_bus_get : %s", err.message); dbus_error_free(&err); } - if (NULL == g_conn) { - SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to get dbus connection" ); - return -1; + if (NULL == g_conn_listener) { + SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to get dbus connection"); + return VCD_ERROR_OPERATION_FAILED; } /* request our name on the bus and check for errors */ - ret = dbus_bus_request_name(g_conn, VC_SERVER_SERVICE_NAME, DBUS_NAME_FLAG_REPLACE_EXISTING , &err); + ret = dbus_bus_request_name(g_conn_listener, VC_SERVER_SERVICE_NAME, DBUS_NAME_FLAG_REPLACE_EXISTING, &err); if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) { printf("Fail to be primary owner in dbus request."); SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to be primary owner"); - return -1; + return VCD_ERROR_OPERATION_FAILED; } if (dbus_error_is_set(&err)) { SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] dbus_bus_request_name() : %s", err.message); dbus_error_free(&err); - return -1; + return VCD_ERROR_OPERATION_FAILED; } /* add a rule for getting signal */ @@ -590,29 +470,23 @@ int vcd_dbus_open_connection() snprintf(rule, 128, "type='signal',interface='%s'", VC_SERVER_SERVICE_INTERFACE); /* add a rule for which messages we want to see */ - dbus_bus_add_match(g_conn, rule, &err);/* see signals from the given interface */ - dbus_connection_flush(g_conn); + dbus_bus_add_match(g_conn_listener, rule, &err);/* see signals from the given interface */ + dbus_connection_flush(g_conn_listener); if (dbus_error_is_set(&err)) { SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] dbus_bus_add_match() : %s", err.message); dbus_error_free(&err); - return -1; + return VCD_ERROR_OPERATION_FAILED; } int fd = 0; - dbus_connection_get_unix_fd(g_conn, &fd); + dbus_connection_get_unix_fd(g_conn_listener, &fd); - if (!ecore_init()) { - SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] ecore_init()"); - return -1; - } + g_dbus_fd_handler = ecore_main_fd_handler_add(fd, ECORE_FD_READ, (Ecore_Fd_Cb)listener_event_callback, g_conn_listener, NULL, NULL); - Ecore_Fd_Handler* fd_handler; - fd_handler = ecore_main_fd_handler_add(fd, ECORE_FD_READ , (Ecore_Fd_Cb)listener_event_callback, g_conn, NULL, NULL); - - if (NULL == fd_handler) { + if (NULL == g_dbus_fd_handler) { SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to get fd handler"); - return -1; + return VCD_ERROR_OPERATION_FAILED; } return 0; @@ -623,13 +497,20 @@ int vcd_dbus_close_connection() DBusError err; dbus_error_init(&err); - dbus_bus_release_name (g_conn, VC_SERVER_SERVICE_NAME, &err); + if (NULL != g_dbus_fd_handler) { + ecore_main_fd_handler_del(g_dbus_fd_handler); + g_dbus_fd_handler = NULL; + } + + dbus_bus_release_name(g_conn_listener, VC_SERVER_SERVICE_NAME, &err); if (dbus_error_is_set(&err)) { SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] dbus_bus_release_name() : %s", err.message); dbus_error_free(&err); - return -1; } + g_conn_listener = NULL; + g_conn_sender = NULL; + return 0; } \ No newline at end of file diff --git a/server/vcd_dbus_server.c b/server/vcd_dbus_server.c index 60e17b1..77be315 100644 --- a/server/vcd_dbus_server.c +++ b/server/vcd_dbus_server.c @@ -666,7 +666,6 @@ int vcd_dbus_server_mgr_result_selection(DBusConnection* conn, DBusMessage* msg) dbus_error_init(&err); int pid; - //int ret = VCD_ERROR_OPERATION_FAILED; dbus_message_get_args(msg, &err, DBUS_TYPE_INT32, &pid, DBUS_TYPE_INVALID); SLOG(LOG_DEBUG, TAG_VCD, ">>>>> VCD Manager result selection"); @@ -674,10 +673,8 @@ int vcd_dbus_server_mgr_result_selection(DBusConnection* conn, DBusMessage* msg) if (dbus_error_is_set(&err)) { SLOG(LOG_ERROR, TAG_VCD, "[IN ERROR] vcd mgr result selection : get arguments error (%s)", err.message); dbus_error_free(&err); - // ret = VCD_ERROR_OPERATION_FAILED; } else { SLOG(LOG_DEBUG, TAG_VCD, "[IN] vcd mgr result selection : pid(%d)", pid); - //ret = vcd_server_mgr_result_select(); vcd_server_mgr_result_select(); } return 0; diff --git a/vc-server.conf b/vc-server.conf new file mode 100644 index 0000000..a408454 --- /dev/null +++ b/vc-server.conf @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- 2.7.4