mirror of https://github.com/labapart/gattlib
adapter: Added support to open multiple time the same adapter
parent
dc009029fa
commit
f609f7d507
|
@ -10,6 +10,38 @@
|
||||||
// It could happen when using Python wrapper.
|
// It could happen when using Python wrapper.
|
||||||
GSList *m_adapter_list;
|
GSList *m_adapter_list;
|
||||||
|
|
||||||
|
static int stricmp(char const *a, char const *b) {
|
||||||
|
for (;; a++, b++) {
|
||||||
|
int d = tolower((unsigned char)*a) - tolower((unsigned char)*b);
|
||||||
|
if (d != 0 || !*a)
|
||||||
|
return d;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static gint _is_adapter_id(gconstpointer a, gconstpointer b) {
|
||||||
|
const gattlib_adapter_t* adapter = a;
|
||||||
|
const char* adapter_id = b;
|
||||||
|
|
||||||
|
return stricmp(adapter->id, adapter_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
gattlib_adapter_t* gattlib_adapter_from_id(const char* adapter_id) {
|
||||||
|
gattlib_adapter_t* adapter = NULL;
|
||||||
|
|
||||||
|
g_rec_mutex_lock(&m_gattlib_mutex);
|
||||||
|
|
||||||
|
GSList *adapter_entry = g_slist_find_custom(m_adapter_list, adapter_id, _is_adapter_id);
|
||||||
|
if (adapter_entry == NULL) {
|
||||||
|
goto EXIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
adapter = adapter_entry->data;
|
||||||
|
|
||||||
|
EXIT:
|
||||||
|
g_rec_mutex_unlock(&m_gattlib_mutex);
|
||||||
|
return adapter;
|
||||||
|
}
|
||||||
|
|
||||||
bool gattlib_adapter_is_valid(gattlib_adapter_t* adapter) {
|
bool gattlib_adapter_is_valid(gattlib_adapter_t* adapter) {
|
||||||
bool is_valid;
|
bool is_valid;
|
||||||
|
|
||||||
|
|
|
@ -68,6 +68,9 @@ struct _gattlib_adapter {
|
||||||
// Context specific to the backend implementation (eg: dbus backend)
|
// Context specific to the backend implementation (eg: dbus backend)
|
||||||
struct _gattlib_adapter_backend backend;
|
struct _gattlib_adapter_backend backend;
|
||||||
|
|
||||||
|
// BLE adapter id (could be its DBUS device path on Linux)
|
||||||
|
char* id;
|
||||||
|
|
||||||
// BLE adapter name
|
// BLE adapter name
|
||||||
char* name;
|
char* name;
|
||||||
|
|
||||||
|
@ -121,6 +124,7 @@ extern GSList *m_adapter_list;
|
||||||
// This structure is used for inter-thread communication
|
// This structure is used for inter-thread communication
|
||||||
extern struct gattlib_signal m_gattlib_signal;
|
extern struct gattlib_signal m_gattlib_signal;
|
||||||
|
|
||||||
|
gattlib_adapter_t* gattlib_adapter_from_id(const char* adapter_id);
|
||||||
bool gattlib_adapter_is_valid(gattlib_adapter_t* adapter);
|
bool gattlib_adapter_is_valid(gattlib_adapter_t* adapter);
|
||||||
bool gattlib_adapter_is_scanning(gattlib_adapter_t* adapter);
|
bool gattlib_adapter_is_scanning(gattlib_adapter_t* adapter);
|
||||||
int gattlib_adapter_ref(gattlib_adapter_t* adapter);
|
int gattlib_adapter_ref(gattlib_adapter_t* adapter);
|
||||||
|
|
|
@ -28,10 +28,21 @@ int gattlib_adapter_open(const char* adapter_name, gattlib_adapter_t** adapter)
|
||||||
adapter_name = GATTLIB_DEFAULT_ADAPTER;
|
adapter_name = GATTLIB_DEFAULT_ADAPTER;
|
||||||
}
|
}
|
||||||
|
|
||||||
GATTLIB_LOG(GATTLIB_DEBUG, "Open bluetooth adapter %s", adapter_name);
|
|
||||||
|
|
||||||
snprintf(object_path, sizeof(object_path), "/org/bluez/%s", adapter_name);
|
snprintf(object_path, sizeof(object_path), "/org/bluez/%s", adapter_name);
|
||||||
|
|
||||||
|
// Check if adapter has already be loaded
|
||||||
|
g_rec_mutex_lock(&m_gattlib_mutex);
|
||||||
|
*adapter = gattlib_adapter_from_id(object_path);
|
||||||
|
if (*adapter != NULL) {
|
||||||
|
GATTLIB_LOG(GATTLIB_DEBUG, "Bluetooth adapter %s has already been opened. Re-use it", adapter_name);
|
||||||
|
gattlib_adapter_ref(*adapter);
|
||||||
|
g_rec_mutex_unlock(&m_gattlib_mutex);
|
||||||
|
return GATTLIB_SUCCESS;
|
||||||
|
}
|
||||||
|
g_rec_mutex_unlock(&m_gattlib_mutex);
|
||||||
|
|
||||||
|
GATTLIB_LOG(GATTLIB_DEBUG, "Open bluetooth adapter %s", adapter_name);
|
||||||
|
|
||||||
adapter_proxy = org_bluez_adapter1_proxy_new_for_bus_sync(
|
adapter_proxy = org_bluez_adapter1_proxy_new_for_bus_sync(
|
||||||
G_BUS_TYPE_SYSTEM, G_DBUS_PROXY_FLAGS_NONE,
|
G_BUS_TYPE_SYSTEM, G_DBUS_PROXY_FLAGS_NONE,
|
||||||
"org.bluez",
|
"org.bluez",
|
||||||
|
@ -58,6 +69,7 @@ int gattlib_adapter_open(const char* adapter_name, gattlib_adapter_t** adapter)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize stucture
|
// Initialize stucture
|
||||||
|
gattlib_adapter->id = strdup(object_path);
|
||||||
gattlib_adapter->name = strdup(adapter_name);
|
gattlib_adapter->name = strdup(adapter_name);
|
||||||
gattlib_adapter->reference_counter = 1;
|
gattlib_adapter->reference_counter = 1;
|
||||||
gattlib_adapter->backend.adapter_proxy = adapter_proxy;
|
gattlib_adapter->backend.adapter_proxy = adapter_proxy;
|
||||||
|
@ -651,11 +663,6 @@ int gattlib_adapter_close(gattlib_adapter_t* adapter) {
|
||||||
bool are_devices_disconnected;
|
bool are_devices_disconnected;
|
||||||
int ret = GATTLIB_SUCCESS;
|
int ret = GATTLIB_SUCCESS;
|
||||||
|
|
||||||
//
|
|
||||||
// TODO: Should we use reference counting to be able to open multiple times an adapter
|
|
||||||
// without freeing it on the first gattlib_adapter_close()
|
|
||||||
//
|
|
||||||
|
|
||||||
g_rec_mutex_lock(&m_gattlib_mutex);
|
g_rec_mutex_lock(&m_gattlib_mutex);
|
||||||
|
|
||||||
if (!gattlib_adapter_is_valid(adapter)) {
|
if (!gattlib_adapter_is_valid(adapter)) {
|
||||||
|
@ -689,9 +696,6 @@ int gattlib_adapter_close(gattlib_adapter_t* adapter) {
|
||||||
// Unref/Free the adapter
|
// Unref/Free the adapter
|
||||||
gattlib_adapter_unref(adapter);
|
gattlib_adapter_unref(adapter);
|
||||||
|
|
||||||
// Remove adapter from the global list
|
|
||||||
m_adapter_list = g_slist_remove(m_adapter_list, adapter);
|
|
||||||
|
|
||||||
EXIT:
|
EXIT:
|
||||||
g_rec_mutex_unlock(&m_gattlib_mutex);
|
g_rec_mutex_unlock(&m_gattlib_mutex);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -730,6 +734,11 @@ int gattlib_adapter_unref(gattlib_adapter_t* adapter) {
|
||||||
adapter->backend.adapter_proxy = NULL;
|
adapter->backend.adapter_proxy = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (adapter->id != NULL) {
|
||||||
|
free(adapter->id);
|
||||||
|
adapter->id = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (adapter->name != NULL) {
|
if (adapter->name != NULL) {
|
||||||
free(adapter->name);
|
free(adapter->name);
|
||||||
adapter->name = NULL;
|
adapter->name = NULL;
|
||||||
|
@ -737,6 +746,9 @@ int gattlib_adapter_unref(gattlib_adapter_t* adapter) {
|
||||||
|
|
||||||
gattlib_devices_free(adapter);
|
gattlib_devices_free(adapter);
|
||||||
|
|
||||||
|
// Remove adapter from the global list
|
||||||
|
m_adapter_list = g_slist_remove(m_adapter_list, adapter);
|
||||||
|
|
||||||
free(adapter);
|
free(adapter);
|
||||||
|
|
||||||
EXIT:
|
EXIT:
|
||||||
|
|
Loading…
Reference in New Issue