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 * Adapter Changed Callback to CA
63 static CAAdapterChangeCallback g_adapterStateCallback = NULL;
66 * error Callback to CA adapter
68 static CAErrorHandleCallback g_errorCallback = NULL;
70 static CAResult_t CANFCPacketReceivedCB(const CASecureEndpoint_t *endpoint,
71 const void *data, uint32_t dataLength);
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");
140 CAResult_t CANFCPacketReceivedCB(const CASecureEndpoint_t *sep, const void *data,
143 OIC_LOG(DEBUG, TAG, "IN");
145 VERIFY_NON_NULL(sep, TAG, "endpoint is NULL");
146 VERIFY_NON_NULL(data, TAG, "data is NULL");
150 OIC_LOG(ERROR, TAG, "Invalid call, data length is 0");
151 return CA_STATUS_FAILED;
154 OIC_LOG_V(DEBUG, TAG, "Address: %s, port:%d", sep->endpoint.addr, sep->endpoint.port);
156 if (g_packetReceivedCallback)
158 g_packetReceivedCallback(sep, data, dataLength);
161 OIC_LOG(DEBUG, TAG, "OUT");
166 void CANFCErrorHandler(const CAEndpoint_t *endpoint, const void *data, uint32_t dataLength,
169 OIC_LOG(DEBUG, TAG, "IN");
171 VERIFY_NON_NULL_VOID(endpoint, TAG, "endpoint is NULL");
173 VERIFY_NON_NULL_VOID(data, TAG, "data is NULL");
176 g_errorCallback(endpoint, data, dataLength, result);
178 OIC_LOG(DEBUG, TAG, "OUT");
181 CAResult_t CAInitializeNFC(CARegisterConnectivityCallback registerCallback,
182 CANetworkPacketReceivedCallback packetReceivedCallback,
183 CAAdapterChangeCallback netCallback,
184 CAErrorHandleCallback errorCallback, ca_thread_pool_t handle)
186 OIC_LOG(DEBUG, TAG, "IN");
187 VERIFY_NON_NULL(registerCallback, TAG, "registerCallback");
188 VERIFY_NON_NULL(packetReceivedCallback, TAG, "packetReceivedCallback");
189 VERIFY_NON_NULL(netCallback, TAG, "netCallback");
190 VERIFY_NON_NULL(handle, TAG, "thread pool handle");
192 g_adapterStateCallback = netCallback;
193 g_packetReceivedCallback = packetReceivedCallback;
194 g_errorCallback = errorCallback;
196 g_nfcThreadPool = handle;
198 CAResult_t result = CAInitializeNfcServer();
199 if (CA_STATUS_OK != result)
201 OIC_LOG(ERROR, TAG, "CAInitializeNfcServer failed");
205 CANFCSetPacketReceiveCallback(CANFCPacketReceivedCB);
206 static const CAConnectivityHandler_t nfcHandler =
208 .startAdapter = CAStartNFC,
209 .stopAdapter = CAStopNFC,
210 .startListenServer = CAStartNFCListeningServer,
211 .stopListenServer = CAStopNFCListeningServer,
212 .startDiscoveryServer = CAStartNFCDiscoveryServer,
213 .sendData = CASendNFCUnicastData,
214 .sendDataToAll = CASendNFCMulticastData,
215 .GetnetInfo = CAGetNFCInterfaceInformation,
216 .readData = CAReadNFCData,
217 .terminate = CATerminateNFC,
218 .cType = CA_ADAPTER_NFC
220 registerCallback(nfcHandler);
222 OIC_LOG(INFO, TAG, "OUT Intialize NFC is Success");
226 CAResult_t CAStartNFC()
229 OIC_LOG(DEBUG, TAG, "IN");
230 CAResult_t res = CANFCInitializeQueueHandles();
232 if (CA_STATUS_OK != res)
234 OIC_LOG(ERROR, TAG, "Failed to Initialize Queue Handle");
238 res = CAQueueingThreadStart(g_sendQueueHandle);
239 // Start send queue thread
240 if (CA_STATUS_OK != res)
242 OIC_LOG(ERROR, TAG, "Failed to Start Send Data Thread");
246 OIC_LOG(DEBUG, TAG, "OUT");
250 CAResult_t CAStartNFCListeningServer()
252 OIC_LOG(DEBUG, TAG, "IN");
254 CAResult_t ret = CANFCStartServer();
255 if (CA_STATUS_OK != ret)
257 OIC_LOG_V(ERROR, TAG, "Failed to start server![%d]", ret);
261 OIC_LOG(DEBUG, TAG, "OUT");
265 CAResult_t CAStopNFCListeningServer()
271 CAResult_t CAStartNFCDiscoveryServer()
273 return CAStartNFCListeningServer();
276 static int32_t CAQueueNFCData(const CAEndpoint_t *endpoint, const void *data,
279 OIC_LOG(DEBUG, TAG, "IN");
281 VERIFY_NON_NULL_RET(endpoint, TAG, "remoteEndpoint", -1);
282 VERIFY_NON_NULL_RET(data, TAG, "data", -1);
286 OIC_LOG(ERROR, TAG, "Invalid Data Length");
290 VERIFY_NON_NULL_RET(g_sendQueueHandle, TAG, "sendQueueHandle", -1);
291 // Create NFCData to add to queue
292 CANFCData *nfcData = CACreateNFCData(endpoint, data, dataLength);
295 OIC_LOG(ERROR, TAG, "Failed to create ipData!");
298 // Add message to send queue
299 CAQueueingThreadAddData(g_sendQueueHandle, nfcData, sizeof(CANFCData));
301 OIC_LOG(DEBUG, TAG, "OUT");
306 int32_t CASendNFCUnicastData(const CAEndpoint_t *endpoint, const void *data, uint32_t dataLength,
307 CADataType_t dataType)
310 return CAQueueNFCData(endpoint, data, dataLength);
313 int32_t CASendNFCMulticastData(const CAEndpoint_t *endpoint, const void *data, uint32_t dataLength,
314 CADataType_t dataType)
317 return CAQueueNFCData(endpoint, data, dataLength);
320 CAResult_t CAReadNFCData()
323 OIC_LOG(DEBUG, TAG, "IN");
325 OIC_LOG(DEBUG, TAG, "OUT");
330 CAResult_t CAStopNFC()
332 OIC_LOG(DEBUG, TAG, "IN");
334 if (g_sendQueueHandle && g_sendQueueHandle->threadMutex)
336 CAQueueingThreadStop(g_sendQueueHandle);
339 CANFCDeinitializeQueueHandles();
343 OIC_LOG(DEBUG, TAG, "OUT");
348 void CATerminateNFC()
351 OIC_LOG(DEBUG, TAG, "IN");
352 CANFCSetPacketReceiveCallback(NULL);
353 CANFCDeinitializeQueueHandles();
355 OIC_LOG(DEBUG, TAG, "OUT");
358 void CANFCSendDataThread(void *threadData)
360 OIC_LOG(DEBUG, TAG, "IN");
361 CANFCData *nfcData = (CANFCData *) threadData;
364 OIC_LOG(ERROR, TAG, "Invalid ip data!");
368 CANFCSendData(nfcData->remoteEndpoint, nfcData->data, nfcData->dataLen);
369 OIC_LOG(DEBUG, TAG, "OUT");
372 CANFCData *CACreateNFCData(const CAEndpoint_t *remoteEndpoint, const void *data,
375 VERIFY_NON_NULL_RET(data, TAG, "NFCData is NULL", NULL);
377 CANFCData *nfcData = (CANFCData *) OICCalloc(1,sizeof(*nfcData));
380 OIC_LOG(ERROR, TAG, "Memory allocation failed!");
384 nfcData->remoteEndpoint = CACloneEndpoint(remoteEndpoint);
385 nfcData->data = (void *) OICMalloc(dataLength);
388 OIC_LOG(ERROR, TAG, "Memory allocation failed!");
389 CAFreeNFCData(nfcData);
393 memcpy(nfcData->data, data, dataLength);
394 nfcData->dataLen = dataLength;
400 void CAFreeNFCData(CANFCData *nfcData)
404 CAFreeEndpoint(nfcData->remoteEndpoint);
405 OICFree(nfcData->data);
410 void CANFCDataDestroyer(void *data, uint32_t size)
412 CANFCData *nfcData = (CANFCData *) data;
414 CAFreeNFCData(nfcData);
418 CAResult_t CAGetNFCInterfaceInformation(CAEndpoint_t **info, uint32_t *size)
420 OIC_LOG(DEBUG, TAG, "CAGetNFCInterfaceInformation not supported");
423 OIC_LOG(ERROR, TAG, "CAGetNFCInterfaceInformation : Invalid Input");
424 return CA_STATUS_FAILED;