#include "camutex.h"
#include "caqueueingthread.h"
#include "cagattservice.h"
+#include "oic_string.h"
#include "oic_malloc.h"
#include "caleutil.h"
*/
static GMainLoop *g_eventLoop = NULL;
-static CALEConnectionStateChangedCallback g_connStateCb = NULL;
+/**
+ * This contains the list of OIC clients connected to the server.
+ */
+static LEClientInfoList *g_LEClientList = NULL;
-void CASetLEConnectionStateChangedCallback(CALEConnectionStateChangedCallback connStateCb)
-{
- g_connStateCb = connStateCb;
-}
+/**
+ * Mutex to synchronize access to LE ClientList.
+ */
+static ca_mutex g_LEClientListMutex = NULL;
void CALEGattServerConnectionStateChanged(bool connected, const char *remoteAddress)
{
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);
if (g_connStateCb)
{
g_connStateCb(CA_ADAPTER_GATT_BTLE, remoteAddress, true);
else
{
OIC_LOG_V(DEBUG, TAG, "Disconnected from [%s]", remoteAddress);
+ ca_mutex_lock(g_LEClientListMutex);
+ CARemoveLEClientInfoFromList(&g_LEClientList, remoteAddress);
+ ca_mutex_unlock(g_LEClientListMutex);
if (g_connStateCb)
{
g_connStateCb(CA_ADAPTER_GATT_BTLE, remoteAddress, false);
{
OIC_LOG(DEBUG, TAG, "IN");
- ca_mutex_lock(g_leServerThreadPoolMutex);
- if (NULL == g_leServerThreadPool)
+ ca_mutex_lock(g_leServerStateMutex);
+ if (true == g_isLEGattServerStarted)
+ {
+ OIC_LOG(ERROR, TAG, "Gatt Server is already running");
+ ca_mutex_unlock(g_leServerStateMutex);
+ return CA_STATUS_OK;
+ }
+
+ CAResult_t ret = CAInitLEGattServer();
+ if (CA_STATUS_OK != ret)
+ {
+ OIC_LOG_V(ERROR, TAG, "CAInitLEGattServer failed[%d]", ret);
+ ca_mutex_unlock(g_leServerStateMutex);
+ CATerminateLEGattServer();
+ return CA_STATUS_FAILED;
+ }
+
+ char *serviceUUID = CA_GATT_SERVICE_UUID;
+
+ ret = CAAddNewLEServiceInGattServer(serviceUUID);
+ if (CA_STATUS_OK != ret)
{
- OIC_LOG(ERROR, TAG, "g_leServerThreadPool is NULL");
- ca_mutex_unlock(g_leServerThreadPoolMutex);
+ OIC_LOG_V(ERROR, TAG, "CAAddNewLEServiceInGattServer failed[%d]", ret);
+ ca_mutex_unlock(g_leServerStateMutex);
+ CATerminateLEGattServer();
return CA_STATUS_FAILED;
}
- CAResult_t ret = ca_thread_pool_add_task(g_leServerThreadPool, CAStartLEGattServerThread,
- NULL);
+ static const char charReadUUID[] = CA_GATT_RESPONSE_CHRC_UUID;
+ char charReadValue[] = {33, 44, 55, 66}; // These are initial random values
+
+ // For Read Characteristics.
+ ret = CAAddNewCharacteristicsToGattServer(g_gattSvcPath, charReadUUID, charReadValue,
+ CA_LE_INITIAL_BUF_SIZE, true);
if (CA_STATUS_OK != ret)
{
- OIC_LOG_V(ERROR, TAG, "ca_thread_pool_add_task failed with ret [%d]", ret);
- ca_mutex_unlock(g_leServerThreadPoolMutex);
+ OIC_LOG_V(ERROR, TAG, "CAAddNewCharacteristicsToGattServer failed[%d]", ret);
+ ca_mutex_unlock(g_leServerStateMutex);
+ CATerminateLEGattServer();
return CA_STATUS_FAILED;
}
- ca_mutex_unlock(g_leServerThreadPoolMutex);
+ static const char charWriteUUID[] = CA_GATT_REQUEST_CHRC_UUID;
+ char charWriteValue[] = {33, 44, 55, 66}; // These are initial random values
+
+
+ ret = CAAddNewCharacteristicsToGattServer(g_gattSvcPath, charWriteUUID, charWriteValue,
+ CA_LE_INITIAL_BUF_SIZE, false); // For Write Characteristics.
+ if (CA_STATUS_OK != ret )
+ {
+ OIC_LOG_V(ERROR, TAG, "CAAddNewCharacteristicsToGattServer failed[%d]", ret);
+ ca_mutex_unlock(g_leServerStateMutex);
+ CATerminateLEGattServer();
+ return CA_STATUS_FAILED;
+ }
+
+ ret = CARegisterLEServicewithGattServer(g_gattSvcPath);
+ if (CA_STATUS_OK != ret )
+ {
+ OIC_LOG_V(ERROR, TAG, "CARegisterLEServicewithGattServer failed[%d]", ret);
+ ca_mutex_unlock(g_leServerStateMutex);
+ CATerminateLEGattServer();
+ return CA_STATUS_FAILED;
+ }
+
+ ret = CALEStartAdvertise(serviceUUID);
+ if (CA_STATUS_OK != ret)
+ {
+ OIC_LOG_V(ERROR, TAG, "CALEStartAdvertise failed[%d]", ret);
+ ca_mutex_unlock(g_leServerStateMutex);
+ CATerminateLEGattServer();
+ return CA_STATUS_FAILED;
+ }
+
+ g_isLEGattServerStarted = true;
+
+ ca_mutex_unlock(g_leServerStateMutex);
+
OIC_LOG(DEBUG, TAG, "OUT");
return CA_STATUS_OK;
}
return CA_STATUS_OK;
}
-void CAStartLEGattServerThread(void *data)
-{
- OIC_LOG(DEBUG, TAG, "IN");
- ca_mutex_lock(g_leServerStateMutex);
- if (true == g_isLEGattServerStarted)
- {
- OIC_LOG(ERROR, TAG, "Gatt Server is already running");
- ca_mutex_unlock(g_leServerStateMutex);
- CATerminateLEGattServer();
- return;
- }
-
- CAResult_t ret = CAInitLEGattServer();
- if (CA_STATUS_OK != ret)
- {
- OIC_LOG_V(ERROR, TAG, "CAInitLEGattService failed[%d]", ret);
- ca_mutex_unlock(g_leServerStateMutex);
- CATerminateLEGattServer();
- return;
- }
-
- char *serviceUUID = CA_GATT_SERVICE_UUID;
-
- ret = CAAddNewLEServiceInGattServer(serviceUUID);
- if (CA_STATUS_OK != ret)
- {
- OIC_LOG_V(ERROR, TAG, "CAAddNewLEServiceInGattServer failed[%d]", ret);
- ca_mutex_unlock(g_leServerStateMutex);
- CATerminateLEGattServer();
- return;
- }
-
- static const char charReadUUID[] = CA_GATT_RESPONSE_CHRC_UUID;
- char charReadValue[] = {33, 44, 55, 66}; // These are initial random values
-
- // For Read Characteristics.
- ret = CAAddNewCharacteristicsToGattServer(g_gattSvcPath, charReadUUID, charReadValue,
- CA_LE_INITIAL_BUF_SIZE, true);
- if (CA_STATUS_OK != ret)
- {
- OIC_LOG_V(ERROR, TAG, "CAAddNewCharacteristicsToGattServer failed[%d]", ret);
- ca_mutex_unlock(g_leServerStateMutex);
- CATerminateLEGattServer();
- return;
- }
-
- static const char charWriteUUID[] = CA_GATT_REQUEST_CHRC_UUID;
- char charWriteValue[] = {33, 44, 55, 66}; // These are initial random values
-
-
- ret = CAAddNewCharacteristicsToGattServer(g_gattSvcPath, charWriteUUID, charWriteValue,
- CA_LE_INITIAL_BUF_SIZE, false); // For Write Characteristics.
- if (CA_STATUS_OK != ret )
- {
- OIC_LOG_V(ERROR, TAG, "CAAddNewCharacteristicsToGattServer failed[%d]", ret);
- ca_mutex_unlock(g_leServerStateMutex);
- CATerminateLEGattServer();
- return;
- }
-
- ret = CARegisterLEServicewithGattServer(g_gattSvcPath);
- if (CA_STATUS_OK != ret )
- {
- OIC_LOG_V(ERROR, TAG, "CARegisterLEServicewithGattServer failed[%d]", ret);
- ca_mutex_unlock(g_leServerStateMutex);
- CATerminateLEGattServer();
- return;
- }
-
- ret = CALEStartAdvertise(serviceUUID);
- if (CA_STATUS_OK != ret)
- {
- OIC_LOG_V(ERROR, TAG, "CALEStartAdvertise failed[%d]", ret);
- ca_mutex_unlock(g_leServerStateMutex);
- CATerminateLEGattServer();
- return;
- }
-
- g_isLEGattServerStarted = true;
-
- ca_mutex_unlock(g_leServerStateMutex);
-
- OIC_LOG(DEBUG, TAG, "LE Server initialization complete.");
-
- GMainContext *thread_context = NULL;
-
- thread_context = g_main_context_new();
-
- g_eventLoop = g_main_loop_new(thread_context, FALSE);
-
- g_main_context_push_thread_default(thread_context);
-
- g_main_loop_run(g_eventLoop);
-
- OIC_LOG(DEBUG, TAG, "OUT");
-}
-
CAResult_t CAStopLEGattServer()
{
OIC_LOG(DEBUG, TAG, "IN");
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);
return CA_STATUS_FAILED;
}
}
+
+ if (NULL == g_leServerThreadPoolMutex)
+ {
+ g_leServerThreadPoolMutex = ca_mutex_new();
+ if (NULL == g_leServerThreadPoolMutex)
+ {
+ OIC_LOG(ERROR, TAG, "ca_mutex_new failed");
+ return CA_STATUS_FAILED;
+ }
+ }
+
+ 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");
}