2 * Copyright (c) 2015 Samsung Electronics Co., Ltd 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.
17 #include "nfc/nfc_util.h"
19 #include "common/assert.h"
20 #include "common/logger.h"
21 #include "common/platform_exception.h"
24 using namespace common;
29 UCharVector NFCUtil::ToVector(const unsigned char* ch, const int size) {
31 UCharVector vec(ch, ch + size / sizeof(char));
35 PlatformResult NFCUtil::CodeToResult(const int errorCode, const std::string& message,
36 const bool newAPIVersion) {
39 case NFC_ERROR_INVALID_PARAMETER:
40 case NFC_ERROR_INVALID_NDEF_MESSAGE:
41 case NFC_ERROR_INVALID_RECORD_TYPE:
42 case NFC_ERROR_NOT_NDEF_FORMAT:
43 return LogAndCreateResult(ErrorCode::INVALID_VALUES_ERR, message);
44 case NFC_ERROR_SECURITY_RESTRICTED:
45 case NFC_ERROR_PERMISSION_DENIED:
46 return LogAndCreateResult(ErrorCode::SECURITY_ERR, message);
47 case NFC_ERROR_NOT_SUPPORTED:
48 return LogAndCreateResult(ErrorCode::NOT_SUPPORTED_ERR, message);
49 case NFC_ERROR_NOT_ACTIVATED:
50 return LogAndCreateResult(ErrorCode::SERVICE_NOT_AVAILABLE_ERR, message);
51 case NFC_ERROR_OPERATION_FAILED:
52 case NFC_ERROR_DEVICE_BUSY:
53 case NFC_ERROR_NO_DEVICE:
54 case NFC_ERROR_TIMED_OUT:
55 case NFC_ERROR_OUT_OF_MEMORY:
56 case NFC_ERROR_NOT_INITIALIZED:
59 return LogAndCreateResult(ErrorCode::ABORT_ERR, message);
61 return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, message);
66 std::string NFCUtil::getNFCErrorString(const int error_code) {
67 ScopeLogger("Error code : %d", error_code);
69 case NFC_ERROR_ALREADY_ACTIVATED:
70 case NFC_ERROR_ALREADY_DEACTIVATED:
72 case NFC_ERROR_INVALID_PARAMETER:
73 case NFC_ERROR_INVALID_NDEF_MESSAGE:
74 case NFC_ERROR_INVALID_RECORD_TYPE:
75 case NFC_ERROR_NOT_NDEF_FORMAT:
76 return INVALID_VALUES_ERROR_NAME_STR;
77 case NFC_ERROR_NO_DEVICE:
78 case NFC_ERROR_OUT_OF_MEMORY:
79 case NFC_ERROR_OPERATION_FAILED:
80 case NFC_ERROR_DEVICE_BUSY:
81 return UNKNOWN_ERROR_NAME_STR;
82 case NFC_ERROR_NOT_ACTIVATED:
83 return SERVICE_NOT_AVAILABLE_ERROR_NAME_STR;
84 case NFC_ERROR_NOT_SUPPORTED:
85 return NOT_SUPPORTED_ERROR_NAME_STR;
86 case NFC_ERROR_TIMED_OUT:
87 return TIMEOUT_ERROR_NAME_STR;
89 return UNKNOWN_ERROR_NAME_STR;
92 const std::string NFCUtil::getNFCErrorMessage(const int error_code) {
93 ScopeLogger("Error code : %d", error_code);
95 case NFC_ERROR_ALREADY_ACTIVATED:
96 case NFC_ERROR_ALREADY_DEACTIVATED:
98 case NFC_ERROR_INVALID_PARAMETER:
99 return "Invalid Parameter";
100 case NFC_ERROR_INVALID_NDEF_MESSAGE:
101 return "Invalid NDEF Message";
102 case NFC_ERROR_INVALID_RECORD_TYPE:
103 return "Invalid Record Type";
104 case NFC_ERROR_NO_DEVICE:
106 case NFC_ERROR_OUT_OF_MEMORY:
107 return "Out Of Memory";
108 case NFC_ERROR_NOT_SUPPORTED:
109 return "NFC Not Supported";
110 case NFC_ERROR_OPERATION_FAILED:
111 return "Operation Failed";
112 case NFC_ERROR_DEVICE_BUSY:
113 return "Device Busy";
114 case NFC_ERROR_NOT_ACTIVATED:
115 return "NFC Not Activated";
116 case NFC_ERROR_TIMED_OUT:
118 case NFC_ERROR_READ_ONLY_NDEF:
119 return "Read Only NDEF";
120 case NFC_ERROR_NO_SPACE_ON_NDEF:
121 return "No Space On NDEF";
122 case NFC_ERROR_NO_NDEF_MESSAGE:
123 return "No NDEF Message";
124 case NFC_ERROR_NOT_NDEF_FORMAT:
125 return "Not NDEF Format";
126 case NFC_ERROR_SECURITY_RESTRICTED:
127 return "Security Restricted";
129 return "UnknownError";
133 std::string NFCUtil::ToStringNFCTag(nfc_tag_type_e tag_type) {
136 case NFC_GENERIC_PICC:
137 return GENERIC_TARGET;
138 case NFC_ISO14443_A_PICC:
140 case NFC_ISO14443_4A_PICC:
142 case NFC_ISO14443_3A_PICC:
144 case NFC_MIFARE_MINI_PICC:
146 case NFC_MIFARE_1K_PICC:
148 case NFC_MIFARE_4K_PICC:
150 case NFC_MIFARE_ULTRA_PICC:
152 case NFC_MIFARE_DESFIRE_PICC:
153 return MIFARE_DESFIRE;
154 case NFC_ISO14443_B_PICC:
156 case NFC_ISO14443_4B_PICC:
158 case NFC_ISO14443_BPRIME_PICC:
159 return ISO14443_BPRIME;
160 case NFC_FELICA_PICC:
164 case NFC_ISO15693_PICC:
166 case NFC_UNKNOWN_TARGET:
168 return UNKNOWN_TARGET;
172 PlatformResult NFCUtil::ToNfcTagString(const std::string& type_string, nfc_tag_type_e* tag_type) {
174 if (GENERIC_TARGET == type_string) {
175 *tag_type = NFC_GENERIC_PICC;
176 } else if (ISO14443_A == type_string) {
177 *tag_type = NFC_ISO14443_A_PICC;
178 } else if (ISO14443_4A == type_string) {
179 *tag_type = NFC_ISO14443_4A_PICC;
180 } else if (ISO14443_3A == type_string) {
181 *tag_type = NFC_ISO14443_3A_PICC;
182 } else if (MIFARE_MINI == type_string) {
183 *tag_type = NFC_MIFARE_MINI_PICC;
184 } else if (MIFARE_1K == type_string) {
185 *tag_type = NFC_MIFARE_1K_PICC;
186 } else if (MIFARE_4K == type_string) {
187 *tag_type = NFC_MIFARE_4K_PICC;
188 } else if (MIFARE_ULTRA == type_string) {
189 *tag_type = NFC_MIFARE_ULTRA_PICC;
190 } else if (MIFARE_DESFIRE == type_string) {
191 *tag_type = NFC_MIFARE_DESFIRE_PICC;
192 } else if (ISO14443_B == type_string) {
193 *tag_type = NFC_ISO14443_B_PICC;
194 } else if (ISO14443_4B == type_string) {
195 *tag_type = NFC_ISO14443_4B_PICC;
196 } else if (ISO14443_BPRIME == type_string) {
197 *tag_type = NFC_ISO14443_BPRIME_PICC;
198 } else if (FELICA == type_string) {
199 *tag_type = NFC_FELICA_PICC;
200 } else if (JEWEL == type_string) {
201 *tag_type = NFC_JEWEL_PICC;
202 } else if (ISO15693 == type_string) {
203 *tag_type = NFC_ISO15693_PICC;
204 } else if (UNKNOWN_TARGET == type_string) {
205 *tag_type = NFC_UNKNOWN_TARGET;
207 return LogAndCreateResult(ErrorCode::TYPE_MISMATCH_ERR, "No Match Tag Type");
209 return PlatformResult(ErrorCode::NO_ERROR);
212 PlatformResult NFCUtil::ToStringCardEmulationMode(const nfc_se_card_emulation_mode_type_e card_mode,
216 case NFC_SE_CARD_EMULATION_MODE_OFF:
219 case NFC_SE_CARD_EMULATION_MODE_ON:
223 return LogAndCreateResult(ErrorCode::TYPE_MISMATCH_ERR, "No Match Card Emulation mode",
224 ("No Match Card Emulation mode: %x", card_mode));
226 return PlatformResult(ErrorCode::NO_ERROR);
229 PlatformResult NFCUtil::ToCardEmulationMode(const std::string& mode_string,
230 nfc_se_card_emulation_mode_type_e* mode) {
232 if (mode_string == ALWAYS_ON) {
233 *mode = NFC_SE_CARD_EMULATION_MODE_ON;
234 } else if (mode_string == OFF) {
235 *mode = NFC_SE_CARD_EMULATION_MODE_OFF;
237 return LogAndCreateResult(ErrorCode::TYPE_MISMATCH_ERR, "No Match Card Emulation mode",
238 ("No Match Card Emulation mode: %s", mode_string.c_str()));
240 return PlatformResult(ErrorCode::NO_ERROR);
243 PlatformResult NFCUtil::ToStringSecureElementType(const nfc_se_type_e se_type, std::string* type) {
246 case NFC_SE_TYPE_ESE:
247 *type = DATA_NFC_SE_TYPE_ESE;
249 case NFC_SE_TYPE_UICC:
250 *type = DATA_NFC_SE_TYPE_UICC;
252 case NFC_SE_TYPE_HCE:
253 *type = DATA_NFC_SE_TYPE_HCE;
256 return LogAndCreateResult(ErrorCode::TYPE_MISMATCH_ERR, "No Match Secure Element Type",
257 ("No Match Secure Element Type: %x", se_type));
259 return PlatformResult(ErrorCode::NO_ERROR);
262 PlatformResult NFCUtil::ToSecureElementType(const std::string& type_string, nfc_se_type_e* type) {
264 if (type_string == DATA_NFC_SE_TYPE_ESE) {
265 *type = NFC_SE_TYPE_ESE;
266 } else if (type_string == DATA_NFC_SE_TYPE_UICC) {
267 *type = NFC_SE_TYPE_UICC;
268 } else if (type_string == DATA_NFC_SE_TYPE_HCE) {
269 *type = NFC_SE_TYPE_HCE;
271 return LogAndCreateResult(ErrorCode::TYPE_MISMATCH_ERR, "No Match Secure Element Type",
272 ("No Match Secure Element Type: %s", type_string.c_str()));
274 return PlatformResult(ErrorCode::NO_ERROR);
277 void NFCUtil::setDefaultFilterValues(std::vector<nfc_tag_type_e>& filter) {
279 filter.push_back(NFC_GENERIC_PICC);
280 filter.push_back(NFC_ISO14443_A_PICC);
281 filter.push_back(NFC_ISO14443_3A_PICC);
282 filter.push_back(NFC_ISO14443_3A_PICC);
283 filter.push_back(NFC_MIFARE_MINI_PICC);
284 filter.push_back(NFC_MIFARE_1K_PICC);
285 filter.push_back(NFC_MIFARE_4K_PICC);
286 filter.push_back(NFC_MIFARE_ULTRA_PICC);
287 filter.push_back(NFC_MIFARE_DESFIRE_PICC);
288 filter.push_back(NFC_ISO14443_B_PICC);
289 filter.push_back(NFC_ISO14443_4B_PICC);
290 filter.push_back(NFC_ISO14443_BPRIME_PICC);
291 filter.push_back(NFC_FELICA_PICC);
292 filter.push_back(NFC_JEWEL_PICC);
293 filter.push_back(NFC_ISO15693_PICC);
294 filter.push_back(NFC_UNKNOWN_TARGET);
297 // Convertion of enum to HCEEventType(characters sequence).
298 PlatformResult NFCUtil::ToStr(nfc_hce_event_type_e event_type, std::string* result_type) {
300 switch (event_type) {
301 case NFC_HCE_EVENT_DEACTIVATED:
302 *result_type = "DEACTIVATED";
304 case NFC_HCE_EVENT_ACTIVATED:
305 *result_type = "ACTIVATED";
307 case NFC_HCE_EVENT_APDU_RECEIVED:
308 *result_type = "APDU_RECEIVED";
311 return LogAndCreateResult(
312 ErrorCode::UNKNOWN_ERR, "That event type is incorrect.",
313 ("Event has not an expected value. Passed value is %d", (int)event_type));
315 return PlatformResult(ErrorCode::NO_ERROR);
318 // Convertion of enum to SecureElementType(characters sequence).
319 // Warning! DISABLE and SDCARD are not mentioned at widl spec.
320 PlatformResult NFCUtil::ToStr(nfc_se_type_e se_type, std::string* result_type) {
323 case NFC_SE_TYPE_DISABLE:
324 *result_type = "DISABLE";
326 case NFC_SE_TYPE_ESE:
327 *result_type = "ESE";
329 case NFC_SE_TYPE_UICC:
330 *result_type = "UICC";
332 case NFC_SE_TYPE_SDCARD:
333 *result_type = "SDCARD";
335 case NFC_SE_TYPE_HCE:
336 *result_type = "HCE";
339 return LogAndCreateResult(
340 ErrorCode::UNKNOWN_ERR, "That event type is incorrect.",
341 ("Event has not an expected value. Passed value is %d", (int)se_type));
343 return PlatformResult(ErrorCode::NO_ERROR);
346 // Convertion CardEmulationCategoryType(characters sequence) to enum.
347 PlatformResult NFCUtil::StringToCategory(const std::string& category_type,
348 nfc_card_emulation_category_type_e* result_type) {
350 if (category_type == "PAYMENT") {
351 *result_type = NFC_CARD_EMULATION_CATEGORY_PAYMENT;
352 } else if (category_type == "OTHER") {
353 *result_type = NFC_CARD_EMULATION_CATEGORY_OTHER;
355 return LogAndCreateResult(
356 ErrorCode::UNKNOWN_ERR, "That category type is incorrect.",
357 ("Category has not an expected value. Passed value is %s", category_type.c_str()));
359 return PlatformResult(ErrorCode::NO_ERROR);
362 unsigned char* NFCUtil::DoubleArrayToUCharArray(const picojson::array& array_in) {
364 unsigned char* result_array = new unsigned char[array_in.size()];
365 for (std::size_t i = 0; i < array_in.size(); ++i) {
366 result_array[i] = (int) array_in.at(i).get<double>();
371 UCharVector NFCUtil::DoubleArrayToUCharVector(const picojson::array& array_in) {
373 return ToVector(NFCUtil::DoubleArrayToUCharArray(array_in), array_in.size());
376 picojson::array NFCUtil::FromUCharArray(unsigned char* array, unsigned int apdu_len) {
378 picojson::array apdu_array;
379 apdu_array.reserve(apdu_len);
380 for (unsigned int i = 0; i < apdu_len; ++i)
381 apdu_array.push_back(picojson::value(static_cast<double>(array[i])));