2 * Copyright (c) 2011-2015 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include <dbus/dbus.h>
18 #include "vcd_client_data.h"
20 #include "vcd_dbus_server.h"
24 static DBusConnection* g_conn_sender = NULL;
25 static DBusConnection* g_conn_listener = NULL;
27 static Ecore_Fd_Handler* g_dbus_fd_handler = NULL;
29 static int g_waiting_time = 3000;
31 static int g_volume_count = 0;
34 static DBusMessage* __get_message(int pid, const char* method, vcd_client_type_e type)
36 char service_name[64] = {0,};
37 char object_path[64] = {0,};
38 char target_if_name[128] = {0,};
40 if (VCD_CLIENT_TYPE_NORMAL == type) {
41 snprintf(service_name, 64, "%s%d", VC_CLIENT_SERVICE_NAME, pid);
42 snprintf(object_path, 64, "%s", VC_CLIENT_SERVICE_OBJECT_PATH);
43 snprintf(target_if_name, 128, "%s", VC_CLIENT_SERVICE_INTERFACE);
44 } else if (VCD_CLIENT_TYPE_WIDGET == type) {
45 snprintf(service_name, 64, "%s%d", VC_WIDGET_SERVICE_NAME, pid);
46 snprintf(object_path, 64, "%s", VC_WIDGET_SERVICE_OBJECT_PATH);
47 snprintf(target_if_name, 128, "%s", VC_WIDGET_SERVICE_INTERFACE);
48 } else if (VCD_CLIENT_TYPE_MANAGER == type) {
49 snprintf(service_name, 64, "%s", VC_MANAGER_SERVICE_NAME);
50 snprintf(object_path, 64, "%s", VC_MANAGER_SERVICE_OBJECT_PATH);
51 snprintf(target_if_name, 128, "%s", VC_MANAGER_SERVICE_INTERFACE);
56 return dbus_message_new_method_call(service_name, object_path, target_if_name, method);
59 int vcd_dbus_reconnect()
61 bool sender_connected = dbus_connection_get_is_connected(g_conn_sender);
62 bool listener_connected = dbus_connection_get_is_connected(g_conn_listener);
63 SLOG(LOG_WARN, TAG_VCD, "[DBUS] Sender(%s) Listener(%s)",
64 sender_connected ? "Connected" : "Not connected", listener_connected ? "Connected" : "Not connected");
66 if (false == sender_connected || false == listener_connected) {
67 vcd_dbus_close_connection();
69 if (0 != vcd_dbus_open_connection()) {
70 SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Fail to reconnect");
74 SLOG(LOG_DEBUG, TAG_VCD, "[DBUS] Reconnect");
80 static int __dbus_check()
82 if (NULL == g_conn_sender || NULL == g_conn_listener) {
83 SLOG(LOG_ERROR, TAG_VCD, "[ERROR] NULL connection");
84 return vcd_dbus_reconnect();
89 int vcd_check_dbus_connection()
91 if (NULL == g_conn_sender || NULL == g_conn_listener) {
92 SLOG(LOG_ERROR, TAG_VCD, "[ERROR] NULL connection sender(%p), listener(%p)", g_conn_sender, g_conn_listener);
98 int vcdc_send_hello(int pid, vcd_client_type_e type)
100 if (0 != __dbus_check()) {
101 return VCD_ERROR_OPERATION_FAILED;
104 DBusMessage* msg = NULL;
106 if (VCD_CLIENT_TYPE_NORMAL == type) {
107 msg = __get_message(pid, VCD_METHOD_HELLO, VCD_CLIENT_TYPE_NORMAL);
108 } else if (VCD_CLIENT_TYPE_WIDGET == type) {
109 msg = __get_message(pid, VCD_WIDGET_METHOD_HELLO, VCD_CLIENT_TYPE_WIDGET);
110 } else if (VCD_CLIENT_TYPE_MANAGER == type) {
111 msg = __get_message(pid, VCD_MANAGER_METHOD_HELLO, VCD_CLIENT_TYPE_MANAGER);
113 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Client type is NOT valid");
118 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to create message");
119 return VCD_ERROR_OUT_OF_MEMORY;
122 dbus_message_append_args(msg, DBUS_TYPE_INT32, &pid, DBUS_TYPE_INVALID);
125 dbus_error_init(&err);
127 DBusMessage* result_msg;
130 result_msg = dbus_connection_send_with_reply_and_block(g_conn_sender, msg, g_waiting_time, &err);
131 dbus_message_unref(msg);
133 if (dbus_error_is_set(&err)) {
134 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] %s", err.message);
135 if (NULL != err.name) {
136 if (!strcmp(err.name, DBUS_ERROR_SERVICE_UNKNOWN)) {
137 SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Unknown service. Client is not available");
138 dbus_error_free(&err);
142 dbus_error_free(&err);
145 if (NULL != result_msg) {
146 dbus_message_get_args(result_msg, &err, DBUS_TYPE_INT32, &result, DBUS_TYPE_INVALID);
148 if (dbus_error_is_set(&err)) {
149 SLOG(LOG_ERROR, TAG_VCD, "[Dbus] Get arguments error (%s)", err.message);
150 dbus_error_free(&err);
151 result = VCD_ERROR_OPERATION_FAILED;
154 dbus_message_unref(result_msg);
156 SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] Result message is NULL. Client is not available");
162 int vcdc_send_show_tooltip(int pid, bool show)
164 if (0 != __dbus_check()) {
165 return VCD_ERROR_OPERATION_FAILED;
169 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] widget pid is NOT valid");
173 char service_name[64] = {0, };
174 memset(service_name, 0, 64);
175 snprintf(service_name, 64, "%s%d", VC_WIDGET_SERVICE_NAME, pid);
177 char target_if_name[128] = {0, };
178 snprintf(target_if_name, sizeof(target_if_name), "%s", VC_WIDGET_SERVICE_INTERFACE);
182 SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] send widget show tooltip signal : pid(%d) show(%d)", pid, show);
184 msg = dbus_message_new_method_call(
186 VC_WIDGET_SERVICE_OBJECT_PATH,
188 VCD_WIDGET_METHOD_SHOW_TOOLTIP);
191 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to create message");
192 return VCD_ERROR_OUT_OF_MEMORY;
195 int temp = (int)show;
197 DBusMessageIter args;
198 dbus_message_iter_init_append(msg, &args);
200 /* Append pid & type */
201 dbus_message_iter_append_basic(&args, DBUS_TYPE_INT32, &pid);
202 dbus_message_iter_append_basic(&args, DBUS_TYPE_INT32, &(temp));
204 dbus_message_set_no_reply(msg, TRUE);
206 if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) {
207 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to Send");
208 return VCD_ERROR_OPERATION_FAILED;
210 SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] SUCCESS Send");
211 dbus_connection_flush(g_conn_sender);
214 dbus_message_unref(msg);
219 int vcdc_send_set_volume(int manger_pid, float volume)
221 if (0 != __dbus_check()) {
222 return VCD_ERROR_OPERATION_FAILED;
225 DBusMessage* msg = NULL;
227 /* SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] Set volume (%f)", volume); */
229 msg = dbus_message_new_signal(
230 VC_MANAGER_SERVICE_OBJECT_PATH,
231 VC_MANAGER_SERVICE_INTERFACE,
232 VCD_MANAGER_METHOD_SET_VOLUME);
235 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Message is NULL");
236 return VCD_ERROR_OUT_OF_MEMORY;
239 dbus_message_append_args(msg, DBUS_TYPE_INT32, &volume, DBUS_TYPE_INVALID);
241 if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) {
242 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to Send");
243 dbus_message_unref(msg);
246 if (10 == g_volume_count) {
247 SLOG(LOG_DEBUG, TAG_VCD, "<<<< Send set volume : pid(%d), volume(%f)", manger_pid, volume);
251 dbus_connection_flush(g_conn_sender);
256 dbus_message_unref(msg);
261 int vcdc_send_result(int pid, int manager_pid, int cmd_type)
263 if (0 != __dbus_check()) {
264 return VCD_ERROR_OPERATION_FAILED;
267 DBusMessage* msg = NULL;
269 SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] Result command type(%d)", cmd_type);
272 case VC_COMMAND_TYPE_FOREGROUND:
273 case VC_COMMAND_TYPE_BACKGROUND:
274 if (pid == manager_pid) {
275 msg = __get_message(pid, VCD_MANAGER_METHOD_RESULT, VCD_CLIENT_TYPE_MANAGER);
277 msg = __get_message(pid, VCD_METHOD_RESULT, VCD_CLIENT_TYPE_NORMAL);
280 case VC_COMMAND_TYPE_WIDGET:
281 msg = __get_message(pid, VCD_WIDGET_METHOD_RESULT, VCD_CLIENT_TYPE_WIDGET);
283 case VC_COMMAND_TYPE_SYSTEM:
284 case VC_COMMAND_TYPE_SYSTEM_BACKGROUND:
285 case VC_COMMAND_TYPE_EXCLUSIVE:
286 msg = __get_message(pid, VCD_MANAGER_METHOD_RESULT, VCD_CLIENT_TYPE_MANAGER);
290 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Command type is NOT valid(%d)", cmd_type);
295 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Message is NULL");
296 return VCD_ERROR_OUT_OF_MEMORY;
299 dbus_message_set_no_reply(msg, TRUE);
301 if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) {
302 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to Send");
303 return VCD_ERROR_OPERATION_FAILED;
305 SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] SUCCESS Send");
306 dbus_connection_flush(g_conn_sender);
309 dbus_message_unref(msg);
314 int vcdc_send_asr_result(int pid, int cmd_type, bool* is_consumed)
316 if (0 != __dbus_check()) {
317 return VCD_ERROR_OPERATION_FAILED;
320 DBusMessage* msg = NULL;
322 SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] Result command type(%d)", cmd_type);
325 case VC_COMMAND_TYPE_WIDGET:
326 msg = __get_message(pid, VCD_WIDGET_METHOD_ASR_RESULT, VCD_CLIENT_TYPE_WIDGET);
329 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Command type is NOT valid(%d)", cmd_type);
330 return VCD_ERROR_INVALID_PARAMETER;
334 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Message is NULL");
335 return VCD_ERROR_OUT_OF_MEMORY;
339 dbus_error_init(&err);
341 DBusMessage* result_msg;
344 result_msg = dbus_connection_send_with_reply_and_block(g_conn_sender, msg, 5000, &err);
345 dbus_message_unref(msg);
347 if (dbus_error_is_set(&err)) {
348 SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Dbus Error (%s)", err.message);
349 dbus_error_free(&err);
352 if (NULL != result_msg) {
353 dbus_message_get_args(result_msg, &err,
354 DBUS_TYPE_INT32, &result,
357 if (dbus_error_is_set(&err)) {
358 SLOG(LOG_ERROR, TAG_VCD, "<<<< Get arguments error (%s)", err.message);
359 dbus_error_free(&err);
360 result = VCD_ERROR_OPERATION_FAILED;
363 dbus_message_unref(result_msg);
364 SLOG(LOG_DEBUG, TAG_VCD, "<<<< vc send asr result : result = %d", result);
365 *is_consumed = result;
366 return VCD_ERROR_NONE;
368 SLOG(LOG_ERROR, TAG_VCD, "<<<< Result message is NULL ");
369 return VCD_ERROR_OPERATION_FAILED;
373 int vcdc_send_pre_result_to_manager(int manager_pid, int event, const char* pre_result)
375 if (0 != __dbus_check()) {
376 return VCD_ERROR_OPERATION_FAILED;
380 dbus_error_init(&err);
382 DBusMessage* msg = NULL;
384 msg = __get_message(manager_pid, VCD_MANAGER_METHOD_PRE_RESULT, VCD_CLIENT_TYPE_MANAGER);
387 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Message is NULL");
388 return VCD_ERROR_OUT_OF_MEMORY;
391 dbus_message_append_args(msg, DBUS_TYPE_INT32, &event, DBUS_TYPE_STRING, &pre_result, DBUS_TYPE_INVALID);
393 dbus_message_set_no_reply(msg, TRUE);
395 if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) {
396 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to Send");
397 return VCD_ERROR_OPERATION_FAILED;
399 SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] SUCCESS Send");
400 dbus_connection_flush(g_conn_sender);
406 int vcdc_send_result_to_manager(int manger_pid, int result_type)
408 if (0 != __dbus_check()) {
409 return VCD_ERROR_OPERATION_FAILED;
413 dbus_error_init(&err);
415 DBusMessage* msg = NULL;
417 msg = __get_message(manger_pid, VCD_MANAGER_METHOD_ALL_RESULT, VCD_CLIENT_TYPE_MANAGER);
420 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Message is NULL");
421 return VCD_ERROR_OUT_OF_MEMORY;
424 SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] send result : result type(%d)", result_type);
426 dbus_message_append_args(msg, DBUS_TYPE_INT32, &result_type, DBUS_TYPE_INVALID);
428 dbus_message_set_no_reply(msg, TRUE);
430 if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) {
431 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to Send");
432 return VCD_ERROR_OPERATION_FAILED;
434 SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] SUCCESS Send");
435 dbus_connection_flush(g_conn_sender);
438 dbus_message_unref(msg);
443 int vcdc_send_speech_detected(int manger_pid)
445 if (0 != __dbus_check()) {
446 return VCD_ERROR_OPERATION_FAILED;
450 dbus_error_init(&err);
452 /* Send to manager */
453 DBusMessage* msg = NULL;
455 msg = __get_message(manger_pid, VCD_MANAGER_METHOD_SPEECH_DETECTED, VCD_CLIENT_TYPE_MANAGER);
458 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Message is NULL");
459 return VCD_ERROR_OUT_OF_MEMORY;
462 dbus_message_set_no_reply(msg, TRUE);
464 if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) {
465 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to Send");
466 return VCD_ERROR_OPERATION_FAILED;
468 SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] SUCCESS Send");
469 dbus_connection_flush(g_conn_sender);
472 dbus_message_unref(msg);
477 int vcdc_send_service_state(vcd_state_e state)
479 if (0 != __dbus_check()) {
480 return VCD_ERROR_OPERATION_FAILED;
484 dbus_error_init(&err);
486 DBusMessage* msg = NULL;
488 msg = dbus_message_new_signal(
489 VC_MANAGER_SERVICE_OBJECT_PATH,
490 VC_MANAGER_SERVICE_INTERFACE,
491 VCD_MANAGER_METHOD_SET_SERVICE_STATE);
494 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Message is NULL");
495 return VCD_ERROR_OUT_OF_MEMORY;
498 dbus_message_append_args(msg, DBUS_TYPE_INT32, &state, DBUS_TYPE_INVALID);
500 if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) {
501 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to Send");
502 return VCD_ERROR_OPERATION_FAILED;
504 SLOG(LOG_DEBUG, TAG_VCD, "<<<< Send serive state message to manager : state(%d)", state);
505 dbus_connection_flush(g_conn_sender);
508 dbus_message_unref(msg);
513 msg = dbus_message_new_signal(
514 VC_CLIENT_SERVICE_OBJECT_PATH,
515 VC_CLIENT_SERVICE_INTERFACE,
516 VCD_METHOD_SET_SERVICE_STATE);
519 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Message is NULL");
520 return VCD_ERROR_OUT_OF_MEMORY;
523 dbus_message_append_args(msg, DBUS_TYPE_INT32, &state, DBUS_TYPE_INVALID);
525 if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) {
526 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to Send");
527 return VCD_ERROR_OPERATION_FAILED;
529 SLOG(LOG_DEBUG, TAG_VCD, "<<<< Send serive state message to client : state(%d)", state);
530 dbus_connection_flush(g_conn_sender);
533 dbus_message_unref(msg);
537 /* Send to widget client */
538 msg = dbus_message_new_signal(
539 VC_WIDGET_SERVICE_OBJECT_PATH,
540 VC_WIDGET_SERVICE_INTERFACE,
541 VCD_WIDGET_METHOD_SET_SERVICE_STATE);
544 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Message is NULL");
545 return VCD_ERROR_OUT_OF_MEMORY;
548 dbus_message_append_args(msg, DBUS_TYPE_INT32, &state, DBUS_TYPE_INVALID);
550 if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) {
551 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to Send");
552 return VCD_ERROR_OPERATION_FAILED;
554 SLOG(LOG_DEBUG, TAG_VCD, "<<<< Send serive state message to widget client : state(%d)", state);
555 dbus_connection_flush(g_conn_sender);
558 dbus_message_unref(msg);
563 int vcdc_send_manager_pid(int manager_pid)
566 dbus_error_init(&err);
568 DBusMessage* msg = NULL;
571 msg = dbus_message_new_signal(
572 VC_CLIENT_SERVICE_OBJECT_PATH,
573 VC_CLIENT_SERVICE_INTERFACE,
574 VCD_METHOD_SEND_MANAGER_PID);
577 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Message is NULL");
578 return VCD_ERROR_OUT_OF_MEMORY;
581 dbus_message_append_args(msg, DBUS_TYPE_INT32, &manager_pid, DBUS_TYPE_INVALID);
583 if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) {
584 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to Send");
585 return VCD_ERROR_OPERATION_FAILED;
587 SLOG(LOG_DEBUG, TAG_VCD, "<<<< Send manager pid to client : pid(%d)", manager_pid);
588 dbus_connection_flush(g_conn_sender);
591 dbus_message_unref(msg);
596 int vcdc_send_dialog(int manger_pid, int pid, const char* disp_text, const char* utt_text, int continuous)
598 if (0 != __dbus_check()) {
599 return VCD_ERROR_OPERATION_FAILED;
603 dbus_error_init(&err);
605 DBusMessage* msg = NULL;
607 msg = __get_message(manger_pid, VCD_MANAGER_METHOD_DIALOG, VCD_CLIENT_TYPE_MANAGER);
610 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Message is NULL");
611 return VCD_ERROR_OUT_OF_MEMORY;
614 SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] send dialog : pid(%d), disp_text(%s), utt_text(%s), continue(%d)", pid, disp_text, utt_text, continuous);
616 dbus_message_append_args(msg,
617 DBUS_TYPE_INT32, &pid,
618 DBUS_TYPE_STRING, &disp_text,
619 DBUS_TYPE_STRING, &utt_text,
620 DBUS_TYPE_INT32, &continuous,
623 dbus_message_set_no_reply(msg, TRUE);
625 if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) {
626 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to Send");
627 return VCD_ERROR_OPERATION_FAILED;
629 SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] SUCCESS Send");
630 dbus_connection_flush(g_conn_sender);
633 dbus_message_unref(msg);
638 int vcdc_send_error_signal_to_manager(int manager_pid, int reason, char *err_msg)
640 SLOG(LOG_ERROR, TAG_VCD, ">>>> Send error signal to manager");
642 if (NULL == err_msg) {
643 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Input parameter is NULL");
644 return VCD_ERROR_INVALID_PARAMETER;
647 if (0 != __dbus_check()) {
648 return VCD_ERROR_OPERATION_FAILED;
653 dbus_error_init(&err);
655 DBusMessage* msg = NULL;
657 msg = dbus_message_new_signal(
658 VC_MANAGER_SERVICE_OBJECT_PATH,
659 VC_MANAGER_SERVICE_INTERFACE,
660 VCD_MANAGER_METHOD_ERROR);
663 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Message is NULL");
664 return VCD_ERROR_OUT_OF_MEMORY;
667 daemon_pid = getpid();
668 dbus_message_append_args(msg, DBUS_TYPE_INT32, &reason, DBUS_TYPE_INT32, &daemon_pid, DBUS_TYPE_STRING, &err_msg, DBUS_TYPE_INVALID);
670 if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) {
671 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to Send");
672 return VCD_ERROR_OPERATION_FAILED;
674 SLOG(LOG_DEBUG, TAG_VCD, "<<<< Send error signal to manager : reason(%d), Error Msg(%s)", reason, err_msg);
675 dbus_connection_flush(g_conn_sender);
678 dbus_message_unref(msg);
683 int vcdc_send_error_signal(int reason, char *err_msg)
685 SLOG(LOG_ERROR, TAG_VCD, ">>>> Send error signal");
687 if (NULL == err_msg) {
688 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Input parameter is NULL");
689 return VCD_ERROR_INVALID_PARAMETER;
692 if (0 != __dbus_check()) {
693 return VCD_ERROR_OPERATION_FAILED;
698 dbus_error_init(&err);
700 DBusMessage* msg = NULL;
702 msg = dbus_message_new_signal(
703 VC_MANAGER_SERVICE_OBJECT_PATH,
704 VC_MANAGER_SERVICE_INTERFACE,
705 VCD_MANAGER_METHOD_ERROR);
708 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Message is NULL");
709 return VCD_ERROR_OUT_OF_MEMORY;
712 daemon_pid = getpid();
713 dbus_message_append_args(msg, DBUS_TYPE_INT32, &reason, DBUS_TYPE_INT32, &daemon_pid, DBUS_TYPE_STRING, &err_msg, DBUS_TYPE_INVALID);
715 if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) {
716 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to Send");
717 return VCD_ERROR_OPERATION_FAILED;
719 SLOG(LOG_DEBUG, TAG_VCD, "<<<< Send error signal to manager: reason(%d), daemon_pid(%d), Error Msg(%s)", reason, daemon_pid, err_msg);
720 dbus_connection_flush(g_conn_sender);
723 dbus_message_unref(msg);
726 msg = dbus_message_new_signal(
727 VC_CLIENT_SERVICE_OBJECT_PATH,
728 VC_CLIENT_SERVICE_INTERFACE,
732 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Message is NULL");
733 return VCD_ERROR_OUT_OF_MEMORY;
736 dbus_message_append_args(msg, DBUS_TYPE_INT32, &reason, DBUS_TYPE_INT32, &daemon_pid, DBUS_TYPE_STRING, &err_msg, DBUS_TYPE_INVALID);
738 if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) {
739 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to Send");
740 return VCD_ERROR_OPERATION_FAILED;
742 SLOG(LOG_DEBUG, TAG_VCD, "<<<< Send error signal : reason(%d), daemon_pid(%d), Error Msg(%s)", reason, daemon_pid, err_msg);
743 dbus_connection_flush(g_conn_sender);
746 dbus_message_unref(msg);
749 msg = dbus_message_new_signal(
750 VC_WIDGET_SERVICE_OBJECT_PATH,
751 VC_WIDGET_SERVICE_INTERFACE,
752 VCD_WIDGET_METHOD_ERROR);
755 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Message is NULL");
756 return VCD_ERROR_OUT_OF_MEMORY;
759 dbus_message_append_args(msg, DBUS_TYPE_INT32, &reason, DBUS_TYPE_INT32, &daemon_pid, DBUS_TYPE_STRING, &err_msg, DBUS_TYPE_INVALID);
761 if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) {
762 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to Send");
763 return VCD_ERROR_OPERATION_FAILED;
765 SLOG(LOG_DEBUG, TAG_VCD, "<<<< Send error signal to widget : reason(%d), daemon_pid(%d), Error Msg(%s)", reason, daemon_pid, err_msg);
766 dbus_connection_flush(g_conn_sender);
769 dbus_message_unref(msg);
774 static Eina_Bool listener_event_callback(void* data, Ecore_Fd_Handler *fd_handler)
776 if (NULL == g_conn_listener) return ECORE_CALLBACK_RENEW;
778 dbus_connection_read_write_dispatch(g_conn_listener, 50);
781 DBusMessage* msg = NULL;
782 msg = dbus_connection_pop_message(g_conn_listener);
784 /* loop again if we haven't read a message */
790 if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_METHOD_HELLO))
791 vcd_dbus_server_hello(g_conn_listener, msg);
794 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_INITIALIZE))
795 vcd_dbus_server_mgr_initialize(g_conn_listener, msg);
797 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_FINALIZE))
798 vcd_dbus_server_mgr_finalize(g_conn_listener, msg);
800 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_SET_COMMAND))
801 vcd_dbus_server_mgr_set_command(g_conn_listener, msg);
803 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_UNSET_COMMAND))
804 vcd_dbus_server_mgr_unset_command(g_conn_listener, msg);
806 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_SET_DEMANDABLE))
807 vcd_dbus_server_mgr_set_demandable_client(g_conn_listener, msg);
809 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_SET_AUDIO_TYPE))
810 vcd_dbus_server_mgr_set_audio_type(g_conn_listener, msg);
812 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_GET_AUDIO_TYPE))
813 vcd_dbus_server_mgr_get_audio_type(g_conn_listener, msg);
815 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_SET_CLIENT_INFO))
816 vcd_dbus_server_mgr_set_client_info(g_conn_listener, msg);
818 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_SET_PRIVATE_DATA))
819 vcd_dbus_server_mgr_set_private_data(g_conn_listener, msg);
821 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_GET_PRIVATE_DATA))
822 vcd_dbus_server_mgr_get_private_data(g_conn_listener, msg);
824 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_START))
825 vcd_dbus_server_mgr_start(g_conn_listener, msg);
827 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_STOP))
828 vcd_dbus_server_mgr_stop(g_conn_listener, msg);
830 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_CANCEL))
831 vcd_dbus_server_mgr_cancel(g_conn_listener, msg);
833 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_RESULT_SELECTION))
834 vcd_dbus_server_mgr_result_selection(g_conn_listener, msg);
836 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_SET_DOMAIN))
837 vcd_dbus_server_mgr_set_domain(g_conn_listener, msg);
839 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_DO_ACTION))
840 vcd_dbus_server_mgr_do_action(g_conn_listener, msg);
842 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_ENABLE_COMMAND_TYPE))
843 vcd_dbus_server_mgr_enable_command_type(g_conn_listener, msg);
845 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_DISABLE_COMMAND_TYPE))
846 vcd_dbus_server_mgr_disable_command_type(g_conn_listener, msg);
849 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_METHOD_INITIALIZE))
850 vcd_dbus_server_initialize(g_conn_listener, msg);
852 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_METHOD_FINALIZE))
853 vcd_dbus_server_finalize(g_conn_listener, msg);
855 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_METHOD_SET_EXCLUSIVE_CMD))
856 vcd_dbus_server_set_exclusive_command(g_conn_listener, msg);
858 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_METHOD_SET_COMMAND))
859 vcd_dbus_server_set_command(g_conn_listener, msg);
861 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_METHOD_UNSET_COMMAND))
862 vcd_dbus_server_unset_command(g_conn_listener, msg);
864 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_METHOD_SET_FOREGROUND))
865 vcd_dbus_server_set_foreground(g_conn_listener, msg);
867 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_METHOD_DIALOG))
868 vcd_dbus_server_dialog(g_conn_listener, msg);
870 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_METHOD_IS_SYS_COMMAND_VALID))
871 vcd_dbus_server_is_system_command_valid(g_conn_listener, msg);
874 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_METHOD_REQUEST_START))
875 vcd_dbus_server_start_request(g_conn_listener, msg);
877 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_METHOD_REQUEST_STOP))
878 vcd_dbus_server_stop_request(g_conn_listener, msg);
880 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_METHOD_REQUEST_CANCEL))
881 vcd_dbus_server_cancel_request(g_conn_listener, msg);
884 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_WIDGET_METHOD_INITIALIZE))
885 vcd_dbus_server_widget_initialize(g_conn_listener, msg);
887 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_WIDGET_METHOD_FINALIZE))
888 vcd_dbus_server_widget_finalize(g_conn_listener, msg);
890 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_WIDGET_METHOD_START_RECORDING))
891 vcd_dbus_server_widget_start_recording(g_conn_listener, msg);
893 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_WIDGET_METHOD_START))
894 vcd_dbus_server_widget_start(g_conn_listener, msg);
896 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_WIDGET_METHOD_STOP))
897 vcd_dbus_server_widget_stop(g_conn_listener, msg);
899 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_WIDGET_METHOD_CANCEL))
900 vcd_dbus_server_widget_cancel(g_conn_listener, msg);
902 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_WIDGET_METHOD_ENABLE_ASR_RESULT))
903 vcd_dbus_server_widget_enable_asr_result(g_conn_listener, msg);
906 SLOG(LOG_DEBUG, TAG_VCD, "Message is NOT valid");
907 dbus_message_unref(msg);
911 /* free the message */
912 dbus_message_unref(msg);
915 return ECORE_CALLBACK_RENEW;
918 int vcd_dbus_open_connection()
921 dbus_error_init(&err);
925 /* Create connection for sender */
926 g_conn_sender = dbus_bus_get_private(DBUS_BUS_SESSION, &err);
928 if (dbus_error_is_set(&err)) {
929 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail dbus_bus_get : %s", err.message);
930 dbus_error_free(&err);
933 if (NULL == g_conn_sender) {
934 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to get dbus connection");
935 return VCD_ERROR_OPERATION_FAILED;
938 /* connect to the bus and check for errors */
939 g_conn_listener = dbus_bus_get_private(DBUS_BUS_SESSION, &err);
941 if (dbus_error_is_set(&err)) {
942 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail dbus_bus_get : %s", err.message);
943 dbus_error_free(&err);
946 if (NULL == g_conn_listener) {
947 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to get dbus connection");
948 return VCD_ERROR_OPERATION_FAILED;
951 /* request our name on the bus and check for errors */
952 ret = dbus_bus_request_name(g_conn_listener, VC_SERVER_SERVICE_NAME, DBUS_NAME_FLAG_REPLACE_EXISTING, &err);
954 if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) {
955 printf("Fail to be primary owner in dbus request.");
956 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to be primary owner");
957 return VCD_ERROR_OPERATION_FAILED;
960 if (dbus_error_is_set(&err)) {
961 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] dbus_bus_request_name() : %s", err.message);
962 dbus_error_free(&err);
963 return VCD_ERROR_OPERATION_FAILED;
966 /* add a rule for getting signal */
968 snprintf(rule, 128, "type='signal',interface='%s'", VC_SERVER_SERVICE_INTERFACE);
970 /* add a rule for which messages we want to see */
971 dbus_bus_add_match(g_conn_listener, rule, &err);/* see signals from the given interface */
972 dbus_connection_flush(g_conn_listener);
974 if (dbus_error_is_set(&err)) {
975 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] dbus_bus_add_match() : %s", err.message);
976 dbus_error_free(&err);
977 return VCD_ERROR_OPERATION_FAILED;
981 dbus_connection_get_unix_fd(g_conn_listener, &fd);
983 g_dbus_fd_handler = ecore_main_fd_handler_add(fd, ECORE_FD_READ, (Ecore_Fd_Cb)listener_event_callback, g_conn_listener, NULL, NULL);
985 if (NULL == g_dbus_fd_handler) {
986 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to get fd handler");
987 return VCD_ERROR_OPERATION_FAILED;
993 int vcd_dbus_close_connection()
996 dbus_error_init(&err);
998 if (NULL != g_dbus_fd_handler) {
999 ecore_main_fd_handler_del(g_dbus_fd_handler);
1000 g_dbus_fd_handler = NULL;
1003 dbus_bus_release_name(g_conn_listener, VC_SERVER_SERVICE_NAME, &err);
1005 if (dbus_error_is_set(&err)) {
1006 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] dbus_bus_release_name() : %s", err.message);
1007 dbus_error_free(&err);
1010 dbus_connection_close(g_conn_listener);
1011 dbus_connection_close(g_conn_sender);
1013 dbus_connection_unref(g_conn_listener);
1014 dbus_connection_unref(g_conn_sender);
1016 g_conn_listener = NULL;
1017 g_conn_sender = NULL;