Fix memory leaks of dbus
[platform/core/uifw/voice-control.git] / client / vc_widget_dbus.c
index adebea1..14d3f4d 100644 (file)
@@ -33,7 +33,7 @@ extern void __vc_widget_cb_show_tooltip(int pid, bool show);
 
 extern void __vc_widget_cb_result();
 
-extern bool __vc_widget_cb_asr_result();
+extern bool __vc_widget_cb_asr_result(int event, const char* asr_result);
 
 extern int __vc_widget_cb_service_state(int state);
 
@@ -168,7 +168,15 @@ static Eina_Bool widget_listener_event_callback(void* data, Ecore_Fd_Handler *fd
                else if (dbus_message_is_method_call(msg, if_name, VCD_WIDGET_METHOD_ASR_RESULT)) {
                        SLOG(LOG_DEBUG, TAG_VCW, "@@@ Get widget asr result");
                        int ret = 0;
-                       if (false == __vc_widget_cb_asr_result())
+                       int event = -1;
+                       char* asr_result = NULL;
+
+                       dbus_message_get_args(msg, &err,
+                               DBUS_TYPE_INT32, &event,
+                               DBUS_TYPE_STRING, &asr_result,
+                               DBUS_TYPE_INVALID);
+
+                       if (false == __vc_widget_cb_asr_result(event, asr_result))
                                ret = 0;
                        else
                                ret = 1;
@@ -179,7 +187,7 @@ static Eina_Bool widget_listener_event_callback(void* data, Ecore_Fd_Handler *fd
                                if (!dbus_connection_send(g_w_conn_listener, reply, NULL))
                                        SLOG(LOG_ERROR, TAG_VCW, "@@ vc widget get asr result : fail to send reply");
                                else
-                                       SLOG(LOG_DEBUG, TAG_VCW, "@@ vc widget get asr result");
+                                       SLOG(LOG_DEBUG, TAG_VCW, "@@ vc widget get asr result, event(%d), asr_result(%s), consumed(%d)", event, asr_result, ret);
 
                                dbus_connection_flush(g_w_conn_listener);
                                dbus_message_unref(reply);
@@ -266,10 +274,12 @@ static void __vc_mgr_dbus_connection_free()
 {
        if (NULL != g_w_conn_listener) {
                dbus_connection_close(g_w_conn_listener);
+               dbus_connection_unref(g_w_conn_listener);
                g_w_conn_listener = NULL;
        }
        if (NULL != g_w_conn_sender) {
                dbus_connection_close(g_w_conn_sender);
+               dbus_connection_unref(g_w_conn_sender);
                g_w_conn_sender = NULL;
        }
 }
@@ -300,6 +310,8 @@ int vc_widget_dbus_open_connection()
                return VC_ERROR_OPERATION_FAILED;
        }
 
+       dbus_connection_set_exit_on_disconnect(g_w_conn_sender, false);
+
        g_w_conn_listener = dbus_bus_get_private(DBUS_BUS_SESSION, &err);
 
        if (dbus_error_is_set(&err)) {
@@ -313,6 +325,8 @@ int vc_widget_dbus_open_connection()
                return VC_ERROR_OPERATION_FAILED;
        }
 
+       dbus_connection_set_exit_on_disconnect(g_w_conn_listener, false);
+
        int pid = getpid();
 
        char service_name[64];
@@ -385,17 +399,19 @@ int vc_widget_dbus_close_connection()
                g_w_fd_handler = NULL;
        }
 
-       int pid = getpid();
+       if (NULL != g_w_conn_listener) {
+               int pid = getpid();
 
-       char service_name[64];
-       memset(service_name, '\0', 64);
-       snprintf(service_name, 64, "%s%d", VC_WIDGET_SERVICE_NAME, pid);
+               char service_name[64];
+               memset(service_name, '\0', 64);
+               snprintf(service_name, 64, "%s%d", VC_WIDGET_SERVICE_NAME, pid);
 
-       dbus_bus_release_name(g_w_conn_listener, 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);
+               if (dbus_error_is_set(&err)) {
+                       SLOG(LOG_ERROR, TAG_VCW, "[ERROR] Dbus Error (%s)", err.message);
+                       dbus_error_free(&err);
+               }
        }
 
        __vc_mgr_dbus_connection_free();