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 err = CAEDRInitializeNetworkMonitor(handle);
162 if (CA_STATUS_OK != err)
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 CAEDRInitializeClient(handle);
174 CAConnectivityHandler_t handler;
175 handler.startAdapter = CAStartEDR;
176 handler.startListenServer = CAStartEDRListeningServer;
177 handler.stopListenServer = CAStopEDRListeningServer;
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_ADAPTER_RFCOMM_BTEDR);
187 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
191 CAResult_t CAStartEDR()
193 //Start Monitoring EDR Network
194 CAResult_t ret = CAEDRStartNetworkMonitor();
195 if (CA_STATUS_OK != ret)
197 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to Start n/w monitor");
200 // Get Bluetooth adapter state
201 bool adapterState = false;
202 if (CA_STATUS_OK != CAEDRGetAdapterEnableState(&adapterState))
204 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to get adapter enable state");
205 return CA_STATUS_FAILED;
208 if (false == adapterState)
210 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Bluetooth adapter is disabled!");
211 g_adapterState = false;
212 return CA_ADAPTER_NOT_ENABLED;
215 if (CA_STATUS_OK != (ret = CAEDRClientSetCallbacks()))
217 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Start Network Monitor failed!, error number [%d] ",
221 // Initialize Send/Receive data message queues
222 if (CA_STATUS_OK != (ret = CAEDRInitializeQueueHandlers()))
224 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG,
225 "CAAdapterInitializeQueues failed!, error number [%d] ", ret);
227 return CA_STATUS_FAILED;
230 // Start Send/Receive data message queues
231 if (CA_STATUS_OK != (ret = CAAdapterStartQueue()))
233 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "CAAdapterStartQueue failed!, error number [%d] ", ret);
239 CAResult_t CAStartEDRListeningServer()
241 return CAStartServer();
244 CAResult_t CAStopEDRListeningServer()
246 return CAEDRServerStop();
249 CAResult_t CAStartEDRDiscoveryServer()
251 return CAStartServer();
254 int32_t CASendEDRUnicastData(const CAEndpoint_t *remoteEndpoint, const void *data,
258 VERIFY_NON_NULL_RET(remoteEndpoint, EDR_ADAPTER_TAG, "Remote endpoint is null", -1);
259 VERIFY_NON_NULL_RET(data, EDR_ADAPTER_TAG, "Data is null", -1);
263 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Invalid input: data length is zero!");
267 if (0 == strlen(remoteEndpoint->addr))
269 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Invalid input: EDR Address is empty!");
273 uint32_t sentLength = 0;
274 const char *serviceUUID = OIC_EDR_SERVICE_ID;
275 const char *address = remoteEndpoint->addr;
276 CAResult_t err = CAAdapterSendData(address, serviceUUID, data, dataLength, &sentLength);
277 if (CA_STATUS_OK != err)
279 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Send unicast data failed!, error num [%d]", err);
280 g_errorCallback(remoteEndpoint, data, dataLength, err);
287 int32_t CASendEDRMulticastData(const CAEndpoint_t *endpoint, const void *data, uint32_t dataLength)
289 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN - CASendEDRMulticastData");
292 VERIFY_NON_NULL_RET(data, EDR_ADAPTER_TAG, "Data is null", -1);
296 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Invalid input: data length is zero!");
300 uint32_t sentLen = 0;
301 const char *serviceUUID = OIC_EDR_SERVICE_ID;
302 CAResult_t err = CAAdapterSendData(NULL, serviceUUID, data, dataLength, &sentLen);
303 if (CA_STATUS_OK != err)
305 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Send multicast data failed!, error num [%d]", err);
306 g_errorCallback(endpoint, data, dataLength, err);
310 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT - CASendEDRMulticastData");
314 CAResult_t CAGetEDRInterfaceInformation(CAEndpoint_t **info, uint32_t *size)
316 VERIFY_NON_NULL(info, EDR_ADAPTER_TAG, "LocalConnectivity info is null");
318 CAResult_t err = CA_STATUS_OK;
320 if (CA_STATUS_OK != (err = CAEDRGetInterfaceInformation(info)))
322 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG,
323 "Failed to get local interface information!, error num [%d]", err);
331 CAResult_t CAReadEDRData()
333 return CAEDRManagerReadData();
336 CAResult_t CAStopEDR()
338 // Stop RFComm server if it is running
341 // Stop network monitor
342 CAEDRStopNetworkMonitor();
345 CAEDRClientUnsetCallbacks();
347 // Disconnect all the client connections
348 CAEDRClientDisconnectAll();
350 // Stop Send and receive Queue
351 CAAdapterStopQueue();
356 void CATerminateEDR()
358 // Terminate EDR Network Monitor
359 CAEDRTerminateNetworkMonitor();
361 // Terminate Send/Receive data messages queues
362 CAAdapterTerminateQueues();
364 g_networkPacketReceivedCallback = NULL;
365 g_networkChangeCallback = NULL;
367 // Terminate thread pool
368 g_edrThreadPool = NULL;
370 // Terminate EDR Client
371 CAEDRClientTerminate();
373 // Terminate EDR Server
374 CAEDRServerTerminate();
376 // Free LocalConnectivity information
377 CAFreeEndpoint(g_localConnectivity);
378 g_localConnectivity = NULL;
381 CAResult_t CAStartServer()
383 if (false == g_adapterState)
385 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "Bluetooth adapter is disabled!");
386 // Setting g_serverState for starting Rfcommserver when adapter starts
387 g_serverState = true;
391 CAResult_t err = CA_STATUS_OK;
392 if (CA_STATUS_OK != (err = CAEDRServerStart(g_edrThreadPool)))
394 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Failed to start RFCOMM server!, error num [%d]",
402 CAResult_t CAEDRInitializeQueueHandlers()
404 if (CA_STATUS_OK == CAEDRInitializeSendHandler()
405 && CA_STATUS_OK == CAEDRInitializeReceiveHandler())
407 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "Queue is initialized!");
411 return CA_STATUS_FAILED;
414 CAResult_t CAEDRInitializeSendHandler()
416 // Check if the message queue is already initialized
417 if (g_sendQueueHandle)
419 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "Already queue is initialized!");
423 g_sendQueueHandle = (CAQueueingThread_t *) OICMalloc(sizeof(CAQueueingThread_t));
424 if (!g_sendQueueHandle)
426 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Memory allocation failed!");
427 return CA_MEMORY_ALLOC_FAILED;
430 if (CA_STATUS_OK != CAQueueingThreadInitialize(g_sendQueueHandle, g_edrThreadPool,
431 CAAdapterDataSendHandler, CAEDRDataDestroyer))
433 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to Initialize send queue thread");
434 return CA_STATUS_FAILED;
439 CAResult_t CAEDRInitializeReceiveHandler()
441 // Check if the message queue is already initialized
442 if (g_recvQueueHandle)
444 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "Already queue is initialized!");
448 g_recvQueueHandle = (CAQueueingThread_t *) OICMalloc(sizeof(CAQueueingThread_t));
449 if (!g_recvQueueHandle)
451 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Memory allocation failed!");
452 return CA_MEMORY_ALLOC_FAILED;
456 if (CA_STATUS_OK != CAQueueingThreadInitialize(g_recvQueueHandle, g_edrThreadPool,
457 CAAdapterDataReceiverHandler,
460 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to Initialize send queue thread");
461 OICFree(g_recvQueueHandle);
462 g_recvQueueHandle = NULL;
463 return CA_STATUS_FAILED;
469 void CAAdapterTerminateQueues()
471 if (g_sendQueueHandle)
473 CAQueueingThreadDestroy(g_sendQueueHandle);
474 g_sendQueueHandle = NULL;
476 if (g_recvQueueHandle)
478 CAQueueingThreadDestroy(g_recvQueueHandle);
479 g_recvQueueHandle = NULL;
483 void CAAdapterDataSendHandler(void *context)
485 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN - CAAdapterDataSendHandler");
487 CAEDRData *message = (CAEDRData *) context;
490 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to get message!");
494 if (!message->remoteEndpoint)
496 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "remoteEndpoint is not available");
500 const char *remoteAddress = message->remoteEndpoint->addr;
503 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "EDR Send Message error");
504 //Error cannot be sent if remote address is NULL
508 CAResult_t result = CAEDRClientSendData(remoteAddress, message->data, message->dataLen);
509 if(CA_STATUS_OK != result)
511 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "CAEDRClientSendData API failed");
512 CAEDRErrorHandler(remoteAddress, message->data, message->dataLen, result);
516 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
519 CAResult_t CAEDRClientSendData(const char *remoteAddress, const uint8_t *data,
522 CAResult_t result = CA_SEND_FAILED;
524 // Send the first segment with the header.
525 if ((NULL != remoteAddress) && (0 < strlen(remoteAddress))) //Unicast data
527 result = CAEDRClientSendUnicastData(remoteAddress, data, dataLength);
528 if (CA_STATUS_OK != result)
530 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to send unicast data !");
536 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "sending multicast data : %s", data);
537 result = CAEDRClientSendMulticastData(data, dataLength);
539 if (CA_STATUS_OK != result)
541 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to send multicast data !");
548 void CAAdapterDataReceiverHandler(void *context)
550 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN_CAAdapterDataReceiverHandler");
552 if (NULL == g_networkPacketReceivedCallback)
554 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "g_networkPacketReceivedCallback is NULL");
558 CAEDRData *message = (CAEDRData *) context;
559 if (NULL == message || NULL == message->remoteEndpoint)
561 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to get message!");
565 CAEndpoint_t *remoteEndpoint = CACreateEndpointObject(CA_DEFAULT_FLAGS,
566 CA_ADAPTER_RFCOMM_BTEDR,
567 message->remoteEndpoint->addr,
570 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "Sending data up !");
571 g_networkPacketReceivedCallback(remoteEndpoint, message->data, message->dataLen);
573 CAFreeEndpoint(remoteEndpoint);
575 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT_CAAdapterDataReceiverHandler");
578 CAResult_t CAAdapterStartQueue()
580 // Start send queue thread
581 if (CA_STATUS_OK != CAQueueingThreadStart(g_sendQueueHandle))
583 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to Start Send Data Thread");
584 CAEDRClientUnsetCallbacks();
585 //Disconnect all the client connections
586 CAEDRClientDisconnectAll();
587 return CA_STATUS_FAILED;
590 // Start receive queue thread
591 if (CA_STATUS_OK != CAQueueingThreadStart(g_recvQueueHandle))
593 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to Start Receive Data Thread");
594 CAEDRClientUnsetCallbacks();
595 //Disconnect all the client connections
596 CAEDRClientDisconnectAll();
597 return CA_STATUS_FAILED;
603 CAResult_t CAAdapterStopQueue()
605 //Stop send queue thread
606 CAQueueingThreadStop(g_sendQueueHandle);
608 //Stop receive queue thread
609 CAQueueingThreadStop(g_recvQueueHandle);
614 void CAAdapterRecvData(const char *remoteAddress, const uint8_t *data, uint32_t dataLength,
615 uint32_t *sentLength)
617 if (false == g_adapterState)
619 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Bluetooth adapter is disabled!");
625 VERIFY_NON_NULL_VOID(data, EDR_ADAPTER_TAG, "Data is null");
626 VERIFY_NON_NULL_VOID(sentLength, EDR_ADAPTER_TAG, "Sent data length holder is null");
628 // Create remote endpoint
629 CAEndpoint_t *remoteEndpoint = CACreateEndpointObject(CA_DEFAULT_FLAGS,
630 CA_ADAPTER_RFCOMM_BTEDR,
632 if (NULL == remoteEndpoint)
634 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to create remote endpoint !");
638 // Add message to data queue
639 CAEDRData *edrData = CACreateEDRData(remoteEndpoint, data, dataLength);
640 CAQueueingThreadAddData(g_recvQueueHandle, edrData, sizeof(CAEDRData));
641 *sentLength = dataLength;
643 // Free remote endpoint
644 CAFreeEndpoint(remoteEndpoint);
647 void CAEDRErrorHandler(const char *remoteAddress, const uint8_t *data,
648 uint32_t dataLength, CAResult_t result)
651 VERIFY_NON_NULL_VOID(data, EDR_ADAPTER_TAG, "Data is null");
653 // Create remote endpoint
654 CAEndpoint_t *remoteEndpoint = CACreateEndpointObject(0, CA_ADAPTER_RFCOMM_BTEDR,
658 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to create remote endpoint !");
662 g_errorCallback(remoteEndpoint, data, dataLength, result);
664 // Free remote endpoint
665 CAFreeEndpoint(remoteEndpoint);
668 CAResult_t CAAdapterSendData(const char *remoteAddress, const char *serviceUUID, const uint8_t *data,
669 uint32_t dataLength, uint32_t *sentLength)
671 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN - CAAdapterSendData");
673 if (false == g_adapterState)
675 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Bluetooth adapter is disabled!");
677 return CA_ADAPTER_NOT_ENABLED;
680 VERIFY_NON_NULL(serviceUUID, EDR_ADAPTER_TAG, "service UUID is null");
681 VERIFY_NON_NULL(data, EDR_ADAPTER_TAG, "Data is null");
682 VERIFY_NON_NULL(sentLength, EDR_ADAPTER_TAG, "Sent data length holder is null");
684 // Create remote endpoint
685 CAEndpoint_t *remoteEndpoint = CACreateEndpointObject(CA_DEFAULT_FLAGS,
686 CA_ADAPTER_RFCOMM_BTEDR,
688 if (NULL == remoteEndpoint)
690 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to create remote endpoint !");
691 return CA_MEMORY_ALLOC_FAILED;
694 // Add message to data queue
695 CAEDRData *edrData = CACreateEDRData(remoteEndpoint, data, dataLength);
696 CAQueueingThreadAddData(g_sendQueueHandle, edrData, sizeof (CAEDRData));
697 *sentLength = dataLength;
699 // Free remote endpoint
700 CAFreeEndpoint(remoteEndpoint);
702 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT - CAAdapterSendData");
706 void CAEDRNotifyNetworkStatus(CANetworkStatus_t status)
708 // Create localconnectivity
709 if (NULL == g_localConnectivity)
711 CAEDRGetInterfaceInformation(&g_localConnectivity);
714 if (CA_INTERFACE_UP == status)
716 if (false == g_adapterState)
718 // Get Bluetooth adapter state
719 bool adapterState = false;
720 if (CA_STATUS_OK != CAEDRGetAdapterEnableState(&adapterState))
722 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to get adapter enable state");
726 if (false == adapterState)
728 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Bluetooth adapter is disabled!");
729 g_adapterState = false;
732 CAEDRClientSetCallbacks();
733 g_adapterState = true;
734 CAAdapterStartQueue();
735 // starting RFCommServer
736 if (true == g_serverState)
739 g_serverState = false;
745 g_adapterState = false;
748 // Notify to upper layer
749 if (g_networkChangeCallback && g_localConnectivity && g_edrThreadPool)
751 // Add notification task to thread pool
752 CAEDRNetworkEvent *event = CAEDRCreateNetworkEvent(g_localConnectivity, status);
755 if (CA_STATUS_OK != ca_thread_pool_add_task(g_edrThreadPool,
756 CAEDROnNetworkStatusChanged,event))
758 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to create threadpool!");
765 void CAEDROnNetworkStatusChanged(void *context)
769 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "context is NULL!");
773 CAEDRNetworkEvent *networkEvent = (CAEDRNetworkEvent *) context;
775 // Notify to upper layer
776 if (g_networkChangeCallback)
778 g_networkChangeCallback(networkEvent->info, networkEvent->status);
781 // Free the created Network event
782 CAEDRFreeNetworkEvent(networkEvent);
785 CAEDRNetworkEvent *CAEDRCreateNetworkEvent(CAEndpoint_t *connectivity,
786 CANetworkStatus_t status)
788 VERIFY_NON_NULL_RET(connectivity, EDR_ADAPTER_TAG, "connectivity is NULL", NULL);
790 // Create CAEDRNetworkEvent
791 CAEDRNetworkEvent *event = (CAEDRNetworkEvent *) OICMalloc(sizeof(CAEDRNetworkEvent));
794 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to allocate memory to network event!");
798 // Create duplicate of Local connectivity
799 event->info = CACloneEndpoint(connectivity);
800 event->status = status;
804 void CAEDRFreeNetworkEvent(CAEDRNetworkEvent *event)
808 CAFreeEndpoint(event->info);
813 CAEDRData *CACreateEDRData(const CAEndpoint_t *remoteEndpoint,
814 const uint8_t *data, uint32_t dataLength)
816 CAEDRData *edrData = (CAEDRData *) OICCalloc(1, sizeof(*edrData));
819 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Memory allocation failed!");
823 edrData->remoteEndpoint = CACloneEndpoint(remoteEndpoint);
825 edrData->data = OICMalloc(dataLength);
826 if (NULL == edrData->data)
828 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Memory allocation failed!");
829 CAFreeEDRData(edrData);
832 memcpy(edrData->data, data, dataLength);
833 edrData->dataLen = dataLength;
838 void CAFreeEDRData(CAEDRData *edrData)
840 VERIFY_NON_NULL_VOID(edrData, EDR_ADAPTER_TAG, "edrData is NULL");
842 CAFreeEndpoint(edrData->remoteEndpoint);
843 OICFree(edrData->data);
847 void CAEDRDataDestroyer(void *data, uint32_t size)
849 if ((size_t)size < sizeof(CAEDRData))
851 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Destroy data too small %p %d", data, size);
853 CAEDRData *edrdata = (CAEDRData *) data;
855 CAFreeEDRData(edrdata);