#include "camutex.h"
#include "caqueueingthread.h"
#include "cagattservice.h"
+#include "oic_string.h"
#include "oic_malloc.h"
#include "caleutil.h"
/**
* Callback to notify any error in LE adapter.
*/
-static CABLEErrorHandleCallback g_serverErrorCallback;
+static CABLEErrorHandleCallback g_serverErrorCallback = NULL;
/**
* To keep the state of GATT server if started or not.
*/
static GMainLoop *g_eventLoop = NULL;
+/**
+ * This contains the list of OIC clients connected to the server.
+ */
+static LEClientInfoList *g_LEClientList = NULL;
+
+/**
+ * Mutex to synchronize access to LE ClientList.
+ */
+static ca_mutex g_LEClientListMutex = NULL;
+
void CALEGattServerConnectionStateChanged(bool connected, const char *remoteAddress)
{
VERIFY_NON_NULL_VOID(remoteAddress, TAG, "remote address");
if (connected)
{
OIC_LOG_V(DEBUG, TAG, "Connected to [%s]", remoteAddress);
+ char *addr = OICStrdup(remoteAddress);
+ ca_mutex_lock(g_LEClientListMutex);
+ CAResult_t result = CAAddLEClientInfoToList(&g_LEClientList, addr);
+ if (CA_STATUS_OK != result)
+ {
+ OIC_LOG(ERROR, TAG, "CAAddLEClientInfoToList failed");
+ ca_mutex_unlock(g_LEClientListMutex);
+ OICFree(addr);
+ return;
+ }
+ ca_mutex_unlock(g_LEClientListMutex);
}
else
{
OIC_LOG_V(DEBUG, TAG, "Disconnected from [%s]", remoteAddress);
+ ca_mutex_lock(g_LEClientListMutex);
+ CARemoveLEClientInfoFromList(&g_LEClientList, remoteAddress);
+ ca_mutex_unlock(g_LEClientListMutex);
}
}
g_isLEGattServerStarted = false;
+ ca_mutex_lock(g_LEClientListMutex);
+ CADisconnectAllClient(g_LEClientList);
+ g_LEClientList = NULL;
+ ca_mutex_unlock(g_LEClientListMutex);
+
CAResult_t res = CALEStopAdvertise();
{
OIC_LOG_V(ERROR, TAG, "CALEStopAdvertise failed with ret[%d]", res);
// Kill g main loops and kill threads
g_main_loop_quit(g_eventLoop);
}
+ g_eventLoop = NULL;
}
else
{
}
}
+ if (NULL == g_LEClientListMutex)
+ {
+ g_LEClientListMutex = ca_mutex_new();
+ if (NULL == g_LEClientListMutex)
+ {
+ OIC_LOG(ERROR, TAG, "ca_mutex_new failed");
+ return CA_STATUS_FAILED;
+ }
+ }
+
OIC_LOG(DEBUG, TAG, "OUT");
return CA_STATUS_OK;
}
ca_mutex_free(g_leReqRespCbMutex);
g_leReqRespCbMutex = NULL;
+ ca_mutex_free(g_leServerThreadPoolMutex);
+ g_leServerThreadPoolMutex = NULL;
+
+ ca_mutex_free(g_LEClientListMutex);
+ g_LEClientListMutex = NULL;
+
OIC_LOG(DEBUG, TAG, "OUT");
}
return CA_STATUS_FAILED;
}
- bt_gatt_server_h server;
-
- ret = bt_gatt_server_create(&server);
- if (0 != ret)
- {
- OIC_LOG_V(ERROR, TAG, "bt_gatt_server_create failed with ret[%s]",
- CALEGetErrorMsg(ret));
- return CA_STATUS_FAILED;
- }
-
- if (NULL != g_gattServer)
+ if (!g_gattServer)
{
- OICFree(g_gattServer);
- g_gattServer = NULL;
+ OIC_LOG(DEBUG, TAG, "g_gattServer is NULL. create gatt server..");
+ ret = bt_gatt_server_create(&g_gattServer);
+ if (0 != ret)
+ {
+ OIC_LOG_V(ERROR, TAG, "bt_gatt_server_create failed with ret[%s]",
+ CALEGetErrorMsg(ret));
+ return CA_STATUS_FAILED;
+ }
}
- g_gattServer = server;
OIC_LOG(DEBUG, TAG, "OUT");
return CA_STATUS_OK;
CALEGetErrorMsg(ret));
return CA_STATUS_FAILED;
}
+ g_gattServer = NULL;
ret = bt_gatt_server_deinitialize();
if (0 != ret)
OIC_LOG_V(DEBUG, TAG, "service uuid %s", serviceUUID);
- bt_gatt_h service = NULL;
bt_gatt_service_type_e type = BT_GATT_SERVICE_TYPE_PRIMARY;
- int ret = bt_gatt_service_create(serviceUUID, type, &service);
+ ca_mutex_lock(g_leServiceMutex);
+ int ret = bt_gatt_service_create(serviceUUID, type, &g_gattSvcPath);
if (0 != ret)
{
+ ca_mutex_unlock(g_leServiceMutex);
OIC_LOG_V(ERROR, TAG, "bt_gatt_service_create failed with ret [%s]",
- CALEGetErrorMsg(ret));
+ CALEGetErrorMsg(ret));
return CA_STATUS_FAILED;
}
+ ca_mutex_unlock(g_leServiceMutex);
- if (NULL != service)
+ if (g_gattSvcPath)
{
- OIC_LOG_V(DEBUG, TAG, "ServicePath obtained is %s", (char *)service);
-
- ca_mutex_lock(g_leServiceMutex);
-
- if (NULL != g_gattSvcPath)
- {
- OICFree(g_gattSvcPath);
- g_gattSvcPath = NULL;
- }
- g_gattSvcPath = service;
-
- ca_mutex_unlock(g_leServiceMutex);
+ OIC_LOG_V(DEBUG, TAG, "ServicePath obtained is %s", (char *)g_gattSvcPath);
}
OIC_LOG(DEBUG, TAG, "OUT");
int permissions = BT_GATT_PERMISSION_READ | BT_GATT_PERMISSION_WRITE;
int properties;
- if(read)
+ if (read)
{
properties = BT_GATT_PROPERTY_NOTIFY | BT_GATT_PROPERTY_READ;
}
properties = BT_GATT_PROPERTY_WRITE | BT_GATT_PROPERTY_READ;
}
- bt_gatt_h charPath;
+ bt_gatt_h charPath = NULL;
int ret = bt_gatt_characteristic_create(charUUID, permissions, properties, charValue,
charValueLen, &charPath);
&descriptor);
if (0 != ret)
{
+ ca_mutex_unlock(g_leCharacteristicMutex);
OIC_LOG_V(ERROR, TAG,
"bt_gatt_descriptor_create failed with ret[%s]",
CALEGetErrorMsg(ret));
ret = bt_gatt_characteristic_add_descriptor(charPath, descriptor);
if (0 != ret)
{
+ ca_mutex_unlock(g_leCharacteristicMutex);
OIC_LOG_V(ERROR, TAG,
"bt_gatt_characteristic_add_descriptor failed with ret[%s]",
CALEGetErrorMsg(ret));
return CA_STATUS_FAILED;
}
- if (NULL != g_gattReadCharPath)
- {
- OICFree(g_gattReadCharPath);
- g_gattReadCharPath = NULL;
- }
g_gattReadCharPath = charPath;
-
}
else
{
- if (NULL != g_gattWriteCharPath)
- {
- OICFree(g_gattWriteCharPath);
- g_gattWriteCharPath = NULL;
- }
g_gattWriteCharPath = charPath;
}
}
ret = bt_gatt_server_notify(g_gattReadCharPath, false, CALEServerNotificationSentCB,
- address, NULL);
+ NULL);
if (0 != ret)
{
OIC_LOG_V(ERROR, TAG,
}
ret = bt_gatt_server_notify(g_gattReadCharPath, false, CALEServerNotificationSentCB,
- NULL, NULL);
+ NULL);
if (0 != ret)
{
OIC_LOG_V(ERROR, TAG,