X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=resource%2Fcsdk%2Fconnectivity%2Fsrc%2Fbt_le_adapter%2Ftizen%2Fcaleserver.c;h=672e7fb86d0a7e0507ffba58783dbe78ea8d5cc7;hb=1cee1631595cac6a6394ac2e0b365c6dd5a42c68;hp=125de56d57fdb3dc08a43db21e0feb6a1d2e0efa;hpb=390866079e285d2c74918432c0d597d5da52f8a0;p=platform%2Fupstream%2Fiotivity.git diff --git a/resource/csdk/connectivity/src/bt_le_adapter/tizen/caleserver.c b/resource/csdk/connectivity/src/bt_le_adapter/tizen/caleserver.c index 125de56..672e7fb 100644 --- a/resource/csdk/connectivity/src/bt_le_adapter/tizen/caleserver.c +++ b/resource/csdk/connectivity/src/bt_le_adapter/tizen/caleserver.c @@ -24,6 +24,7 @@ #include "camutex.h" #include "caqueueingthread.h" #include "cagattservice.h" +#include "oic_string.h" #include "oic_malloc.h" #include "caleutil.h" @@ -114,12 +115,15 @@ static ca_thread_pool_t g_leServerThreadPool = NULL; */ 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) { @@ -128,6 +132,17 @@ void CALEGattServerConnectionStateChanged(bool connected, const char *remoteAddr 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); @@ -136,6 +151,9 @@ void CALEGattServerConnectionStateChanged(bool connected, const char *remoteAddr 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); @@ -153,24 +171,84 @@ CAResult_t CAStartLEGattServer() { 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; } @@ -249,103 +327,6 @@ CAResult_t CALEStopAdvertise() 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"); @@ -361,6 +342,11 @@ CAResult_t CAStopLEGattServer() 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); @@ -478,6 +464,28 @@ CAResult_t CAInitGattServerMutexVariables() 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; } @@ -497,6 +505,12 @@ void CATerminateGattServerMutexVariables() 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"); }