1 /******************************************************************
3 * Copyright 2014 Samsung Electronics All Rights Reserved.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
19 ******************************************************************/
20 #include "caleadapter.h"
23 #include <arpa/inet.h>
24 #include <sys/socket.h>
29 #endif //#ifdef __TIZEN__
34 #include "cableserver.h"
35 #include "cableclient.h"
38 #include "caadapterutils.h"
40 #include "BLEAdapterArduino.h"
41 #include "caadapterutils.h"
42 #endif //#ifdef __TIZEN__
43 #include "caqueueingthread.h"
44 #include "camsgparser.h"
47 #define CALEADAPTER_TAG "CA_BLE_ADAPTER"
49 static CANetworkChangeCallback gNetworkCallback = NULL;
51 static char gLocalBLEAddress[16] = { 0, };
53 static CABool_t gIsServer = CA_FALSE;
55 static u_mutex gBleIsServerMutex = NULL;
57 static u_mutex gBleNetworkCbMutex = NULL;
59 static u_mutex gBleLocalAddressMutex = NULL;
62 * @var gBleClientThreadPool
63 * @brief reference to threadpool
65 static u_thread_pool_t gBleAdapterThreadPool = NULL;
68 * @var gBleAdapterThreadPoolMutex
69 * @brief Mutex to synchronize the task to be pushed to thread pool.
71 static u_mutex gBleAdapterThreadPoolMutex = NULL;
74 * @var gBLEClientSendQueueHandle
75 * @brief Queue to process the outgoing packets from GATTClient.
77 static CAQueueingThread_t *gBLEClientSendQueueHandle = NULL;
80 * @var gCABleClientReceiverQueue
81 * @brief Queue to process the incoming packets to GATT Client.
83 static CAQueueingThread_t *gCABleClientReceiverQueue = NULL;
86 * @var gBleClientSendDataMutex
87 * @brief Mutex to synchronize the queing of the data from SenderQueue.
89 static u_mutex gBleClientSendDataMutex = NULL;
93 * @var gBleClientReceiveDataMutex
94 * @brief Mutex to synchronize the queing of the data from ReceiverQueue.
96 static u_mutex gBleClientReceiveDataMutex = NULL;
99 * @var gDataReceiverHandlerState
100 * @brief Stop condition of redvhandler.
102 static bool gDataReceiverHandlerState = false;
105 * @var isHeaderAvailable
106 * @brief to differentiate btw header and data packet.
108 static CABool_t isHeaderAvailable = false;
111 * @var gNetworkPacketReceivedServerCallback
112 * @brief Maintains the callback to be notified on receival of network packets from other
115 static CANetworkPacketReceivedCallback gNetworkPacketReceivedServerCallback = NULL;
118 * @var gSendQueueHandle
119 * @brief Queue to process the outgoing packets from GATTServer.
121 //static CAAdapterMessageQueue_t *gSendQueueHandle = NULL;
123 static CAQueueingThread_t *gSendQueueHandle = NULL;
126 * @var gCABleServerReceiverQueue
127 * @brief Queue to process the incoming packets to GATTServer
129 static CAQueueingThread_t *gCABleServerReceiverQueue = NULL;
132 * @var gBleServerSendDataMutex
133 * @brief Mutex to synchronize the queing of the data from SenderQueue.
135 static u_mutex gBleServerSendDataMutex = NULL;
138 * @var gBleServerReceiveDataMutex
139 * @brief Mutex to synchronize the queing of the data from ReceiverQueue.
141 static u_mutex gBleServerReceiveDataMutex = NULL;
143 static u_mutex gBleAdapterReqRespCbMutex = NULL;
145 static CANetworkPacketReceivedCallback gNetworkPacketReceivedCallback = NULL;
147 * @ENUM CALeServerStatus
148 * @brief status of BLE Server Status
150 * This ENUM provides information of LE Adapter Server status
154 CA_SERVER_NOTSTARTED = 0,
159 static CALeServerStatus gLeServerStatus = CA_SERVER_NOTSTARTED;
161 int32_t CALERegisterNetworkNotifications(CANetworkChangeCallback netCallback);
164 void CALEDeviceStateChangedCb(int32_t result, bt_adapter_state_e adapter_state,
166 CAResult_t CAInitBleAdapterMutex();
167 CAResult_t CATermiateBleAdapterMutex();
169 #endif //#ifdef __TIZEN__
171 CAResult_t CAInitializeLE(CARegisterConnectivityCallback registerCallback,
172 CANetworkPacketReceivedCallback reqRespCallback,
173 CANetworkChangeCallback netCallback,
174 u_thread_pool_t handle)
176 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
179 VERIFY_NON_NULL(registerCallback, NULL, "RegisterConnectivity callback is null");
180 VERIFY_NON_NULL(reqRespCallback, NULL, "PacketReceived Callback is null");
181 VERIFY_NON_NULL(netCallback, NULL, "NetworkChange Callback is null");
183 CAResult_t result = CAInitBleAdapterMutex();
184 if (CA_STATUS_OK != result)
186 OIC_LOG(ERROR, CALEADAPTER_TAG, "CAInitBleAdapterMutex failed!");
187 return CA_STATUS_FAILED;
194 #endif //#ifdef __TIZEN__
196 CASetBleServerThreadPoolHandle(handle);
197 CASetBleClientThreadPoolHandle(handle);
198 CASetBleAdapterThreadPoolHandle(handle);
199 CASetBLEReqRespServerCallback(CABLEServerReceivedData);
200 CASetBLEReqRespClientCallback(CABLEClientReceivedData);
201 CASetBLEReqRespAdapterCallback(reqRespCallback);
203 CALERegisterNetworkNotifications(netCallback);
205 CAConnectivityHandler_t connHandler;
206 connHandler.startAdapter = NULL;
207 connHandler.stopAdapter = NULL;
208 connHandler.startListenServer = CAStartLEListeningServer;
209 connHandler.startDiscoverServer = CAStartLEDiscoveryServer;
210 connHandler.sendData = CASendLEUnicastData;
211 connHandler.sendDataToAll = CASendLEMulticastData;
212 connHandler.GetnetInfo = CAGetLEInterfaceInformation;
213 connHandler.readData = CAReadLEData;
214 connHandler.terminate = CATerminateLE;
215 registerCallback(connHandler, CA_LE);
217 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
224 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
226 CASetBLEReqRespServerCallback(NULL);
227 CASetBLEReqRespClientCallback(NULL);
228 CALERegisterNetworkNotifications(NULL);
230 u_mutex_lock(gBleIsServerMutex);
231 if (CA_TRUE == gIsServer)
233 CAStopBleGattServer();
237 CAStopBLEGattClient();
239 u_mutex_unlock(gBleIsServerMutex);
241 CATerminateBleQueues();
243 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
247 CAResult_t CAStartLEListeningServer()
249 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
251 bt_error_e err = BT_ERROR_NONE;
252 bt_adapter_state_e adapterState;
254 CAResult_t result = CAInitBleServerQueues();
255 if (CA_STATUS_OK != result)
257 OIC_LOG(ERROR, CALEADAPTER_TAG, "CAInitBleClientQueues failed");
258 return CA_STATUS_FAILED;
261 //Get Bluetooth adapter state
262 if (BT_ERROR_NONE != (err = bt_adapter_get_state(&adapterState)))
264 OIC_LOG_V(ERROR, CALEADAPTER_TAG, "Bluetooth get state failed!, error num [%x]",
267 return CA_STATUS_FAILED;
270 if (BT_ADAPTER_ENABLED != adapterState)
272 gLeServerStatus = CA_LISTENING_SERVER;
273 OIC_LOG(DEBUG, CALEADAPTER_TAG, "Listen Server will be started once BT Adapter is enabled");
277 CAStartBleGattServer();
279 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
280 u_mutex_lock(gBleIsServerMutex);
282 u_mutex_unlock(gBleIsServerMutex);
286 CAResult_t CAStartLEDiscoveryServer()
288 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
290 bt_error_e err = BT_ERROR_NONE;
291 bt_adapter_state_e adapterState;
293 CAResult_t result = CAInitBleClientQueues();
294 if (CA_STATUS_OK != result)
296 OIC_LOG(ERROR, CALEADAPTER_TAG, "CAInitBleClientQueues failed");
297 return CA_STATUS_FAILED;
300 //Get Bluetooth adapter state
301 if (BT_ERROR_NONE != (err = bt_adapter_get_state(&adapterState)))
303 OIC_LOG_V(ERROR, CALEADAPTER_TAG, "Bluetooth get state failed!, error num [%x]",
306 return CA_STATUS_FAILED;
309 if (BT_ADAPTER_ENABLED != adapterState)
311 gLeServerStatus = CA_DISCOVERY_SERVER;
312 OIC_LOG(DEBUG, CALEADAPTER_TAG, "Disc Server will be started once BT Adapter is enabled");
316 CAStartBLEGattClient();
318 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
319 u_mutex_lock(gBleIsServerMutex);
320 gIsServer = CA_FALSE;
321 u_mutex_unlock(gBleIsServerMutex);
325 CAResult_t CAStartLENotifyServer()
327 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
329 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
334 uint32_t CASendLENotification(const CARemoteEndpoint_t *endpoint, void *data, uint32_t dataLen)
336 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
338 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
343 CAResult_t CAReadLEData()
345 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
347 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
352 uint32_t CASendLEUnicastData(const CARemoteEndpoint_t *endpoint, void *data, uint32_t dataLen)
354 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
357 VERIFY_NON_NULL(endpoint, NULL, "Remote endpoint is null");
358 VERIFY_NON_NULL(data, NULL, "Data is null");
360 CAResult_t result = CA_STATUS_FAILED;
363 u_mutex_lock(gBleIsServerMutex);
364 if (CA_TRUE == gIsServer)
366 result = CABLEServerSendData(endpoint, data, dataLen);
367 if (CA_STATUS_OK != result)
369 OIC_LOG(ERROR, CALEADAPTER_TAG,
370 "[SendLEUnicastData] CABleServerSenderQueueEnqueueMessage failed \n");
371 u_mutex_unlock(gBleIsServerMutex);
377 result = CABLEClientSendData(endpoint, data, dataLen);
378 if (CA_STATUS_OK != result)
380 OIC_LOG(ERROR, CALEADAPTER_TAG,
381 "[SendLEUnicastData] CABleClientSenderQueueEnqueueMessage failed \n");
382 u_mutex_unlock(gBleIsServerMutex);
386 u_mutex_unlock(gBleIsServerMutex);
388 char *tempPath = "temp_path";
389 updateCharacteristicsInGattServer(tempPath, (char *) data, dataLen);
390 #endif //#ifdef __TIZEN__
391 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
396 uint32_t CASendLEMulticastData(void *data, uint32_t dataLen)
398 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
401 VERIFY_NON_NULL(data, NULL, "Data is null");
405 OIC_LOG(ERROR, CALEADAPTER_TAG, "Invalid Parameter");
409 CAResult_t result = CA_STATUS_FAILED;
411 u_mutex_lock(gBleIsServerMutex);
412 if (CA_TRUE == gIsServer)
414 result = CABLEServerSendData(NULL, data, dataLen);
415 if (CA_STATUS_OK != result)
417 OIC_LOG(ERROR, CALEADAPTER_TAG,
418 "[SendLEMulticastDataToAll] CABleServerSenderQueueEnqueueMessage failed" );
419 u_mutex_unlock(gBleIsServerMutex);
425 result = CABLEClientSendData(NULL, data, dataLen);
426 if (CA_STATUS_OK != result)
428 OIC_LOG(ERROR, CALEADAPTER_TAG,
429 "[SendLEMulticastDataToAll] CABleClientSenderQueueEnqueueMessage failed" );
430 u_mutex_unlock(gBleIsServerMutex);
434 u_mutex_unlock(gBleIsServerMutex);
436 char *tempPath = "temp_path";
437 updateCharacteristicsInGattServer(tempPath, (char *) data, dataLen);
438 #endif //#ifdef __TIZEN__
439 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
443 CAResult_t CAGetLEInterfaceInformation(CALocalConnectivity_t **info, uint32_t *size)
445 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
447 VERIFY_NON_NULL(info, NULL, "CALocalConnectivity info is null");
451 char *local_address = NULL;
453 bt_adapter_get_address(&local_address);
454 if (NULL == local_address)
456 OIC_LOG(ERROR, CALEADAPTER_TAG, "Get local bt adapter address failed");
457 return CA_STATUS_FAILED;
460 #endif //#if ARDUINODUE
462 (*info) = (CALocalConnectivity_t *) OICMalloc(sizeof(CALocalConnectivity_t));
465 OIC_LOG(ERROR, CALEADAPTER_TAG, "Malloc failure!");
466 return CA_STATUS_FAILED;
468 memset((*info), 0x0, sizeof(CALocalConnectivity_t));
470 strncpy((*info)->addressInfo.BT.btMacAddress, local_address, strlen(local_address));
471 u_mutex_lock(gBleLocalAddressMutex);
472 strncpy(gLocalBLEAddress, local_address, sizeof(gLocalBLEAddress));
473 u_mutex_unlock(gBleLocalAddressMutex);
475 (*info)->type = CA_LE;
477 OICFree(local_address);
479 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
483 int32_t CALERegisterNetworkNotifications(CANetworkChangeCallback netCallback)
485 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
487 u_mutex_lock(gBleNetworkCbMutex);
488 gNetworkCallback = netCallback;
489 u_mutex_unlock(gBleNetworkCbMutex);
494 ret = bt_adapter_set_state_changed_cb(CALEDeviceStateChangedCb, NULL);
497 OIC_LOG(ERROR, CALEADAPTER_TAG, "bt_adapter_set_state_changed_cb failed!");
502 ret = bt_adapter_unset_state_changed_cb();
505 OIC_LOG(ERROR, CALEADAPTER_TAG, "bt_adapter_set_state_changed_cb failed!");
508 #endif //#ifdef __TIZEN__
509 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
515 void CALEDeviceStateChangedCb(int32_t result, bt_adapter_state_e adapter_state, void *user_data)
517 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
519 CALocalConnectivity_t localEndpoint;
521 u_mutex_lock(gBleLocalAddressMutex);
522 strncpy(localEndpoint.addressInfo.BT.btMacAddress, gLocalBLEAddress, strlen(gLocalBLEAddress));
523 u_mutex_unlock(gBleLocalAddressMutex);
525 // Start a GattServer/Client if gLeServerStatus is SET
526 if (CA_LISTENING_SERVER == gLeServerStatus)
528 OIC_LOG(DEBUG, CALEADAPTER_TAG, "Before CAStartBleGattServer");
529 CAStartBleGattServer();
531 else if (CA_DISCOVERY_SERVER == gLeServerStatus)
533 OIC_LOG(DEBUG, CALEADAPTER_TAG, "Before CAStartBleGattClient");
534 CAStartBLEGattClient();
536 gLeServerStatus = CA_SERVER_NOTSTARTED;
538 u_mutex_lock(gBleNetworkCbMutex);
539 if (NULL != gNetworkCallback)
541 gNetworkCallback(&localEndpoint, adapter_state);
545 OIC_LOG(ERROR, CALEADAPTER_TAG, "gNetworkCallback is NULL");
547 u_mutex_unlock(gBleNetworkCbMutex);
549 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
552 CAResult_t CAInitBleAdapterMutex()
554 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
557 if (NULL == gBleIsServerMutex)
559 gBleIsServerMutex = u_mutex_new();
560 if (NULL == gBleIsServerMutex)
562 OIC_LOG(ERROR, CALEADAPTER_TAG, "u_mutex_new failed");
563 return CA_STATUS_FAILED;
567 if (NULL == gBleNetworkCbMutex)
569 gBleNetworkCbMutex = u_mutex_new();
570 if (NULL == gBleNetworkCbMutex)
572 OIC_LOG(ERROR, CALEADAPTER_TAG, "u_mutex_new failed");
573 return CA_STATUS_FAILED;
577 if (NULL == gBleLocalAddressMutex)
579 gBleLocalAddressMutex = u_mutex_new();
580 if (NULL == gBleLocalAddressMutex)
582 OIC_LOG(ERROR, CALEADAPTER_TAG, "u_mutex_new failed");
583 return CA_STATUS_FAILED;
587 if (NULL == gBleAdapterThreadPoolMutex)
589 gBleAdapterThreadPoolMutex = u_mutex_new();
590 if (NULL == gBleAdapterThreadPoolMutex)
592 OIC_LOG(ERROR, CALEADAPTER_TAG, "u_mutex_new failed");
593 return CA_STATUS_FAILED;
597 if (NULL == gBleClientSendDataMutex)
599 gBleClientSendDataMutex = u_mutex_new();
600 if (NULL == gBleClientSendDataMutex)
602 OIC_LOG(ERROR, CALEADAPTER_TAG, "u_mutex_new failed");
603 return CA_STATUS_FAILED;
607 if (NULL == gBleClientReceiveDataMutex)
609 gBleClientReceiveDataMutex = u_mutex_new();
610 if (NULL == gBleClientReceiveDataMutex)
612 OIC_LOG(ERROR, CALEADAPTER_TAG, "u_mutex_new failed");
613 return CA_STATUS_FAILED;
617 if (NULL == gBleServerSendDataMutex)
619 gBleServerSendDataMutex = u_mutex_new();
620 if (NULL == gBleServerSendDataMutex)
622 OIC_LOG(ERROR, CALEADAPTER_TAG, "u_mutex_new failed");
623 return CA_STATUS_FAILED;
627 if (NULL == gBleServerReceiveDataMutex)
629 gBleServerReceiveDataMutex = u_mutex_new();
630 if (NULL == gBleServerReceiveDataMutex)
632 OIC_LOG(ERROR, CALEADAPTER_TAG, "u_mutex_new failed");
633 return CA_STATUS_FAILED;
637 if (NULL == gBleAdapterReqRespCbMutex)
639 gBleAdapterReqRespCbMutex = u_mutex_new();
640 if (NULL == gBleAdapterReqRespCbMutex)
642 OIC_LOG(ERROR, CALEADAPTER_TAG, "u_mutex_new failed");
643 return CA_STATUS_FAILED;
647 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
650 CAResult_t CATermiateBleAdapterMutex()
652 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
654 u_mutex_free(gBleIsServerMutex);
655 gBleIsServerMutex = NULL;
657 u_mutex_free(gBleNetworkCbMutex);
658 gBleNetworkCbMutex = NULL;
660 u_mutex_free(gBleLocalAddressMutex);
661 gBleLocalAddressMutex = NULL;
663 u_mutex_free(gBleAdapterThreadPoolMutex);
664 gBleAdapterThreadPoolMutex = NULL;
666 u_mutex_free(gBleClientSendDataMutex);
667 gBleClientSendDataMutex = NULL;
669 u_mutex_free(gBleClientReceiveDataMutex);
670 gBleClientReceiveDataMutex = NULL;
672 u_mutex_free(gBleServerSendDataMutex);
673 gBleServerSendDataMutex = NULL;
675 u_mutex_free(gBleServerReceiveDataMutex);
676 gBleServerReceiveDataMutex = NULL;
678 u_mutex_free(gBleAdapterReqRespCbMutex);
679 gBleAdapterReqRespCbMutex = NULL;
681 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
685 void CAInitBleQueues()
687 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
689 CAResult_t result = CAInitBleServerQueues();
690 if (CA_STATUS_OK != result)
692 OIC_LOG(ERROR, CALEADAPTER_TAG, "CAInitBleClientQueues failed");
696 result = CAInitBleClientQueues();
697 if (CA_STATUS_OK != result)
699 OIC_LOG(ERROR, CALEADAPTER_TAG, "CAInitBleClientQueues failed");
703 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
708 CAResult_t CAInitBleServerQueues()
710 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
712 u_mutex_lock(gBleAdapterThreadPoolMutex);
714 CAResult_t result = CAInitBleServerSenderQueue();
715 if (CA_STATUS_OK != result)
717 OIC_LOG(ERROR, CALEADAPTER_TAG, "CAInitBleClientQueues failed");
718 u_mutex_unlock(gBleAdapterThreadPoolMutex);
719 return CA_STATUS_FAILED;
722 result = CAInitBleServerReceiverQueue();
723 if (CA_STATUS_OK != result)
725 OIC_LOG(ERROR, CALEADAPTER_TAG, "CAInitBleClientQueues failed");
726 u_mutex_unlock(gBleAdapterThreadPoolMutex);
727 return CA_STATUS_FAILED;
730 gDataReceiverHandlerState = true;
732 u_mutex_unlock(gBleAdapterThreadPoolMutex);
734 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
738 CAResult_t CAInitBleClientQueues()
740 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
742 u_mutex_lock(gBleAdapterThreadPoolMutex);
744 CAResult_t result = CAInitBleClientSenderQueue();
745 if (CA_STATUS_OK != result)
747 OIC_LOG(ERROR, CALEADAPTER_TAG, "CAInitBleClientQueues failed");
748 u_mutex_unlock(gBleAdapterThreadPoolMutex);
749 return CA_STATUS_FAILED;
752 result = CAInitBleClientReceiverQueue();
753 if (CA_STATUS_OK != result)
755 OIC_LOG(ERROR, CALEADAPTER_TAG, "CAInitBleClientQueues failed");
756 u_mutex_unlock(gBleAdapterThreadPoolMutex);
757 return CA_STATUS_FAILED;
760 gDataReceiverHandlerState = true;
762 u_mutex_unlock(gBleAdapterThreadPoolMutex);
764 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
768 CAResult_t CAInitBleServerSenderQueue()
770 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
771 // Check if the message queue is already initialized
772 if (gSendQueueHandle)
774 OIC_LOG(DEBUG, CALEADAPTER_TAG, "Already queue is initialized!");
778 // Create send message queue
779 gSendQueueHandle = OICMalloc(sizeof(CAQueueingThread_t));
780 if (!gSendQueueHandle)
782 OIC_LOG(ERROR, CALEADAPTER_TAG, "Memory allocation failed!");
783 return CA_MEMORY_ALLOC_FAILED;
786 if (CA_STATUS_OK != CAQueueingThreadInitialize(gSendQueueHandle, gBleAdapterThreadPool,
787 CABLEServerSendDataThread))
789 OIC_LOG(ERROR, CALEADAPTER_TAG, "Failed to Initialize send queue thread");
790 OICFree(gSendQueueHandle);
791 gSendQueueHandle = NULL;
792 return CA_STATUS_FAILED;
795 if (CA_STATUS_OK != CAQueueingThreadStart(gSendQueueHandle))
797 OIC_LOG_V(ERROR, CALEADAPTER_TAG, "u_thread_pool_add_task failed ");
798 OICFree(gSendQueueHandle);
799 gSendQueueHandle = NULL;
800 return CA_STATUS_FAILED;
804 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
809 CAResult_t CAInitBleClientSenderQueue()
811 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
813 if (gBLEClientSendQueueHandle)
815 OIC_LOG(DEBUG, CALEADAPTER_TAG, "Already queue is initialized!");
819 // Create send message queue
820 gBLEClientSendQueueHandle = OICMalloc(sizeof(CAQueueingThread_t));
821 if (!gBLEClientSendQueueHandle)
823 OIC_LOG(ERROR, CALEADAPTER_TAG, "Memory allocation failed!");
824 return CA_MEMORY_ALLOC_FAILED;
827 if (CA_STATUS_OK != CAQueueingThreadInitialize(gBLEClientSendQueueHandle, gBleAdapterThreadPool,
828 CABLEClientSendDataThread))
830 OIC_LOG(ERROR, CALEADAPTER_TAG, "Failed to Initialize send queue thread");
831 OICFree(gBLEClientSendQueueHandle);
832 gBLEClientSendQueueHandle = NULL;
833 return CA_STATUS_FAILED;
836 if (CA_STATUS_OK != CAQueueingThreadStart(gBLEClientSendQueueHandle))
838 OIC_LOG_V(ERROR, CALEADAPTER_TAG, "u_thread_pool_add_task failed ");
839 OICFree(gBLEClientSendQueueHandle);
840 gBLEClientSendQueueHandle = NULL;
841 return CA_STATUS_FAILED;
844 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
848 CAResult_t CAInitBleServerReceiverQueue()
850 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
851 // Check if the message queue is already initialized
852 if (gCABleServerReceiverQueue)
854 OIC_LOG(DEBUG, CALEADAPTER_TAG, "Already queue is initialized!");
858 // Create send message queue
859 gCABleServerReceiverQueue = OICMalloc(sizeof(CAQueueingThread_t));
860 if (!gCABleServerReceiverQueue)
862 OIC_LOG(ERROR, CALEADAPTER_TAG, "Memory allocation failed!");
863 OICFree(gSendQueueHandle);
864 return CA_MEMORY_ALLOC_FAILED;
867 if (CA_STATUS_OK != CAQueueingThreadInitialize(gCABleServerReceiverQueue, gBleAdapterThreadPool,
868 CABLEServerDataReceiverHandler))
870 OIC_LOG(ERROR, CALEADAPTER_TAG, "Failed to Initialize send queue thread");
871 OICFree(gCABleServerReceiverQueue);
872 gCABleServerReceiverQueue = NULL;
873 return CA_STATUS_FAILED;
876 if (CA_STATUS_OK != CAQueueingThreadStart(gCABleServerReceiverQueue))
878 OIC_LOG_V(ERROR, CALEADAPTER_TAG, "u_thread_pool_add_task failed ");
879 OICFree(gCABleServerReceiverQueue);
880 gCABleServerReceiverQueue = NULL;
881 return CA_STATUS_FAILED;
884 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
888 CAResult_t CAInitBleClientReceiverQueue()
890 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
892 // Check if the message queue is already initialized
893 if (gCABleClientReceiverQueue)
895 OIC_LOG(DEBUG, CALEADAPTER_TAG, "Already queue is initialized!");
899 // Create send message queue
900 gCABleClientReceiverQueue = OICMalloc(sizeof(CAQueueingThread_t));
901 if (!gCABleClientReceiverQueue)
903 OIC_LOG(ERROR, CALEADAPTER_TAG, "Memory allocation failed!");
904 OICFree(gBLEClientSendQueueHandle);
905 return CA_MEMORY_ALLOC_FAILED;
908 if (CA_STATUS_OK != CAQueueingThreadInitialize(gCABleClientReceiverQueue, gBleAdapterThreadPool,
909 CABLEClientDataReceiverHandler))
911 OIC_LOG(ERROR, CALEADAPTER_TAG, "Failed to Initialize send queue thread");
912 OICFree(gBLEClientSendQueueHandle);
913 OICFree(gCABleClientReceiverQueue);
914 gCABleClientReceiverQueue = NULL;
915 return CA_STATUS_FAILED;
918 //gClientUp = CA_TRUE; //AMOGH
920 if (CA_STATUS_OK != CAQueueingThreadStart(gCABleClientReceiverQueue))
922 OIC_LOG_V(ERROR, CALEADAPTER_TAG, "u_thread_pool_add_task failed ");
923 OICFree(gCABleClientReceiverQueue);
924 gCABleClientReceiverQueue = NULL;
925 return CA_STATUS_FAILED;
928 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
932 void CATerminateBleQueues()
934 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
936 u_mutex_lock(gBleClientSendDataMutex);
937 if (NULL != gBLEClientSendQueueHandle)
939 CAQueueingThreadStop(gBLEClientSendQueueHandle);
940 gBLEClientSendQueueHandle = NULL;
942 u_mutex_unlock(gBleClientSendDataMutex);
944 u_mutex_lock(gBleClientReceiveDataMutex);
945 if (NULL != gCABleClientReceiverQueue)
947 CAQueueingThreadStop(gCABleClientReceiverQueue);
948 gCABleClientReceiverQueue = NULL;
950 u_mutex_unlock(gBleClientReceiveDataMutex);
952 u_mutex_lock(gBleServerSendDataMutex);
953 if (NULL != gBLEClientSendQueueHandle)
955 CAQueueingThreadStop(gBLEClientSendQueueHandle);
956 gBLEClientSendQueueHandle = NULL;
958 u_mutex_unlock(gBleServerSendDataMutex);
960 u_mutex_lock(gBleServerReceiveDataMutex);
961 if (NULL != gCABleServerReceiverQueue)
963 CAQueueingThreadStop(gCABleServerReceiverQueue);
964 gCABleServerReceiverQueue = NULL;
966 u_mutex_unlock(gBleServerReceiveDataMutex);
968 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
971 void CABLEServerDataReceiverHandler(void *threadData)
973 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "IN");
975 // CAAdapterMessage_t *message = NULL;
976 static const char *remoteAddress = NULL;
977 static const char *serviceUUID = NULL;
978 static uint32_t recvDataLen = 0;
979 static uint32_t totalDataLen = 0;
980 static char *defragData = NULL;
981 static isHeaderAvailable = false;
982 static CARemoteEndpoint_t *remoteEndpoint = NULL;
984 u_mutex_lock(gBleClientReceiveDataMutex);
986 if (gDataReceiverHandlerState)
988 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "checking for DE Fragmentation");
990 CABLEData *bleData = (CABLEData *) threadData;
993 OIC_LOG(DEBUG, CALEADAPTER_TAG, "Invalid wifidata!");
997 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "checking for DE Fragmentation");
999 if (!isHeaderAvailable)
1001 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "Parsing the header");
1002 char *header = (char *) OICMalloc(sizeof(char) * CA_HEADER_LENGTH);
1003 VERIFY_NON_NULL_VOID(header, CALEADAPTER_TAG, "header is NULL");
1005 memcpy(header, bleData->data, CA_HEADER_LENGTH);
1006 totalDataLen = CAParseHeader(header);
1007 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "Total data to be accumulated [%d] bytes", totalDataLen);
1008 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "data received in the first packet [%d] bytes", bleData->dataLen);
1009 defragData = (char *) OICMalloc(sizeof(char) * totalDataLen);
1010 if (NULL == defragData)
1012 OIC_LOG(ERROR, CALEADAPTER_TAG, "defragData is NULL!");
1019 remoteAddress = bleData->remoteEndpoint->addressInfo.LE.leMacAddress;
1020 serviceUUID = bleData->remoteEndpoint->resourceUri;
1022 remoteEndpoint = CAAdapterCreateRemoteEndpoint(CA_EDR, remoteAddress,
1025 memcpy(defragData + recvDataLen, bleData->data + CA_HEADER_LENGTH,
1026 bleData->dataLen - CA_HEADER_LENGTH);
1027 recvDataLen += bleData->dataLen - CA_HEADER_LENGTH;
1028 isHeaderAvailable = true;
1032 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "Copying the data of length [%d]", bleData->dataLen);
1033 memcpy(defragData + recvDataLen, bleData->data, bleData->dataLen);
1034 recvDataLen += bleData->dataLen ;
1035 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "totalDatalength [%d] recveived Datalen [%d]",
1036 totalDataLen, recvDataLen);
1038 CAFreeBLEData(bleData);
1039 if (totalDataLen == recvDataLen)
1041 u_mutex_lock(gBleAdapterReqRespCbMutex);
1042 if (NULL == gNetworkPacketReceivedCallback)
1044 OIC_LOG(ERROR, CALEADAPTER_TAG, "gReqRespCallback is NULL!");
1045 u_mutex_unlock(gBleAdapterReqRespCbMutex);
1048 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "Sending data up !");
1049 gNetworkPacketReceivedCallback(remoteEndpoint, defragData, recvDataLen);
1052 isHeaderAvailable = false;
1053 u_mutex_unlock(gBleAdapterReqRespCbMutex);
1056 if (false == gDataReceiverHandlerState)
1058 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "GATTClient is terminating. Cleaning up");
1059 OICFree(defragData);
1060 OICFree(remoteEndpoint);
1061 u_mutex_unlock(gBleClientReceiveDataMutex);
1065 u_mutex_unlock(gBleClientReceiveDataMutex);
1066 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "OUT");
1069 void CABLEClientDataReceiverHandler(void *threadData)
1071 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "IN");
1073 // CAAdapterMessage_t *message = NULL;
1074 static const char *remoteAddress = NULL;
1075 static const char *serviceUUID = NULL;
1076 static uint32_t recvDataLen = 0;
1077 static uint32_t totalDataLen = 0;
1078 static char *defragData = NULL;
1079 static isHeaderAvailable = false;
1080 static CARemoteEndpoint_t *remoteEndpoint = NULL;
1082 u_mutex_lock(gBleClientReceiveDataMutex);
1084 if (gDataReceiverHandlerState)
1086 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "checking for DE Fragmentation");
1088 CABLEData *bleData = (CABLEData *) threadData;
1091 OIC_LOG(DEBUG, CALEADAPTER_TAG, "Invalid wifidata!");
1095 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "checking for DE Fragmentation");
1097 if (!isHeaderAvailable)
1099 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "Parsing the header");
1100 char *header = (char *) OICMalloc(sizeof(char) * CA_HEADER_LENGTH);
1101 VERIFY_NON_NULL_VOID(header, CALEADAPTER_TAG, "header is NULL");
1103 memcpy(header, bleData->data, CA_HEADER_LENGTH);
1104 totalDataLen = CAParseHeader(header);
1105 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "Total data to be accumulated [%d] bytes", totalDataLen);
1106 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "Data received in the first packet [%d] bytes", bleData->dataLen);
1107 defragData = (char *) OICMalloc(sizeof(char) * totalDataLen);
1108 if (NULL == defragData)
1110 OIC_LOG(ERROR, CALEADAPTER_TAG, "defragData is NULL!");
1117 remoteAddress = bleData->remoteEndpoint->addressInfo.LE.leMacAddress;
1118 serviceUUID = bleData->remoteEndpoint->resourceUri;
1120 remoteEndpoint = CAAdapterCreateRemoteEndpoint(CA_EDR, remoteAddress,
1123 memcpy(defragData , bleData->data + CA_HEADER_LENGTH,
1124 bleData->dataLen - CA_HEADER_LENGTH);
1125 recvDataLen += bleData->dataLen - CA_HEADER_LENGTH;
1126 isHeaderAvailable = true;
1130 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "Copying the data of length [%d]", bleData->dataLen);
1131 memcpy(defragData + recvDataLen, bleData->data, bleData->dataLen);
1132 recvDataLen += bleData->dataLen ;
1133 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "totalDatalength [%d] recveived Datalen [%d]",
1134 totalDataLen, recvDataLen);
1136 CAFreeBLEData(bleData);
1137 if (totalDataLen == recvDataLen)
1139 u_mutex_lock(gBleAdapterReqRespCbMutex);
1140 if (NULL == gNetworkPacketReceivedCallback)
1142 OIC_LOG(ERROR, CALEADAPTER_TAG, "gReqRespCallback is NULL!");
1143 u_mutex_unlock(gBleAdapterReqRespCbMutex);
1146 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "Sending data up !");
1147 gNetworkPacketReceivedCallback(remoteEndpoint, defragData, recvDataLen);
1150 isHeaderAvailable = false;
1151 u_mutex_unlock(gBleAdapterReqRespCbMutex);
1154 if (false == gDataReceiverHandlerState)
1156 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "GATTClient is terminating. Cleaning up");
1157 OICFree(defragData);
1158 OICFree(remoteEndpoint);
1159 u_mutex_unlock(gBleClientReceiveDataMutex);
1163 u_mutex_unlock(gBleClientReceiveDataMutex);
1164 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "OUT");
1167 void CABLEServerSendDataThread(void *threadData)
1169 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
1171 CABLEData *bleData = (CABLEData *) threadData;
1174 OIC_LOG(DEBUG, CALEADAPTER_TAG, "Invalid bledata!");
1177 char *header = (char *) OICMalloc(sizeof(char) * CA_HEADER_LENGTH);
1178 VERIFY_NON_NULL_VOID(header, CALEADAPTER_TAG, "Malloc failed");
1180 char *dataSegment = (char *) OICMalloc(sizeof(char) * bleData->dataLen + CA_HEADER_LENGTH);
1181 if (NULL == dataSegment)
1183 OIC_LOG(ERROR, CALEADAPTER_TAG, "Malloc failed");
1188 memset(header, 0x0, sizeof(char) * CA_HEADER_LENGTH );
1189 memset(dataSegment, 0x0, sizeof(char) * bleData->dataLen );
1191 CAResult_t result = CAGenerateHeader(header, bleData->dataLen);
1192 if (CA_STATUS_OK != result )
1194 OIC_LOG(ERROR, CALEADAPTER_TAG, "Generate header failed");
1196 OICFree(dataSegment);
1200 memcpy(dataSegment, header, CA_HEADER_LENGTH);
1203 if (CA_SUPPORTED_BLE_MTU_SIZE >= bleData->dataLen)
1205 length = bleData->dataLen + CA_HEADER_LENGTH;
1206 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "length [%d]", length);
1207 memcpy(dataSegment + CA_HEADER_LENGTH, bleData->data, bleData->dataLen);
1211 length = CA_SUPPORTED_BLE_MTU_SIZE;
1212 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "length [%d]", length);
1213 memcpy(dataSegment + CA_HEADER_LENGTH, bleData->data,
1214 CA_SUPPORTED_BLE_MTU_SIZE - CA_HEADER_LENGTH);
1217 int32_t iter = bleData->dataLen / CA_SUPPORTED_BLE_MTU_SIZE;
1219 u_mutex_lock(gBleServerSendDataMutex);
1220 // Send the first segment with the header.
1221 result = CAUpdateCharacteristicsInGattServer(dataSegment, length);
1222 for (index = 1; index < iter; index++)
1224 // Send the remaining header.
1225 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "Sending the chunk number [%d]", index);
1226 result = CAUpdateCharacteristicsInGattServer(
1227 bleData->data + ((index * CA_SUPPORTED_BLE_MTU_SIZE) - CA_HEADER_LENGTH),
1228 CA_SUPPORTED_BLE_MTU_SIZE);
1230 if (bleData->dataLen / CA_SUPPORTED_BLE_MTU_SIZE)
1232 // send the last segment of the data (Ex: 22 bytes of 622 bytes of data when MTU is 200)
1233 OIC_LOG(DEBUG, CALEADAPTER_TAG, "Sending the last chunk");
1234 result = CAUpdateCharacteristicsInGattServer(
1235 bleData->data + (index * CA_SUPPORTED_BLE_MTU_SIZE) - CA_HEADER_LENGTH,
1236 bleData->dataLen % CA_SUPPORTED_BLE_MTU_SIZE + CA_HEADER_LENGTH);
1239 OICFree(bleData->remoteEndpoint);
1241 u_mutex_unlock(gBleServerSendDataMutex); // AMOGH is this mutex required ?
1243 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
1248 void CABLEClientSendDataThread(void *threadData)
1250 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
1252 CABLEData *bleData = (CABLEData *) threadData;
1255 OIC_LOG(DEBUG, CALEADAPTER_TAG, "Invalid bledata!");
1258 char *header = (char *) OICMalloc(sizeof(char) * CA_HEADER_LENGTH);
1259 VERIFY_NON_NULL_VOID(*header, CALEADAPTER_TAG, "Malloc failed");
1261 char *dataSegment = (char *) OICMalloc(sizeof(char) * bleData->dataLen + CA_HEADER_LENGTH);
1262 if (NULL == dataSegment)
1264 OIC_LOG(ERROR, CALEADAPTER_TAG, "Malloc failed");
1269 memset(header, 0x0, sizeof(char) * CA_HEADER_LENGTH );
1270 memset(dataSegment, 0x0, sizeof(char) * bleData->dataLen );
1272 CAResult_t result = CAGenerateHeader(header, bleData->dataLen);
1273 if (CA_STATUS_OK != result )
1275 OIC_LOG(ERROR, CALEADAPTER_TAG, "Generate header failed");
1277 OICFree(dataSegment);
1280 memcpy(dataSegment, header, CA_HEADER_LENGTH);
1283 if (CA_SUPPORTED_BLE_MTU_SIZE >= bleData->dataLen)
1285 length = bleData->dataLen + CA_HEADER_LENGTH;
1286 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "length [%d]", length);
1287 memcpy(dataSegment + CA_HEADER_LENGTH, bleData->data, bleData->dataLen);
1291 length = CA_SUPPORTED_BLE_MTU_SIZE;
1292 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "length [%d]", length);
1293 memcpy(dataSegment + CA_HEADER_LENGTH, bleData->data,
1294 CA_SUPPORTED_BLE_MTU_SIZE - CA_HEADER_LENGTH);
1297 int32_t iter = bleData->dataLen / CA_SUPPORTED_BLE_MTU_SIZE;
1299 u_mutex_lock(gBleClientSendDataMutex);
1300 if (NULL != bleData->remoteEndpoint)
1302 // Send the first segment with the header.
1303 result = CAUpdateCharacteristicsToGattServer(bleData->remoteEndpoint->addressInfo.LE.leMacAddress,
1307 for (index = 1; index < iter; index++)
1309 // Send the remaining header.
1310 result = CAUpdateCharacteristicsToGattServer(bleData->remoteEndpoint->addressInfo.LE.leMacAddress,
1311 bleData->data + (index * CA_SUPPORTED_BLE_MTU_SIZE) - CA_HEADER_LENGTH,
1312 CA_SUPPORTED_BLE_MTU_SIZE,
1315 if (bleData->dataLen / CA_SUPPORTED_BLE_MTU_SIZE)
1317 // send the last segment of the data (Ex: 22 bytes of 622 bytes of data when MTU is 200)
1318 OIC_LOG(DEBUG, CALEADAPTER_TAG, "Sending the last chunk");
1319 result = CAUpdateCharacteristicsToGattServer(bleData->remoteEndpoint->addressInfo.LE.leMacAddress,
1320 bleData->data + (index * CA_SUPPORTED_BLE_MTU_SIZE) - CA_HEADER_LENGTH,
1321 bleData->dataLen % CA_SUPPORTED_BLE_MTU_SIZE + CA_HEADER_LENGTH,
1327 // Send the first segment with the header.
1328 result = CAUpdateCharacteristicsToAllGattServers(dataSegment + (index * length),
1330 // Send the remaining header.
1331 for (index = 1; index <= iter; index++)
1333 result = CAUpdateCharacteristicsToAllGattServers(
1334 bleData->data + (index * CA_SUPPORTED_BLE_MTU_SIZE) - CA_HEADER_LENGTH,
1335 CA_SUPPORTED_BLE_MTU_SIZE);
1337 if (bleData->dataLen / CA_SUPPORTED_BLE_MTU_SIZE)
1339 // send the last segment of the data (Ex: 22 bytes of 622 bytes of data when MTU is 200)
1340 OIC_LOG(DEBUG, CALEADAPTER_TAG, "Sending the last chunk");
1341 result = CAUpdateCharacteristicsToAllGattServers(
1342 bleData->data + (index * CA_SUPPORTED_BLE_MTU_SIZE) - CA_HEADER_LENGTH,
1343 bleData->dataLen % CA_SUPPORTED_BLE_MTU_SIZE + CA_HEADER_LENGTH);
1347 OICFree(bleData->remoteEndpoint);
1349 u_mutex_unlock(gBleClientSendDataMutex);
1351 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
1356 CABLEData *CACreateBLEData(const CARemoteEndpoint_t *remoteEndpoint, void *data,
1357 uint32_t dataLength)
1359 CABLEData *bleData = (CABLEData *) OICMalloc(sizeof(CABLEData));
1362 OIC_LOG(ERROR, CALEADAPTER_TAG, "Memory allocation failed!");
1366 bleData->remoteEndpoint = CAAdapterCopyRemoteEndpoint(remoteEndpoint);
1367 bleData->data = (void *)OICMalloc(dataLength);
1368 if (NULL == bleData->data)
1370 OIC_LOG(ERROR, CALEADAPTER_TAG, "Memory allocation failed!");
1371 CAFreeBLEData(bleData);
1374 memcpy(bleData->data, data, dataLength);
1375 bleData->dataLen = dataLength;
1380 void CAFreeBLEData(CABLEData *bleData)
1385 CAAdapterFreeRemoteEndpoint(bleData->remoteEndpoint);
1386 OICFree(bleData->data);
1390 CAResult_t CABLEClientSendData(const CARemoteEndpoint_t *remoteEndpoint,
1394 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN ");
1396 VERIFY_NON_NULL(data, NULL, "Param data is NULL");
1398 VERIFY_NON_NULL_RET(gBLEClientSendQueueHandle, CALEADAPTER_TAG,
1399 "gBLEClientSendQueueHandle is NULL",
1401 VERIFY_NON_NULL_RET(gBleClientSendDataMutex, CALEADAPTER_TAG,
1402 "gBleClientSendDataMutex is NULL",
1405 VERIFY_NON_NULL_RET(gBLEClientSendQueueHandle, CALEADAPTER_TAG, "gBLEClientSendQueueHandle",
1408 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "Data Sending to LE layer [%d]", dataLen);
1410 CABLEData *bleData = CACreateBLEData(remoteEndpoint, data, dataLen);
1413 OIC_LOG_V(ERROR, CALEADAPTER_TAG, "Failed to create bledata!");
1414 return CA_MEMORY_ALLOC_FAILED;
1416 // Add message to send queue
1417 u_mutex_lock(gBleClientSendDataMutex);
1418 CAQueueingThreadAddData(gBLEClientSendQueueHandle, bleData, sizeof(CABLEData));
1419 u_mutex_unlock(gBleClientSendDataMutex);
1421 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT ");
1422 return CA_STATUS_OK;
1426 CAResult_t CABLEServerSendData(const CARemoteEndpoint_t *remoteEndpoint,
1430 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN ");
1432 VERIFY_NON_NULL(data, NULL, "Param data is NULL");
1434 VERIFY_NON_NULL_RET(gSendQueueHandle, CALEADAPTER_TAG,
1435 "BleClientReceiverQueue is NULL",
1437 VERIFY_NON_NULL_RET(gBleClientSendDataMutex, CALEADAPTER_TAG,
1438 "BleClientSendDataMutex is NULL",
1441 VERIFY_NON_NULL_RET(gSendQueueHandle, CALEADAPTER_TAG, "sendQueueHandle",
1444 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "Data Sending to LE layer [%d]", dataLen);
1446 CABLEData *bleData = CACreateBLEData(remoteEndpoint, data, dataLen);
1449 OIC_LOG_V(ERROR, CALEADAPTER_TAG, "Failed to create bledata!");
1450 return CA_MEMORY_ALLOC_FAILED;
1452 // Add message to send queue
1453 u_mutex_lock(gBleServerSendDataMutex);
1454 CAQueueingThreadAddData(gSendQueueHandle, bleData, sizeof(CABLEData));
1455 u_mutex_unlock(gBleServerSendDataMutex);
1457 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT ");
1458 return CA_STATUS_OK;
1461 CAResult_t CABLEServerReceivedData(const char *remoteAddress, const char *serviceUUID,
1462 void *data, uint32_t dataLength, uint32_t *sentLength)
1464 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "IN");
1467 VERIFY_NON_NULL(serviceUUID, CALEADAPTER_TAG, "service UUID is null");
1468 VERIFY_NON_NULL(data, CALEADAPTER_TAG, "Data is null");
1469 VERIFY_NON_NULL(sentLength, CALEADAPTER_TAG, "Sent data length holder is null");
1470 VERIFY_NON_NULL_RET(gCABleServerReceiverQueue, CALEADAPTER_TAG, "gCABleServerReceiverQueue",
1473 //Add message to data queue
1474 CARemoteEndpoint_t *remoteEndpoint = CAAdapterCreateRemoteEndpoint(CA_LE, remoteAddress,
1476 if (NULL == remoteEndpoint)
1478 OIC_LOG_V(ERROR, CALEADAPTER_TAG, "Failed to create remote endpoint !");
1479 return CA_STATUS_FAILED;
1482 // Create bleData to add to queue
1483 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "Data received from LE layer [%d]", dataLength);
1485 CABLEData *bleData = CACreateBLEData(remoteEndpoint, data, dataLength);
1488 OIC_LOG_V(ERROR, CALEADAPTER_TAG, "Failed to create bledata!");
1489 return CA_MEMORY_ALLOC_FAILED;
1492 // Add message to send queue
1493 CAQueueingThreadAddData(gCABleServerReceiverQueue, bleData, sizeof(CABLEData));
1495 *sentLength = dataLength;
1500 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "OUT");
1501 return CA_STATUS_OK;
1504 CAResult_t CABLEClientReceivedData(const char *remoteAddress, const char *serviceUUID,
1505 void *data, uint32_t dataLength, uint32_t *sentLength)
1507 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "IN");
1510 VERIFY_NON_NULL(serviceUUID, CALEADAPTER_TAG, "service UUID is null");
1511 VERIFY_NON_NULL(data, CALEADAPTER_TAG, "Data is null");
1512 VERIFY_NON_NULL(sentLength, CALEADAPTER_TAG, "Sent data length holder is null");
1513 VERIFY_NON_NULL_RET(gCABleClientReceiverQueue, CALEADAPTER_TAG, "gCABleClientReceiverQueue",
1516 //Add message to data queue
1517 CARemoteEndpoint_t *remoteEndpoint = CAAdapterCreateRemoteEndpoint(CA_LE, remoteAddress,
1519 if (NULL == remoteEndpoint)
1521 OIC_LOG_V(ERROR, CALEADAPTER_TAG, "Failed to create remote endpoint !");
1522 return CA_STATUS_FAILED;
1525 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "Data received from LE layer [%d]", dataLength);
1527 // Create bleData to add to queue
1528 CABLEData *bleData = CACreateBLEData(remoteEndpoint, data, dataLength);
1531 OIC_LOG_V(ERROR, CALEADAPTER_TAG, "Failed to create bledata!");
1532 return CA_MEMORY_ALLOC_FAILED;
1535 // Add message to send queue
1536 CAQueueingThreadAddData(gCABleClientReceiverQueue, bleData, sizeof(CABLEData));
1538 *sentLength = dataLength;
1543 OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "OUT");
1544 return CA_STATUS_OK;
1547 void CASetBleAdapterThreadPoolHandle(u_thread_pool_t handle)
1549 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
1551 u_mutex_unlock(gBleAdapterThreadPoolMutex);
1552 gBleAdapterThreadPool = handle;
1553 u_mutex_unlock(gBleAdapterThreadPoolMutex);
1555 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
1558 void CASetBLEReqRespAdapterCallback(CANetworkPacketReceivedCallback callback)
1560 OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
1562 u_mutex_lock(gBleAdapterReqRespCbMutex);
1564 gNetworkPacketReceivedCallback = callback;
1566 u_mutex_unlock(gBleAdapterReqRespCbMutex);
1568 OIC_LOG(DEBUG, CALEADAPTER_TAG, "OUT");
1572 #endif //#ifdef OIC_TIZEN