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 "cafragmentation.h"
33 #include "caqueueingthread.h"
34 #include "oic_malloc.h"
35 #include "caremotehandler.h"
39 * @var EDR_ADAPTER_TAG
40 * @brief Logging tag for module name.
42 #define EDR_ADAPTER_TAG "OIC_CA_EDR_ADAP"
45 * @var g_edrThreadPool
46 * @brief Reference to threadpool.
48 static ca_thread_pool_t g_edrThreadPool = NULL;
51 * @var g_sendQueueHandle
52 * @brief Queue handle for Send Data
54 static CAQueueingThread_t *g_sendQueueHandle = NULL;
57 * @var g_recvQueueHandle
58 * @brief Queue handle for Receive Data
60 static CAQueueingThread_t *g_recvQueueHandle = NULL;
64 * @brief Storing Adapter state information
66 static bool g_adapterState = true;
69 * @var g_networkPacketReceivedCallback
70 * @brief Maintains the callback to be notified on receival of network packets from other
73 static CANetworkPacketReceivedCallback g_networkPacketReceivedCallback = NULL;
76 * @var g_networkChangeCallback
77 * @brief Maintains the callback to be notified on local bluetooth adapter status change.
79 static CANetworkChangeCallback g_networkChangeCallback = NULL;
82 * @var g_errorCallback
83 * @brief error Callback to CA adapter
85 static CAErrorHandleCallback g_errorCallback = NULL;
88 * @var g_localConnectivity
89 * @brief Information of local Bluetooth adapter.
91 static CAEndpoint_t *g_localConnectivity = NULL;
95 * @brief Storing Rfcommserver state information
97 static bool g_serverState = false;
99 static CAResult_t CAStartServer();
100 static CAResult_t CAEDRInitializeQueueHandlers();
101 CAResult_t CAEDRInitializeSendHandler();
102 CAResult_t CAEDRInitializeReceiveHandler();
103 void CAAdapterTerminateQueues();
104 void CAAdapterDataSendHandler(void *context);
105 void CAAdapterDataReceiverHandler(void *context);
106 CAResult_t CAAdapterStopQueue();
107 void CAAdapterRecvData(const char *remoteAddress, const uint8_t *data, uint32_t dataLength,
108 uint32_t *sentLength);
109 void CAEDRNotifyNetworkStatus(CANetworkStatus_t status);
110 void CAEDROnNetworkStatusChanged(void *context);
111 CAResult_t CAAdapterSendData(const char *remoteAddress, const char *serviceUUID,
112 const uint8_t *data, uint32_t dataLength, uint32_t *sentLength);
113 CAEDRNetworkEvent *CAEDRCreateNetworkEvent(CAEndpoint_t *connectivity, CANetworkStatus_t status);
114 CAResult_t CAEDRClientSendData(const char *remoteAddress, const uint8_t *data,
115 uint32_t dataLength);
118 * @fn CACreateEDRData
119 * @brief Helper function to create CAEDRData
121 static CAEDRData *CACreateEDRData(const CAEndpoint_t *remoteEndpoint, const uint8_t *data,
122 uint32_t dataLength);
126 * @brief Free the Created EDR data
128 static void CAFreeEDRData(CAEDRData *edrData);
131 * @fn CAEDRFreeNetworkEvent
132 * @brief Free the memory associated with @event.
134 void CAEDRFreeNetworkEvent(CAEDRNetworkEvent *event);
136 static void CAEDRDataDestroyer(void *data, uint32_t size);
138 static void CAEDRErrorHandler(const char *remoteAddress, const uint8_t *data,
139 uint32_t dataLength, CAResult_t result);
141 CAResult_t CAInitializeEDR(CARegisterConnectivityCallback registerCallback,
142 CANetworkPacketReceivedCallback packetReceivedCallback,
143 CANetworkChangeCallback networkStateChangeCallback,
144 CAErrorHandleCallback errorCallback, ca_thread_pool_t handle)
147 VERIFY_NON_NULL(registerCallback, EDR_ADAPTER_TAG, "register callback is NULL");
148 VERIFY_NON_NULL(packetReceivedCallback, EDR_ADAPTER_TAG, "data receive callback is NULL");
149 VERIFY_NON_NULL(networkStateChangeCallback, EDR_ADAPTER_TAG,
150 "network state change callback is NULL");
151 VERIFY_NON_NULL(handle, EDR_ADAPTER_TAG, "Thread pool handle is NULL");
153 // Register the callbacks
155 g_edrThreadPool = handle;
156 g_networkPacketReceivedCallback = packetReceivedCallback;
157 g_networkChangeCallback = networkStateChangeCallback;
158 g_errorCallback = errorCallback;
160 // Initialize EDR Network Monitor
161 CAResult_t res = CAEDRInitializeNetworkMonitor(handle);
162 if (CA_STATUS_OK != res)
164 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "EDR N/w Monitor Initialize failed!, error number [%d]",
169 CAEDRSetNetworkChangeCallback(CAEDRNotifyNetworkStatus);
170 CAEDRSetPacketReceivedCallback(CAAdapterRecvData);
171 CAEDRSetErrorHandler(CAEDRErrorHandler);
172 res = CAEDRClientInitialize();
173 if (CA_STATUS_OK != res)
175 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "EDR Client Initialize failed, error number [%d]", res);
179 res = CAEDRServerInitialize(handle);
180 if (CA_STATUS_OK != res)
182 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "EDR Server Initialize failed, error number [%d]", res);
186 static const CAConnectivityHandler_t handler =
188 .startAdapter = CAStartEDR,
189 .stopAdapter = CAStopEDR,
190 .startListenServer = CAStartEDRListeningServer,
191 .stopListenServer = CAStopEDRListeningServer,
192 .startDiscoveryServer = CAStartEDRDiscoveryServer,
193 .sendData = CASendEDRUnicastData,
194 .sendDataToAll = CASendEDRMulticastData,
195 .GetnetInfo = CAGetEDRInterfaceInformation,
196 .readData = CAReadEDRData,
197 .terminate = CATerminateEDR,
198 .cType = CA_ADAPTER_RFCOMM_BTEDR
200 registerCallback(handler);
202 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
206 CAResult_t CAStartEDR()
208 //Start Monitoring EDR Network
209 CAResult_t ret = CAEDRStartNetworkMonitor();
210 if (CA_STATUS_OK != ret)
212 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to Start n/w monitor");
215 // Get Bluetooth adapter state
216 bool adapterState = false;
217 if (CA_STATUS_OK != CAEDRGetAdapterEnableState(&adapterState))
219 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to get adapter enable state");
220 return CA_STATUS_FAILED;
223 if (false == adapterState)
225 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Bluetooth adapter is disabled!");
226 g_adapterState = false;
227 return CA_ADAPTER_NOT_ENABLED;
230 if (CA_STATUS_OK != (ret = CAEDRClientSetCallbacks()))
232 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Start Network Monitor failed!, error number [%d] ",
236 // Initialize Send/Receive data message queues
237 if (CA_STATUS_OK != (ret = CAEDRInitializeQueueHandlers()))
239 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG,
240 "CAAdapterInitializeQueues failed!, error number [%d] ", ret);
242 return CA_STATUS_FAILED;
245 // Start Send/Receive data message queues
246 if (CA_STATUS_OK != (ret = CAAdapterStartQueue()))
248 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "CAAdapterStartQueue failed!, error number [%d] ", ret);
254 CAResult_t CAStartEDRListeningServer()
256 return CAStartServer();
259 CAResult_t CAStopEDRListeningServer()
261 return CAEDRServerStop();
264 CAResult_t CAStartEDRDiscoveryServer()
267 // Start device discovery
268 CAResult_t result = CAEDRStartDeviceDiscovery();
269 if(CA_STATUS_OK != result)
271 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "Failed to Start Device discovery");
275 return CAStartServer();
278 int32_t CASendEDRUnicastData(const CAEndpoint_t *remoteEndpoint, const void *data,
282 VERIFY_NON_NULL_RET(remoteEndpoint, EDR_ADAPTER_TAG, "Remote endpoint is null", -1);
283 VERIFY_NON_NULL_RET(data, EDR_ADAPTER_TAG, "Data is null", -1);
287 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Invalid input: data length is zero!");
291 if (0 == strlen(remoteEndpoint->addr))
293 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Invalid input: EDR Address is empty!");
297 uint32_t sentLength = 0;
298 const char *serviceUUID = OIC_EDR_SERVICE_ID;
299 const char *address = remoteEndpoint->addr;
300 CAResult_t err = CAAdapterSendData(address, serviceUUID, data, dataLength, &sentLength);
301 if (CA_STATUS_OK != err)
303 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Send unicast data failed!, error num [%d]", err);
304 g_errorCallback(remoteEndpoint, data, dataLength, err);
311 int32_t CASendEDRMulticastData(const CAEndpoint_t *endpoint, const void *data, uint32_t dataLength)
313 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN - CASendEDRMulticastData");
316 VERIFY_NON_NULL_RET(data, EDR_ADAPTER_TAG, "Data is null", -1);
320 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Invalid input: data length is zero!");
324 uint32_t sentLen = 0;
325 const char *serviceUUID = OIC_EDR_SERVICE_ID;
326 CAResult_t err = CAAdapterSendData(NULL, serviceUUID, data, dataLength, &sentLen);
327 if (CA_STATUS_OK != err)
329 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Send multicast data failed!, error num [%d]", err);
330 g_errorCallback(endpoint, data, dataLength, err);
334 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT - CASendEDRMulticastData");
338 CAResult_t CAGetEDRInterfaceInformation(CAEndpoint_t **info, uint32_t *size)
340 VERIFY_NON_NULL(info, EDR_ADAPTER_TAG, "LocalConnectivity info is null");
342 CAResult_t err = CA_STATUS_OK;
344 if (CA_STATUS_OK != (err = CAEDRGetInterfaceInformation(info)))
346 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG,
347 "Failed to get local interface information!, error num [%d]", err);
355 CAResult_t CAReadEDRData()
357 return CAEDRManagerReadData();
360 CAResult_t CAStopEDR()
362 // Stop RFComm server if it is running
365 // Stop network monitor
366 CAEDRStopNetworkMonitor();
369 CAEDRClientUnsetCallbacks();
371 // Disconnect all the client connections
372 CAEDRClientDisconnectAll();
374 // Stop Send and receive Queue
375 CAAdapterStopQueue();
380 void CATerminateEDR()
382 // Terminate EDR Network Monitor
383 CAEDRTerminateNetworkMonitor();
385 // Terminate Send/Receive data messages queues
386 CAAdapterTerminateQueues();
388 g_networkPacketReceivedCallback = NULL;
389 g_networkChangeCallback = NULL;
391 // Terminate thread pool
392 g_edrThreadPool = NULL;
394 // Terminate EDR Client
395 CAEDRClientTerminate();
397 // Terminate EDR Server
398 CAEDRServerTerminate();
400 // Free LocalConnectivity information
401 CAFreeEndpoint(g_localConnectivity);
402 g_localConnectivity = NULL;
405 CAResult_t CAStartServer()
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;
415 CAResult_t err = CA_STATUS_OK;
416 if (CA_STATUS_OK != (err = CAEDRServerStart()))
418 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Failed to start RFCOMM server!, error num [%d]",
426 CAResult_t CAEDRInitializeQueueHandlers()
428 if (CA_STATUS_OK == CAEDRInitializeSendHandler()
429 && CA_STATUS_OK == CAEDRInitializeReceiveHandler())
431 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "Queue is initialized!");
435 return CA_STATUS_FAILED;
438 CAResult_t CAEDRInitializeSendHandler()
440 // Check if the message queue is already initialized
441 if (g_sendQueueHandle)
443 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "Already queue is initialized!");
447 g_sendQueueHandle = (CAQueueingThread_t *) OICMalloc(sizeof(CAQueueingThread_t));
448 if (!g_sendQueueHandle)
450 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Memory allocation failed!");
451 return CA_MEMORY_ALLOC_FAILED;
454 if (CA_STATUS_OK != CAQueueingThreadInitialize(g_sendQueueHandle, g_edrThreadPool,
455 CAAdapterDataSendHandler, CAEDRDataDestroyer))
457 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to Initialize send queue thread");
458 return CA_STATUS_FAILED;
463 CAResult_t CAEDRInitializeReceiveHandler()
465 // Check if the message queue is already initialized
466 if (g_recvQueueHandle)
468 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "Already queue is initialized!");
472 g_recvQueueHandle = (CAQueueingThread_t *) OICMalloc(sizeof(CAQueueingThread_t));
473 if (!g_recvQueueHandle)
475 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Memory allocation failed!");
476 return CA_MEMORY_ALLOC_FAILED;
480 if (CA_STATUS_OK != CAQueueingThreadInitialize(g_recvQueueHandle, g_edrThreadPool,
481 CAAdapterDataReceiverHandler,
484 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to Initialize send queue thread");
485 OICFree(g_recvQueueHandle);
486 g_recvQueueHandle = NULL;
487 return CA_STATUS_FAILED;
493 void CAAdapterTerminateQueues()
495 if (g_sendQueueHandle)
497 CAQueueingThreadDestroy(g_sendQueueHandle);
498 g_sendQueueHandle = NULL;
500 if (g_recvQueueHandle)
502 CAQueueingThreadDestroy(g_recvQueueHandle);
503 g_recvQueueHandle = NULL;
507 void CAAdapterDataSendHandler(void *context)
509 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN - CAAdapterDataSendHandler");
511 CAEDRData *message = (CAEDRData *) context;
514 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to get message!");
518 if (!message->remoteEndpoint)
520 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "remoteEndpoint is not available");
524 const char *remoteAddress = message->remoteEndpoint->addr;
527 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "EDR Send Message error");
528 //Error cannot be sent if remote address is NULL
532 CAResult_t result = CAEDRClientSendData(remoteAddress, message->data, message->dataLen);
533 if(CA_STATUS_OK != result)
535 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "CAEDRClientSendData API failed");
536 CAEDRErrorHandler(remoteAddress, message->data, message->dataLen, result);
540 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
543 CAResult_t CAEDRClientSendData(const char *remoteAddress, const uint8_t *data,
546 CAResult_t result = CA_SEND_FAILED;
548 // Send the first segment with the header.
549 if ((NULL != remoteAddress) && (0 < strlen(remoteAddress))) //Unicast data
551 result = CAEDRClientSendUnicastData(remoteAddress, data, dataLength);
552 if (CA_STATUS_OK != result)
554 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to send unicast data !");
560 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "sending multicast data : %s", data);
561 result = CAEDRClientSendMulticastData(data, dataLength);
563 if (CA_STATUS_OK != result)
565 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to send multicast data !");
572 void CAAdapterDataReceiverHandler(void *context)
574 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN_CAAdapterDataReceiverHandler");
576 if (NULL == g_networkPacketReceivedCallback)
578 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "g_networkPacketReceivedCallback is NULL");
582 CAEDRData *message = (CAEDRData *) context;
583 if (NULL == message || NULL == message->remoteEndpoint)
585 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to get message!");
589 CAEndpoint_t *remoteEndpoint = CACreateEndpointObject(CA_DEFAULT_FLAGS,
590 CA_ADAPTER_RFCOMM_BTEDR,
591 message->remoteEndpoint->addr,
594 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "Sending data up !");
596 const CASecureEndpoint_t sep = { .endpoint = *remoteEndpoint };
598 g_networkPacketReceivedCallback(&sep, message->data, message->dataLen);
600 CAFreeEndpoint(remoteEndpoint);
602 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT_CAAdapterDataReceiverHandler");
605 CAResult_t CAAdapterStartQueue()
607 // Start send queue thread
608 if (CA_STATUS_OK != CAQueueingThreadStart(g_sendQueueHandle))
610 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to Start Send Data Thread");
611 CAEDRClientUnsetCallbacks();
612 //Disconnect all the client connections
613 CAEDRClientDisconnectAll();
614 return CA_STATUS_FAILED;
617 // Start receive queue thread
618 if (CA_STATUS_OK != CAQueueingThreadStart(g_recvQueueHandle))
620 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to Start Receive Data Thread");
621 CAEDRClientUnsetCallbacks();
622 //Disconnect all the client connections
623 CAEDRClientDisconnectAll();
624 return CA_STATUS_FAILED;
630 CAResult_t CAAdapterStopQueue()
632 //Stop send queue thread
633 CAQueueingThreadStop(g_sendQueueHandle);
635 //Stop receive queue thread
636 CAQueueingThreadStop(g_recvQueueHandle);
641 void CAAdapterRecvData(const char *remoteAddress, const uint8_t *data, uint32_t dataLength,
642 uint32_t *sentLength)
644 if (false == g_adapterState)
646 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Bluetooth adapter is disabled!");
652 VERIFY_NON_NULL_VOID(data, EDR_ADAPTER_TAG, "Data is null");
653 VERIFY_NON_NULL_VOID(sentLength, EDR_ADAPTER_TAG, "Sent data length holder is null");
655 // Create remote endpoint
656 CAEndpoint_t *remoteEndpoint = CACreateEndpointObject(CA_DEFAULT_FLAGS,
657 CA_ADAPTER_RFCOMM_BTEDR,
659 if (NULL == remoteEndpoint)
661 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to create remote endpoint !");
665 // Add message to data queue
666 CAEDRData *edrData = CACreateEDRData(remoteEndpoint, data, dataLength);
667 CAQueueingThreadAddData(g_recvQueueHandle, edrData, sizeof(CAEDRData));
668 *sentLength = dataLength;
670 // Free remote endpoint
671 CAFreeEndpoint(remoteEndpoint);
674 void CAEDRErrorHandler(const char *remoteAddress, const uint8_t *data,
675 uint32_t dataLength, CAResult_t result)
678 VERIFY_NON_NULL_VOID(data, EDR_ADAPTER_TAG, "Data is null");
680 // Create remote endpoint
681 CAEndpoint_t *remoteEndpoint = CACreateEndpointObject(0, CA_ADAPTER_RFCOMM_BTEDR,
685 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to create remote endpoint !");
689 g_errorCallback(remoteEndpoint, data, dataLength, result);
691 // Free remote endpoint
692 CAFreeEndpoint(remoteEndpoint);
695 CAResult_t CAAdapterSendData(const char *remoteAddress, const char *serviceUUID, const uint8_t *data,
696 uint32_t dataLength, uint32_t *sentLength)
698 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN - CAAdapterSendData");
700 if (false == g_adapterState)
702 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Bluetooth adapter is disabled!");
704 return CA_ADAPTER_NOT_ENABLED;
707 VERIFY_NON_NULL(serviceUUID, EDR_ADAPTER_TAG, "service UUID is null");
708 VERIFY_NON_NULL(data, EDR_ADAPTER_TAG, "Data is null");
709 VERIFY_NON_NULL(sentLength, EDR_ADAPTER_TAG, "Sent data length holder is null");
711 // Create remote endpoint
712 CAEndpoint_t *remoteEndpoint = CACreateEndpointObject(CA_DEFAULT_FLAGS,
713 CA_ADAPTER_RFCOMM_BTEDR,
715 if (NULL == remoteEndpoint)
717 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to create remote endpoint !");
718 return CA_MEMORY_ALLOC_FAILED;
721 // Add message to data queue
722 CAEDRData *edrData = CACreateEDRData(remoteEndpoint, data, dataLength);
723 CAQueueingThreadAddData(g_sendQueueHandle, edrData, sizeof (CAEDRData));
724 *sentLength = dataLength;
726 // Free remote endpoint
727 CAFreeEndpoint(remoteEndpoint);
729 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT - CAAdapterSendData");
733 void CAEDRNotifyNetworkStatus(CANetworkStatus_t status)
735 // Create localconnectivity
736 if (NULL == g_localConnectivity)
738 CAEDRGetInterfaceInformation(&g_localConnectivity);
741 if (CA_INTERFACE_UP == status)
743 if (false == g_adapterState)
745 // Get Bluetooth adapter state
746 bool adapterState = false;
747 if (CA_STATUS_OK != CAEDRGetAdapterEnableState(&adapterState))
749 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to get adapter enable state");
753 if (false == adapterState)
755 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Bluetooth adapter is disabled!");
756 g_adapterState = false;
759 CAEDRClientSetCallbacks();
760 g_adapterState = true;
761 CAAdapterStartQueue();
762 // starting RFCommServer
763 if (true == g_serverState)
766 g_serverState = false;
772 g_adapterState = false;
775 // Notify to upper layer
776 if (g_networkChangeCallback && g_localConnectivity && g_edrThreadPool)
778 // Add notification task to thread pool
779 CAEDRNetworkEvent *event = CAEDRCreateNetworkEvent(g_localConnectivity, status);
782 if (CA_STATUS_OK != ca_thread_pool_add_task(g_edrThreadPool,
783 CAEDROnNetworkStatusChanged,event))
785 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to create threadpool!");
792 void CAEDROnNetworkStatusChanged(void *context)
796 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "context is NULL!");
800 CAEDRNetworkEvent *networkEvent = (CAEDRNetworkEvent *) context;
802 // Notify to upper layer
803 if (g_networkChangeCallback)
805 g_networkChangeCallback(networkEvent->info, networkEvent->status);
808 // Free the created Network event
809 CAEDRFreeNetworkEvent(networkEvent);
812 CAEDRNetworkEvent *CAEDRCreateNetworkEvent(CAEndpoint_t *connectivity,
813 CANetworkStatus_t status)
815 VERIFY_NON_NULL_RET(connectivity, EDR_ADAPTER_TAG, "connectivity is NULL", NULL);
817 // Create CAEDRNetworkEvent
818 CAEDRNetworkEvent *event = (CAEDRNetworkEvent *) OICMalloc(sizeof(CAEDRNetworkEvent));
821 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to allocate memory to network event!");
825 // Create duplicate of Local connectivity
826 event->info = CACloneEndpoint(connectivity);
827 event->status = status;
831 void CAEDRFreeNetworkEvent(CAEDRNetworkEvent *event)
835 CAFreeEndpoint(event->info);
840 CAEDRData *CACreateEDRData(const CAEndpoint_t *remoteEndpoint,
841 const uint8_t *data, uint32_t dataLength)
843 CAEDRData *edrData = (CAEDRData *) OICCalloc(1, sizeof(*edrData));
846 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Memory allocation failed!");
850 edrData->remoteEndpoint = CACloneEndpoint(remoteEndpoint);
852 edrData->data = OICMalloc(dataLength);
853 if (NULL == edrData->data)
855 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Memory allocation failed!");
856 CAFreeEDRData(edrData);
859 memcpy(edrData->data, data, dataLength);
860 edrData->dataLen = dataLength;
865 void CAFreeEDRData(CAEDRData *edrData)
867 VERIFY_NON_NULL_VOID(edrData, EDR_ADAPTER_TAG, "edrData is NULL");
869 CAFreeEndpoint(edrData->remoteEndpoint);
870 OICFree(edrData->data);
874 void CAEDRDataDestroyer(void *data, uint32_t size)
876 if ((size_t)size < sizeof(CAEDRData))
878 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Destroy data too small %p %d", data, size);
880 CAEDRData *edrdata = (CAEDRData *) data;
882 CAFreeEDRData(edrdata);