#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. */
* 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;
}
#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;
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 = {
.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
};
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
#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
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)
{
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;
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
#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,
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__