Resolve memory leak in HAL
[platform/core/connectivity/bluetooth-frwk.git] / bt-oal / bluez_hal / src / bt-hal-dbus-common-utils.c
index 8528369..730fde4 100644 (file)
@@ -72,8 +72,6 @@ struct avrcp_proxy {
 
 struct avrcp_proxy proxy_array[BT_AUDIO_SOURCE_MAX];
 
-static GDBusConnection *system_gconn = NULL;
-
 static guint bus_id;
 GDBusNodeInfo *new_conn_node;
 static const gchar rfcomm_agent_xml[] =
@@ -90,31 +88,44 @@ static const gchar rfcomm_agent_xml[] =
 "  </interface>"
 "</node>";
 
-GDBusConnection *_bt_hal_gdbus_init_system_gconn(void)
+static GDBusConnection *__bt_hal_init_session_conn(void)
+{
+       if (session_conn == NULL)
+               session_conn = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, NULL);
+
+       return session_conn;
+}
+
+GDBusConnection *_bt_hal_get_session_gconn(void)
+{
+       return (session_conn) ? session_conn : __bt_hal_init_session_conn();
+}
+
+static GDBusConnection *__bt_hal_init_system_gconn(void)
 {
        GError *error = NULL;
 
-       if (system_gconn != NULL)
-               return system_gconn;
+       if (system_conn != NULL)
+               return system_conn;
 
-       system_gconn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
+       system_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
 
-       if (!system_gconn) {
+       if (!system_conn) {
                ERR("Unable to connect to dbus: %s", error->message);
                g_clear_error(&error);
        }
 
-       return system_gconn;
+       return system_conn;
 }
 
-GDBusConnection *_bt_hal_gdbus_get_system_gconn(void)
+GDBusConnection *_bt_hal_get_system_gconn(void)
 {
        GDBusConnection *local_system_gconn = NULL;
        GError *error = NULL;
 
-       if (system_gconn == NULL) {
-               system_gconn = _bt_hal_gdbus_init_system_gconn();
-       } else if (g_dbus_connection_is_closed(system_gconn)) {
+       if (system_conn == NULL) {
+               system_conn = __bt_hal_init_system_gconn();
+       } else if (g_dbus_connection_is_closed(system_conn)) {
 
                local_system_gconn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
 
@@ -123,18 +134,16 @@ GDBusConnection *_bt_hal_gdbus_get_system_gconn(void)
                        g_clear_error(&error);
                }
 
-               system_gconn = local_system_gconn;
+               system_conn = local_system_gconn;
        }
 
-       return system_gconn;
+       return system_conn;
 }
 
 static GDBusProxy *__bt_hal_init_manager_proxy(void)
 {
        GDBusProxy *proxy;
 
-       DBG("+");
-
        if (system_conn == NULL) {
                system_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, NULL);
                if (system_conn == NULL)
@@ -150,7 +159,6 @@ static GDBusProxy *__bt_hal_init_manager_proxy(void)
 
        manager_gproxy = proxy;
 
-       DBG("-");
        return proxy;
 }
 
@@ -265,17 +273,23 @@ static char *__bt_hal_extract_control_device_path(GVariantIter *iter, char *addr
 {
        char *object_path = NULL;
        char *interface_str = NULL;
+       GVariantIter *interface_iter;
        char device_address[BT_HAL_ADDRESS_STRING_SIZE] = { 0 };
 
        /* Parse the signature: oa{sa{sv}}} */
-       while (g_variant_iter_loop(iter, "{&oa{sa{sv}}}", &object_path, &interface_str)) {
+       while (g_variant_iter_loop(iter, "{&oa{sa{sv}}}", &object_path, &interface_iter)) {
                if (object_path == NULL)
-                       return  NULL;
+                       continue;
 
-               if (g_strcmp0(interface_str, BT_HAL_PLAYER_CONTROL_INTERFACE) == 0) {
-                       _bt_hal_convert_device_path_to_address(object_path, device_address);
-                       if (g_strcmp0(address, device_address) == 0)
-                               return g_strdup(object_path);
+               while(g_variant_iter_loop(interface_iter, "{&sa{sv}}", &interface_str, NULL)) {
+                       if (g_strcmp0(interface_str, BT_HAL_PLAYER_CONTROL_INTERFACE) == 0) {
+                               _bt_hal_convert_device_path_to_address(object_path, device_address);
+                               if (g_strcmp0(address, device_address) == 0) {
+                                       DBG("Object Path: %s", object_path);
+                                       g_variant_iter_free(interface_iter);
+                                       return g_strdup(object_path);
+                               }
+                       }
                }
        }
        return NULL;
@@ -285,17 +299,23 @@ static char *__bt_hal_extract_transport_device_path(GVariantIter *iter, char *ad
 {
        char *object_path = NULL;
        char *interface_str = NULL;
+       GVariantIter *interface_iter;
        char device_address[BT_HAL_ADDRESS_STRING_SIZE] = { 0 };
 
        /* Parse the signature: oa{sa{sv}}} */
-       while (g_variant_iter_loop(iter, "{&oa{sa{sv}}}", &object_path, &interface_str)) {
+       while (g_variant_iter_loop(iter, "{&oa{sa{sv}}}", &object_path, &interface_iter)) {
                if (object_path == NULL)
-                       return  NULL;
+                       continue;
 
-               if (g_strcmp0(interface_str, BT_HAL_MEDIATRANSPORT_INTERFACE) == 0) {
-                       _bt_hal_convert_device_path_to_address(object_path, device_address);
-                       if (g_strcmp0(address, device_address) == 0)
-                               return g_strdup(object_path);
+               while(g_variant_iter_loop(interface_iter, "{&sa{sv}}", &interface_str, NULL)) {
+                       if (g_strcmp0(interface_str, BT_HAL_MEDIATRANSPORT_INTERFACE) == 0) {
+                               _bt_hal_convert_device_path_to_address(object_path, device_address);
+                               if (g_strcmp0(address, device_address) == 0) {
+                                       DBG("Object Path: %s", object_path);
+                                       g_variant_iter_free(interface_iter);
+                                       return g_strdup(object_path);
+                               }
+                       }
                }
        }
        return NULL;
@@ -376,15 +396,11 @@ char *_bt_hal_get_control_device_path(bt_bdaddr_t *bd_addr)
        char *control_path;
        char connected_address[BT_HAL_ADDRESS_STRING_SIZE];
 
-       DBG("+");
-
        if (avrcp_control_path != NULL)
                return avrcp_control_path;
 
        _bt_hal_convert_addr_type_to_string(connected_address, bd_addr->address);
 
-       DBG("device address = %s", connected_address);
-
        control_path = __bt_hal_get_control_device_object_path(connected_address);
        if (control_path == NULL)
                return NULL;
@@ -399,15 +415,11 @@ char *_bt_hal_get_transport_device_path(bt_bdaddr_t *bd_addr)
        char *transport_path;
        char connected_address[BT_HAL_ADDRESS_STRING_SIZE];
 
-       DBG("+");
-
        if (avrcp_transport_path != NULL)
                return avrcp_transport_path;
 
        _bt_hal_convert_addr_type_to_string(connected_address, bd_addr->address);
 
-       DBG("device address = %s", connected_address);
-
        transport_path = __bt_hal_get_transport_device_object_path(connected_address);
        if (transport_path == NULL)
                return NULL;
@@ -417,14 +429,6 @@ char *_bt_hal_get_transport_device_path(bt_bdaddr_t *bd_addr)
        return transport_path;
 }
 
-static GDBusConnection *__bt_hal_init_system_gconn(void)
-{
-       if (system_conn == NULL)
-               system_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, NULL);
-
-       return system_conn;
-}
-
 static GDBusProxy *__bt_hal_init_avrcp_ctrl_proxy(bt_bdaddr_t *bd_addr)
 {
        GDBusProxy *manager_proxy;
@@ -432,7 +436,7 @@ static GDBusProxy *__bt_hal_init_avrcp_ctrl_proxy(bt_bdaddr_t *bd_addr)
        GDBusConnection *gconn = NULL;
        int i;
 
-       gconn = _bt_hal_gdbus_get_system_gconn();
+       gconn = _bt_hal_get_system_gconn();
        if (gconn == NULL)
                return  NULL;
 
@@ -466,27 +470,8 @@ static GDBusProxy *__bt_hal_init_avrcp_ctrl_proxy(bt_bdaddr_t *bd_addr)
        return proxy;
 }
 
-static GDBusConnection *__bt_hal_init_session_conn(void)
-{
-       if (session_conn == NULL)
-               session_conn = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, NULL);
-
-       return session_conn;
-}
-
-GDBusConnection *_bt_hal_get_session_gconn(void)
-{
-       return (session_conn) ? session_conn : __bt_hal_init_session_conn();
-}
-
-GDBusConnection *_bt_hal_get_system_gconn(void)
-{
-       return (system_conn) ? system_conn : __bt_hal_init_system_gconn();
-}
-
 GDBusProxy *_bt_hal_get_manager_proxy(void)
 {
-       DBG("+");
        if (manager_gproxy) {
                const gchar *path =  g_dbus_proxy_get_object_path(manager_gproxy);
                if (path == NULL) {
@@ -495,7 +480,6 @@ GDBusProxy *_bt_hal_get_manager_proxy(void)
                }
                return manager_gproxy;
        }
-       DBG("-");
        return  __bt_hal_init_manager_proxy();
 }
 
@@ -546,7 +530,6 @@ GDBusProxy *_bt_hal_get_avrcp_ctrl_properties_proxy(bt_bdaddr_t *bd_addr)
        char *control_path = NULL;
        GDBusConnection *conn = NULL;
 
-       DBG("+");
        control_path = _bt_hal_get_control_device_path(bd_addr);
        if (control_path == NULL)
                return  NULL;
@@ -571,7 +554,6 @@ GDBusProxy *_bt_hal_get_avrcp_ctrl_properties_proxy(bt_bdaddr_t *bd_addr)
                return NULL;
        }
 
-       DBG("-");
        return proxy;
 }
 
@@ -582,7 +564,6 @@ GDBusProxy *_bt_hal_get_avrcp_transport_properties_proxy(bt_bdaddr_t *bd_addr)
        char *transport_path = NULL;
        GDBusConnection *conn = NULL;
 
-       DBG("+");
        transport_path = _bt_hal_get_transport_device_path(bd_addr);
        if (transport_path == NULL)
                return  NULL;
@@ -607,7 +588,6 @@ GDBusProxy *_bt_hal_get_avrcp_transport_properties_proxy(bt_bdaddr_t *bd_addr)
                return NULL;
        }
 
-       DBG("-");
        return proxy;
 }
 
@@ -682,7 +662,6 @@ char *_bt_hal_get_adapter_path(void)
        GVariantIter *iter = NULL;
        char *adapter_path = NULL;
 
-       DBG("+");
        conn = _bt_hal_get_system_gconn();
        if (conn == NULL)
                return  NULL;
@@ -708,7 +687,7 @@ char *_bt_hal_get_adapter_path(void)
        adapter_path = __bt_hal_extract_adapter_path(iter);
        g_variant_iter_free(iter);
        g_variant_unref(result);
-       DBG("-");
+
        return adapter_path;
 }
 
@@ -783,6 +762,32 @@ void _bt_hal_deinit_proxys(void)
        }
 }
 
+GDBusProxy *_bt_hal_get_hid_agent_proxy(void)
+{
+       GDBusConnection *conn;
+       GDBusProxy *proxy;
+       GError *err = NULL;
+
+       conn = _bt_hal_get_system_gconn();
+       if (conn == NULL) {
+               ERR("_bt_hal_get_system_gconn failed");
+               return NULL;
+       }
+
+       proxy = g_dbus_proxy_new_sync(conn, G_DBUS_PROXY_FLAGS_NONE, NULL,
+                                       BT_HAL_HID_SERVICE_NAME, BT_HAL_HID_AGENT_OBJECT_PATH,
+                                       BT_HAL_HID_SERVICE_INTERFACE, NULL, &err);
+       if (proxy == NULL) {
+               if (err != NULL) {
+                       ERR("Unable to create proxy: %s", err->message);
+                       g_clear_error(&err);
+               }
+               return NULL;
+       }
+
+       return proxy;
+}
+
 void _bt_hal_convert_device_path_to_address(const char *device_path,
                char *device_address)
 {
@@ -959,7 +964,6 @@ int _bt_hal_copy_utf8_string(char *dest, const char *src, unsigned int length)
 
 gboolean _bt_hal_utf8_validate(char *name)
 {
-       DBG("+");
        gunichar2 *u16;
        glong items_written = 0;
 
@@ -975,7 +979,6 @@ gboolean _bt_hal_utf8_validate(char *name)
        if (items_written != g_utf8_strlen(name, -1))
                return FALSE;
 
-       DBG("-");
        return TRUE;
 }
 
@@ -1079,7 +1082,6 @@ GVariant *_bt_hal_get_managed_objects(void)
        GVariant *result = NULL;
        GError *error = NULL;
 
-       DBG("+");
        conn = _bt_hal_get_system_gconn();
        if (conn == NULL)
                return NULL;
@@ -1744,8 +1746,6 @@ int _bt_hal_discover_service_uuids(char *address, char *remote_uuid)
        GVariant *ret = NULL;
        int result = BT_STATUS_FAIL;
 
-       DBG("+");
-
        if (remote_uuid == NULL) {
                ERR("remote_uuid == NULL, return");
                return BT_STATUS_FAIL;
@@ -1832,7 +1832,6 @@ done:
        if (uuid_value)
                g_free(uuid_value);
 
-       DBG("-");
        return result;
 }
 
@@ -1952,8 +1951,6 @@ gboolean _bt_hal_is_service_enabled(const char *uuid)
        gchar *uuid_str;
        gboolean ret = FALSE;
 
-       DBG("+");
-
        proxy = _bt_hal_get_adapter_properties_proxy();
        if (!proxy) {
                DBG("_bt_hal_dbus_get_local_name: Adapter Properties proxy get failed!!!");
@@ -1982,7 +1979,7 @@ gboolean _bt_hal_is_service_enabled(const char *uuid)
                return FALSE;
        }
 
-       while (g_variant_iter_loop(iter, "s", &uuid_str)) {
+       while (g_variant_iter_loop(iter, "&s", &uuid_str)) {
                DBG("UUID string [%s]\n", uuid_str);
                if (!strncasecmp(uuid, uuid_str, strlen(uuid))) {
                        ret = TRUE;
@@ -1993,6 +1990,6 @@ gboolean _bt_hal_is_service_enabled(const char *uuid)
        g_variant_iter_free(iter);
        g_variant_unref(result);
        g_variant_unref(temp);
-       DBG("-");
+
        return ret;
 }