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) {
83 SLOG(LOG_ERROR, TAG_VCD, "[ERROR] NULL connection");
84 return vcd_dbus_reconnect();
89 int vcdc_send_hello(int pid, vcd_client_type_e type)
91 if (0 != __dbus_check()) {
92 return VCD_ERROR_OPERATION_FAILED;
95 DBusMessage* msg = NULL;
97 if (VCD_CLIENT_TYPE_NORMAL == type) {
98 msg = __get_message(pid, VCD_METHOD_HELLO, VCD_CLIENT_TYPE_NORMAL);
99 } else if (VCD_CLIENT_TYPE_WIDGET == type) {
100 msg = __get_message(pid, VCD_WIDGET_METHOD_HELLO, VCD_CLIENT_TYPE_WIDGET);
101 } else if (VCD_CLIENT_TYPE_MANAGER == type) {
102 msg = __get_message(pid, VCD_MANAGER_METHOD_HELLO, VCD_CLIENT_TYPE_MANAGER);
104 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Client type is NOT valid");
109 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to create message");
110 return VCD_ERROR_OUT_OF_MEMORY;
113 dbus_message_append_args(msg, DBUS_TYPE_INT32, &pid, DBUS_TYPE_INVALID);
116 dbus_error_init(&err);
118 DBusMessage* result_msg;
121 result_msg = dbus_connection_send_with_reply_and_block(g_conn_sender, msg, g_waiting_time, &err);
122 dbus_message_unref(msg);
124 if (dbus_error_is_set(&err)) {
125 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] %s", err.message);
126 if (NULL != err.name) {
127 if (!strcmp(err.name, DBUS_ERROR_SERVICE_UNKNOWN)) {
128 SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Unknown service. Client is not available");
129 dbus_error_free(&err);
133 dbus_error_free(&err);
136 if (NULL != result_msg) {
137 dbus_message_get_args(result_msg, &err, DBUS_TYPE_INT32, &result, DBUS_TYPE_INVALID);
139 if (dbus_error_is_set(&err)) {
140 SLOG(LOG_ERROR, TAG_VCD, "[Dbus] Get arguments error (%s)", err.message);
141 dbus_error_free(&err);
142 result = VCD_ERROR_OPERATION_FAILED;
145 dbus_message_unref(result_msg);
147 SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] Result message is NULL. Client is not available");
153 int vcdc_send_show_tooltip(int pid, bool show)
155 if (0 != __dbus_check()) {
156 return VCD_ERROR_OPERATION_FAILED;
160 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] widget pid is NOT valid");
164 char service_name[64] = {0, };
165 memset(service_name, 0, 64);
166 snprintf(service_name, 64, "%s%d", VC_WIDGET_SERVICE_NAME, pid);
168 char target_if_name[128] = {0, };
169 snprintf(target_if_name, sizeof(target_if_name), "%s", VC_WIDGET_SERVICE_INTERFACE);
173 SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] send widget show tooltip signal : pid(%d) show(%d)", pid, show);
175 msg = dbus_message_new_method_call(
177 VC_WIDGET_SERVICE_OBJECT_PATH,
179 VCD_WIDGET_METHOD_SHOW_TOOLTIP);
182 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to create message");
183 return VCD_ERROR_OUT_OF_MEMORY;
186 int temp = (int)show;
188 DBusMessageIter args;
189 dbus_message_iter_init_append(msg, &args);
191 /* Append pid & type */
192 dbus_message_iter_append_basic(&args, DBUS_TYPE_INT32, &pid);
193 dbus_message_iter_append_basic(&args, DBUS_TYPE_INT32, &(temp));
195 dbus_message_set_no_reply(msg, TRUE);
197 if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) {
198 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to Send");
199 return VCD_ERROR_OPERATION_FAILED;
201 SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] SUCCESS Send");
202 dbus_connection_flush(g_conn_sender);
205 dbus_message_unref(msg);
210 int vcdc_send_set_volume(int manger_pid, float volume)
212 if (0 != __dbus_check()) {
213 return VCD_ERROR_OPERATION_FAILED;
216 DBusMessage* msg = NULL;
218 /* SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] Set volume (%f)", volume); */
220 msg = dbus_message_new_signal(
221 VC_MANAGER_SERVICE_OBJECT_PATH,
222 VC_MANAGER_SERVICE_INTERFACE,
223 VCD_MANAGER_METHOD_SET_VOLUME);
226 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Message is NULL");
227 return VCD_ERROR_OUT_OF_MEMORY;
230 dbus_message_append_args(msg, DBUS_TYPE_INT32, &volume, DBUS_TYPE_INVALID);
232 if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) {
233 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to Send");
234 dbus_message_unref(msg);
237 if (10 == g_volume_count) {
238 SLOG(LOG_DEBUG, TAG_VCD, "<<<< Send set volume : pid(%d), volume(%f)", manger_pid, volume);
242 dbus_connection_flush(g_conn_sender);
247 dbus_message_unref(msg);
252 int vcdc_send_result(int pid, int manager_pid, int cmd_type)
254 if (0 != __dbus_check()) {
255 return VCD_ERROR_OPERATION_FAILED;
258 DBusMessage* msg = NULL;
260 SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] Result command type(%d)", cmd_type);
263 case VC_COMMAND_TYPE_FOREGROUND:
264 case VC_COMMAND_TYPE_BACKGROUND:
265 if (pid == manager_pid) {
266 msg = __get_message(pid, VCD_MANAGER_METHOD_RESULT, VCD_CLIENT_TYPE_MANAGER);
268 msg = __get_message(pid, VCD_METHOD_RESULT, VCD_CLIENT_TYPE_NORMAL);
271 case VC_COMMAND_TYPE_WIDGET:
272 msg = __get_message(pid, VCD_WIDGET_METHOD_RESULT, VCD_CLIENT_TYPE_WIDGET);
274 case VC_COMMAND_TYPE_SYSTEM:
275 case VC_COMMAND_TYPE_SYSTEM_BACKGROUND:
276 case VC_COMMAND_TYPE_EXCLUSIVE:
277 msg = __get_message(pid, VCD_MANAGER_METHOD_RESULT, VCD_CLIENT_TYPE_MANAGER);
281 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Command type is NOT valid(%d)", cmd_type);
286 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Message is NULL");
287 return VCD_ERROR_OUT_OF_MEMORY;
290 dbus_message_set_no_reply(msg, TRUE);
292 if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) {
293 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to Send");
294 return VCD_ERROR_OPERATION_FAILED;
296 SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] SUCCESS Send");
297 dbus_connection_flush(g_conn_sender);
300 dbus_message_unref(msg);
305 int vcdc_send_pre_result_to_manager(int manager_pid, int event, const char* pre_result)
307 if (0 != __dbus_check()) {
308 return VCD_ERROR_OPERATION_FAILED;
312 dbus_error_init(&err);
314 DBusMessage* msg = NULL;
316 msg = __get_message(manager_pid, VCD_MANAGER_METHOD_PRE_RESULT, VCD_CLIENT_TYPE_MANAGER);
319 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Message is NULL");
320 return VCD_ERROR_OUT_OF_MEMORY;
323 dbus_message_append_args(msg, DBUS_TYPE_INT32, &event, DBUS_TYPE_STRING, &pre_result, DBUS_TYPE_INVALID);
325 dbus_message_set_no_reply(msg, TRUE);
327 if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) {
328 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to Send");
329 return VCD_ERROR_OPERATION_FAILED;
331 SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] SUCCESS Send");
332 dbus_connection_flush(g_conn_sender);
338 int vcdc_send_result_to_manager(int manger_pid, int result_type)
340 if (0 != __dbus_check()) {
341 return VCD_ERROR_OPERATION_FAILED;
345 dbus_error_init(&err);
347 DBusMessage* msg = NULL;
349 msg = __get_message(manger_pid, VCD_MANAGER_METHOD_ALL_RESULT, VCD_CLIENT_TYPE_MANAGER);
352 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Message is NULL");
353 return VCD_ERROR_OUT_OF_MEMORY;
356 SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] send result : result type(%d)", result_type);
358 dbus_message_append_args(msg, DBUS_TYPE_INT32, &result_type, DBUS_TYPE_INVALID);
360 dbus_message_set_no_reply(msg, TRUE);
362 if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) {
363 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to Send");
364 return VCD_ERROR_OPERATION_FAILED;
366 SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] SUCCESS Send");
367 dbus_connection_flush(g_conn_sender);
370 dbus_message_unref(msg);
375 int vcdc_send_speech_detected(int manger_pid)
377 if (0 != __dbus_check()) {
378 return VCD_ERROR_OPERATION_FAILED;
382 dbus_error_init(&err);
384 /* Send to manager */
385 DBusMessage* msg = NULL;
387 msg = __get_message(manger_pid, VCD_MANAGER_METHOD_SPEECH_DETECTED, VCD_CLIENT_TYPE_MANAGER);
390 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Message is NULL");
391 return VCD_ERROR_OUT_OF_MEMORY;
394 dbus_message_set_no_reply(msg, TRUE);
396 if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) {
397 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to Send");
398 return VCD_ERROR_OPERATION_FAILED;
400 SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] SUCCESS Send");
401 dbus_connection_flush(g_conn_sender);
404 dbus_message_unref(msg);
409 int vcdc_send_service_state(vcd_state_e state)
411 if (0 != __dbus_check()) {
412 return VCD_ERROR_OPERATION_FAILED;
416 dbus_error_init(&err);
418 DBusMessage* msg = NULL;
420 msg = dbus_message_new_signal(
421 VC_MANAGER_SERVICE_OBJECT_PATH,
422 VC_MANAGER_SERVICE_INTERFACE,
423 VCD_MANAGER_METHOD_SET_SERVICE_STATE);
426 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Message is NULL");
427 return VCD_ERROR_OUT_OF_MEMORY;
430 dbus_message_append_args(msg, DBUS_TYPE_INT32, &state, DBUS_TYPE_INVALID);
432 if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) {
433 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to Send");
434 return VCD_ERROR_OPERATION_FAILED;
436 SLOG(LOG_DEBUG, TAG_VCD, "<<<< Send serive state message to manager : state(%d)", state);
437 dbus_connection_flush(g_conn_sender);
440 dbus_message_unref(msg);
445 msg = dbus_message_new_signal(
446 VC_CLIENT_SERVICE_OBJECT_PATH,
447 VC_CLIENT_SERVICE_INTERFACE,
448 VCD_METHOD_SET_SERVICE_STATE);
451 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Message is NULL");
452 return VCD_ERROR_OUT_OF_MEMORY;
455 dbus_message_append_args(msg, DBUS_TYPE_INT32, &state, DBUS_TYPE_INVALID);
457 if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) {
458 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to Send");
459 return VCD_ERROR_OPERATION_FAILED;
461 SLOG(LOG_DEBUG, TAG_VCD, "<<<< Send serive state message to client : state(%d)", state);
462 dbus_connection_flush(g_conn_sender);
465 dbus_message_unref(msg);
469 /* Send to widget client */
470 msg = dbus_message_new_signal(
471 VC_WIDGET_SERVICE_OBJECT_PATH,
472 VC_WIDGET_SERVICE_INTERFACE,
473 VCD_WIDGET_METHOD_SET_SERVICE_STATE);
476 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Message is NULL");
477 return VCD_ERROR_OUT_OF_MEMORY;
480 dbus_message_append_args(msg, DBUS_TYPE_INT32, &state, DBUS_TYPE_INVALID);
482 if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) {
483 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to Send");
484 return VCD_ERROR_OPERATION_FAILED;
486 SLOG(LOG_DEBUG, TAG_VCD, "<<<< Send serive state message to widget client : state(%d)", state);
487 dbus_connection_flush(g_conn_sender);
490 dbus_message_unref(msg);
495 int vcdc_send_dialog(int manger_pid, int pid, const char* disp_text, const char* utt_text, int continuous)
497 if (0 != __dbus_check()) {
498 return VCD_ERROR_OPERATION_FAILED;
502 dbus_error_init(&err);
504 DBusMessage* msg = NULL;
506 msg = __get_message(manger_pid, VCD_MANAGER_METHOD_DIALOG, VCD_CLIENT_TYPE_MANAGER);
509 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Message is NULL");
510 return VCD_ERROR_OUT_OF_MEMORY;
513 SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] send dialog : pid(%d), disp_text(%s), utt_text(%s), continue(%d)", pid, disp_text, utt_text, continuous);
515 dbus_message_append_args(msg,
516 DBUS_TYPE_INT32, &pid,
517 DBUS_TYPE_STRING, &disp_text,
518 DBUS_TYPE_STRING, &utt_text,
519 DBUS_TYPE_INT32, &continuous,
522 dbus_message_set_no_reply(msg, TRUE);
524 if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) {
525 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to Send");
526 return VCD_ERROR_OPERATION_FAILED;
528 SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] SUCCESS Send");
529 dbus_connection_flush(g_conn_sender);
532 dbus_message_unref(msg);
537 int vcdc_send_error_signal_to_manager(int manager_pid, int reason, char *err_msg)
539 SLOG(LOG_ERROR, TAG_VCD, ">>>> Send error signal to manager");
541 if (NULL == err_msg) {
542 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Input parameter is NULL");
543 return VCD_ERROR_INVALID_PARAMETER;
546 if (0 != __dbus_check()) {
547 return VCD_ERROR_OPERATION_FAILED;
552 dbus_error_init(&err);
554 DBusMessage* msg = NULL;
556 msg = dbus_message_new_signal(
557 VC_MANAGER_SERVICE_OBJECT_PATH,
558 VC_MANAGER_SERVICE_INTERFACE,
559 VCD_MANAGER_METHOD_ERROR);
562 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Message is NULL");
563 return VCD_ERROR_OUT_OF_MEMORY;
566 daemon_pid = getpid();
567 dbus_message_append_args(msg, DBUS_TYPE_INT32, &reason, DBUS_TYPE_INT32, &daemon_pid, DBUS_TYPE_STRING, &err_msg, DBUS_TYPE_INVALID);
569 if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) {
570 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to Send");
571 return VCD_ERROR_OPERATION_FAILED;
573 SLOG(LOG_DEBUG, TAG_VCD, "<<<< Send error signal to manager : reason(%d), Error Msg(%s)", reason, err_msg);
574 dbus_connection_flush(g_conn_sender);
577 dbus_message_unref(msg);
582 int vcdc_send_error_signal(int reason, char *err_msg)
584 SLOG(LOG_ERROR, TAG_VCD, ">>>> Send error signal");
586 if (NULL == err_msg) {
587 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Input parameter is NULL");
588 return VCD_ERROR_INVALID_PARAMETER;
591 if (0 != __dbus_check()) {
592 return VCD_ERROR_OPERATION_FAILED;
597 dbus_error_init(&err);
599 DBusMessage* msg = NULL;
601 msg = dbus_message_new_signal(
602 VC_MANAGER_SERVICE_OBJECT_PATH,
603 VC_MANAGER_SERVICE_INTERFACE,
604 VCD_MANAGER_METHOD_ERROR);
607 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Message is NULL");
608 return VCD_ERROR_OUT_OF_MEMORY;
611 daemon_pid = getpid();
612 dbus_message_append_args(msg, DBUS_TYPE_INT32, &reason, DBUS_TYPE_INT32, &daemon_pid, DBUS_TYPE_STRING, &err_msg, DBUS_TYPE_INVALID);
614 if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) {
615 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to Send");
616 return VCD_ERROR_OPERATION_FAILED;
618 SLOG(LOG_DEBUG, TAG_VCD, "<<<< Send error signal to manager: reason(%d), daemon_pid(%d), Error Msg(%s)", reason, daemon_pid, err_msg);
619 dbus_connection_flush(g_conn_sender);
622 dbus_message_unref(msg);
625 msg = dbus_message_new_signal(
626 VC_CLIENT_SERVICE_OBJECT_PATH,
627 VC_CLIENT_SERVICE_INTERFACE,
631 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Message is NULL");
632 return VCD_ERROR_OUT_OF_MEMORY;
635 dbus_message_append_args(msg, DBUS_TYPE_INT32, &reason, DBUS_TYPE_INT32, &daemon_pid, DBUS_TYPE_STRING, &err_msg, DBUS_TYPE_INVALID);
637 if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) {
638 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to Send");
639 return VCD_ERROR_OPERATION_FAILED;
641 SLOG(LOG_DEBUG, TAG_VCD, "<<<< Send error signal : reason(%d), daemon_pid(%d), Error Msg(%s)", reason, daemon_pid, err_msg);
642 dbus_connection_flush(g_conn_sender);
645 dbus_message_unref(msg);
648 msg = dbus_message_new_signal(
649 VC_WIDGET_SERVICE_OBJECT_PATH,
650 VC_WIDGET_SERVICE_INTERFACE,
651 VCD_WIDGET_METHOD_ERROR);
654 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Message is NULL");
655 return VCD_ERROR_OUT_OF_MEMORY;
658 dbus_message_append_args(msg, DBUS_TYPE_INT32, &reason, DBUS_TYPE_INT32, &daemon_pid, DBUS_TYPE_STRING, &err_msg, DBUS_TYPE_INVALID);
660 if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) {
661 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to Send");
662 return VCD_ERROR_OPERATION_FAILED;
664 SLOG(LOG_DEBUG, TAG_VCD, "<<<< Send error signal to widget : reason(%d), daemon_pid(%d), Error Msg(%s)", reason, daemon_pid, err_msg);
665 dbus_connection_flush(g_conn_sender);
668 dbus_message_unref(msg);
673 static Eina_Bool listener_event_callback(void* data, Ecore_Fd_Handler *fd_handler)
675 if (NULL == g_conn_listener) return ECORE_CALLBACK_RENEW;
677 dbus_connection_read_write_dispatch(g_conn_listener, 50);
680 DBusMessage* msg = NULL;
681 msg = dbus_connection_pop_message(g_conn_listener);
683 /* loop again if we haven't read a message */
689 if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_METHOD_HELLO))
690 vcd_dbus_server_hello(g_conn_listener, msg);
693 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_INITIALIZE))
694 vcd_dbus_server_mgr_initialize(g_conn_listener, msg);
696 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_FINALIZE))
697 vcd_dbus_server_mgr_finalize(g_conn_listener, msg);
699 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_SET_COMMAND))
700 vcd_dbus_server_mgr_set_command(g_conn_listener, msg);
702 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_UNSET_COMMAND))
703 vcd_dbus_server_mgr_unset_command(g_conn_listener, msg);
705 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_SET_DEMANDABLE))
706 vcd_dbus_server_mgr_set_demandable_client(g_conn_listener, msg);
708 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_SET_AUDIO_TYPE))
709 vcd_dbus_server_mgr_set_audio_type(g_conn_listener, msg);
711 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_GET_AUDIO_TYPE))
712 vcd_dbus_server_mgr_get_audio_type(g_conn_listener, msg);
714 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_SET_CLIENT_INFO))
715 vcd_dbus_server_mgr_set_client_info(g_conn_listener, msg);
717 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_SET_PRIVATE_DATA))
718 vcd_dbus_server_mgr_set_private_data(g_conn_listener, msg);
720 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_GET_PRIVATE_DATA))
721 vcd_dbus_server_mgr_get_private_data(g_conn_listener, msg);
723 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_START))
724 vcd_dbus_server_mgr_start(g_conn_listener, msg);
726 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_STOP))
727 vcd_dbus_server_mgr_stop(g_conn_listener, msg);
729 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_CANCEL))
730 vcd_dbus_server_mgr_cancel(g_conn_listener, msg);
732 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_RESULT_SELECTION))
733 vcd_dbus_server_mgr_result_selection(g_conn_listener, msg);
735 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_SET_DOMAIN))
736 vcd_dbus_server_mgr_set_domain(g_conn_listener, msg);
738 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_DO_ACTION))
739 vcd_dbus_server_mgr_do_action(g_conn_listener, msg);
742 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_METHOD_INITIALIZE))
743 vcd_dbus_server_initialize(g_conn_listener, msg);
745 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_METHOD_FINALIZE))
746 vcd_dbus_server_finalize(g_conn_listener, msg);
748 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_METHOD_SET_EXCLUSIVE_CMD))
749 vcd_dbus_server_set_exclusive_command(g_conn_listener, msg);
751 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_METHOD_SET_COMMAND))
752 vcd_dbus_server_set_command(g_conn_listener, msg);
754 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_METHOD_UNSET_COMMAND))
755 vcd_dbus_server_unset_command(g_conn_listener, msg);
757 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_METHOD_SET_FOREGROUND))
758 vcd_dbus_server_set_foreground(g_conn_listener, msg);
760 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_METHOD_DIALOG))
761 vcd_dbus_server_dialog(g_conn_listener, msg);
763 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_METHOD_IS_SYS_COMMAND_VALID))
764 vcd_dbus_server_is_system_command_valid(g_conn_listener, msg);
767 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_METHOD_REQUEST_START))
768 vcd_dbus_server_start_request(g_conn_listener, msg);
770 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_METHOD_REQUEST_STOP))
771 vcd_dbus_server_stop_request(g_conn_listener, msg);
773 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_METHOD_REQUEST_CANCEL))
774 vcd_dbus_server_cancel_request(g_conn_listener, msg);
777 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_WIDGET_METHOD_INITIALIZE))
778 vcd_dbus_server_widget_initialize(g_conn_listener, msg);
780 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_WIDGET_METHOD_FINALIZE))
781 vcd_dbus_server_widget_finalize(g_conn_listener, msg);
783 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_WIDGET_METHOD_START_RECORDING))
784 vcd_dbus_server_widget_start_recording(g_conn_listener, msg);
786 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_WIDGET_METHOD_START))
787 vcd_dbus_server_widget_start(g_conn_listener, msg);
789 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_WIDGET_METHOD_STOP))
790 vcd_dbus_server_widget_stop(g_conn_listener, msg);
792 else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_WIDGET_METHOD_CANCEL))
793 vcd_dbus_server_widget_cancel(g_conn_listener, msg);
796 SLOG(LOG_DEBUG, TAG_VCD, "Message is NOT valid");
797 dbus_message_unref(msg);
801 /* free the message */
802 dbus_message_unref(msg);
805 return ECORE_CALLBACK_RENEW;
808 int vcd_dbus_open_connection()
811 dbus_error_init(&err);
815 /* Create connection for sender */
816 g_conn_sender = dbus_bus_get_private(DBUS_BUS_SESSION, &err);
818 if (dbus_error_is_set(&err)) {
819 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail dbus_bus_get : %s", err.message);
820 dbus_error_free(&err);
823 if (NULL == g_conn_sender) {
824 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to get dbus connection");
825 return VCD_ERROR_OPERATION_FAILED;
828 /* connect to the bus and check for errors */
829 g_conn_listener = dbus_bus_get_private(DBUS_BUS_SESSION, &err);
831 if (dbus_error_is_set(&err)) {
832 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail dbus_bus_get : %s", err.message);
833 dbus_error_free(&err);
836 if (NULL == g_conn_listener) {
837 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to get dbus connection");
838 return VCD_ERROR_OPERATION_FAILED;
841 /* request our name on the bus and check for errors */
842 ret = dbus_bus_request_name(g_conn_listener, VC_SERVER_SERVICE_NAME, DBUS_NAME_FLAG_REPLACE_EXISTING, &err);
844 if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) {
845 printf("Fail to be primary owner in dbus request.");
846 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to be primary owner");
847 return VCD_ERROR_OPERATION_FAILED;
850 if (dbus_error_is_set(&err)) {
851 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] dbus_bus_request_name() : %s", err.message);
852 dbus_error_free(&err);
853 return VCD_ERROR_OPERATION_FAILED;
856 /* add a rule for getting signal */
858 snprintf(rule, 128, "type='signal',interface='%s'", VC_SERVER_SERVICE_INTERFACE);
860 /* add a rule for which messages we want to see */
861 dbus_bus_add_match(g_conn_listener, rule, &err);/* see signals from the given interface */
862 dbus_connection_flush(g_conn_listener);
864 if (dbus_error_is_set(&err)) {
865 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] dbus_bus_add_match() : %s", err.message);
866 dbus_error_free(&err);
867 return VCD_ERROR_OPERATION_FAILED;
871 dbus_connection_get_unix_fd(g_conn_listener, &fd);
873 g_dbus_fd_handler = ecore_main_fd_handler_add(fd, ECORE_FD_READ, (Ecore_Fd_Cb)listener_event_callback, g_conn_listener, NULL, NULL);
875 if (NULL == g_dbus_fd_handler) {
876 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to get fd handler");
877 return VCD_ERROR_OPERATION_FAILED;
883 int vcd_dbus_close_connection()
886 dbus_error_init(&err);
888 if (NULL != g_dbus_fd_handler) {
889 ecore_main_fd_handler_del(g_dbus_fd_handler);
890 g_dbus_fd_handler = NULL;
893 dbus_bus_release_name(g_conn_listener, VC_SERVER_SERVICE_NAME, &err);
895 if (dbus_error_is_set(&err)) {
896 SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] dbus_bus_release_name() : %s", err.message);
897 dbus_error_free(&err);
900 dbus_connection_close(g_conn_listener);
901 dbus_connection_close(g_conn_sender);
903 dbus_connection_unref(g_conn_listener);
904 dbus_connection_unref(g_conn_sender);
906 g_conn_listener = NULL;
907 g_conn_sender = NULL;