1 /* *****************************************************************
2 * Copyright 2015 Samsung Electronics All Rights Reserved.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 ******************************************************************/
17 #include "canfcadapter.h"
19 #include "canfcinterface.h"
20 #include "caqueueingthread.h"
21 #include "caadapterutils.h"
23 #include "uarraylist.h"
24 #include "caremotehandler.h"
26 #include "oic_malloc.h"
27 #include "oic_string.h"
30 * Logging tag for module name
32 #define TAG "NFC_ADAP"
35 * Holds inter thread nfc data information.
40 CAEndpoint_t *remoteEndpoint;
46 * Reference to threadpool.
48 static ca_thread_pool_t g_nfcThreadPool = NULL;
51 * Queue handle for Send Data
53 static CAQueueingThread_t *g_sendQueueHandle = NULL;
56 * Network Packet Received Callback to CA
58 static CANetworkPacketReceivedCallback g_packetReceivedCallback = NULL;
61 * Network Changed Callback to CA
63 static CANetworkChangeCallback g_connectionStateCallback = NULL;
66 * error Callback to CA adapter
68 static CAErrorHandleCallback g_errorCallback = NULL;
70 static void CANFCPacketReceivedCB(const CASecureEndpoint_t *endpoint, const void *data,
74 static CAResult_t CANFCInitializeQueueHandles();
76 static void CANFCDeinitializeQueueHandles();
78 static void CANFCSendDataThread(void *threadData);
80 CANFCData *CACreateNFCData(const CAEndpoint_t *remoteEndpoint, const void *data,
83 void CAFreeNFCData(CANFCData *ipData);
85 static void CANFCDataDestroyer(void *data, uint32_t size);
87 CAResult_t CANFCInitializeQueueHandles()
89 OIC_LOG(DEBUG, TAG, "IN");
91 // Check if the message queue is already initialized
92 if (g_sendQueueHandle)
94 OIC_LOG(DEBUG, TAG, "send queue handle is already initialized!");
98 // Create send message queue
99 g_sendQueueHandle = OICCalloc(1, sizeof(*g_sendQueueHandle));
100 if (!g_sendQueueHandle)
102 OIC_LOG(ERROR, TAG, "Memory allocation failed!");
103 return CA_MEMORY_ALLOC_FAILED;
107 != CAQueueingThreadInitialize(g_sendQueueHandle, (const ca_thread_pool_t) g_nfcThreadPool,
108 CANFCSendDataThread, CANFCDataDestroyer))
110 OIC_LOG(ERROR, TAG, "Failed to Initialize send queue thread");
111 OICFree(g_sendQueueHandle);
112 g_sendQueueHandle = NULL;
113 return CA_STATUS_FAILED;
116 OIC_LOG(DEBUG, TAG, "OUT");
120 void CANFCDeinitializeQueueHandles()
122 OIC_LOG(DEBUG, TAG, "IN");
124 CAQueueingThreadDestroy(g_sendQueueHandle);
125 OICFree(g_sendQueueHandle);
126 g_sendQueueHandle = NULL;
128 OIC_LOG(DEBUG, TAG, "OUT");
131 #endif // SINGLE_THREAD
132 void CANFCConnectionStateCB(const char *nfcAddress, CANetworkStatus_t status)
134 OIC_LOG(DEBUG, TAG, "Currently Not Supported");
137 void CANFCPacketReceivedCB(const CASecureEndpoint_t *sep, const void *data, uint32_t dataLength)
139 OIC_LOG(DEBUG, TAG, "IN");
141 VERIFY_NON_NULL_VOID(sep, TAG, "endpoint is NULL");
142 VERIFY_NON_NULL_VOID(data, TAG, "data is NULL");
146 OIC_LOG(ERROR, TAG, "Invalid call, data length is 0");
150 OIC_LOG_V(DEBUG, TAG, "Address: %s, port:%d", sep->endpoint.addr, sep->endpoint.port);
152 if (g_packetReceivedCallback)
154 g_packetReceivedCallback(sep, data, dataLength);
157 OIC_LOG(DEBUG, TAG, "OUT");
160 void CANFCErrorHandler(const CAEndpoint_t *endpoint, const void *data, uint32_t dataLength,
163 OIC_LOG(DEBUG, TAG, "IN");
165 VERIFY_NON_NULL_VOID(endpoint, TAG, "endpoint is NULL");
167 VERIFY_NON_NULL_VOID(data, TAG, "data is NULL");
170 g_errorCallback(endpoint, data, dataLength, result);
172 OIC_LOG(DEBUG, TAG, "OUT");
175 CAResult_t CAInitializeNFC(CARegisterConnectivityCallback registerCallback,
176 CANetworkPacketReceivedCallback packetReceivedCallback,
177 CANetworkChangeCallback connectionStateCallback,
178 CAErrorHandleCallback errorCallback, ca_thread_pool_t handle)
180 OIC_LOG(DEBUG, TAG, "IN");
181 VERIFY_NON_NULL(registerCallback, TAG, "registerCallback");
182 VERIFY_NON_NULL(packetReceivedCallback, TAG, "packetReceivedCallback");
183 VERIFY_NON_NULL(connectionStateCallback, TAG, "connectionStateCallback");
184 VERIFY_NON_NULL(handle, TAG, "thread pool handle");
186 g_connectionStateCallback = connectionStateCallback;
187 g_packetReceivedCallback = packetReceivedCallback;
188 g_errorCallback = errorCallback;
190 g_nfcThreadPool = handle;
192 CAResult_t result = CAInitializeNfcServer();
193 if (CA_STATUS_OK != result)
195 OIC_LOG(ERROR, TAG, "CAInitializeNfcServer failed");
199 CANFCSetPacketReceiveCallback(CANFCPacketReceivedCB);
200 static const CAConnectivityHandler_t nfcHandler =
202 .startAdapter = CAStartNFC,
203 .stopAdapter = CAStopNFC,
204 .startListenServer = CAStartNFCListeningServer,
205 .stopListenServer = CAStopNFCListeningServer,
206 .startDiscoveryServer = CAStartNFCDiscoveryServer,
207 .sendData = CASendNFCUnicastData,
208 .sendDataToAll = CASendNFCMulticastData,
209 .GetnetInfo = CAGetNFCInterfaceInformation,
210 .readData = CAReadNFCData,
211 .terminate = CATerminateNFC,
212 .cType = CA_ADAPTER_NFC
214 registerCallback(nfcHandler);
216 OIC_LOG(INFO, TAG, "OUT Intialize NFC is Success");
220 CAResult_t CAStartNFC()
223 OIC_LOG(DEBUG, TAG, "IN");
224 CAResult_t res = CANFCInitializeQueueHandles();
226 if (CA_STATUS_OK != res)
228 OIC_LOG(ERROR, TAG, "Failed to Initialize Queue Handle");
232 res = CAQueueingThreadStart(g_sendQueueHandle);
233 // Start send queue thread
234 if (CA_STATUS_OK != res)
236 OIC_LOG(ERROR, TAG, "Failed to Start Send Data Thread");
240 OIC_LOG(DEBUG, TAG, "OUT");
244 CAResult_t CAStartNFCListeningServer()
246 OIC_LOG(DEBUG, TAG, "IN");
248 CAResult_t ret = CANFCStartServer();
249 if (CA_STATUS_OK != ret)
251 OIC_LOG_V(ERROR, TAG, "Failed to start server![%d]", ret);
255 OIC_LOG(DEBUG, TAG, "OUT");
259 CAResult_t CAStopNFCListeningServer()
265 CAResult_t CAStartNFCDiscoveryServer()
267 return CAStartNFCListeningServer();
270 static int32_t CAQueueNFCData(const CAEndpoint_t *endpoint, const void *data,
273 OIC_LOG(DEBUG, TAG, "IN");
275 VERIFY_NON_NULL_RET(endpoint, TAG, "remoteEndpoint", -1);
276 VERIFY_NON_NULL_RET(data, TAG, "data", -1);
280 OIC_LOG(ERROR, TAG, "Invalid Data Length");
284 VERIFY_NON_NULL_RET(g_sendQueueHandle, TAG, "sendQueueHandle", -1);
285 // Create NFCData to add to queue
286 CANFCData *nfcData = CACreateNFCData(endpoint, data, dataLength);
289 OIC_LOG(ERROR, TAG, "Failed to create ipData!");
292 // Add message to send queue
293 CAQueueingThreadAddData(g_sendQueueHandle, nfcData, sizeof(CANFCData));
295 OIC_LOG(DEBUG, TAG, "OUT");
300 int32_t CASendNFCUnicastData(const CAEndpoint_t *endpoint, const void *data, uint32_t dataLength)
302 return CAQueueNFCData(endpoint, data, dataLength);
305 int32_t CASendNFCMulticastData(const CAEndpoint_t *endpoint, const void *data, uint32_t dataLength)
307 return CAQueueNFCData(endpoint, data, dataLength);
310 CAResult_t CAReadNFCData()
313 OIC_LOG(DEBUG, TAG, "IN");
315 OIC_LOG(DEBUG, TAG, "OUT");
320 CAResult_t CAStopNFC()
322 OIC_LOG(DEBUG, TAG, "IN");
324 if (g_sendQueueHandle && g_sendQueueHandle->threadMutex)
326 CAQueueingThreadStop(g_sendQueueHandle);
329 CANFCDeinitializeQueueHandles();
333 OIC_LOG(DEBUG, TAG, "OUT");
338 void CATerminateNFC()
341 OIC_LOG(DEBUG, TAG, "IN");
342 CANFCSetPacketReceiveCallback(NULL);
343 CANFCDeinitializeQueueHandles();
345 OIC_LOG(DEBUG, TAG, "OUT");
348 void CANFCSendDataThread(void *threadData)
350 OIC_LOG(DEBUG, TAG, "IN");
351 CANFCData *nfcData = (CANFCData *) threadData;
354 OIC_LOG(ERROR, TAG, "Invalid ip data!");
358 CANFCSendData(nfcData->remoteEndpoint, nfcData->data, nfcData->dataLen);
359 OIC_LOG(DEBUG, TAG, "OUT");
362 CANFCData *CACreateNFCData(const CAEndpoint_t *remoteEndpoint, const void *data,
365 VERIFY_NON_NULL_RET(data, TAG, "NFCData is NULL", NULL);
367 CANFCData *nfcData = (CANFCData *) OICCalloc(1,sizeof(*nfcData));
370 OIC_LOG(ERROR, TAG, "Memory allocation failed!");
374 nfcData->remoteEndpoint = CACloneEndpoint(remoteEndpoint);
375 nfcData->data = (void *) OICMalloc(dataLength);
378 OIC_LOG(ERROR, TAG, "Memory allocation failed!");
379 CAFreeNFCData(nfcData);
383 memcpy(nfcData->data, data, dataLength);
384 nfcData->dataLen = dataLength;
390 void CAFreeNFCData(CANFCData *nfcData)
394 CAFreeEndpoint(nfcData->remoteEndpoint);
395 OICFree(nfcData->data);
400 void CANFCDataDestroyer(void *data, uint32_t size)
402 CANFCData *nfcData = (CANFCData *) data;
404 CAFreeNFCData(nfcData);
407 CAResult_t CAGetNFCInterfaceInformation(CAEndpoint_t **info, uint32_t *size)
409 OIC_LOG(DEBUG, TAG, "CAGetNFCInterfaceInformation not supported");
412 OIC_LOG(ERROR, TAG, "CAGetNFCInterfaceInformation : Invalid Input");
413 return CA_STATUS_FAILED;