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 ca_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();
104 static CAResult_t CAEDRInitializeQueueHandlers();
105 CAResult_t CAEDRInitializeSendHandler();
106 CAResult_t CAEDRInitializeReceiveHandler();
107 void CAAdapterTerminateQueues();
108 void CAAdapterDataSendHandler(void *context);
109 void CAAdapterDataReceiverHandler(void *context);
110 CAResult_t CAAdapterStopQueue();
111 void CAAdapterRecvData(const char *remoteAddress, const void *data, uint32_t dataLength,
112 uint32_t *sentLength);
113 void CAEDRNotifyNetworkStatus(CANetworkStatus_t status);
114 void CAEDROnNetworkStatusChanged(void *context);
115 CAResult_t CAAdapterSendData(const char *remoteAddress, const char *serviceUUID, const void *data,
116 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 ca_thread_pool_t handle)
147 OIC_LOG(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(handle);
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(DEBUG, EDR_ADAPTER_TAG, "OUT");
199 CAResult_t CAStartEDR()
201 OIC_LOG(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(ERROR, EDR_ADAPTER_TAG, "Failed to get adapter enable state");
215 return CA_STATUS_FAILED;
218 if (false == adapterState)
220 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Bluetooth adapter is disabled!");
221 g_adapterState = false;
222 return CA_ADAPTER_NOT_ENABLED;
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] ", ret);
236 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
240 CAResult_t CAStartEDRListeningServer()
242 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
244 return CAStartServer();
247 CAResult_t CAStartEDRDiscoveryServer()
249 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
251 return CAStartServer();
254 int32_t CASendEDRUnicastData(const CARemoteEndpoint_t *remoteEndpoint, const void *data,
257 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
260 VERIFY_NON_NULL_RET(remoteEndpoint, EDR_ADAPTER_TAG, "Remote endpoint is null", -1);
261 VERIFY_NON_NULL_RET(data, EDR_ADAPTER_TAG, "Data is null", -1);
265 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Invalid input: data length is zero!");
269 if (0 == strlen(remoteEndpoint->addressInfo.BT.btMacAddress))
271 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Invalid input: EDR Address is empty!");
275 uint32_t sentLength = 0;
276 const char *serviceUUID = OIC_EDR_SERVICE_ID;
277 const char *address = remoteEndpoint->addressInfo.BT.btMacAddress;
278 CAResult_t err = CAAdapterSendData(address, serviceUUID, data, dataLength, &sentLength);
279 if (CA_STATUS_OK != err)
281 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Send unicast data failed!, error num [%d]", err);
285 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
289 int32_t CASendEDRMulticastData(const void *data, uint32_t dataLength)
291 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN - CASendEDRMulticastData");
294 VERIFY_NON_NULL_RET(data, EDR_ADAPTER_TAG, "Data is null", -1);
298 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Invalid input: data length is zero!");
302 uint32_t sentLen = 0;
303 const char *serviceUUID = OIC_EDR_SERVICE_ID;
304 CAResult_t err = CAAdapterSendData(NULL, serviceUUID, data, dataLength, &sentLen);
305 if (CA_STATUS_OK != err)
307 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Send multicast data failed!, error num [%d]", err);
311 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT - CASendEDRMulticastData");
316 CAResult_t CAGetEDRInterfaceInformation(CALocalConnectivity_t **info, uint32_t *size)
318 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
320 VERIFY_NON_NULL(info, EDR_ADAPTER_TAG, "LocalConnectivity info is null");
322 CAResult_t err = CA_STATUS_OK;
324 if (CA_STATUS_OK != (err = CAEDRGetInterfaceInformation(info)))
326 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG,
327 "Failed to get local interface information!, error num [%d]", err);
332 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
336 CAResult_t CAReadEDRData()
338 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
340 return CAEDRManagerReadData();
343 CAResult_t CAStopEDR()
345 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
347 // Stop RFComm server if it is running
348 if (-1 != g_serverId)
350 CAEDRServerStop(g_serverId);
354 // Stop network monitor
355 CAEDRStopNetworkMonitor();
358 CAEDRClientUnsetCallbacks();
360 // Disconnect all the client connections
361 CAEDRClientDisconnectAll();
363 // Stop Send and receive Queue
364 CAAdapterStopQueue();
366 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
370 void CATerminateEDR()
372 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
376 // Terminate EDR Network Monitor
377 CAEDRTerminateNetworkMonitor();
379 // Terminate Send/Receive data messages queues
380 CAAdapterTerminateQueues();
382 g_networkPacketReceivedCallback = NULL;
383 g_networkChangeCallback = NULL;
385 // Terminate thread pool
386 g_edrThreadPool = NULL;
388 // Terminate EDR Client
389 CAEDRClientTerminate();
391 // Terminate EDR Server
392 CAEDRServerTerminate();
394 // Free LocalConnectivity information
395 CAAdapterFreeLocalEndpoint(g_localConnectivity);
396 g_localConnectivity = NULL;
398 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
401 CAResult_t CAStartServer()
403 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
405 CAResult_t err = CA_STATUS_OK;
407 if (false == g_adapterState)
409 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "Bluetooth adapter is disabled!");
410 // Setting g_serverState for starting Rfcommserver when adapter starts
411 g_serverState = true;
417 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "Server is already in running state.");
418 return CA_SERVER_STARTED_ALREADY;
421 if (CA_STATUS_OK != (err = CAEDRServerStart(OIC_EDR_SERVICE_ID, &g_serverId, g_edrThreadPool)))
423 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Failed to start RFCOMM server!, error num [%d]",
428 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
432 CAResult_t CAEDRInitializeQueueHandlers()
434 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
436 if (CA_STATUS_OK == CAEDRInitializeSendHandler()
437 && CA_STATUS_OK == CAEDRInitializeReceiveHandler())
439 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "Queue is initialized!");
443 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
444 return CA_STATUS_FAILED;
447 CAResult_t CAEDRInitializeSendHandler()
449 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
450 // Check if the message queue is already initialized
451 if (g_sendQueueHandle)
453 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "Already queue is initialized!");
457 g_sendQueueHandle = (CAQueueingThread_t *) OICMalloc(sizeof(CAQueueingThread_t));
458 if (!g_sendQueueHandle)
460 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Memory allocation failed!");
461 return CA_MEMORY_ALLOC_FAILED;
464 if (CA_STATUS_OK != CAQueueingThreadInitialize(g_sendQueueHandle, g_edrThreadPool,
465 CAAdapterDataSendHandler, CAEDRDataDestroyer))
467 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to Initialize send queue thread");
468 return CA_STATUS_FAILED;
473 CAResult_t CAEDRInitializeReceiveHandler()
475 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
476 // Check if the message queue is already initialized
477 if (g_recvQueueHandle)
479 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "Already queue is initialized!");
483 g_recvQueueHandle = (CAQueueingThread_t *) OICMalloc(sizeof(CAQueueingThread_t));
484 if (!g_recvQueueHandle)
486 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Memory allocation failed!");
487 return CA_MEMORY_ALLOC_FAILED;
490 if (CA_STATUS_OK != CAQueueingThreadInitialize(g_recvQueueHandle, g_edrThreadPool,
491 CAAdapterDataReceiverHandler,
494 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to Initialize send queue thread");
495 return CA_STATUS_FAILED;
498 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
502 void CAAdapterTerminateQueues()
504 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
506 if (g_sendQueueHandle)
508 CAQueueingThreadDestroy(g_sendQueueHandle);
509 g_sendQueueHandle = NULL;
511 if (g_recvQueueHandle)
513 CAQueueingThreadDestroy(g_recvQueueHandle);
514 g_recvQueueHandle = NULL;
517 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
520 void CAAdapterDataSendHandler(void *context)
522 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN - CAAdapterDataSendHandler");
524 CAEDRData *message = (CAEDRData *) context;
527 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to get message!");
531 const char *remoteAddress = NULL;
532 const char *serviceUUID = NULL;
533 uint32_t sentLength = 0;
535 if (NULL == message->remoteEndpoint)
537 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "remoteEndpoint is not available");
541 remoteAddress = message->remoteEndpoint->addressInfo.BT.btMacAddress;
542 serviceUUID = message->remoteEndpoint->resourceUri;
545 uint32_t dataSegmentLength = message->dataLen + CA_HEADER_LENGTH;
546 uint32_t dataLen = message->dataLen;
547 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "checking for fragmentation and the dataLen is %d",
550 char *header = (char *) OICCalloc(CA_HEADER_LENGTH, sizeof(char));
551 VERIFY_NON_NULL_VOID(header, EDR_ADAPTER_TAG, "Memory allocation failed");
553 char* dataSegment = (char *) OICCalloc(dataSegmentLength, sizeof(char));
554 if (NULL == dataSegment)
556 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Memory allocation failed");
561 CAResult_t result = CAGenerateHeader(header, dataLen);
562 if (CA_STATUS_OK != result)
564 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Generate header failed");
566 OICFree(dataSegment);
570 memcpy(dataSegment, header, CA_HEADER_LENGTH);
573 if (CA_SUPPORTED_EDR_MTU_SIZE > dataSegmentLength)
575 length = dataSegmentLength;
576 memcpy(dataSegment + CA_HEADER_LENGTH, message->data, dataLen);
580 length = CA_SUPPORTED_EDR_MTU_SIZE;
581 memcpy(dataSegment + CA_HEADER_LENGTH, message->data,
582 CA_SUPPORTED_EDR_MTU_SIZE - CA_HEADER_LENGTH);
585 uint32_t iter = dataSegmentLength / CA_SUPPORTED_EDR_MTU_SIZE;
587 if (CA_STATUS_OK != CAEDRClientSendData(remoteAddress, serviceUUID, dataSegment, length,
590 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "CAEDRClientSendData API failed");
591 OICFree(dataSegment);
594 OICFree(dataSegment);
596 for (index = 1; index < iter; index++)
598 // Send the remaining header.
599 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "Sending the chunk number [%d]", index);
601 if (CA_STATUS_OK != CAEDRClientSendData(remoteAddress, serviceUUID,
602 message->data + ((index * CA_SUPPORTED_EDR_MTU_SIZE) - CA_HEADER_LENGTH),
603 CA_SUPPORTED_EDR_MTU_SIZE, &sentLength))
605 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "CAEDRClientSendData API failed");
610 uint32_t remainingLen = dataSegmentLength % CA_SUPPORTED_EDR_MTU_SIZE;
611 if (remainingLen && (dataSegmentLength > CA_SUPPORTED_EDR_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_EDR_MTU_SIZE) - CA_HEADER_LENGTH,
617 remainingLen, &sentLength))
619 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "CAEDRClientSendData API failed");
624 OIC_LOG(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, data,
635 dataLength, sentLength))
637 OIC_LOG(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, dataLength,
647 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to send multicast data !");
648 return CA_STATUS_FAILED;
654 void CAAdapterDataReceiverHandler(void *context)
656 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN_CAAdapterDataReceiverHandler");
658 CAEDRData *message = (CAEDRData *) context;
661 OIC_LOG(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 (0 == totalDataLen)
675 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "totalDataLen is zero");
679 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "Total data to be accumulated [%d] bytes", totalDataLen);
681 defragData = (char *) OICMalloc(sizeof(char) * totalDataLen);
684 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "defragData is null");
688 const char *remoteAddress = message->remoteEndpoint->addressInfo.BT.btMacAddress;
689 const char *serviceUUID = message->remoteEndpoint->resourceUri;
691 remoteEndpoint = CAAdapterCreateRemoteEndpoint(CA_EDR, remoteAddress, serviceUUID);
693 memcpy(defragData + recvDataLen, message->data + CA_HEADER_LENGTH,
694 message->dataLen - CA_HEADER_LENGTH);
695 recvDataLen += message->dataLen - CA_HEADER_LENGTH;
696 g_isHeaderAvailable = true;
700 memcpy(defragData + recvDataLen, message->data, message->dataLen);
701 recvDataLen += message->dataLen ;
704 if (totalDataLen == recvDataLen)
706 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "Sending data up !");
707 g_networkPacketReceivedCallback(remoteEndpoint, defragData, recvDataLen);
710 remoteEndpoint = NULL;
711 g_isHeaderAvailable = false;
714 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT_CAAdapterDataReceiverHandler");
717 CAResult_t CAAdapterStartQueue()
719 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
720 // Start send queue thread
721 if (CA_STATUS_OK != CAQueueingThreadStart(g_sendQueueHandle))
723 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to Start Send Data Thread");
724 CAEDRClientUnsetCallbacks();
725 //Disconnect all the client connections
726 CAEDRClientDisconnectAll();
727 return CA_STATUS_FAILED;
730 // Start receive queue thread
731 if (CA_STATUS_OK != CAQueueingThreadStart(g_recvQueueHandle))
733 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to Start Receive Data Thread");
734 CAEDRClientUnsetCallbacks();
735 //Disconnect all the client connections
736 CAEDRClientDisconnectAll();
737 return CA_STATUS_FAILED;
739 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
743 CAResult_t CAAdapterStopQueue()
745 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
746 //Stop send queue thread
747 CAQueueingThreadStop(g_sendQueueHandle);
749 //Stop receive queue thread
750 CAQueueingThreadStop(g_recvQueueHandle);
751 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
755 void CAAdapterRecvData(const char *remoteAddress, const void *data, uint32_t dataLength,
756 uint32_t *sentLength)
758 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
760 if (false == g_adapterState)
762 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Bluetooth adapter is disabled!");
768 VERIFY_NON_NULL_VOID(data, EDR_ADAPTER_TAG, "Data is null");
769 VERIFY_NON_NULL_VOID(sentLength, EDR_ADAPTER_TAG, "Sent data length holder is null");
771 static const char serviceUUID[] = OIC_EDR_SERVICE_ID;
772 // Create remote endpoint
773 CARemoteEndpoint_t *remoteEndpoint = CAAdapterCreateRemoteEndpoint(CA_EDR, remoteAddress,
775 if (NULL == remoteEndpoint)
777 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to create remote endpoint !");
781 // Add message to data queue
782 CAEDRData *edrData = CACreateEDRData(remoteEndpoint, data, dataLength);
783 CAQueueingThreadAddData(g_recvQueueHandle, edrData, sizeof(CAEDRData));
784 *sentLength = dataLength;
786 // Free remote endpoint
787 CAAdapterFreeRemoteEndpoint(remoteEndpoint);
789 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
792 CAResult_t CAAdapterSendData(const char *remoteAddress, const char *serviceUUID, const void *data,
793 uint32_t dataLength, uint32_t *sentLength)
795 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN - CAAdapterSendData");
797 if (false == g_adapterState)
799 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Bluetooth adapter is disabled!");
804 VERIFY_NON_NULL(serviceUUID, EDR_ADAPTER_TAG, "service UUID is null");
805 VERIFY_NON_NULL(data, EDR_ADAPTER_TAG, "Data is null");
806 VERIFY_NON_NULL(sentLength, EDR_ADAPTER_TAG, "Sent data length holder is null");
808 // Create remote endpoint
809 CARemoteEndpoint_t *remoteEndpoint = CAAdapterCreateRemoteEndpoint(CA_EDR, remoteAddress,
811 if (NULL == remoteEndpoint)
813 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to create remote endpoint !");
814 return CA_STATUS_FAILED;
817 // Add message to data queue
818 CAEDRData *edrData = CACreateEDRData(remoteEndpoint, data, dataLength);
819 CAQueueingThreadAddData(g_sendQueueHandle, edrData, sizeof(CAEDRData));
820 *sentLength = dataLength;
822 // Free remote endpoint
823 CAAdapterFreeRemoteEndpoint(remoteEndpoint);
825 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT - CAAdapterSendData");
829 void CAEDRNotifyNetworkStatus(CANetworkStatus_t status)
831 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
833 // Create localconnectivity
834 if (NULL == g_localConnectivity)
836 CAEDRGetInterfaceInformation(&g_localConnectivity);
839 if (CA_INTERFACE_UP == status)
841 if (false == g_adapterState)
843 // Get Bluetooth adapter state
844 bool adapterState = false;
845 if (CA_STATUS_OK != CAEDRGetAdapterEnableState(&adapterState))
847 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to get adapter enable state");
851 if (false== adapterState)
853 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Bluetooth adapter is disabled!");
854 g_adapterState = false;
857 CAEDRClientSetCallbacks();
858 g_adapterState = true;
859 CAAdapterStartQueue();
860 // starting RFCommServer
861 if (true == g_serverState)
864 g_serverState = false;
870 g_adapterState = false;
873 // Notify to upper layer
874 if (g_networkChangeCallback && g_localConnectivity && g_edrThreadPool)
876 // Add notification task to thread pool
877 CAEDRNetworkEvent *event = CAEDRCreateNetworkEvent(g_localConnectivity, status);
880 if (CA_STATUS_OK != ca_thread_pool_add_task(g_edrThreadPool,
881 CAEDROnNetworkStatusChanged,event))
883 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to create threadpool!");
889 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "OUT");
892 void CAEDROnNetworkStatusChanged(void *context)
894 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
898 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "context is NULL!");
902 CAEDRNetworkEvent *networkEvent = (CAEDRNetworkEvent *) context;
904 // Notify to upper layer
905 if (g_networkChangeCallback)
907 g_networkChangeCallback(networkEvent->info, networkEvent->status);
910 // Free the created Network event
911 CAEDRFreeNetworkEvent(networkEvent);
913 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
916 CAEDRNetworkEvent *CAEDRCreateNetworkEvent(CALocalConnectivity_t *connectivity,
917 CANetworkStatus_t status)
919 VERIFY_NON_NULL_RET(connectivity, EDR_ADAPTER_TAG, "connectivity is NULL", NULL);
921 // Create CAEDRNetworkEvent
922 CAEDRNetworkEvent *event = (CAEDRNetworkEvent *) OICMalloc(sizeof(CAEDRNetworkEvent));
925 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to allocate memory to network event!");
929 // Create duplicate of Local connectivity
930 event->info = CAAdapterCopyLocalEndpoint(connectivity);
931 event->status = status;
935 void CAEDRFreeNetworkEvent(CAEDRNetworkEvent *event)
939 CAAdapterFreeLocalEndpoint(event->info);
944 CAEDRData *CACreateEDRData(const CARemoteEndpoint_t *remoteEndpoint, const void *data,
947 CAEDRData *edrData = (CAEDRData *) OICMalloc(sizeof(CAEDRData));
950 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Memory allocation failed!");
954 edrData->remoteEndpoint = CAAdapterCopyRemoteEndpoint(remoteEndpoint);
955 edrData->data = OICMalloc(dataLength);
956 if (NULL == edrData->data)
958 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Memory allocation failed!");
959 CAFreeEDRData(edrData);
962 memcpy(edrData->data, data, dataLength);
963 edrData->dataLen = dataLength;
968 void CAFreeEDRData(CAEDRData *edrData)
970 VERIFY_NON_NULL_VOID(edrData, EDR_ADAPTER_TAG, "edrData is NULL");
972 CAAdapterFreeRemoteEndpoint(edrData->remoteEndpoint);
973 OICFree(edrData->data);
977 void CAEDRDataDestroyer(void *data, uint32_t size)
979 CAEDRData *edrdata = (CAEDRData *) data;
981 CAFreeEDRData(edrdata);