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"
38 * Logging tag for module name.
40 #define EDR_ADAPTER_TAG "OIC_CA_EDR_ADAP"
43 * Reference to threadpool.
45 static ca_thread_pool_t g_edrThreadPool = NULL;
48 * Queue handle for Send Data
50 static CAQueueingThread_t *g_sendQueueHandle = NULL;
53 * Queue handle for Receive Data
55 static CAQueueingThread_t *g_recvQueueHandle = NULL;
58 * Storing Adapter state information
60 static bool g_adapterState = true;
63 * Maintains the callback to be notified on receival of network packets from other
66 static CANetworkPacketReceivedCallback g_networkPacketReceivedCallback = NULL;
69 * Maintains the callback to be notified on local bluetooth adapter status change.
71 static CAAdapterChangeCallback g_adapterChangeCallback = NULL;
74 * error Callback to CA adapter
76 static CAErrorHandleCallback g_errorCallback = NULL;
79 * Information of local Bluetooth adapter.
81 static CAEndpoint_t *g_localConnectivity = NULL;
84 * Storing Rfcommserver state information
86 static bool g_serverState = false;
88 static CAResult_t CAStartServer();
89 static CAResult_t CAEDRInitializeQueueHandlers();
90 CAResult_t CAEDRInitializeSendHandler();
91 CAResult_t CAEDRInitializeReceiveHandler();
92 void CAAdapterTerminateQueues();
93 void CAAdapterDataSendHandler(void *context);
94 void CAAdapterDataReceiverHandler(void *context);
95 CAResult_t CAAdapterStopQueue();
96 void CAAdapterRecvData(const char *remoteAddress, const uint8_t *data, uint32_t dataLength,
97 uint32_t *sentLength);
98 void CAEDRNotifyNetworkStatus(CANetworkStatus_t status);
99 void CAEDROnNetworkStatusChanged(void *context);
100 CAResult_t CAAdapterSendData(const char *remoteAddress, const char *serviceUUID,
101 const uint8_t *data, uint32_t dataLength, uint32_t *sentLength);
102 CAEDRNetworkEvent *CAEDRCreateNetworkEvent(CAEndpoint_t *connectivity, CANetworkStatus_t status);
103 CAResult_t CAEDRClientSendData(const char *remoteAddress, const uint8_t *data,
104 uint32_t dataLength);
107 * @fn CACreateEDRData
108 * @brief Helper function to create CAEDRData
110 static CAEDRData *CACreateEDRData(const CAEndpoint_t *remoteEndpoint, const uint8_t *data,
111 uint32_t dataLength);
115 * @brief Free the Created EDR data
117 static void CAFreeEDRData(CAEDRData *edrData);
120 * @fn CAEDRFreeNetworkEvent
121 * @brief Free the memory associated with @event.
123 void CAEDRFreeNetworkEvent(CAEDRNetworkEvent *event);
125 static void CAEDRDataDestroyer(void *data, uint32_t size);
127 static void CAEDRErrorHandler(const char *remoteAddress, const uint8_t *data,
128 uint32_t dataLength, CAResult_t result);
130 CAResult_t CAInitializeEDR(CARegisterConnectivityCallback registerCallback,
131 CANetworkPacketReceivedCallback packetReceivedCallback,
132 CAAdapterChangeCallback netCallback,
133 CAConnectionChangeCallback connCallback,
134 CAErrorHandleCallback errorCallback, ca_thread_pool_t handle)
137 VERIFY_NON_NULL(registerCallback, EDR_ADAPTER_TAG, "register callback is NULL");
138 VERIFY_NON_NULL(packetReceivedCallback, EDR_ADAPTER_TAG, "data receive callback is NULL");
139 VERIFY_NON_NULL(netCallback, EDR_ADAPTER_TAG, "adapter state change callback is NULL");
140 VERIFY_NON_NULL(connCallback, EDR_ADAPTER_TAG, "connection state change callback is NULL");
141 VERIFY_NON_NULL(handle, EDR_ADAPTER_TAG, "Thread pool handle is NULL");
143 // Register the callbacks
144 g_edrThreadPool = handle;
145 g_networkPacketReceivedCallback = packetReceivedCallback;
146 g_adapterChangeCallback = netCallback;
147 g_errorCallback = errorCallback;
149 // Initialize EDR Network Monitor
150 CAResult_t res = CAEDRInitializeNetworkMonitor(handle);
151 if (CA_STATUS_OK != res)
153 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "EDR N/w Monitor Initialize failed!, error number [%d]",
158 CAEDRSetNetworkChangeCallback(CAEDRNotifyNetworkStatus);
159 CAEDRSetPacketReceivedCallback(CAAdapterRecvData);
160 CAEDRSetErrorHandler(CAEDRErrorHandler);
161 res = CAEDRClientInitialize();
162 if (CA_STATUS_OK != res)
164 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "EDR Client Initialize failed, error number [%d]", res);
168 res = CAEDRServerInitialize(handle);
169 if (CA_STATUS_OK != res)
171 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "EDR Server Initialize failed, error number [%d]", res);
175 static const CAConnectivityHandler_t handler =
177 .startAdapter = CAStartEDR,
178 .stopAdapter = CAStopEDR,
179 .startListenServer = CAStartEDRListeningServer,
180 .stopListenServer = CAStopEDRListeningServer,
181 .startDiscoveryServer = CAStartEDRDiscoveryServer,
182 .sendData = CASendEDRUnicastData,
183 .sendDataToAll = CASendEDRMulticastData,
184 .GetnetInfo = CAGetEDRInterfaceInformation,
185 .readData = CAReadEDRData,
186 .terminate = CATerminateEDR,
187 .cType = CA_ADAPTER_RFCOMM_BTEDR
189 registerCallback(handler);
191 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
195 CAResult_t CAStartEDR()
197 //Start Monitoring EDR Network
198 CAResult_t ret = CAEDRStartNetworkMonitor();
199 if (CA_STATUS_OK != ret)
201 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to Start n/w monitor");
204 // Get Bluetooth adapter state
205 bool adapterState = false;
206 if (CA_STATUS_OK != CAEDRGetAdapterEnableState(&adapterState))
208 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to get adapter enable state");
209 return CA_STATUS_FAILED;
212 if (false == adapterState)
214 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Bluetooth adapter is disabled!");
215 g_adapterState = false;
216 return CA_ADAPTER_NOT_ENABLED;
219 if (CA_STATUS_OK != (ret = CAEDRClientSetCallbacks()))
221 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Start Network Monitor failed!, error number [%d] ",
225 // Initialize Send/Receive data message queues
226 if (CA_STATUS_OK != (ret = CAEDRInitializeQueueHandlers()))
228 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG,
229 "CAAdapterInitializeQueues failed!, error number [%d] ", ret);
231 return CA_STATUS_FAILED;
234 // Start Send/Receive data message queues
235 if (CA_STATUS_OK != (ret = CAAdapterStartQueue()))
237 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "CAAdapterStartQueue failed!, error number [%d] ", ret);
243 CAResult_t CAStartEDRListeningServer()
245 return CAStartServer();
248 CAResult_t CAStopEDRListeningServer()
250 return CAEDRServerStop();
253 CAResult_t CAStartEDRDiscoveryServer()
256 // Start device discovery
257 CAResult_t result = CAEDRStartDeviceDiscovery();
258 if(CA_STATUS_OK != result)
260 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "Failed to Start Device discovery");
264 return CAStartServer();
267 int32_t CASendEDRUnicastData(const CAEndpoint_t *remoteEndpoint, const void *data,
271 VERIFY_NON_NULL_RET(remoteEndpoint, EDR_ADAPTER_TAG, "Remote endpoint is null", -1);
272 VERIFY_NON_NULL_RET(data, EDR_ADAPTER_TAG, "Data is null", -1);
276 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Invalid input: data length is zero!");
280 if (0 == strlen(remoteEndpoint->addr))
282 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Invalid input: EDR Address is empty!");
286 uint32_t sentLength = 0;
287 const char *serviceUUID = OIC_EDR_SERVICE_ID;
288 const char *address = remoteEndpoint->addr;
289 CAResult_t err = CAAdapterSendData(address, serviceUUID, data, dataLength, &sentLength);
290 if (CA_STATUS_OK != err)
292 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Send unicast data failed!, error num [%d]", err);
293 g_errorCallback(remoteEndpoint, data, dataLength, err);
300 int32_t CASendEDRMulticastData(const CAEndpoint_t *endpoint, const void *data, uint32_t dataLength)
302 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN - CASendEDRMulticastData");
305 VERIFY_NON_NULL_RET(data, EDR_ADAPTER_TAG, "Data is null", -1);
309 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Invalid input: data length is zero!");
313 uint32_t sentLen = 0;
314 const char *serviceUUID = OIC_EDR_SERVICE_ID;
315 CAResult_t err = CAAdapterSendData(NULL, serviceUUID, data, dataLength, &sentLen);
316 if (CA_STATUS_OK != err)
318 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Send multicast data failed!, error num [%d]", err);
319 g_errorCallback(endpoint, data, dataLength, err);
323 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT - CASendEDRMulticastData");
327 CAResult_t CAGetEDRInterfaceInformation(CAEndpoint_t **info, uint32_t *size)
329 VERIFY_NON_NULL(info, EDR_ADAPTER_TAG, "LocalConnectivity info is null");
331 CAResult_t err = CA_STATUS_OK;
333 if (CA_STATUS_OK != (err = CAEDRGetInterfaceInformation(info)))
335 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG,
336 "Failed to get local interface information!, error num [%d]", err);
344 CAResult_t CAReadEDRData()
346 return CAEDRManagerReadData();
349 CAResult_t CAStopEDR()
351 // Stop RFComm server if it is running
354 // Stop network monitor
355 CAEDRStopNetworkMonitor();
358 CAEDRClientUnsetCallbacks();
360 // Disconnect all the client connections
361 CAEDRClientDisconnectAll();
363 // Stop Send and receive Queue
364 CAAdapterStopQueue();
369 void CATerminateEDR()
371 // Terminate EDR Network Monitor
372 CAEDRTerminateNetworkMonitor();
374 // Terminate Send/Receive data messages queues
375 CAAdapterTerminateQueues();
377 g_networkPacketReceivedCallback = NULL;
378 g_adapterChangeCallback = NULL;
380 // Terminate thread pool
381 g_edrThreadPool = NULL;
383 // Terminate EDR Client
384 CAEDRClientTerminate();
386 // Terminate EDR Server
387 CAEDRServerTerminate();
389 // Free LocalConnectivity information
390 CAFreeEndpoint(g_localConnectivity);
391 g_localConnectivity = NULL;
394 CAResult_t CAStartServer()
396 if (false == g_adapterState)
398 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "Bluetooth adapter is disabled!");
399 // Setting g_serverState for starting Rfcommserver when adapter starts
400 g_serverState = true;
404 CAResult_t err = CA_STATUS_OK;
405 if (CA_STATUS_OK != (err = CAEDRServerStart()))
407 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Failed to start RFCOMM server!, error num [%d]",
415 CAResult_t CAEDRInitializeQueueHandlers()
417 if (CA_STATUS_OK == CAEDRInitializeSendHandler()
418 && CA_STATUS_OK == CAEDRInitializeReceiveHandler())
420 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "Queue is initialized!");
424 return CA_STATUS_FAILED;
427 CAResult_t CAEDRInitializeSendHandler()
429 // Check if the message queue is already initialized
430 if (g_sendQueueHandle)
432 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "Already queue is initialized!");
436 g_sendQueueHandle = (CAQueueingThread_t *) OICMalloc(sizeof(CAQueueingThread_t));
437 if (!g_sendQueueHandle)
439 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Memory allocation failed!");
440 return CA_MEMORY_ALLOC_FAILED;
443 if (CA_STATUS_OK != CAQueueingThreadInitialize(g_sendQueueHandle, g_edrThreadPool,
444 CAAdapterDataSendHandler, CAEDRDataDestroyer))
446 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to Initialize send queue thread");
447 return CA_STATUS_FAILED;
452 CAResult_t CAEDRInitializeReceiveHandler()
454 // Check if the message queue is already initialized
455 if (g_recvQueueHandle)
457 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "Already queue is initialized!");
461 g_recvQueueHandle = (CAQueueingThread_t *) OICMalloc(sizeof(CAQueueingThread_t));
462 if (!g_recvQueueHandle)
464 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Memory allocation failed!");
465 return CA_MEMORY_ALLOC_FAILED;
469 if (CA_STATUS_OK != CAQueueingThreadInitialize(g_recvQueueHandle, g_edrThreadPool,
470 CAAdapterDataReceiverHandler,
473 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to Initialize send queue thread");
474 OICFree(g_recvQueueHandle);
475 g_recvQueueHandle = NULL;
476 return CA_STATUS_FAILED;
482 void CAAdapterTerminateQueues()
484 if (g_sendQueueHandle)
486 CAQueueingThreadDestroy(g_sendQueueHandle);
487 g_sendQueueHandle = NULL;
489 if (g_recvQueueHandle)
491 CAQueueingThreadDestroy(g_recvQueueHandle);
492 g_recvQueueHandle = NULL;
496 void CAAdapterDataSendHandler(void *context)
498 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN - CAAdapterDataSendHandler");
500 CAEDRData *message = (CAEDRData *) context;
503 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to get message!");
507 if (!message->remoteEndpoint)
509 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "remoteEndpoint is not available");
513 const char *remoteAddress = message->remoteEndpoint->addr;
516 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "EDR Send Message error");
517 //Error cannot be sent if remote address is NULL
521 CAResult_t result = CAEDRClientSendData(remoteAddress, message->data, message->dataLen);
522 if(CA_STATUS_OK != result)
524 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "CAEDRClientSendData API failed");
525 CAEDRErrorHandler(remoteAddress, message->data, message->dataLen, result);
529 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT");
532 CAResult_t CAEDRClientSendData(const char *remoteAddress, const uint8_t *data,
535 CAResult_t result = CA_SEND_FAILED;
537 // Send the first segment with the header.
538 if ((NULL != remoteAddress) && (0 < strlen(remoteAddress))) //Unicast data
540 result = CAEDRClientSendUnicastData(remoteAddress, data, dataLength);
541 if (CA_STATUS_OK != result)
543 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to send unicast data !");
549 OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "sending multicast data : %s", data);
550 result = CAEDRClientSendMulticastData(data, dataLength);
552 if (CA_STATUS_OK != result)
554 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to send multicast data !");
561 void CAAdapterDataReceiverHandler(void *context)
563 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN_CAAdapterDataReceiverHandler");
565 if (NULL == g_networkPacketReceivedCallback)
567 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "g_networkPacketReceivedCallback is NULL");
571 CAEDRData *message = (CAEDRData *) context;
572 if (NULL == message || NULL == message->remoteEndpoint)
574 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to get message!");
578 CAEndpoint_t *remoteEndpoint = CACreateEndpointObject(CA_DEFAULT_FLAGS,
579 CA_ADAPTER_RFCOMM_BTEDR,
580 message->remoteEndpoint->addr,
585 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "remoteEndpoint is NULL");
589 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "Sending data up !");
591 const CASecureEndpoint_t sep = { .endpoint = *remoteEndpoint };
593 g_networkPacketReceivedCallback(&sep, message->data, message->dataLen);
595 CAFreeEndpoint(remoteEndpoint);
597 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT_CAAdapterDataReceiverHandler");
600 CAResult_t CAAdapterStartQueue()
602 // Start send queue thread
603 if (CA_STATUS_OK != CAQueueingThreadStart(g_sendQueueHandle))
605 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to Start Send Data Thread");
606 CAEDRClientUnsetCallbacks();
607 //Disconnect all the client connections
608 CAEDRClientDisconnectAll();
609 return CA_STATUS_FAILED;
612 // Start receive queue thread
613 if (CA_STATUS_OK != CAQueueingThreadStart(g_recvQueueHandle))
615 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to Start Receive Data Thread");
616 CAEDRClientUnsetCallbacks();
617 //Disconnect all the client connections
618 CAEDRClientDisconnectAll();
619 return CA_STATUS_FAILED;
625 CAResult_t CAAdapterStopQueue()
627 //Stop send queue thread
628 CAQueueingThreadStop(g_sendQueueHandle);
630 //Stop receive queue thread
631 CAQueueingThreadStop(g_recvQueueHandle);
636 void CAAdapterRecvData(const char *remoteAddress, const uint8_t *data, uint32_t dataLength,
637 uint32_t *sentLength)
639 if (false == g_adapterState)
641 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Bluetooth adapter is disabled!");
647 VERIFY_NON_NULL_VOID(data, EDR_ADAPTER_TAG, "Data is null");
648 VERIFY_NON_NULL_VOID(sentLength, EDR_ADAPTER_TAG, "Sent data length holder is null");
650 // Create remote endpoint
651 CAEndpoint_t *remoteEndpoint = CACreateEndpointObject(CA_DEFAULT_FLAGS,
652 CA_ADAPTER_RFCOMM_BTEDR,
654 if (NULL == remoteEndpoint)
656 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to create remote endpoint !");
660 // Add message to data queue
661 CAEDRData *edrData = CACreateEDRData(remoteEndpoint, data, dataLength);
662 CAQueueingThreadAddData(g_recvQueueHandle, edrData, sizeof(CAEDRData));
663 *sentLength = dataLength;
665 // Free remote endpoint
666 CAFreeEndpoint(remoteEndpoint);
669 void CAEDRErrorHandler(const char *remoteAddress, const uint8_t *data,
670 uint32_t dataLength, CAResult_t result)
673 VERIFY_NON_NULL_VOID(data, EDR_ADAPTER_TAG, "Data is null");
675 // Create remote endpoint
676 CAEndpoint_t *remoteEndpoint = CACreateEndpointObject(0, CA_ADAPTER_RFCOMM_BTEDR,
680 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to create remote endpoint !");
684 g_errorCallback(remoteEndpoint, data, dataLength, result);
686 // Free remote endpoint
687 CAFreeEndpoint(remoteEndpoint);
690 CAResult_t CAAdapterSendData(const char *remoteAddress, const char *serviceUUID, const uint8_t *data,
691 uint32_t dataLength, uint32_t *sentLength)
693 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "IN - CAAdapterSendData");
695 if (false == g_adapterState)
697 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Bluetooth adapter is disabled!");
699 return CA_ADAPTER_NOT_ENABLED;
702 VERIFY_NON_NULL(serviceUUID, EDR_ADAPTER_TAG, "service UUID is null");
703 VERIFY_NON_NULL(data, EDR_ADAPTER_TAG, "Data is null");
704 VERIFY_NON_NULL(sentLength, EDR_ADAPTER_TAG, "Sent data length holder is null");
706 // Create remote endpoint
707 CAEndpoint_t *remoteEndpoint = CACreateEndpointObject(CA_DEFAULT_FLAGS,
708 CA_ADAPTER_RFCOMM_BTEDR,
710 if (NULL == remoteEndpoint)
712 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to create remote endpoint !");
713 return CA_MEMORY_ALLOC_FAILED;
716 // Add message to data queue
717 CAEDRData *edrData = CACreateEDRData(remoteEndpoint, data, dataLength);
718 CAQueueingThreadAddData(g_sendQueueHandle, edrData, sizeof (CAEDRData));
719 *sentLength = dataLength;
721 // Free remote endpoint
722 CAFreeEndpoint(remoteEndpoint);
724 OIC_LOG(DEBUG, EDR_ADAPTER_TAG, "OUT - CAAdapterSendData");
728 void CAEDRNotifyNetworkStatus(CANetworkStatus_t status)
730 // Create localconnectivity
731 if (NULL == g_localConnectivity)
733 CAEDRGetInterfaceInformation(&g_localConnectivity);
736 if (CA_INTERFACE_UP == status)
738 if (false == g_adapterState)
740 // Get Bluetooth adapter state
741 bool adapterState = false;
742 if (CA_STATUS_OK != CAEDRGetAdapterEnableState(&adapterState))
744 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to get adapter enable state");
748 if (false == adapterState)
750 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Bluetooth adapter is disabled!");
751 g_adapterState = false;
754 CAEDRClientSetCallbacks();
755 g_adapterState = true;
756 CAAdapterStartQueue();
757 // starting RFCommServer
758 if (true == g_serverState)
761 g_serverState = false;
767 g_adapterState = false;
770 // Notify to upper layer
771 if (g_adapterChangeCallback && g_localConnectivity && g_edrThreadPool)
773 // Add notification task to thread pool
774 CAEDRNetworkEvent *event = CAEDRCreateNetworkEvent(g_localConnectivity, status);
777 if (CA_STATUS_OK != ca_thread_pool_add_task(g_edrThreadPool,
778 CAEDROnNetworkStatusChanged,event))
780 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to create threadpool!");
787 void CAEDROnNetworkStatusChanged(void *context)
791 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "context is NULL!");
795 CAEDRNetworkEvent *networkEvent = (CAEDRNetworkEvent *) context;
797 // Notify to upper layer
798 if (g_adapterChangeCallback)
800 g_adapterChangeCallback(networkEvent->info->adapter, networkEvent->status);
803 // Free the created Network event
804 CAEDRFreeNetworkEvent(networkEvent);
807 CAEDRNetworkEvent *CAEDRCreateNetworkEvent(CAEndpoint_t *connectivity,
808 CANetworkStatus_t status)
810 VERIFY_NON_NULL_RET(connectivity, EDR_ADAPTER_TAG, "connectivity is NULL", NULL);
812 // Create CAEDRNetworkEvent
813 CAEDRNetworkEvent *event = (CAEDRNetworkEvent *) OICMalloc(sizeof(CAEDRNetworkEvent));
816 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Failed to allocate memory to network event!");
820 // Create duplicate of Local connectivity
821 event->info = CACloneEndpoint(connectivity);
822 event->status = status;
826 void CAEDRFreeNetworkEvent(CAEDRNetworkEvent *event)
830 CAFreeEndpoint(event->info);
835 CAEDRData *CACreateEDRData(const CAEndpoint_t *remoteEndpoint,
836 const uint8_t *data, uint32_t dataLength)
838 CAEDRData *edrData = (CAEDRData *) OICCalloc(1, sizeof(*edrData));
841 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Memory allocation failed!");
845 edrData->remoteEndpoint = CACloneEndpoint(remoteEndpoint);
847 edrData->data = OICMalloc(dataLength);
848 if (NULL == edrData->data)
850 OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Memory allocation failed!");
851 CAFreeEDRData(edrData);
854 memcpy(edrData->data, data, dataLength);
855 edrData->dataLen = dataLength;
860 void CAFreeEDRData(CAEDRData *edrData)
862 VERIFY_NON_NULL_VOID(edrData, EDR_ADAPTER_TAG, "edrData is NULL");
864 CAFreeEndpoint(edrData->remoteEndpoint);
865 OICFree(edrData->data);
869 void CAEDRDataDestroyer(void *data, uint32_t size)
871 if ((size_t)size < sizeof(CAEDRData))
873 OIC_LOG_V(ERROR, EDR_ADAPTER_TAG, "Destroy data too small %p %d", data, size);
875 CAEDRData *edrdata = (CAEDRData *) data;
877 CAFreeEDRData(edrdata);