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 "caqueueingthread.h"
33 #include "oic_malloc.h"
34 #include "caremotehandler.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;
62 * @brief Storing Adapter state information
64 static bool g_adapterState = true;
67 * @var g_networkPacketReceivedCallback
68 * @brief Maintains the callback to be notified on receival of network packets from other
71 static CANetworkPacketReceivedCallback g_networkPacketReceivedCallback = NULL;
74 * @var g_networkChangeCallback
75 * @brief Maintains the callback to be notified on local bluetooth adapter status change.
77 static CANetworkChangeCallback g_networkChangeCallback = NULL;
80 * @var g_errorCallback
81 * @brief error Callback to CA adapter
83 static CAErrorHandleCallback g_errorCallback = NULL;
86 * @var g_localConnectivity
87 * @brief Information of local Bluetooth adapter.
89 static CAEndpoint_t *g_localConnectivity = NULL;
93 * @brief Storing Rfcommserver state information
95 static bool g_serverState = false;
97 static CAResult_t CAStartServer();
98 static CAResult_t CAEDRInitializeQueueHandlers();
99 CAResult_t CAEDRInitializeSendHandler();
100 CAResult_t CAEDRInitializeReceiveHandler();
101 void CAAdapterTerminateQueues();
102 void CAAdapterDataSendHandler(void *context);
103 void CAAdapterDataReceiverHandler(void *context);
104 CAResult_t CAAdapterStopQueue();
105 void CAAdapterRecvData(const char *remoteAddress, const uint8_t *data, uint32_t dataLength,
106 uint32_t *sentLength);
107 void CAEDRNotifyNetworkStatus(CANetworkStatus_t status);
108 void CAEDROnNetworkStatusChanged(void *context);
109 CAResult_t CAAdapterSendData(const char *remoteAddress, const char *serviceUUID, const uint8_t *data,
110 uint32_t dataLength, uint32_t *sentLength);
111 CAEDRNetworkEvent *CAEDRCreateNetworkEvent(CAEndpoint_t *connectivity,
112 CANetworkStatus_t status);
114 CAResult_t CAEDRClientSendData(const char *remoteAddress,
116 uint32_t dataLength);
119 * @fn CACreateEDRData
120 * @brief Helper function to create CAEDRData
122 static CAEDRData *CACreateEDRData(const CAEndpoint_t *remoteEndpoint, const uint8_t *data,
123 uint32_t dataLength);
127 * @brief Free the Created EDR data
129 static void CAFreeEDRData(CAEDRData *edrData);
132 * @fn CAEDRFreeNetworkEvent
133 * @brief Free the memory associated with @event.
135 void CAEDRFreeNetworkEvent(CAEDRNetworkEvent *event);
137 static void CAEDRDataDestroyer(void *data, uint32_t size);
139 static void CAEDRErrorHandler(const char *remoteAddress, const uint8_t *data,
140 uint32_t dataLength, CAResult_t result);
142 CAResult_t CAInitializeEDR(CARegisterConnectivityCallback registerCallback,
143 CANetworkPacketReceivedCallback packetReceivedCallback,
144 CANetworkChangeCallback networkStateChangeCallback,
145 CAErrorHandleCallback errorCallback, 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;
161 g_errorCallback = errorCallback;
163 // Initialize EDR Network Monitor
164 CAResult_t err = CAEDRInitializeNetworkMonitor(handle);
165 if (CA_STATUS_OK != err)
167 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "EDR N/w Monitor Initialize failed!, error number [%d]",
172 CAEDRSetNetworkChangeCallback(CAEDRNotifyNetworkStatus);
173 CAEDRSetPacketReceivedCallback(CAAdapterRecvData);
174 CAEDRSetErrorHandler(CAEDRErrorHandler);
175 CAEDRInitializeClient(handle);
177 CAConnectivityHandler_t handler;
178 handler.startAdapter = CAStartEDR;
179 handler.startListenServer = CAStartEDRListeningServer;
180 handler.startDiscoveryServer = CAStartEDRDiscoveryServer;
181 handler.sendData = CASendEDRUnicastData;
182 handler.sendDataToAll = CASendEDRMulticastData;
183 handler.GetnetInfo = CAGetEDRInterfaceInformation;
184 handler.readData = CAReadEDRData;
185 handler.stopAdapter = CAStopEDR;
186 handler.terminate = CATerminateEDR;
187 registerCallback(handler, CA_ADAPTER_RFCOMM_BTEDR);
189 // Initialize Send/Receive data message queues
190 if (CA_STATUS_OK != CAEDRInitializeQueueHandlers())
192 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "CAAdapterInitializeQueues API failed");
194 return CA_STATUS_FAILED;
197 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
201 CAResult_t CAStartEDR()
203 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
205 //Start Monitoring EDR Network
206 CAResult_t ret = CAEDRStartNetworkMonitor();
207 if (CA_STATUS_OK != ret)
209 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to Start n/w monitor");
212 // Get Bluetooth adapter state
213 bool adapterState = false;
214 if (CA_STATUS_OK != CAEDRGetAdapterEnableState(&adapterState))
216 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to get adapter enable state");
217 return CA_STATUS_FAILED;
220 if (false == adapterState)
222 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Bluetooth adapter is disabled!");
223 g_adapterState = false;
224 return CA_ADAPTER_NOT_ENABLED;
227 if (CA_STATUS_OK != (ret = CAEDRClientSetCallbacks()))
229 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Start Network Monitor failed!, error number [%d] ",
233 if (CA_STATUS_OK != (ret = CAAdapterStartQueue()))
235 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "CAAdapterStartQueue failed!, error number [%d] ", ret);
238 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
242 CAResult_t CAStartEDRListeningServer()
244 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
246 return CAStartServer();
249 CAResult_t CAStartEDRDiscoveryServer()
251 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
253 return CAStartServer();
256 int32_t CASendEDRUnicastData(const CAEndpoint_t *remoteEndpoint, const void *data,
259 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
262 VERIFY_NON_NULL_RET(remoteEndpoint, EDR_ADAPTER_TAG, "Remote endpoint is null", -1);
263 VERIFY_NON_NULL_RET(data, EDR_ADAPTER_TAG, "Data is null", -1);
267 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Invalid input: data length is zero!");
271 if (0 == strlen(remoteEndpoint->addr))
273 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Invalid input: EDR Address is empty!");
277 uint32_t sentLength = 0;
278 const char *serviceUUID = OIC_EDR_SERVICE_ID;
279 const char *address = remoteEndpoint->addr;
280 CAResult_t err = CAAdapterSendData(address, serviceUUID, data, dataLength, &sentLength);
281 if (CA_STATUS_OK != err)
283 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Send unicast data failed!, error num [%d]", err);
284 g_errorCallback(remoteEndpoint, data, dataLength, err);
288 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
292 int32_t CASendEDRMulticastData(const CAEndpoint_t *endpoint, const void *data, uint32_t dataLength)
294 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN - CASendEDRMulticastData");
297 VERIFY_NON_NULL_RET(data, EDR_ADAPTER_TAG, "Data is null", -1);
301 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Invalid input: data length is zero!");
305 uint32_t sentLen = 0;
306 const char *serviceUUID = OIC_EDR_SERVICE_ID;
307 CAResult_t err = CAAdapterSendData(NULL, serviceUUID, data, dataLength, &sentLen);
308 if (CA_STATUS_OK != err)
310 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Send multicast data failed!, error num [%d]", err);
311 g_errorCallback(endpoint, data, dataLength, err);
315 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT - CASendEDRMulticastData");
319 CAResult_t CAGetEDRInterfaceInformation(CAEndpoint_t **info, uint32_t *size)
321 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
323 VERIFY_NON_NULL(info, EDR_ADAPTER_TAG, "LocalConnectivity info is null");
325 CAResult_t err = CA_STATUS_OK;
327 if (CA_STATUS_OK != (err = CAEDRGetInterfaceInformation(info)))
329 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG,
330 "Failed to get local interface information!, error num [%d]", err);
335 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
339 CAResult_t CAReadEDRData()
341 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
343 return CAEDRManagerReadData();
346 CAResult_t CAStopEDR()
348 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
350 // Stop RFComm server if it is running
353 // Stop network monitor
354 CAEDRStopNetworkMonitor();
357 CAEDRClientUnsetCallbacks();
359 // Disconnect all the client connections
360 CAEDRClientDisconnectAll();
362 // Stop Send and receive Queue
363 CAAdapterStopQueue();
365 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
369 void CATerminateEDR()
371 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
373 // Terminate EDR Network Monitor
374 CAEDRTerminateNetworkMonitor();
376 // Terminate Send/Receive data messages queues
377 CAAdapterTerminateQueues();
379 g_networkPacketReceivedCallback = NULL;
380 g_networkChangeCallback = NULL;
382 // Terminate thread pool
383 g_edrThreadPool = NULL;
385 // Terminate EDR Client
386 CAEDRClientTerminate();
388 // Terminate EDR Server
389 CAEDRServerTerminate();
391 // Free LocalConnectivity information
392 CAFreeEndpoint(g_localConnectivity);
393 g_localConnectivity = NULL;
395 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
398 CAResult_t CAStartServer()
400 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
402 CAResult_t err = CA_STATUS_OK;
404 if (false == g_adapterState)
406 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "Bluetooth adapter is disabled!");
407 // Setting g_serverState for starting Rfcommserver when adapter starts
408 g_serverState = true;
412 if (CA_STATUS_OK != (err = CAEDRServerStart(g_edrThreadPool)))
414 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Failed to start RFCOMM server!, error num [%d]",
419 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
423 CAResult_t CAEDRInitializeQueueHandlers()
425 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
427 if (CA_STATUS_OK == CAEDRInitializeSendHandler()
428 && CA_STATUS_OK == CAEDRInitializeReceiveHandler())
430 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "Queue is initialized!");
434 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
435 return CA_STATUS_FAILED;
438 CAResult_t CAEDRInitializeSendHandler()
440 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
441 // Check if the message queue is already initialized
442 if (g_sendQueueHandle)
444 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "Already queue is initialized!");
448 g_sendQueueHandle = (CAQueueingThread_t *) OICMalloc(sizeof(CAQueueingThread_t));
449 if (!g_sendQueueHandle)
451 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Memory allocation failed!");
452 return CA_MEMORY_ALLOC_FAILED;
455 if (CA_STATUS_OK != CAQueueingThreadInitialize(g_sendQueueHandle, g_edrThreadPool,
456 CAAdapterDataSendHandler, CAEDRDataDestroyer))
458 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to Initialize send queue thread");
459 return CA_STATUS_FAILED;
464 CAResult_t CAEDRInitializeReceiveHandler()
466 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
467 // Check if the message queue is already initialized
468 if (g_recvQueueHandle)
470 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "Already queue is initialized!");
474 g_recvQueueHandle = (CAQueueingThread_t *) OICMalloc(sizeof(CAQueueingThread_t));
475 if (!g_recvQueueHandle)
477 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Memory allocation failed!");
478 return CA_MEMORY_ALLOC_FAILED;
481 if (CA_STATUS_OK != CAQueueingThreadInitialize(g_recvQueueHandle, g_edrThreadPool,
482 CAAdapterDataReceiverHandler,
485 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to Initialize send queue thread");
486 return CA_STATUS_FAILED;
489 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
493 void CAAdapterTerminateQueues()
495 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
497 if (g_sendQueueHandle)
499 CAQueueingThreadDestroy(g_sendQueueHandle);
500 g_sendQueueHandle = NULL;
502 if (g_recvQueueHandle)
504 CAQueueingThreadDestroy(g_recvQueueHandle);
505 g_recvQueueHandle = NULL;
508 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
511 void CAAdapterDataSendHandler(void *context)
513 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN - CAAdapterDataSendHandler");
515 CAEDRData *message = (CAEDRData *) context;
518 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to get message!");
522 const char *remoteAddress = NULL;
524 if (NULL == message->remoteEndpoint)
526 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "remoteEndpoint is not available");
531 remoteAddress = message->remoteEndpoint->addr;
536 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "EDR Send Message error");
537 //Error cannot be sent if remote address is NULL
541 CAResult_t result = CAEDRClientSendData(remoteAddress, message->data,
543 if(CA_STATUS_OK != result)
545 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "CAEDRClientSendData API failed");
546 CAEDRErrorHandler(remoteAddress, message->data, message->dataLen, result);
550 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
553 CAResult_t CAEDRClientSendData(const char *remoteAddress,
558 CAResult_t result = CA_SEND_FAILED;
560 // Send the first segment with the header.
561 if ((NULL != remoteAddress) && (0 < strlen(remoteAddress))) //Unicast data
563 result = CAEDRClientSendUnicastData(remoteAddress, data, dataLength);
564 if (CA_STATUS_OK != result)
566 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to send unicast data !");
572 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "sending multicast data : %s", data);
573 result = CAEDRClientSendMulticastData(data, dataLength);
575 if (CA_STATUS_OK != result)
577 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to send multicast data !");
584 void CAAdapterDataReceiverHandler(void *context)
586 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN_CAAdapterDataReceiverHandler");
588 CAEDRData *message = (CAEDRData *) context;
589 if (NULL == message || NULL == message->remoteEndpoint)
591 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to get message!");
595 CAEndpoint_t *remoteEndpoint = CACreateEndpointObject(CA_DEFAULT_FLAGS,
596 CA_ADAPTER_RFCOMM_BTEDR,
597 message->remoteEndpoint->addr,
600 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "Sending data up !");
601 g_networkPacketReceivedCallback(remoteEndpoint, message->data, message->dataLen);
603 CAFreeEndpoint(remoteEndpoint);
605 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT_CAAdapterDataReceiverHandler");
608 CAResult_t CAAdapterStartQueue()
610 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
611 // Start send queue thread
612 if (CA_STATUS_OK != CAQueueingThreadStart(g_sendQueueHandle))
614 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to Start Send Data Thread");
615 CAEDRClientUnsetCallbacks();
616 //Disconnect all the client connections
617 CAEDRClientDisconnectAll();
618 return CA_STATUS_FAILED;
621 // Start receive queue thread
622 if (CA_STATUS_OK != CAQueueingThreadStart(g_recvQueueHandle))
624 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to Start Receive Data Thread");
625 CAEDRClientUnsetCallbacks();
626 //Disconnect all the client connections
627 CAEDRClientDisconnectAll();
628 return CA_STATUS_FAILED;
630 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
634 CAResult_t CAAdapterStopQueue()
636 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
637 //Stop send queue thread
638 CAQueueingThreadStop(g_sendQueueHandle);
640 //Stop receive queue thread
641 CAQueueingThreadStop(g_recvQueueHandle);
642 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
646 void CAAdapterRecvData(const char *remoteAddress, const uint8_t *data, uint32_t dataLength,
647 uint32_t *sentLength)
649 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
651 if (false == g_adapterState)
653 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Bluetooth adapter is disabled!");
659 VERIFY_NON_NULL_VOID(data, EDR_ADAPTER_TAG, "Data is null");
660 VERIFY_NON_NULL_VOID(sentLength, EDR_ADAPTER_TAG, "Sent data length holder is null");
662 // Create remote endpoint
663 CAEndpoint_t *remoteEndpoint = CACreateEndpointObject(CA_DEFAULT_FLAGS,
664 CA_ADAPTER_RFCOMM_BTEDR,
666 if (NULL == remoteEndpoint)
668 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to create remote endpoint !");
672 // Add message to data queue
673 CAEDRData *edrData = CACreateEDRData(remoteEndpoint, data, dataLength);
674 CAQueueingThreadAddData(g_recvQueueHandle, edrData, sizeof(CAEDRData));
675 *sentLength = dataLength;
677 // Free remote endpoint
678 CAFreeEndpoint(remoteEndpoint);
680 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
683 void CAEDRErrorHandler(const char *remoteAddress, const uint8_t *data,
684 uint32_t dataLength, CAResult_t result)
686 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
689 VERIFY_NON_NULL_VOID(data, EDR_ADAPTER_TAG, "Data is null");
691 // Create remote endpoint
692 CAEndpoint_t *remoteEndpoint = CACreateEndpointObject(0, CA_ADAPTER_RFCOMM_BTEDR,
696 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to create remote endpoint !");
700 g_errorCallback(remoteEndpoint, data, dataLength, result);
702 // Free remote endpoint
703 CAFreeEndpoint(remoteEndpoint);
705 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
708 CAResult_t CAAdapterSendData(const char *remoteAddress, const char *serviceUUID, const uint8_t *data,
709 uint32_t dataLength, uint32_t *sentLength)
711 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN - CAAdapterSendData");
713 if (false == g_adapterState)
715 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Bluetooth adapter is disabled!");
717 return CA_ADAPTER_NOT_ENABLED;
720 VERIFY_NON_NULL(serviceUUID, EDR_ADAPTER_TAG, "service UUID is null");
721 VERIFY_NON_NULL(data, EDR_ADAPTER_TAG, "Data is null");
722 VERIFY_NON_NULL(sentLength, EDR_ADAPTER_TAG, "Sent data length holder is null");
724 // Create remote endpoint
725 CAEndpoint_t *remoteEndpoint = CACreateEndpointObject(CA_DEFAULT_FLAGS,
726 CA_ADAPTER_RFCOMM_BTEDR,
728 if (NULL == remoteEndpoint)
730 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to create remote endpoint !");
731 return CA_MEMORY_ALLOC_FAILED;
734 // Add message to data queue
735 CAEDRData *edrData = CACreateEDRData(remoteEndpoint, data, dataLength);
736 CAQueueingThreadAddData(g_sendQueueHandle, edrData, sizeof (CAEDRData));
737 *sentLength = dataLength;
739 // Free remote endpoint
740 CAFreeEndpoint(remoteEndpoint);
742 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT - CAAdapterSendData");
746 void CAEDRNotifyNetworkStatus(CANetworkStatus_t status)
748 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
750 // Create localconnectivity
751 if (NULL == g_localConnectivity)
753 CAEDRGetInterfaceInformation(&g_localConnectivity);
756 if (CA_INTERFACE_UP == status)
758 if (false == g_adapterState)
760 // Get Bluetooth adapter state
761 bool adapterState = false;
762 if (CA_STATUS_OK != CAEDRGetAdapterEnableState(&adapterState))
764 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to get adapter enable state");
768 if (false== adapterState)
770 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Bluetooth adapter is disabled!");
771 g_adapterState = false;
774 CAEDRClientSetCallbacks();
775 g_adapterState = true;
776 CAAdapterStartQueue();
777 // starting RFCommServer
778 if (true == g_serverState)
781 g_serverState = false;
787 g_adapterState = false;
790 // Notify to upper layer
791 if (g_networkChangeCallback && g_localConnectivity && g_edrThreadPool)
793 // Add notification task to thread pool
794 CAEDRNetworkEvent *event = CAEDRCreateNetworkEvent(g_localConnectivity, status);
797 if (CA_STATUS_OK != ca_thread_pool_add_task(g_edrThreadPool,
798 CAEDROnNetworkStatusChanged,event))
800 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to create threadpool!");
806 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "OUT");
809 void CAEDROnNetworkStatusChanged(void *context)
811 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN");
815 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "context is NULL!");
819 CAEDRNetworkEvent *networkEvent = (CAEDRNetworkEvent *) context;
821 // Notify to upper layer
822 if (g_networkChangeCallback)
824 g_networkChangeCallback(networkEvent->info, networkEvent->status);
827 // Free the created Network event
828 CAEDRFreeNetworkEvent(networkEvent);
830 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
833 CAEDRNetworkEvent *CAEDRCreateNetworkEvent(CAEndpoint_t *connectivity,
834 CANetworkStatus_t status)
836 VERIFY_NON_NULL_RET(connectivity, EDR_ADAPTER_TAG, "connectivity is NULL", NULL);
838 // Create CAEDRNetworkEvent
839 CAEDRNetworkEvent *event = (CAEDRNetworkEvent *) OICMalloc(sizeof(CAEDRNetworkEvent));
842 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to allocate memory to network event!");
846 // Create duplicate of Local connectivity
847 event->info = CACloneEndpoint(connectivity);
848 event->status = status;
852 void CAEDRFreeNetworkEvent(CAEDRNetworkEvent *event)
856 CAFreeEndpoint(event->info);
861 CAEDRData *CACreateEDRData(const CAEndpoint_t *remoteEndpoint,
862 const uint8_t *data, uint32_t dataLength)
864 CAEDRData *edrData = (CAEDRData *)OICMalloc(sizeof (CAEDRData));
867 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Memory allocation failed!");
871 edrData->remoteEndpoint = CACloneEndpoint(remoteEndpoint);
873 edrData->data = OICMalloc(dataLength);
874 if (NULL == edrData->data)
876 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Memory allocation failed!");
877 CAFreeEDRData(edrData);
880 memcpy(edrData->data, data, dataLength);
881 edrData->dataLen = dataLength;
886 void CAFreeEDRData(CAEDRData *edrData)
888 VERIFY_NON_NULL_VOID(edrData, EDR_ADAPTER_TAG, "edrData is NULL");
890 CAFreeEndpoint(edrData->remoteEndpoint);
891 OICFree(edrData->data);
895 void CAEDRDataDestroyer(void *data, uint32_t size)
897 if ((size_t)size < sizeof(CAEDRData))
899 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Destroy data too small %p %d",
902 CAEDRData *edrdata = (CAEDRData *) data;
904 CAFreeEDRData(edrdata);