[HAL]Add API to set/unset OSP server in GAP agent 20/148820/1
authorAtul Rai <a.rai@samsung.com>
Fri, 8 Sep 2017 08:15:26 +0000 (13:45 +0530)
committerAtul Rai <a.rai@samsung.com>
Fri, 8 Sep 2017 08:15:26 +0000 (13:45 +0530)
Change-Id: I9c5e241214495420b9914d20d023c309232faa3c
Signed-off-by: Atul Rai <a.rai@samsung.com>
bt-oal/bluez_hal/hardware/bluetooth.h
bt-oal/bluez_hal/src/bt-hal-agent.c
bt-oal/bluez_hal/src/bt-hal-bluetooth.c
bt-oal/bluez_hal/src/bt-hal-device-dbus-handler.c
bt-oal/bluez_hal/src/bt-hal-device-dbus-handler.h
bt-oal/bluez_hal/src/bt-hal-gap-agent.c
bt-oal/bluez_hal/src/bt-hal-gap-agent.h

index fd5a317..34c2d37 100644 (file)
@@ -395,6 +395,12 @@ typedef enum {
 
 #define BT_MAX_NUM_UUIDS 32
 
+#ifdef TIZEN_BT_HAL
+#define BT_OSP_SERVER_OBEX 0x00
+/* TODO: Add more types If and when required */
+#define BT_OSP_SERVER_MAX 0xFF
+#endif
+
 /** Bluetooth Interface callbacks */
 
 /** Bluetooth Enable/Disable Callback. */
@@ -696,6 +702,12 @@ typedef struct {
      * non-zero return status indicates an active connection.
      */
     int (*get_service_connection_state)(const bt_bdaddr_t *bd_addr, bt_service_id_t rem_svc_id);
+
+    /*
+     * Enable/Disable osp server in gap agent.
+     * enable == 0/1 -> Register/Unregister osp server.
+     */
+    int (*set_agent_osp_server)(uint32_t type, uint8_t enable);
 #endif
 } bt_interface_t;
 
index e5c6104..2b03ccc 100644 (file)
@@ -738,6 +738,14 @@ static gboolean __bt_hal_authorize_request(GapAgentPrivate *agent, GDBusProxy *d
        }
 
 #ifdef TIZEN_BT_HAL
+       if (!strcasecmp(uuid, BT_HAL_OPP_UUID) &&
+               (NULL != _bt_hal_gap_agent_find_osp_server_by_type(
+                               agent->osp_servers, BT_OSP_SERVER_OBEX))) {
+               INFO("OSP server for OPP found, send event");
+               __bt_hal_send_authorize_request_event(address, uuid);
+               goto done;
+       }
+
        if (_is_rfcomm_server_uuid(uuid)) {
                __bt_hal_send_rfcomm_authorize_request_event(address, uuid);
                goto done;
index 004b2e2..a9b0538 100644 (file)
@@ -317,6 +317,12 @@ static int get_service_connection_state(const bt_bdaddr_t *bd_addr, bt_service_i
        DBG("");
        return _bt_hal_device_get_service_connection_state(bd_addr, rem_svc_id);
 }
+
+static int set_agent_osp_server(uint32_t type, uint8_t enable)
+{
+       DBG("");
+       return _bt_hal_device_set_osp_server(type, enable);
+}
 #endif
 
 static const bt_interface_t bluetooth_if = {
@@ -357,6 +363,7 @@ static const bt_interface_t bluetooth_if = {
        .set_authorization = set_authorization,
 #ifdef TIZEN_BT_HAL
        .get_service_connection_state = get_service_connection_state,
+       .set_agent_osp_server = set_agent_osp_server,
 #endif
 };
 
index 1667bee..caff416 100644 (file)
@@ -1310,4 +1310,25 @@ int _bt_hal_device_get_service_connection_state(
 
        return 1;
 }
+
+int _bt_hal_device_set_osp_server(uint32_t type, gboolean enable)
+{
+       GapAgentPrivate *agent = _bt_hal_get_adapter_agent();
+       gboolean result = FALSE;
+
+       DBG("+");
+       if (!agent)
+               return BT_STATUS_FAIL;
+
+       if (enable)
+               result = _bt_hal_gap_agent_register_osp_server(agent, type);
+       else
+               result = _bt_hal_gap_agent_unregister_osp_server(agent, type);
+
+       if (!result)
+               return BT_STATUS_FAIL;
+
+       DBG("-");
+       return BT_STATUS_SUCCESS;
+}
 #endif
index 35e7b92..8281930 100644 (file)
@@ -65,6 +65,8 @@ int _bt_hal_device_get_connection_state(const bt_bdaddr_t *bd_addr);
 #ifdef TIZEN_BT_HAL
 int _bt_hal_device_get_service_connection_state(
                const bt_bdaddr_t *bd_addr, bt_service_id_t rem_svc_id);
+
+int _bt_hal_device_set_osp_server(uint32_t type, gboolean enable);
 #endif
 
 #ifdef __cplusplus
index 57503d4..27aa529 100644 (file)
@@ -77,9 +77,39 @@ static void __bt_gap_agent_method(GDBusConnection *connection,
                gpointer user_data);
 void _gap_agent_set_canceled(GapAgentPrivate *agent, gboolean value);
 
+static gint gap_agent_id = -1;
 
+#ifdef TIZEN_BT_HAL
+static void __bt_hal_free_osp_server(gpointer data)
+{
+       bt_hal_agent_osp_server_t *server = data;
 
-static gint gap_agent_id = -1;
+       DBG("+");
+
+       if (!server)
+               return;
+
+       /* TODO: Free additional elements if present */
+       g_free(server);
+
+       DBG("-");
+}
+
+static void __bt_hal_gap_agent_remove_osp_servers(GSList *osp_servers)
+{
+       DBG("+");
+
+       if (!osp_servers) {
+               ERR("osp_servers is NULL");
+               return;
+
+       }
+
+       g_slist_free_full(osp_servers, __bt_hal_free_osp_server);
+
+       DBG("-");
+}
+#endif
 
 gboolean _gap_agent_register(GapAgentPrivate *agent)
 {
@@ -308,14 +338,12 @@ void _gap_agent_reset_dbus(GapAgentPrivate *agent)
                                        gap_agent_id);
                gap_agent_id = -1;
        }
-       /*TODO*/
-#if 0
-       if (priv->osp_servers) {
-               __gap_agent_remove_osp_servers(priv->osp_servers);
-               g_slist_free(priv->osp_servers);
-               priv->osp_servers = NULL;
-       }
+
+#ifdef TIZEN_BT_HAL
+       if (priv->osp_servers)
+               __bt_hal_gap_agent_remove_osp_servers(priv->osp_servers);
 #endif
+
        g_object_ref(priv->adapter);
        priv->adapter = NULL;
 
@@ -1021,3 +1049,68 @@ gboolean gap_agent_reply_authorize(GapAgentPrivate *agent, const guint accept,
        DBG("-");
        return ret;
 }
+
+#ifdef TIZEN_BT_HAL
+bt_hal_agent_osp_server_t *_bt_hal_gap_agent_find_osp_server_by_type(GSList *servers, unsigned int type)
+{
+       GSList *l;
+       bt_hal_agent_osp_server_t *server;
+
+       for (l = servers; l != NULL; l = g_slist_next(l)) {
+               server = l->data;
+
+               if (server == NULL)
+                       continue;
+
+               if (type == server->type)
+                       return server;
+       }
+
+       return NULL;
+}
+
+gboolean _bt_hal_gap_agent_register_osp_server(GapAgentPrivate *agent, unsigned int type)
+{
+       bt_hal_agent_osp_server_t *server;
+
+       DBG("+");
+
+       GapAgentPrivate *priv = agent;
+       if (priv == NULL)
+               return FALSE;
+
+       if (type >= BT_OSP_SERVER_MAX)
+               return FALSE;
+
+       server = g_malloc0(sizeof(bt_hal_agent_osp_server_t));
+       server->type = type;
+       priv->osp_servers = g_slist_append(priv->osp_servers, server);
+
+       DBG("-");
+       return TRUE;
+}
+
+gboolean _bt_hal_gap_agent_unregister_osp_server(GapAgentPrivate *agent, unsigned int type)
+{
+       bt_hal_agent_osp_server_t *server;
+
+       GapAgentPrivate *priv = agent;
+
+       DBG("+");
+       if (priv == NULL)
+               return FALSE;
+
+       if (type >= BT_OSP_SERVER_MAX)
+               return FALSE;
+
+       server = _bt_hal_gap_agent_find_osp_server_by_type(priv->osp_servers, type);
+       if (server == NULL)
+               return FALSE;
+
+       priv->osp_servers = g_slist_remove(priv->osp_servers, server);
+       __bt_hal_free_osp_server(server);
+
+       DBG("-");
+       return TRUE;
+}
+#endif
index 52ecea5..fad7c74 100644 (file)
 #include <glib.h>
 #include <gio/gio.h>
 
+#ifdef TIZEN_BT_HAL
+typedef struct {
+       unsigned int type;
+       /* TODO: Add more elements If and when required */
+} bt_hal_agent_osp_server_t;
+#endif
+
 typedef enum {
        GAP_AGENT_EXEC_NO_OPERATION,
        GAP_AGENT_EXEC_PAIRING,
@@ -110,4 +117,12 @@ gboolean gap_agent_reply_confirmation(GapAgentPrivate *agent, const guint accept
 
 gboolean gap_agent_reply_authorize(GapAgentPrivate *agent, const guint accept,
                 GDBusMethodInvocation *context);
+
+#ifdef TIZEN_BT_HAL
+bt_hal_agent_osp_server_t *_bt_hal_gap_agent_find_osp_server_by_type(GSList *servers, unsigned int type);
+
+gboolean _bt_hal_gap_agent_register_osp_server(GapAgentPrivate *agent, unsigned int type);
+
+gboolean _bt_hal_gap_agent_unregister_osp_server(GapAgentPrivate *agent, unsigned int type);
+#endif
 #endif //_BT_HAL_GAP_AGENT_H__