#include "cainterfacecontroller.h"
#include "caedradapter.h"
#include "caleadapter.h"
+#include "canfcadapter.h"
#include "caremotehandler.h"
#include "cathreadpool.h"
#include "caipadapter.h"
#define CA_MEMORY_ALLOC_CHECK(arg) {if (arg == NULL) \
{OIC_LOG(ERROR, TAG, "memory error");goto memory_error_exit;} }
-#ifdef TCP_ADAPTER
-#define CA_TRANSPORT_TYPE_NUM 5
-#elif RA_ADAPTER
-#define CA_TRANSPORT_TYPE_NUM 4
-#else
-#define CA_TRANSPORT_TYPE_NUM 3
-#endif
+static CAConnectivityHandler_t *g_adapterHandler = NULL;
-static CAConnectivityHandler_t g_adapterHandler[CA_TRANSPORT_TYPE_NUM] = {};
+static uint32_t g_numberOfAdapters = 0;
static CANetworkPacketReceivedCallback g_networkPacketReceivedCallback = NULL;
-static CANetworkChangeCallback g_networkChangeCallback = NULL;
+static CAAdapterStateChangedCB g_adapterChangeCallback = NULL;
+
+static CAConnectionStateChangedCB g_connChangeCallback = NULL;
static CAErrorHandleCallback g_errorHandleCallback = NULL;
static int CAGetAdapterIndex(CATransportAdapter_t cType)
{
- switch (cType)
+ for (uint32_t index=0 ; index < g_numberOfAdapters ; index++)
{
- case CA_ADAPTER_IP:
- return 0;
- case CA_ADAPTER_GATT_BTLE:
- return 1;
- case CA_ADAPTER_RFCOMM_BTEDR:
- return 2;
-
-#ifdef RA_ADAPTER
- case CA_ADAPTER_REMOTE_ACCESS:
- return 3;
-#endif
-
-#ifdef TCP_ADAPTER
- case CA_ADAPTER_TCP:
- return 4;
-#endif
-
- default:
- break;
+ if (cType == g_adapterHandler[index].cType )
+ {
+ return index;
+ }
}
return -1;
}
-static void CARegisterCallback(CAConnectivityHandler_t handler, 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 ||
OIC_LOG(ERROR, TAG, "connectivity handler is not enough to be used!");
return;
}
-
- int index = CAGetAdapterIndex(cType);
- if (0 > index)
+ uint32_t numberofAdapters = g_numberOfAdapters + 1;
+ CAConnectivityHandler_t *adapterHandler = OICRealloc(g_adapterHandler,
+ (numberofAdapters) * sizeof(*adapterHandler));
+ if (NULL == adapterHandler)
{
- OIC_LOG(ERROR, TAG, "unknown connectivity type!");
+ OIC_LOG(ERROR, TAG, "Memory allocation failed during registration");
return;
}
+ g_adapterHandler = adapterHandler;
+ g_numberOfAdapters = numberofAdapters;
+ g_adapterHandler[g_numberOfAdapters-1] = handler;
- g_adapterHandler[index] = handler;
-
- OIC_LOG_V(DEBUG, TAG, "%d type adapter, register complete!", cType);
+ OIC_LOG_V(DEBUG, TAG, "%d type adapter, register complete!", handler.cType);
}
#ifdef RA_ADAPTER
}
}
-static void CANetworkChangedCallback(const CAEndpoint_t *info, CANetworkStatus_t status)
+static void CAAdapterChangedCallback(CATransportAdapter_t adapter, CANetworkStatus_t status)
+{
+ // Call the callback.
+ if (g_adapterChangeCallback != NULL)
+ {
+ if (CA_INTERFACE_UP == status)
+ {
+ g_adapterChangeCallback(adapter, true);
+ }
+ else if (CA_INTERFACE_DOWN == status)
+ {
+ g_adapterChangeCallback(adapter, false);
+ }
+ }
+ 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_networkChangeCallback != NULL)
+ if (g_connChangeCallback != NULL)
{
- g_networkChangeCallback(info, status);
+ g_connChangeCallback(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,
{
OIC_LOG(DEBUG, TAG, "initialize adapters..");
- memset(g_adapterHandler, 0, sizeof(CAConnectivityHandler_t) * CA_TRANSPORT_TYPE_NUM);
-
// Initialize adapters and register callback.
#ifdef IP_ADAPTER
- CAInitializeIP(CARegisterCallback, CAReceivedPacketCallback, CANetworkChangedCallback,
+ CAInitializeIP(CARegisterCallback, CAReceivedPacketCallback, CAAdapterChangedCallback,
CAAdapterErrorHandleCallback, handle);
#endif /* IP_ADAPTER */
#ifdef EDR_ADAPTER
- CAInitializeEDR(CARegisterCallback, CAReceivedPacketCallback, CANetworkChangedCallback,
- CAAdapterErrorHandleCallback, handle);
+ CAInitializeEDR(CARegisterCallback, CAReceivedPacketCallback, CAAdapterChangedCallback,
+ CAConnectionChangedCallback, CAAdapterErrorHandleCallback, handle);
#endif /* EDR_ADAPTER */
#ifdef LE_ADAPTER
- CAInitializeLE(CARegisterCallback, CAReceivedPacketCallback, CANetworkChangedCallback,
- CAAdapterErrorHandleCallback, handle);
+ CAInitializeLE(CARegisterCallback, CAReceivedPacketCallback, CAAdapterChangedCallback,
+ CAConnectionChangedCallback, CAAdapterErrorHandleCallback, handle);
#endif /* LE_ADAPTER */
#ifdef RA_ADAPTER
- CAInitializeRA(CARegisterCallback, CAReceivedPacketCallback, CANetworkChangedCallback,
+ CAInitializeRA(CARegisterCallback, CAReceivedPacketCallback, CAAdapterChangedCallback,
handle);
#endif /* RA_ADAPTER */
#ifdef TCP_ADAPTER
- CAInitializeTCP(CARegisterCallback, CAReceivedPacketCallback, CANetworkChangedCallback,
- CAAdapterErrorHandleCallback, handle);
+ CAInitializeTCP(CARegisterCallback, CAReceivedPacketCallback, CAAdapterChangedCallback,
+ CAConnectionChangedCallback, CAAdapterErrorHandleCallback, handle);
#endif /* TCP_ADAPTER */
+
+#ifdef NFC_ADAPTER
+ CAInitializeNFC(CARegisterCallback, CAReceivedPacketCallback, CAAdapterChangedCallback,
+ CAAdapterErrorHandleCallback, handle);
+#endif /* NFC_ADAPTER */
}
void CASetPacketReceivedCallback(CANetworkPacketReceivedCallback callback)
g_networkPacketReceivedCallback = callback;
}
-void CASetNetworkChangeCallback(CANetworkChangeCallback callback)
+void CASetNetworkMonitorCallbacks(CAAdapterStateChangedCB adapterCB,
+ CAConnectionStateChangedCB connCB)
{
- OIC_LOG(DEBUG, TAG, "Set network handle callback");
+ OIC_LOG(DEBUG, TAG, "Set network monitoring callback");
- g_networkChangeCallback = callback;
+ g_adapterChangeCallback = adapterCB;
+ g_connChangeCallback = connCB;
}
void CASetErrorHandleCallback(CAErrorHandleCallback errorCallback)
return CA_STATUS_INVALID_PARAM;
}
- CAEndpoint_t *tempInfo[CA_TRANSPORT_TYPE_NUM] = { 0 };
- uint32_t tempSize[CA_TRANSPORT_TYPE_NUM] = { 0 };
+ CAEndpoint_t **tempInfo = (CAEndpoint_t**) OICCalloc(g_numberOfAdapters, sizeof(*tempInfo));
+ if (!tempInfo)
+ {
+ OIC_LOG(ERROR, TAG, "Out of memory!");
+ return CA_MEMORY_ALLOC_FAILED;
+ }
+ uint32_t *tempSize =(uint32_t*) OICCalloc(g_numberOfAdapters, sizeof(*tempSize));
+ if (!tempSize)
+ {
+ OIC_LOG(ERROR, TAG, "Out of memory!");
+ OICFree(tempInfo);
+ return CA_MEMORY_ALLOC_FAILED;
+ }
CAResult_t res = CA_STATUS_FAILED;
size_t resSize = 0;
- for (size_t index = 0; index < CA_TRANSPORT_TYPE_NUM; index++)
+ for (uint32_t index = 0; index < g_numberOfAdapters; index++)
{
if (g_adapterHandler[index].GetnetInfo != NULL)
{
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);
if (resSize == 0)
{
+ OICFree(tempInfo);
+ OICFree(tempSize);
if (res == CA_ADAPTER_NOT_ENABLED || res == CA_NOT_SUPPORTED)
{
return res;
}
- return CA_STATUS_FAILED;
+ else
+ {
+ return CA_STATUS_FAILED;
+ }
}
// #3. add data into result
*info = resInfo;
*size = resSize;
- for (size_t index = 0; index < CA_TRANSPORT_TYPE_NUM; index++)
+ for (uint32_t index = 0; index < g_numberOfAdapters; index++)
{
// check information
if (tempSize[index] == 0)
OICFree(tempInfo[index]);
tempInfo[index] = NULL;
}
+ OICFree(tempInfo);
+ OICFree(tempSize);
OIC_LOG(DEBUG, TAG, "each network info save success!");
return CA_STATUS_OK;
// memory error label.
memory_error_exit:
- for (size_t index = 0; index < CA_TRANSPORT_TYPE_NUM; index++)
+ for (uint32_t index = 0; index < g_numberOfAdapters; index++)
{
OICFree(tempInfo[index]);
tempInfo[index] = NULL;
}
+ OICFree(tempInfo);
+ OICFree(tempSize);
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)
{
return CA_STATUS_INVALID_PARAM;
}
- CATransportAdapter_t type = endpoint->adapter;
- int index = CAGetAdapterIndex(type);
- if (0 > index)
+ u_arraylist_t *list = CAGetSelectedNetworkList();
+ if (!list)
{
- OIC_LOG(ERROR, TAG, "unknown transport type!");
- return CA_STATUS_INVALID_PARAM;
+ OIC_LOG(ERROR, TAG, "No selected network");
+ return CA_SEND_FAILED;
}
+ CATransportAdapter_t requestedAdapter = endpoint->adapter ? endpoint->adapter : CA_ALL_ADAPTERS;
- int32_t sentDataLen = 0;
-
- if (g_adapterHandler[index].sendData != NULL)
+ for (uint32_t i = 0; i < u_arraylist_length(list); i++)
{
- sentDataLen = g_adapterHandler[index].sendData(endpoint, data, length);
- }
+ void* ptrType = u_arraylist_get(list, i);
- if (sentDataLen != (int)length)
- {
- OIC_LOG(ERROR, TAG, "error in sending data. Error will be reported in adapter");
+ if (NULL == ptrType)
+ {
+ continue;
+ }
+
+ CATransportAdapter_t connType = *(CATransportAdapter_t *)ptrType;
+ if (0 == (connType & requestedAdapter))
+ {
+ continue;
+ }
+
+ int index = CAGetAdapterIndex(connType);
+
+ if (-1 == index)
+ {
+ OIC_LOG(ERROR, TAG, "unknown transport type!");
+ return CA_STATUS_INVALID_PARAM;
+ }
+
+ int32_t sentDataLen = 0;
+
+ if (NULL != g_adapterHandler[index].sendData)
+ {
+ OIC_LOG(DEBUG, TAG, "unicast message to adapter");
+ sentDataLen = g_adapterHandler[index].sendData(endpoint, data, length, dataType);
+ }
+
+ if (sentDataLen != (int32_t)length)
+ {
+ OIC_LOG(ERROR, TAG, "error in sending data. Error will be reported in adapter");
#ifdef SINGLE_THREAD
- //in case of single thread, no error handler. Report error immediately
- return CA_SEND_FAILED;
+ //in case of single thread, no error handler. Report error immediately
+ return CA_SEND_FAILED;
#endif
+ }
+
}
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)
return CA_SEND_FAILED;
}
- CATransportFlags_t requestedAdapter = endpoint->adapter ? endpoint->adapter : CA_ALL_ADAPTERS;
+ CATransportAdapter_t requestedAdapter = endpoint->adapter ? endpoint->adapter : CA_ALL_ADAPTERS;
size_t selectedLength = u_arraylist_length(list);
for (size_t i = 0; i < selectedLength; i++)
{
void* ptrType = u_arraylist_get(list, i);
- if(ptrType == NULL)
+ if (NULL == ptrType)
{
continue;
}
CATransportAdapter_t connType = *(CATransportAdapter_t *)ptrType;
- if ((connType & requestedAdapter) == 0)
+ if (0 == (connType & requestedAdapter))
{
continue;
}
int index = CAGetAdapterIndex(connType);
if (0 > index)
{
- OIC_LOG(DEBUG, TAG, "unknown connectivity type!");
+ OIC_LOG(ERROR, TAG, "unknown connectivity type!");
continue;
}
uint32_t sentDataLen = 0;
- if (g_adapterHandler[index].sendDataToAll != NULL)
+ if (NULL != g_adapterHandler[index].sendDataToAll)
{
void *payload = (void *) OICMalloc(length);
if (!payload)
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);
}
void CATerminateAdapters()
{
- for (size_t index = 0; index < CA_TRANSPORT_TYPE_NUM; index++)
+ for (uint32_t index = 0; index < g_numberOfAdapters; index++)
{
if (g_adapterHandler[index].terminate != NULL)
{
g_adapterHandler[index].terminate();
}
}
+
+ OICFree(g_adapterHandler);
+ g_adapterHandler = NULL;
+ g_numberOfAdapters = 0;
}
#ifdef SINGLE_THREAD