X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=resource%2Fcsdk%2Fconnectivity%2Fsrc%2Fcainterfacecontroller.c;h=b0ffc3fa61f500f89074426b53c2bbc2f77d1024;hb=80c944e64b1febb010ed0dee8dd8feeb60c051e5;hp=7ae093c755da57f6cdf0dc58a902ed84a15f8b26;hpb=9c19498809f7e49a9ae68114fb0e1250ca15f55c;p=platform%2Fupstream%2Fiotivity.git diff --git a/resource/csdk/connectivity/src/cainterfacecontroller.c b/resource/csdk/connectivity/src/cainterfacecontroller.c index 7ae093c..b0ffc3f 100644 --- a/resource/csdk/connectivity/src/cainterfacecontroller.c +++ b/resource/csdk/connectivity/src/cainterfacecontroller.c @@ -35,6 +35,7 @@ #include "cathreadpool.h" #include "caipadapter.h" #include "cainterface.h" +#include #ifdef RA_ADAPTER #include "caraadapter.h" @@ -55,11 +56,26 @@ static uint32_t g_numberOfAdapters = 0; static CANetworkPacketReceivedCallback g_networkPacketReceivedCallback = NULL; -static CAAdapterChangeCallback g_adapterChangeCallback = NULL; +static CAErrorHandleCallback g_errorHandleCallback = NULL; -static CAConnectionChangeCallback g_connChangeCallback = NULL; +static struct CANetworkCallback_t * g_networkChangeCallbackList = NULL; -static CAErrorHandleCallback g_errorHandleCallback = NULL; +/** + * network callback structure is handling + * for adapter state changed and connection state changed event. + */ +typedef struct CANetworkCallback_t { + + /** Linked list; for multiple callback list.*/ + struct CANetworkCallback_t * next; + + /** Adapter state changed event callback. */ + CAAdapterStateChangedCB adapter; + + /** Connection state changed event callback. */ + CAConnectionStateChangedCB conn; + +} CANetworkCallback_t; static int CAGetAdapterIndex(CATransportAdapter_t cType) { @@ -75,7 +91,7 @@ static int CAGetAdapterIndex(CATransportAdapter_t cType) static void CARegisterCallback(CAConnectivityHandler_t handler) { - if(handler.startAdapter == NULL || + if (handler.startAdapter == NULL || handler.startListenServer == NULL || handler.stopListenServer == NULL || handler.startDiscoveryServer == NULL || @@ -104,6 +120,93 @@ static void CARegisterCallback(CAConnectivityHandler_t handler) OIC_LOG_V(DEBUG, TAG, "%d type adapter, register complete!", handler.cType); } +/** + * Add a network callback from caller to the network callback list + * + * @param adapterCB adapter state changed callback + * @param connCB connection state changed callback + * + * @return + * CAResult_t + */ +static CAResult_t AddNetworkStateChangedCallback(CAAdapterStateChangedCB adapterCB, + CAConnectionStateChangedCB connCB) +{ + OIC_LOG(DEBUG, TAG, "Add NetworkStateChanged Callback"); + + if (!adapterCB || !connCB) + { + OIC_LOG(ERROR, TAG, "parameter is null"); + return CA_STATUS_INVALID_PARAM; + } + + CANetworkCallback_t* callback = NULL; + LL_FOREACH(g_networkChangeCallbackList, callback) + { + if (callback && adapterCB == callback->adapter && connCB == callback->conn) + { + OIC_LOG(DEBUG, TAG, "this callback is already added"); + return CA_STATUS_OK; + } + } + + callback = (CANetworkCallback_t *) OICCalloc(1, sizeof(CANetworkCallback_t)); + if (NULL == callback) + { + OIC_LOG(ERROR, TAG, "Memory allocation failed during registration"); + return CA_MEMORY_ALLOC_FAILED; + } + + callback->adapter = adapterCB; + callback->conn = connCB; + LL_APPEND(g_networkChangeCallbackList, callback); + return CA_STATUS_OK; +} + +/** + * Remove a network callback from the network callback list + * + * @param adapterCB adapter state changed callback + * @param connCB connection state changed callback + * + * @return + * CAResult_t + */ +static CAResult_t RemoveNetworkStateChangedCallback(CAAdapterStateChangedCB adapterCB, + CAConnectionStateChangedCB connCB) +{ + OIC_LOG(DEBUG, TAG, "Remove NetworkStateChanged Callback"); + + CANetworkCallback_t* callback = NULL; + LL_FOREACH(g_networkChangeCallbackList, callback) + { + if (callback && adapterCB == callback->adapter && connCB == callback->conn) + { + OIC_LOG(DEBUG, TAG, "remove specific callback"); + LL_DELETE(g_networkChangeCallbackList, callback); + OICFree(callback); + return CA_STATUS_OK; + } + } + return CA_STATUS_OK; +} + +/** + * Remove all network callback from the network callback list + */ +static void RemoveAllNetworkStateChangedCallback() +{ + OIC_LOG(DEBUG, TAG, "Remove All NetworkStateChanged Callback"); + + CANetworkCallback_t* callback = NULL; + LL_FOREACH(g_networkChangeCallbackList, callback) + { + OIC_LOG(DEBUG, TAG, "remove all callbacks"); + LL_DELETE(g_networkChangeCallbackList, callback); + OICFree(callback); + } +} + #ifdef RA_ADAPTER CAResult_t CASetAdapterRAInfo(const CARAInfo_t *caraInfo) { @@ -127,22 +230,39 @@ static void CAReceivedPacketCallback(const CASecureEndpoint_t *sep, static void CAAdapterChangedCallback(CATransportAdapter_t adapter, CANetworkStatus_t status) { // Call the callback. - if (g_adapterChangeCallback != NULL) + CANetworkCallback_t* callback = NULL; + LL_FOREACH(g_networkChangeCallbackList, callback) { - g_adapterChangeCallback(adapter, status); + if (callback && callback->adapter) + { + if (CA_INTERFACE_UP == status) + { + callback->adapter(adapter, true); + } + else if (CA_INTERFACE_DOWN == status) + { + callback->adapter(adapter, false); + } + } } - OIC_LOG_V(DEBUG, TAG, "[%d]adapter status is changed to [%d]", adapter, status); + OIC_LOG_V(DEBUG, TAG, "[%d] adapter status is changed to [%d]", adapter, status); } +#if defined(TCP_ADAPTER) || defined(EDR_ADAPTER) || defined(LE_ADAPTER) static void CAConnectionChangedCallback(const CAEndpoint_t *info, bool isConnected) { // Call the callback. - if (g_connChangeCallback != NULL) + CANetworkCallback_t* callback = NULL; + LL_FOREACH(g_networkChangeCallbackList, callback) { - g_connChangeCallback(info, isConnected); + if (callback && callback->conn) + { + callback->conn(info, isConnected); + } } OIC_LOG_V(DEBUG, TAG, "[%s] connection status is changed to [%d]", info->addr, isConnected); } +#endif static void CAAdapterErrorHandleCallback(const CAEndpoint_t *endpoint, const void *data, uint32_t dataLen, @@ -200,13 +320,27 @@ void CASetPacketReceivedCallback(CANetworkPacketReceivedCallback callback) g_networkPacketReceivedCallback = callback; } -void CASetNetworkMonitorCallbacks(CAAdapterChangeCallback adapterCB, - CAConnectionChangeCallback connCB) +void CASetNetworkMonitorCallbacks(CAAdapterStateChangedCB adapterCB, + CAConnectionStateChangedCB connCB) { OIC_LOG(DEBUG, TAG, "Set network monitoring callback"); + CAResult_t res = AddNetworkStateChangedCallback(adapterCB, connCB); + if (CA_STATUS_OK != res) + { + OIC_LOG(ERROR, TAG, "AddNetworkStateChangedCallback has failed"); + } +} - g_adapterChangeCallback = adapterCB; - g_connChangeCallback = connCB; +CAResult_t CAUnsetNetworkMonitorCallbacks(CAAdapterStateChangedCB adapterCB, + CAConnectionStateChangedCB connCB) +{ + OIC_LOG(DEBUG, TAG, "Unset network monitoring callback"); + CAResult_t res = RemoveNetworkStateChangedCallback(adapterCB, connCB); + if (CA_STATUS_OK != res) + { + OIC_LOG(ERROR, TAG, "RemoveNetworkStateChangedCallback has failed"); + } + return res; } void CASetErrorHandleCallback(CAErrorHandleCallback errorCallback) @@ -291,7 +425,7 @@ CAResult_t CAGetNetworkInfo(CAEndpoint_t **info, uint32_t *size) OIC_LOG_V(DEBUG, TAG, - "%zu adapter network info size is %" PRIu32 " res:%d", + "%" PRIu32 " adapter network info size is %" PRIu32 " res:%d", index, tempSize[index], res); @@ -361,7 +495,8 @@ memory_error_exit: return CA_MEMORY_ALLOC_FAILED; } -CAResult_t CASendUnicastData(const CAEndpoint_t *endpoint, const void *data, uint32_t length) +CAResult_t CASendUnicastData(const CAEndpoint_t *endpoint, const void *data, uint32_t length, + CADataType_t dataType) { if (endpoint == NULL) { @@ -406,7 +541,7 @@ CAResult_t CASendUnicastData(const CAEndpoint_t *endpoint, const void *data, uin if (NULL != g_adapterHandler[index].sendData) { OIC_LOG(DEBUG, TAG, "unicast message to adapter"); - sentDataLen = g_adapterHandler[index].sendData(endpoint, data, length); + sentDataLen = g_adapterHandler[index].sendData(endpoint, data, length, dataType); } if (sentDataLen != (int32_t)length) @@ -423,7 +558,8 @@ CAResult_t CASendUnicastData(const CAEndpoint_t *endpoint, const void *data, uin return CA_STATUS_OK; } -CAResult_t CASendMulticastData(const CAEndpoint_t *endpoint, const void *data, uint32_t length) +CAResult_t CASendMulticastData(const CAEndpoint_t *endpoint, const void *data, uint32_t length, + CADataType_t dataType) { u_arraylist_t *list = CAGetSelectedNetworkList(); if (!list) @@ -438,7 +574,7 @@ CAResult_t CASendMulticastData(const CAEndpoint_t *endpoint, const void *data, u { void* ptrType = u_arraylist_get(list, i); - if(NULL == ptrType) + if (NULL == ptrType) { continue; } @@ -451,9 +587,8 @@ CAResult_t CASendMulticastData(const CAEndpoint_t *endpoint, const void *data, u int index = CAGetAdapterIndex(connType); if (0 > index) - if (-1 == index) { - OIC_LOG(DEBUG, TAG, "unknown connectivity type!"); + OIC_LOG(ERROR, TAG, "unknown connectivity type!"); continue; } @@ -468,7 +603,7 @@ CAResult_t CASendMulticastData(const CAEndpoint_t *endpoint, const void *data, u return CA_MEMORY_ALLOC_FAILED; } memcpy(payload, data, length); - sentDataLen = g_adapterHandler[index].sendDataToAll(endpoint, payload, length); + sentDataLen = g_adapterHandler[index].sendDataToAll(endpoint, payload, length, dataType); OICFree(payload); }