Add bt-driver-insmod.service trigger logic
[platform/core/connectivity/bluetooth-frwk.git] / bt-api / bt-common.c
index f70f5a4..40f7fd1 100644 (file)
 #include "bt-internal-types.h"
 #include "bluetooth-ipsp-api.h"
 
+#ifndef GATT_DIRECT
+#include "bluetooth-gatt-server-api.h"
+#endif
+
 #include "bt-common.h"
 #include "bt-request-sender.h"
 #include "bt-event-handler.h"
@@ -201,6 +205,25 @@ void _bt_avrcp_event_cb(int event, int result, void *param,
                                        user_data);
 }
 
+#ifndef GATT_DIRECT
+void _bt_gatt_server_event_cb(int event, int result, void *param,
+               void *callback, void *user_data)
+{
+       BT_INFO("__bt_gatt_server_event_cb");
+       gatt_server_event_param_t bt_event = { 0, 0, NULL, NULL };
+       bt_event.event = event;
+       bt_event.result = result;
+       bt_event.param_data = param;
+       if (callback) {
+               BT_INFO("GATT Server event callback is registered");
+               ((gatt_server_cb_func_ptr)callback)(bt_event.event, &bt_event,
+                       user_data);
+       } else {
+               BT_ERR("GATT Server event callback is not registered!!!");
+       }
+}
+#endif
+
 void _bt_divide_device_class(bluetooth_device_class_t *device_class,
                                unsigned int cod)
 {
@@ -246,6 +269,7 @@ void _bt_convert_addr_string_to_secure_string(char *addr, const char *address)
        ret_if(len != BT_ADDRESS_STRING_SIZE - 1);
 
        strncpy(addr, address, len);
+       addr[len] = '\0';
 
        addr[len-1] = 'X';
        addr[len-2] = 'X';
@@ -439,8 +463,6 @@ const char *_bt_convert_service_function_to_string(int function)
                {BT_UPDATE_LE_CONNECTION_MODE, "BT_UPDATE_LE_CONNECTION_MODE"},
                {BT_SET_PROFILE_TRUSTED, "BT_SET_PROFILE_TRUSTED"},
                {BT_GET_PROFILE_TRUSTED, "BT_GET_PROFILE_TRUSTED"},
-               {BT_SET_PROFILE_RESTRICTED, "BT_SET_PROFILE_RESTRICTED"},
-               {BT_GET_PROFILE_RESTRICTED, "BT_GET_PROFILE_RESTRICTED"},
                {BT_HID_CONNECT, "BT_HID_CONNECT"},
                {BT_HID_DISCONNECT, "BT_HID_DISCONNECT"},
                {BT_HID_DEVICE_ACTIVATE, "BT_HID_DEVICE_ACTIVATE"},
@@ -693,13 +715,13 @@ static const gchar rfcomm_agent_xml[] =
 "</node>";
 
 static void __new_connection_method(GDBusConnection *connection,
-                                           const gchar *sender,
-                                           const gchar *object_path,
-                                           const gchar *interface_name,
-                                           const gchar *method_name,
-                                           GVariant *parameters,
-                                           GDBusMethodInvocation *invocation,
-                                           gpointer user_data)
+               const gchar *sender,
+               const gchar *object_path,
+               const gchar *interface_name,
+               const gchar *method_name,
+               GVariant *parameters,
+               GDBusMethodInvocation *invocation,
+               gpointer user_data)
 {
        BT_DBG("method %s", method_name);
        if (g_strcmp0(method_name, "NewConnection") == 0) {
@@ -864,7 +886,7 @@ static GDBusProxy *__bt_gdbus_get_device_proxy(char *object_path)
                                                BT_DEVICE_INTERFACE,
                                                NULL, &err);
 
-       if (err) {
+       if (device_gproxy == NULL && err) {
                BT_ERR("Unable to create proxy: %s", err->message);
                g_clear_error(&err);
                return NULL;
@@ -1467,57 +1489,45 @@ int _bt_discover_service_uuids(char *address, char *remote_uuid)
                BT_ERR("DBus Error: [%s]", err->message);
                g_clear_error(&err);
        }
-       ret = g_dbus_proxy_call_sync(proxy, "GetAll",
-                       g_variant_new("(s)", BT_DEVICE_INTERFACE),
-                       G_DBUS_CALL_FLAGS_NONE,
-                       DBUS_TIMEOUT, NULL,
-                       &err);
+       ret = g_dbus_proxy_call_sync(proxy, "Get",
+                       g_variant_new("(ss)", BT_DEVICE_INTERFACE, "UUIDs"),
+                       G_DBUS_CALL_FLAGS_NONE, DBUS_TIMEOUT, NULL, &err);
        if (err) {
                result = BLUETOOTH_ERROR_INTERNAL;
                BT_ERR("DBus Error : %s", err->message);
                g_clear_error(&err);
                goto done;
-       }
-       if (ret == NULL) {
-               BT_ERR("g_dbus_proxy_call_sync function return NULL");
-               result = BLUETOOTH_ERROR_INTERNAL;
-               goto done;
-       }
-
-       g_variant_get(ret, "(@a{sv})", &value);
-       g_variant_unref(ret);
-       if (value) {
-               GVariant *temp_value = g_variant_lookup_value(value, "UUIDs",
-                       G_VARIANT_TYPE_STRING_ARRAY);
-
-               if (temp_value) {
-                       size = g_variant_get_size(temp_value);
-                       if (size > 0) {
-                               uuid_value = (char **)g_variant_get_strv(temp_value, &size);
-                               BT_DBG("Size items %d", size);
-
-                               if (uuid_value) {
-                                       for (i = 0; uuid_value[i] != NULL; i++) {
-                                               BT_DBG("Remote uuids %s", uuid_value[i]);
-                                               if (strcasecmp(uuid_value[i], remote_uuid) == 0) {
-                                                       result = BLUETOOTH_ERROR_NONE;
-                                                       g_variant_unref(temp_value);
-                                                       goto done;
-                                               }
-                                       }
-                               }
+       } else {
+               g_variant_get(ret, "(v)", &value);
+               uuid_value = (char **)g_variant_get_strv(value, &size);
+               BT_DBG("Size items %d", size);
+       }
+
+       if (uuid_value) {
+               for (i = 0; uuid_value[i] != NULL; i++) {
+                       BT_DBG("Remote uuids %s", uuid_value[i]);
+                       if (uuid_value[i] == NULL) {
+                               BT_ERR("_bt_discover_service_uuids Error Parameter are NULL..\n");
+                               continue;
+                       } else if (g_ascii_strcasecmp(uuid_value[i], remote_uuid) == 0) {
+                               result = BLUETOOTH_ERROR_NONE;
+                               goto done;
                        }
-                       g_variant_unref(temp_value);
                }
        }
+
 done:
        if (proxy)
                g_object_unref(proxy);
-       if (value)
-               g_variant_unref(value);
        if (uuid_value)
                g_free(uuid_value);
 
+       if (value)
+               g_variant_unref(value);
+
+       if (ret)
+               g_variant_unref(ret);
+
        BT_DBG("-");
        return result;
 }
@@ -1551,38 +1561,25 @@ int _bt_get_cod_by_address(char *address, bluetooth_device_class_t *dev_class)
                g_clear_error(&err);
        }
 
-       result = g_dbus_proxy_call_sync(proxy, "GetAll",
-                       g_variant_new("(s)", BT_DEVICE_INTERFACE),
-                       G_DBUS_CALL_FLAGS_NONE,
-                       DBUS_TIMEOUT, NULL,
-                       &err);
+       result = g_dbus_proxy_call_sync(proxy, "Get",
+                       g_variant_new("(ss)", BT_DEVICE_INTERFACE, "Class"),
+                       G_DBUS_CALL_FLAGS_NONE, DBUS_TIMEOUT, NULL, &err);
        if (err) {
                ret = BLUETOOTH_ERROR_INTERNAL;
                BT_ERR("DBus Error : %s", err->message);
                g_clear_error(&err);
                goto done;
-       }
-       if (result == NULL) {
-               BT_ERR("g_dbus_proxy_call_sync function return NULL");
-               ret = BLUETOOTH_ERROR_INTERNAL;
-               goto done;
-       }
-       g_variant_get(result, "(@a{sv})", &value);
-       g_variant_unref(result);
-       if (value) {
-               GVariant *temp_value = g_variant_lookup_value(value, "Class",
-                       G_VARIANT_TYPE_UINT32);
-               class = g_variant_get_uint32(temp_value);
+       } else {
+               g_variant_get(result, "(v)", &value);
+               class = g_variant_get_uint32(value);
                _bt_divide_device_class(dev_class, class);
-               if (temp_value)
-                       g_variant_unref(temp_value);
+               g_variant_unref(value);
+               g_variant_unref(result);
        }
 
 done:
        if (proxy)
                g_object_unref(proxy);
-       if (value)
-               g_variant_unref(value);
 
        BT_DBG("-");
        return ret;
@@ -1946,9 +1943,14 @@ GVariant *_bt_get_managed_objects(void)
        if (error) {
                BT_ERR("Unable to create proxy: %s", error->message);
                g_clear_error(&error);
+               if (manager_proxy)
+                       g_object_unref(manager_proxy);
                return NULL;
        }
 
+       if (!manager_proxy)
+               return NULL;
+
        result = g_dbus_proxy_call_sync(manager_proxy,
                        "GetManagedObjects", NULL,
                        G_DBUS_CALL_FLAGS_NONE, -1,
@@ -2300,15 +2302,21 @@ BT_EXPORT_API int bluetooth_register_callback(bluetooth_cb_func_ptr callback_ptr
                ret = _bt_register_event(BT_RFCOMM_SERVER_EVENT, (void *)callback_ptr, user_data);
                if (ret != BLUETOOTH_ERROR_NONE)
                        goto fail;
+
+#ifdef GATT_NO_RELAY
                ret = _bt_register_event(BT_GATT_BLUEZ_EVENT, (void *)callback_ptr, user_data);
                if (ret != BLUETOOTH_ERROR_NONE)
                        goto fail;
+#endif
                ret = _bt_register_event(BT_TDS_EVENT, (void *)callback_ptr, user_data);
                if (ret != BLUETOOTH_ERROR_NONE)
                        goto fail;
                ret = _bt_register_event(BT_OTP_EVENT, (void *)callback_ptr, user_data);
                if (ret != BLUETOOTH_ERROR_NONE)
                        goto fail;
+               ret = _bt_register_event(BT_HDP_EVENT, (void *)callback_ptr, user_data);
+               if (ret != BLUETOOTH_ERROR_NONE)
+                       goto fail;
        }
 
        _bt_register_name_owner_changed();