Skip to content

Commit

Permalink
Refactor code to better separate gattlib_adapter_t, gattlib_device_t,…
Browse files Browse the repository at this point in the history
… gattlib_connection_t and their backends
  • Loading branch information
oliviermartin committed Apr 5, 2024
1 parent 22dca45 commit 014c280
Show file tree
Hide file tree
Showing 33 changed files with 507 additions and 559 deletions.
10 changes: 5 additions & 5 deletions bluez/gattlib_adapter.c
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ static char* parse_name(uint8_t* data, size_t size) {
return NULL;
}

static int ble_scan(void *adapter, int device_desc, gattlib_discovered_device_t discovered_device_cb, int timeout, void *user_data) {
static int ble_scan(gattlib_adapter_t* adapter, int device_desc, gattlib_discovered_device_t discovered_device_cb, int timeout, void *user_data) {
struct hci_filter old_options;
socklen_t slen = sizeof(old_options);
struct hci_filter new_options;
Expand Down Expand Up @@ -212,7 +212,7 @@ static int ble_scan(void *adapter, int device_desc, gattlib_discovered_device_t
return GATTLIB_SUCCESS;
}

int gattlib_adapter_scan_enable(void* adapter, gattlib_discovered_device_t discovered_device_cb, size_t timeout, void *user_data) {
int gattlib_adapter_scan_enable(gattlib_adapter_t* adapter, gattlib_discovered_device_t discovered_device_cb, size_t timeout, void *user_data) {
int device_desc = *(int*)adapter;

uint16_t interval = htobs(DISCOV_LE_SCAN_INT);
Expand Down Expand Up @@ -241,13 +241,13 @@ int gattlib_adapter_scan_enable(void* adapter, gattlib_discovered_device_t disco
return GATTLIB_SUCCESS;
}

int gattlib_adapter_scan_enable_with_filter(void *adapter, uuid_t **uuid_list, int16_t rssi_threshold, uint32_t enabled_filters,
int gattlib_adapter_scan_enable_with_filter(gattlib_adapter_t* adapter, uuid_t **uuid_list, int16_t rssi_threshold, uint32_t enabled_filters,
gattlib_discovered_device_t discovered_device_cb, size_t timeout, void *user_data)
{
return GATTLIB_NOT_SUPPORTED;
}

int gattlib_adapter_scan_disable(void* adapter) {
int gattlib_adapter_scan_disable(gattlib_adapter_t* adapter) {
int device_desc = *(int*)adapter;

if (device_desc == -1) {
Expand All @@ -262,7 +262,7 @@ int gattlib_adapter_scan_disable(void* adapter) {
return result;
}

int gattlib_adapter_close(void* adapter) {
int gattlib_adapter_close(gattlib_adapter_t* adapter) {
hci_close_dev(*(int*)adapter);
free(adapter);
return GATTLIB_SUCCESS;
Expand Down
32 changes: 16 additions & 16 deletions bluez/gattlib_connect.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
struct gattlib_thread_t g_gattlib_thread = { 0 };

typedef struct {
gatt_connection_t* conn;
gattlib_connection_t* conn;
gatt_connect_cb_t connect_cb;
int connected;
int timeout;
Expand All @@ -50,7 +50,7 @@ typedef struct {
} io_connect_arg_t;

static void events_handler(const uint8_t *pdu, uint16_t len, gpointer user_data) {
gatt_connection_t *conn = user_data;
gattlib_connection_t *conn = user_data;
uint8_t opdu[ATT_MAX_MTU];
uint16_t handle, olen = 0;
uuid_t uuid = {};
Expand Down Expand Up @@ -98,7 +98,7 @@ static void events_handler(const uint8_t *pdu, uint16_t len, gpointer user_data)
}

static gboolean io_listen_cb(gpointer user_data) {
gatt_connection_t *conn = user_data;
gattlib_connection_t *conn = user_data;
gattlib_context_t* conn_context = conn->context;

g_attrib_register(conn_context->attrib, ATT_OP_HANDLE_NOTIFY,
Expand Down Expand Up @@ -178,7 +178,7 @@ static void *connection_thread(void* arg) {
return NULL;
}

static gatt_connection_t *initialize_gattlib_connection(const gchar *src, const gchar *dst,
static gattlib_connection_t *initialize_gattlib_connection(const gchar *src, const gchar *dst,
uint8_t dest_type, BtIOSecLevel sec_level, int psm, int mtu,
gatt_connect_cb_t connect_cb,
io_connect_arg_t* io_connect_arg)
Expand Down Expand Up @@ -250,7 +250,7 @@ static gatt_connection_t *initialize_gattlib_connection(const gchar *src, const
return NULL;
}

gatt_connection_t* conn = calloc(sizeof(gatt_connection_t), 1);
gattlib_connection_t* conn = calloc(sizeof(gattlib_connection_t), 1);
if (conn == NULL) {
free(conn_context);
return NULL;
Expand Down Expand Up @@ -325,13 +325,13 @@ static void get_connection_options(unsigned long options, BtIOSecLevel *bt_io_se
*mtu = GATTLIB_CONNECTION_OPTIONS_LEGACY_GET_MTU(options);
}

int gattlib_connect(void *adapter, const char *dst,
int gattlib_connect(gattlib_adapter_t* adapter, const char *dst,
unsigned long options,
gatt_connect_cb_t connect_cb,
void* user_data)
{
const char *adapter_mac_address;
gatt_connection_t *conn;
gattlib_connection_t *conn;
BtIOSecLevel bt_io_sec_level;
int psm, mtu;

Expand Down Expand Up @@ -393,11 +393,11 @@ static gboolean connection_timeout(gpointer user_data) {
* @param psm Specify the PSM for GATT/ATT over BR/EDR
* @param mtu Specify the MTU size
*/
static gatt_connection_t *gattlib_connect_with_options(const char *src, const char *dst,
static gattlib_connection_t *gattlib_connect_with_options(const char *src, const char *dst,
uint8_t dest_type, BtIOSecLevel bt_io_sec_level, int psm, int mtu)
{
GSource* timeout;
gatt_connection_t *conn;
gattlib_connection_t *conn;
io_connect_arg_t io_connect_arg;

conn = initialize_gattlib_connection(src, dst, dest_type, bt_io_sec_level,
Expand Down Expand Up @@ -444,10 +444,10 @@ static gatt_connection_t *gattlib_connect_with_options(const char *src, const ch
* @param dst Remote Bluetooth address
* @param options Options to connect to BLE device. See `GATTLIB_CONNECTION_OPTIONS_*`
*/
gatt_connection_t *gattlib_connect(void* adapter, const char *dst, unsigned long options)
gattlib_connection_t *gattlib_connect(gattlib_adapter_t* adapter, const char *dst, unsigned long options)
{
const char* adapter_mac_address;
gatt_connection_t *conn;
gattlib_connection_t *conn;
BtIOSecLevel bt_io_sec_level;
int psm, mtu;

Expand Down Expand Up @@ -483,7 +483,7 @@ gatt_connection_t *gattlib_connect(void* adapter, const char *dst, unsigned long
return conn;
}

int gattlib_disconnect(gatt_connection_t* connection, bool wait_disconnection) {
int gattlib_disconnect(gattlib_connection_t* connection, bool wait_disconnection) {
gattlib_context_t* conn_context = connection->context;

#if BLUEZ_VERSION_MAJOR == 4
Expand Down Expand Up @@ -546,7 +546,7 @@ GSource* gattlib_timeout_add_seconds(guint interval, GSourceFunc function, gpoin
return source;
}

int get_uuid_from_handle(gatt_connection_t* connection, uint16_t handle, uuid_t* uuid) {
int get_uuid_from_handle(gattlib_connection_t* connection, uint16_t handle, uuid_t* uuid) {
gattlib_context_t* conn_context = connection->context;
int i;

Expand All @@ -559,7 +559,7 @@ int get_uuid_from_handle(gatt_connection_t* connection, uint16_t handle, uuid_t*
return GATTLIB_NOT_FOUND;
}

int get_handle_from_uuid(gatt_connection_t* connection, const uuid_t* uuid, uint16_t* handle) {
int get_handle_from_uuid(gattlib_connection_t* connection, const uuid_t* uuid, uint16_t* handle) {
gattlib_context_t* conn_context = connection->context;
int i;

Expand All @@ -573,13 +573,13 @@ int get_handle_from_uuid(gatt_connection_t* connection, const uuid_t* uuid, uint
}

#if 0 // Disable until https://github.com/labapart/gattlib/issues/75 is resolved
int gattlib_get_rssi(gatt_connection_t *connection, int16_t *rssi)
int gattlib_get_rssi(gattlib_connection_t *connection, int16_t *rssi)
{
return GATTLIB_NOT_SUPPORTED;
}
#endif

int gattlib_get_rssi_from_mac(void *adapter, const char *mac_address, int16_t *rssi)
int gattlib_get_rssi_from_mac(gattlib_adapter_t* adapter, const char *mac_address, int16_t *rssi)
{
return GATTLIB_NOT_SUPPORTED;
}
14 changes: 7 additions & 7 deletions bluez/gattlib_discover.c
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ static void primary_all_cb(uint8_t status, GSList *services, void *user_data) {
data->discovered = TRUE;
}

int gattlib_discover_primary(gatt_connection_t* connection, gattlib_primary_service_t** services, int* services_count) {
int gattlib_discover_primary(gattlib_connection_t* connection, gattlib_primary_service_t** services, int* services_count) {
struct primary_all_cb_t user_data;
guint ret;

Expand Down Expand Up @@ -146,7 +146,7 @@ static void characteristic_cb(uint8_t status, GSList *characteristics, void *use
data->discovered = TRUE;
}

int gattlib_discover_char_range(gatt_connection_t* connection, uint16_t start, uint16_t end, gattlib_characteristic_t** characteristics, int* characteristics_count) {
int gattlib_discover_char_range(gattlib_connection_t* connection, uint16_t start, uint16_t end, gattlib_characteristic_t** characteristics, int* characteristics_count) {
struct characteristic_cb_t user_data;
guint ret;

Expand All @@ -170,7 +170,7 @@ int gattlib_discover_char_range(gatt_connection_t* connection, uint16_t start, u
return GATTLIB_SUCCESS;
}

int gattlib_discover_char(gatt_connection_t* connection, gattlib_characteristic_t** characteristics, int* characteristics_count) {
int gattlib_discover_char(gattlib_connection_t* connection, gattlib_characteristic_t** characteristics, int* characteristics_count) {
return gattlib_discover_char_range(connection, 0x0001, 0xffff, characteristics, characteristics_count);
}

Expand Down Expand Up @@ -264,7 +264,7 @@ static void char_desc_cb(uint8_t status, GSList *descriptors, void *user_data)
}
#endif

int gattlib_discover_desc_range(gatt_connection_t* connection, int start, int end, gattlib_descriptor_t** descriptors, int* descriptor_count) {
int gattlib_discover_desc_range(gattlib_connection_t* connection, int start, int end, gattlib_descriptor_t** descriptors, int* descriptor_count) {
gattlib_context_t* conn_context = connection->context;
struct descriptor_cb_t descriptor_data;
guint ret;
Expand Down Expand Up @@ -292,7 +292,7 @@ int gattlib_discover_desc_range(gatt_connection_t* connection, int start, int en
return GATTLIB_SUCCESS;
}

int gattlib_discover_desc(gatt_connection_t* connection, gattlib_descriptor_t** descriptors, int* descriptor_count) {
int gattlib_discover_desc(gattlib_connection_t* connection, gattlib_descriptor_t** descriptors, int* descriptor_count) {
return gattlib_discover_desc_range(connection, 0x0001, 0xffff, descriptors, descriptor_count);
}

Expand All @@ -309,7 +309,7 @@ int gattlib_discover_desc(gatt_connection_t* connection, gattlib_descriptor_t**
*
* @return GATTLIB_SUCCESS on success or GATTLIB_* error code
*/
int gattlib_get_advertisement_data(gatt_connection_t *connection,
int gattlib_get_advertisement_data(gattlib_connection_t *connection,
gattlib_advertisement_data_t **advertisement_data, size_t *advertisement_data_count,
uint16_t *manufacturer_id, uint8_t **manufacturer_data, size_t *manufacturer_data_size)
{
Expand All @@ -329,7 +329,7 @@ int gattlib_get_advertisement_data(gatt_connection_t *connection,
*
* @return GATTLIB_SUCCESS on success or GATTLIB_* error code
*/
int gattlib_get_advertisement_data_from_mac(void *adapter, const char *mac_address,
int gattlib_get_advertisement_data_from_mac(gattlib_adapter_t* adapter, const char *mac_address,
gattlib_advertisement_data_t **advertisement_data, size_t *advertisement_data_count,
uint16_t *manufacturer_id, uint8_t **manufacturer_data, size_t *manufacturer_data_size)
{
Expand Down
4 changes: 2 additions & 2 deletions bluez/gattlib_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ GSource* gattlib_timeout_add_seconds(guint interval, GSourceFunc function, gpoin
void uuid_to_bt_uuid(uuid_t* uuid, bt_uuid_t* bt_uuid);
void bt_uuid_to_uuid(bt_uuid_t* bt_uuid, uuid_t* uuid);

int get_uuid_from_handle(gatt_connection_t* connection, uint16_t handle, uuid_t* uuid);
int get_handle_from_uuid(gatt_connection_t* connection, const uuid_t* uuid, uint16_t* handle);
int get_uuid_from_handle(gattlib_connection_t* connection, uint16_t handle, uuid_t* uuid);
int get_handle_from_uuid(gattlib_connection_t* connection, const uuid_t* uuid, uint16_t* handle);

#endif
16 changes: 8 additions & 8 deletions bluez/gattlib_read_write.c
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ void uuid_to_bt_uuid(uuid_t* uuid, bt_uuid_t* bt_uuid) {
}
}

int gattlib_read_char_by_uuid(gatt_connection_t* connection, uuid_t* uuid,
int gattlib_read_char_by_uuid(gattlib_connection_t* connection, uuid_t* uuid,
void **buffer, size_t* buffer_len)
{
gattlib_context_t* conn_context = connection->context;
Expand Down Expand Up @@ -134,7 +134,7 @@ int gattlib_read_char_by_uuid(gatt_connection_t* connection, uuid_t* uuid,
return GATTLIB_SUCCESS;
}

int gattlib_read_char_by_uuid_async(gatt_connection_t* connection, uuid_t* uuid,
int gattlib_read_char_by_uuid_async(gattlib_connection_t* connection, uuid_t* uuid,
gatt_read_cb_t gatt_read_cb)
{
gattlib_context_t* conn_context = connection->context;
Expand Down Expand Up @@ -170,7 +170,7 @@ void gattlib_write_result_cb(guint8 status, const guint8 *pdu, guint16 len, gpoi
*write_completed = TRUE;
}

int gattlib_write_char_by_handle(gatt_connection_t* connection, uint16_t handle, const void* buffer, size_t buffer_len) {
int gattlib_write_char_by_handle(gattlib_connection_t* connection, uint16_t handle, const void* buffer, size_t buffer_len) {
gattlib_context_t* conn_context = connection->context;
int write_completed = FALSE;

Expand All @@ -187,7 +187,7 @@ int gattlib_write_char_by_handle(gatt_connection_t* connection, uint16_t handle,
return 0;
}

int gattlib_write_char_by_uuid(gatt_connection_t* connection, uuid_t* uuid, const void* buffer, size_t buffer_len) {
int gattlib_write_char_by_uuid(gattlib_connection_t* connection, uuid_t* uuid, const void* buffer, size_t buffer_len) {
uint16_t handle = 0;
int ret;

Expand All @@ -200,19 +200,19 @@ int gattlib_write_char_by_uuid(gatt_connection_t* connection, uuid_t* uuid, cons
return gattlib_write_char_by_handle(connection, handle, buffer, buffer_len);
}

int gattlib_write_without_response_char_by_uuid(gatt_connection_t* connection, uuid_t* uuid, const void* buffer, size_t buffer_len)
int gattlib_write_without_response_char_by_uuid(gattlib_connection_t* connection, uuid_t* uuid, const void* buffer, size_t buffer_len)
{
// Only supported in the DBUS API (ie: Bluez > v5.40) at the moment
return GATTLIB_NOT_SUPPORTED;
}

int gattlib_write_without_response_char_by_handle(gatt_connection_t* connection, uint16_t handle, const void* buffer, size_t buffer_len)
int gattlib_write_without_response_char_by_handle(gattlib_connection_t* connection, uint16_t handle, const void* buffer, size_t buffer_len)
{
// Only supported in the DBUS API (ie: Bluez > v5.40) at the moment
return GATTLIB_NOT_SUPPORTED;
}

int gattlib_notification_start(gatt_connection_t* connection, const uuid_t* uuid) {
int gattlib_notification_start(gattlib_connection_t* connection, const uuid_t* uuid) {
uint16_t handle;
uint16_t enable_notification = 0x0001;

Expand All @@ -225,7 +225,7 @@ int gattlib_notification_start(gatt_connection_t* connection, const uuid_t* uuid
return gattlib_write_char_by_handle(connection, handle + 1, &enable_notification, sizeof(enable_notification));
}

int gattlib_notification_stop(gatt_connection_t* connection, const uuid_t* uuid) {
int gattlib_notification_stop(gattlib_connection_t* connection, const uuid_t* uuid) {
uint16_t handle;
uint16_t enable_notification = 0x0000;

Expand Down
19 changes: 9 additions & 10 deletions common/gattlib_callback_connected_device.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
#include "gattlib_internal.h"

#if defined(WITH_PYTHON)
void gattlib_connected_device_python_callback(void *adapter, const char *dst, gatt_connection_t* connection, int error, void* user_data) {
void gattlib_connected_device_python_callback(gattlib_adapter_t* adapter, const char *dst, gattlib_connection_t* connection, int error, void* user_data) {
struct gattlib_python_args* args = user_data;
PyObject *result;

Expand All @@ -17,7 +17,7 @@ void gattlib_connected_device_python_callback(void *adapter, const char *dst, ga

const char* argument_string;
// We pass pointer into integer/long parameter. We need to check the address size of the platform
// arguments: (void *adapter, const char *dst, gatt_connection_t* connection, void* user_data)
// arguments: (gattlib_adapter_t* adapter, const char *dst, gattlib_connection_t* connection, void* user_data)
if (sizeof(void*) == 8) {
argument_string = "(LsLIO)";
} else {
Expand Down Expand Up @@ -47,12 +47,11 @@ void gattlib_connected_device_python_callback(void *adapter, const char *dst, ga
#endif

static gpointer _gattlib_connected_device_thread(gpointer data) {
gatt_connection_t* connection = data;
gattlib_context_t* conn_context = connection->context;
const gchar *device_mac_address = org_bluez_device1_get_address(conn_context->device);
gattlib_connection_t* connection = data;
const gchar *device_mac_address = org_bluez_device1_get_address(connection->backend.device);

// Mutex to ensure the device is valid and not freed during its use
g_mutex_lock(&connection->device_mutex);
g_mutex_lock(&connection->device->device_mutex);
// Mutex to ensure the handler is valid
g_rec_mutex_lock(&connection->on_connection.mutex);

Expand All @@ -61,21 +60,21 @@ static gpointer _gattlib_connected_device_thread(gpointer data) {
}

connection->on_connection.callback.connection_handler(
conn_context->adapter, device_mac_address, connection, 0 /* no error */,
connection->device->adapter, device_mac_address, connection, 0 /* no error */,
connection->on_connection.user_data);

EXIT:
g_rec_mutex_unlock(&connection->on_connection.mutex);
g_mutex_unlock(&connection->device_mutex);
g_mutex_unlock(&connection->device->device_mutex);
return NULL;
}

static void* _connected_device_thread_args_allocator(va_list args) {
gatt_connection_t* connection = va_arg(args, gatt_connection_t*);
gattlib_connection_t* connection = va_arg(args, gattlib_connection_t*);
return connection;
}

void gattlib_on_connected_device(gatt_connection_t* connection) {
void gattlib_on_connected_device(gattlib_connection_t* connection) {
gattlib_handler_dispatch_to_thread(
&connection->on_connection,
#if defined(WITH_PYTHON)
Expand Down
Loading

0 comments on commit 014c280

Please sign in to comment.