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 ******************************************************************/
24 * This file contains the APIs for EDR adapter.
27 #include "caedradapter.h"
29 #include "caedrinterface.h"
30 #include "caadapterutils.h"
32 #include "camsgparser.h"
33 #include "caqueueingthread.h"
34 #include "oic_malloc.h"
37 * @var EDR_ADAPTER_TAG
38 * @brief Logging tag for module name.
40 #define EDR_ADAPTER_TAG "CA_EDR_ADAPTER"
43 * @var g_edrThreadPool
44 * @brief Reference to threadpool.
46 static u_thread_pool_t g_edrThreadPool = NULL;
49 * @var g_sendQueueHandle
50 * @brief Queue handle for Send Data
52 static CAQueueingThread_t *g_sendQueueHandle = NULL;
55 * @var g_recvQueueHandle
56 * @brief Queue handle for Receive Data
58 static CAQueueingThread_t *g_recvQueueHandle = NULL;
61 * @var g_isHeaderAvailable
62 * @brief to differentiate btw header and data packet.
64 static bool g_isHeaderAvailable = false;
68 * @brief Storing Adapter state information
70 static bool g_adapterState = true;
73 * @var g_networkPacketReceivedCallback
74 * @brief Maintains the callback to be notified on receival of network packets from other
77 static CANetworkPacketReceivedCallback g_networkPacketReceivedCallback = NULL;
80 * @var g_networkChangeCallback
81 * @brief Maintains the callback to be notified on local bluetooth adapter status change.
83 static CANetworkChangeCallback g_networkChangeCallback = NULL;
86 * @var g_localConnectivity
87 * @brief Information of local Bluetooth adapter.
89 static CALocalConnectivity_t *g_localConnectivity = NULL;
93 * @brief Storing RfcommserverUUID
95 static int g_serverId = -1;
99 * @brief Storing Rfcommserver state information
101 static bool g_serverState = false;
103 static CAResult_t CAStartServer(void);
104 static CAResult_t CAEDRInitializeQueueHandlers(void);
105 CAResult_t CAEDRInitializeSendHandler(void);
106 CAResult_t CAEDRInitializeReceiveHandler(void);
107 void CAAdapterTerminateQueues(void);
108 void CAAdapterDataSendHandler(void *context);
109 void CAAdapterDataReceiverHandler(void *context);
110 CAResult_t CAAdapterStopQueue();
111 void CAAdapterRecvData(const char *remoteAddress, const void *data,
112 uint32_t dataLength, uint32_t *sentLength);
113 void CAEDRNotifyNetworkStatus(CANetworkStatus_t status);
114 void CAEDROnNetworkStatusChanged(void *context);
115 CAResult_t CAAdapterSendData(const char *remoteAddress, const char *serviceUUID,
116 const void *data, uint32_t dataLength, uint32_t *sentLength);
117 CAEDRNetworkEvent *CAEDRCreateNetworkEvent(CALocalConnectivity_t *connectivity,
118 CANetworkStatus_t status);
119 CAResult_t CAEDRClientSendData(const char *remoteAddress, const char *serviceUUID,
120 const void *data, uint32_t dataLength, uint32_t *sentLength);
122 * @fn CACreateEDRData
123 * @brief Helper function to create CAEDRData
125 static CAEDRData *CACreateEDRData(const CARemoteEndpoint_t *remoteEndpoint, const void *data,
126 uint32_t dataLength);
130 * @brief Free the Created EDR data
132 static void CAFreeEDRData(CAEDRData *edrData);
135 * @fn CAEDRFreeNetworkEvent
136 * @brief Free the memory associated with @event.
138 void CAEDRFreeNetworkEvent(CAEDRNetworkEvent *event);
140 static void CAEDRDataDestroyer(void *data, uint32_t size);
142 CAResult_t CAInitializeEDR(CARegisterConnectivityCallback registerCallback,
143 CANetworkPacketReceivedCallback packetReceivedCallback,
144 CANetworkChangeCallback networkStateChangeCallback,
145 u_thread_pool_t handle)
147 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "IN");
150 VERIFY_NON_NULL(registerCallback, EDR_ADAPTER_TAG, "register callback is NULL");
151 VERIFY_NON_NULL(packetReceivedCallback, EDR_ADAPTER_TAG, "data receive callback is NULL");
152 VERIFY_NON_NULL(networkStateChangeCallback, EDR_ADAPTER_TAG,
153 "network state change callback is NULL");
154 VERIFY_NON_NULL(handle, EDR_ADAPTER_TAG, "Thread pool handle is NULL");
156 // Register the callbacks
158 g_edrThreadPool = handle;
159 g_networkPacketReceivedCallback = packetReceivedCallback;
160 g_networkChangeCallback = networkStateChangeCallback;
162 // Initialize EDR Network Monitor
163 CAResult_t err = CAEDRInitializeNetworkMonitor();
164 if (CA_STATUS_OK != err)
166 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "EDR N/w Monitor Initialize failed!, error number [%d]",
171 CAEDRSetNetworkChangeCallback(CAEDRNotifyNetworkStatus);
172 CAEDRSetPacketReceivedCallback(CAAdapterRecvData);
173 CAEDRInitializeClient(handle);
175 CAConnectivityHandler_t handler;
176 handler.startAdapter = CAStartEDR;
177 handler.startListenServer = CAStartEDRListeningServer;
178 handler.startDiscoveryServer = CAStartEDRDiscoveryServer;
179 handler.sendData = CASendEDRUnicastData;
180 handler.sendDataToAll = CASendEDRMulticastData;
181 handler.GetnetInfo = CAGetEDRInterfaceInformation;
182 handler.readData = CAReadEDRData;
183 handler.stopAdapter = CAStopEDR;
184 handler.terminate = CATerminateEDR;
185 registerCallback(handler, CA_EDR);
187 // Initialize Send/Receive data message queues
188 if (CA_STATUS_OK != CAEDRInitializeQueueHandlers())
190 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "CAAdapterInitializeQueues API failed");
192 return CA_STATUS_FAILED;
195 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "OUT");
199 CAResult_t CAStartEDR(void)
201 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "IN");
203 //Start Monitoring EDR Network
204 CAResult_t ret = CAEDRStartNetworkMonitor();
205 if(CA_STATUS_OK != ret)
207 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to Start n/w monitor");
210 // Get Bluetooth adapter state
211 bool adapterState = false;
212 if (CA_STATUS_OK != CAEDRGetAdapterEnableState(&adapterState))
214 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Failed to get adapter enable state");
215 return CA_STATUS_FAILED;
218 if (false == adapterState)
220 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Bluetooth adapter is disabled!");
221 g_adapterState = false;
225 if (CA_STATUS_OK != (ret = CAEDRClientSetCallbacks()))
227 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Start Network Monitor failed!, error number [%d] ",
231 if (CA_STATUS_OK != (ret = CAAdapterStartQueue()))
233 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "CAAdapterStartQueue failed!, error number [%d] ",
237 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "OUT");
241 CAResult_t CAStartEDRListeningServer(void)
243 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "IN");
245 return CAStartServer();
248 CAResult_t CAStartEDRDiscoveryServer(void)
250 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "IN");
252 return CAStartServer();
255 int32_t CASendEDRUnicastData(const CARemoteEndpoint_t *remoteEndpoint, const void *data,
258 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "IN");
260 CAResult_t err = CA_STATUS_OK;
263 VERIFY_NON_NULL_RET(remoteEndpoint, EDR_ADAPTER_TAG, "Remote endpoint is null", -1);
264 VERIFY_NON_NULL_RET(data, EDR_ADAPTER_TAG, "Data is null", -1);
266 if (0 == strlen(remoteEndpoint->addressInfo.BT.btMacAddress))
268 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Invalid input: EDR Address is empty!");
274 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Invalid input: data length is zero!");
278 uint32_t sentLength = 0;
279 const char *serviceUUID = OIC_EDR_SERVICE_ID;
280 const char *address = remoteEndpoint->addressInfo.BT.btMacAddress;
281 if (CA_STATUS_OK != (err = CAAdapterSendData(address, serviceUUID, data,
282 dataLength, &sentLength)))
284 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Send unicast data failed!, error num [%d]", err);
288 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "OUT");
292 int32_t CASendEDRMulticastData(const void *data, uint32_t dataLength)
294 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "IN - CASendEDRMulticastData");
296 CAResult_t err = CA_STATUS_OK;
299 VERIFY_NON_NULL_RET(data, EDR_ADAPTER_TAG, "Data is null", -1);
303 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Invalid input: data length is zero!");
307 uint32_t sentLen = 0;
308 const char *serviceUUID = OIC_EDR_SERVICE_ID;
309 if (CA_STATUS_OK != (err = CAAdapterSendData(NULL, serviceUUID, data, dataLength,
312 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Send multicast data failed!, error num [%d]",
317 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "OUT - CASendEDRMulticastData");
322 CAResult_t CAGetEDRInterfaceInformation(CALocalConnectivity_t **info, uint32_t *size)
324 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "IN");
326 VERIFY_NON_NULL(info, EDR_ADAPTER_TAG, "LocalConnectivity info is null");
328 CAResult_t err = CA_STATUS_OK;
330 if (CA_STATUS_OK != (err = CAEDRGetInterfaceInformation(info)))
332 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG,
333 "Failed to get local interface information!, error num [%d]", err);
338 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "OUT");
342 CAResult_t CAReadEDRData(void)
344 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "IN");
346 return CAEDRManagerReadData();
349 CAResult_t CAStopEDR(void)
351 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "IN");
353 // Stop RFComm server if it is running
354 if (-1 != g_serverId)
356 CAEDRServerStop(g_serverId);
360 // Stop network monitor
361 CAEDRStopNetworkMonitor();
364 CAEDRClientUnsetCallbacks();
366 // Disconnect all the client connections
367 CAEDRClientDisconnectAll();
369 // Stop Send and receive Queue
370 CAAdapterStopQueue();
372 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "OUT");
376 void CATerminateEDR(void)
378 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "IN");
380 // Terminate EDR Network Monitor
381 CAEDRTerminateNetworkMonitor();
383 // Terminate Send/Receive data messages queues
384 CAAdapterTerminateQueues();
386 g_networkPacketReceivedCallback = NULL;
387 g_networkChangeCallback = NULL;
389 // Terminate thread pool
390 g_edrThreadPool = NULL;
392 // Terminate BT Client
393 CAEDRClientTerminate();
395 // Terminate BT Server
396 CAEDRServerTerminate();
398 // Free LocalConnectivity information
399 CAAdapterFreeLocalEndpoint(g_localConnectivity);
400 g_localConnectivity = NULL;
402 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "OUT");
405 CAResult_t CAStartServer(void)
407 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "IN");
409 CAResult_t err = CA_STATUS_OK;
411 if (false == g_adapterState)
413 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "Bluetooth adapter is disabled!");
414 // Setting g_serverState for starting Rfcommserver when adapter starts
415 g_serverState = TRUE;
421 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "Server is already in running state.");
425 if (CA_STATUS_OK != (err = CAEDRServerStart(OIC_EDR_SERVICE_ID, &g_serverId, g_edrThreadPool)))
427 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Failed to start RFCOMM server!, error num [%d]",
432 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "OUT");
436 CAResult_t CAEDRInitializeQueueHandlers(void)
438 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "IN");
440 if (CA_STATUS_OK == CAEDRInitializeSendHandler()
441 && CA_STATUS_OK == CAEDRInitializeReceiveHandler())
443 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "Queue is initialized!");
447 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "OUT");
448 return CA_STATUS_FAILED;
451 CAResult_t CAEDRInitializeSendHandler(void)
453 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "IN");
454 // Check if the message queue is already initialized
455 if (g_sendQueueHandle)
457 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "Already queue is initialized!");
461 g_sendQueueHandle = (CAQueueingThread_t *) OICMalloc(sizeof(CAQueueingThread_t));
462 if (!g_sendQueueHandle)
464 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Memory allocation failed!");
465 return CA_MEMORY_ALLOC_FAILED;
468 if (CA_STATUS_OK != CAQueueingThreadInitialize(g_sendQueueHandle, g_edrThreadPool,
469 CAAdapterDataSendHandler, CAEDRDataDestroyer))
471 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to Initialize send queue thread");
472 return CA_STATUS_FAILED;
477 CAResult_t CAEDRInitializeReceiveHandler(void)
479 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "IN");
480 // Check if the message queue is already initialized
481 if (g_recvQueueHandle)
483 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "Already queue is initialized!");
487 g_recvQueueHandle = (CAQueueingThread_t *) OICMalloc(sizeof(CAQueueingThread_t));
488 if (!g_recvQueueHandle)
490 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Memory allocation failed!");
491 return CA_MEMORY_ALLOC_FAILED;
494 if (CA_STATUS_OK != CAQueueingThreadInitialize(g_recvQueueHandle, g_edrThreadPool,
495 CAAdapterDataReceiverHandler, CAEDRDataDestroyer))
497 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to Initialize send queue thread");
498 return CA_STATUS_FAILED;
501 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "OUT");
505 void CAAdapterTerminateQueues(void)
507 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "IN");
509 if (g_sendQueueHandle)
511 CAQueueingThreadDestroy(g_sendQueueHandle);
512 g_sendQueueHandle = NULL;
514 if (g_recvQueueHandle)
516 CAQueueingThreadDestroy(g_recvQueueHandle);
517 g_recvQueueHandle = NULL;
520 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "OUT");
523 void CAAdapterDataSendHandler(void *context)
525 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "IN - CAAdapterDataSendHandler");
527 CAEDRData *message = (CAEDRData *) context;
530 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Failed to get message!");
534 const char *remoteAddress = NULL;
535 const char *serviceUUID = NULL;
536 uint32_t sentLength = 0;
538 if(NULL == message->remoteEndpoint)
540 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "remoteEndpoint is not available");
543 remoteAddress = message->remoteEndpoint->addressInfo.BT.btMacAddress;
544 serviceUUID = message->remoteEndpoint->resourceUri;
546 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "checking for fragmentation and the dataLen is %d",
549 char *header = (char *) OICCalloc(CA_HEADER_LENGTH, sizeof(char));
550 VERIFY_NON_NULL_VOID(header, EDR_ADAPTER_TAG, "Malloc failed");
552 char* dataSegment = (char *) OICCalloc(message->dataLen + CA_HEADER_LENGTH, sizeof(char));
553 if (NULL == dataSegment)
555 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Malloc failed");
560 CAResult_t result = CAGenerateHeader(header, message->dataLen);
561 if (CA_STATUS_OK != result )
563 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Generate header failed");
565 OICFree(dataSegment);
569 memcpy(dataSegment, header, CA_HEADER_LENGTH);
572 if (CA_SUPPORTED_BLE_MTU_SIZE >= message->dataLen)
574 length = message->dataLen + CA_HEADER_LENGTH;
575 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "length [%d]", length);
576 memcpy(dataSegment + CA_HEADER_LENGTH, message->data, message->dataLen);
580 length = CA_SUPPORTED_BLE_MTU_SIZE;
581 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "length [%d]", length);
582 memcpy(dataSegment + CA_HEADER_LENGTH, message->data,
583 CA_SUPPORTED_BLE_MTU_SIZE - CA_HEADER_LENGTH);
586 int32_t iter = message->dataLen / CA_SUPPORTED_BLE_MTU_SIZE;
588 if (CA_STATUS_OK != CAEDRClientSendData(remoteAddress, serviceUUID,
589 dataSegment, length, &sentLength))
591 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "CAEDRClientSendData API failed");
592 OICFree(dataSegment);
595 OICFree(dataSegment);
597 for (index = 1; index < iter; index++)
599 // Send the remaining header.
600 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "Sending the chunk number [%d]", index);
602 if (CA_STATUS_OK != CAEDRClientSendData(remoteAddress, serviceUUID,
603 message->data + ((index * CA_SUPPORTED_BLE_MTU_SIZE) - CA_HEADER_LENGTH),
604 CA_SUPPORTED_BLE_MTU_SIZE, &sentLength))
606 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "CAEDRClientSendData API failed");
611 if (message->dataLen / CA_SUPPORTED_BLE_MTU_SIZE)
613 // send the last segment of the data (Ex: 22 bytes of 622 bytes of data when MTU is 200)
614 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "Sending the last chunk");
615 if (CA_STATUS_OK != CAEDRClientSendData(remoteAddress, serviceUUID,
616 message->data + (index * CA_SUPPORTED_BLE_MTU_SIZE) - CA_HEADER_LENGTH,
617 message->dataLen % CA_SUPPORTED_BLE_MTU_SIZE + CA_HEADER_LENGTH, &sentLength))
619 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "CAEDRClientSendData API failed");
624 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "OUT");
627 CAResult_t CAEDRClientSendData(const char *remoteAddress, const char *serviceUUID,
628 const void *data, uint32_t dataLength, uint32_t *sentLength)
631 // Send the first segment with the header.
632 if ((NULL != remoteAddress) && (0 < strlen(remoteAddress))) //Unicast data
634 if (CA_STATUS_OK != CAEDRClientSendUnicastData(remoteAddress, serviceUUID,
635 data, dataLength, sentLength))
637 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Failed to send unicast data !");
638 return CA_STATUS_FAILED;
643 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "sending multicast data : %s", data);
644 if (CA_STATUS_OK != CAEDRClientSendMulticastData(serviceUUID, data,
645 dataLength, sentLength))
647 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Failed to send multicast data !");
648 return CA_STATUS_FAILED;
654 void CAAdapterDataReceiverHandler(void *context)
656 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "IN_CAAdapterDataReceiverHandler");
658 CAEDRData *message = (CAEDRData *) context;
661 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Failed to get message!");
665 static uint32_t recvDataLen = 0;
666 static uint32_t totalDataLen = 0;
667 static char *defragData = NULL;
668 static CARemoteEndpoint_t *remoteEndpoint = NULL;
670 if (!g_isHeaderAvailable)
672 totalDataLen = CAParseHeader((char*)message->data);
673 if (totalDataLen == 0)
675 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "totalDataLen is zero");
679 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "Total data to be accumulated [%d] bytes",
682 defragData = (char *) OICMalloc(sizeof(char) * totalDataLen);
685 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "defragData is null");
689 const char *remoteAddress = message->remoteEndpoint->addressInfo.BT.btMacAddress;
690 const char *serviceUUID = message->remoteEndpoint->resourceUri;
692 remoteEndpoint = CAAdapterCreateRemoteEndpoint(CA_EDR, remoteAddress,
695 memcpy(defragData + recvDataLen, message->data + CA_HEADER_LENGTH,
696 message->dataLen - CA_HEADER_LENGTH);
697 recvDataLen += message->dataLen - CA_HEADER_LENGTH;
698 g_isHeaderAvailable = true;
702 memcpy(defragData + recvDataLen, message->data, message->dataLen);
703 recvDataLen += message->dataLen ;
706 if (totalDataLen == recvDataLen)
708 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "Sending data up !");
709 g_networkPacketReceivedCallback(remoteEndpoint, defragData, recvDataLen);
712 remoteEndpoint = NULL;
713 g_isHeaderAvailable = false;
716 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "OUT_CAAdapterDataReceiverHandler");
719 CAResult_t CAAdapterStartQueue()
721 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
722 // Start send queue thread
723 if (CA_STATUS_OK != CAQueueingThreadStart(g_sendQueueHandle))
725 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to Start Send Data Thread");
726 CAEDRClientUnsetCallbacks();
727 //Disconnect all the client connections
728 CAEDRClientDisconnectAll();
729 return CA_STATUS_FAILED;
732 // Start receive queue thread
733 if (CA_STATUS_OK != CAQueueingThreadStart(g_recvQueueHandle))
735 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to Start Receive Data Thread");
736 CAEDRClientUnsetCallbacks();
737 //Disconnect all the client connections
738 CAEDRClientDisconnectAll();
739 return CA_STATUS_FAILED;
741 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
745 CAResult_t CAAdapterStopQueue()
747 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
748 //Stop send queue thread
749 CAQueueingThreadStop(g_sendQueueHandle);
751 //Stop receive queue thread
752 CAQueueingThreadStop(g_recvQueueHandle);
753 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
757 void CAAdapterRecvData(const char *remoteAddress, const void *data,
758 uint32_t dataLength, uint32_t *sentLength)
760 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "IN");
762 if (false == g_adapterState)
764 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Bluetooth adapter is disabled!");
769 char *serviceUUID = OIC_EDR_SERVICE_ID;
772 VERIFY_NON_NULL_VOID(serviceUUID, EDR_ADAPTER_TAG, "service UUID is null");
773 VERIFY_NON_NULL_VOID(data, EDR_ADAPTER_TAG, "Data is null");
774 VERIFY_NON_NULL_VOID(sentLength, EDR_ADAPTER_TAG, "Sent data length holder is null");
776 // Create remote endpoint
777 CARemoteEndpoint_t *remoteEndpoint = CAAdapterCreateRemoteEndpoint(CA_EDR, remoteAddress,
779 if (NULL == remoteEndpoint)
781 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Failed to create remote endpoint !");
785 // Add message to data queue
786 CAEDRData *edrData = CACreateEDRData(remoteEndpoint, data, dataLength);
787 CAQueueingThreadAddData(g_recvQueueHandle, edrData, sizeof(CARemoteEndpoint_t));
788 *sentLength = dataLength;
790 // Free remote endpoint
791 CAAdapterFreeRemoteEndpoint(remoteEndpoint);
793 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "OUT");
797 CAResult_t CAAdapterSendData(const char *remoteAddress, const char *serviceUUID,
798 const void *data, uint32_t dataLength, uint32_t *sentLength)
800 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "IN - CAAdapterSendData");
802 if (false == g_adapterState)
804 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Bluetooth adapter is disabled!");
809 VERIFY_NON_NULL(serviceUUID, EDR_ADAPTER_TAG, "service UUID is null");
810 VERIFY_NON_NULL(data, EDR_ADAPTER_TAG, "Data is null");
811 VERIFY_NON_NULL(sentLength, EDR_ADAPTER_TAG, "Sent data length holder is null");
813 // Create remote endpoint
814 CARemoteEndpoint_t *remoteEndpoint = CAAdapterCreateRemoteEndpoint(CA_EDR, remoteAddress,
816 if (NULL == remoteEndpoint)
818 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Failed to create remote endpoint !");
819 return CA_STATUS_FAILED;
822 // Add message to data queue
823 CAEDRData *edrData = CACreateEDRData(remoteEndpoint, data, dataLength);
824 CAQueueingThreadAddData(g_sendQueueHandle, edrData, sizeof(CAEDRData));
825 *sentLength = dataLength;
827 // Free remote endpoint
828 CAAdapterFreeRemoteEndpoint(remoteEndpoint);
830 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "OUT - CAAdapterSendData");
834 void CAEDRNotifyNetworkStatus(CANetworkStatus_t status)
836 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "IN");
838 // Create localconnectivity
839 if (NULL == g_localConnectivity)
841 CAEDRGetInterfaceInformation(&g_localConnectivity);
844 if(CA_INTERFACE_UP == status)
846 if(false == g_adapterState)
848 // Get Bluetooth adapter state
849 bool adapterState = false;
850 if (CA_STATUS_OK != CAEDRGetAdapterEnableState(&adapterState))
852 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Failed to get adapter enable state");
856 if (false== adapterState)
858 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Bluetooth adapter is disabled!");
859 g_adapterState = false;
862 CAEDRClientSetCallbacks();
863 g_adapterState = true;
864 CAAdapterStartQueue();
865 // starting RFCommServer
866 if(true == g_serverState)
869 g_serverState = false;
875 g_adapterState = false;
878 // Notity to upper layer
879 if (g_networkChangeCallback && g_localConnectivity && g_edrThreadPool)
881 // Add notification task to thread pool
882 CAEDRNetworkEvent *event = CAEDRCreateNetworkEvent(g_localConnectivity, status);
885 if (CA_STATUS_OK != u_thread_pool_add_task(g_edrThreadPool, CAEDROnNetworkStatusChanged,
888 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Failed to create threadpool!");
894 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "OUT");
897 void CAEDROnNetworkStatusChanged(void *context)
899 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "IN");
903 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "context is NULL!");
907 CAEDRNetworkEvent *networkEvent = (CAEDRNetworkEvent *) context;
909 // Notity to upper layer
910 if (g_networkChangeCallback)
912 g_networkChangeCallback(networkEvent->info, networkEvent->status);
915 // Free the created Network event
916 CAEDRFreeNetworkEvent(networkEvent);
918 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "OUT");
921 CAEDRNetworkEvent *CAEDRCreateNetworkEvent(CALocalConnectivity_t *connectivity,
922 CANetworkStatus_t status)
924 VERIFY_NON_NULL_RET(connectivity, EDR_ADAPTER_TAG, "connectivity is NULL", NULL);
926 // Create CAEDRNetworkEvent
927 CAEDRNetworkEvent *event = (CAEDRNetworkEvent *) OICMalloc(sizeof(CAEDRNetworkEvent));
930 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Failed to allocate memory to network event!");
934 // Create duplicate of Local connectivity
935 event->info = CAAdapterCopyLocalEndpoint(connectivity);
936 event->status = status;
940 void CAEDRFreeNetworkEvent(CAEDRNetworkEvent *event)
944 CAAdapterFreeLocalEndpoint(event->info);
949 CAEDRData *CACreateEDRData(const CARemoteEndpoint_t *remoteEndpoint, const void *data,
952 CAEDRData *edrData = (CAEDRData *) OICMalloc(sizeof(CAEDRData));
955 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Memory allocation failed!");
959 edrData->remoteEndpoint = CAAdapterCopyRemoteEndpoint(remoteEndpoint);
960 edrData->data = OICMalloc(dataLength);
961 if (NULL == edrData->data)
963 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Memory allocation failed!");
964 CAFreeEDRData(edrData);
967 memcpy(edrData->data, data, dataLength);
968 edrData->dataLen = dataLength;
973 void CAFreeEDRData(CAEDRData *edrData)
978 CAAdapterFreeRemoteEndpoint(edrData->remoteEndpoint);
979 OICFree(edrData->data);
983 void CAEDRDataDestroyer(void *data, uint32_t size)
985 CAEDRData *edrdata = (CAEDRData *) data;
987 CAFreeEDRData(edrdata);