2 * Copyright (c) 2011 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.
19 #include <dpl/log/log.h>
20 #include <CommonsJavaScript/Validator.h>
21 #include <CommonsJavaScript/ScopedJSStringRef.h>
22 #include <CommonsJavaScript/JSUtils.h>
23 #include <API/NFC/NFCFactory.h>
24 #include "NFCConverter.h"
25 #include "JSNdefRecord.h"
26 #include "JSNdefRecordText.h"
27 #include "JSNdefRecordURI.h"
28 #include "JSNdefRecordMedia.h"
29 #include "JSNdefMessage.h"
32 using namespace TizenApis::Api::NFC;
33 using namespace WrtDeviceApis::CommonsJavaScript;
34 using namespace WrtDeviceApis;
37 #define NFC_FILTER_ATTRIBUTE_TAG_TYPES "tagTypes"
39 #define NFC_CHANGED_CALLBACK_ONATTATCH "onAttach"
40 #define NFC_CHANGED_CALLBACK_ONDETACH "onDetach"
45 vector<std::string> NFCConverter::m_allowedTagFilterProperties;
47 NFCConverter::NFCConverter(JSContextRef context) : Converter(context)
50 static bool init = initializeAllowedProperties();
54 NFCConverter::~NFCConverter()
59 TagFilterPtr NFCConverter::toNFCTagFilter(JSValueRef jsValue)
62 if (JSValueIsNull(m_context, jsValue) ||
63 JSValueIsUndefined(m_context, jsValue)) {
64 return TagFilterPtr(); //empty filter
66 TagFilterPtr filter(new TagFilter());
68 Validator validator(m_context);
70 if (!JSValueIsUndefined(m_context, jsValue)) {
71 vector<std::string> filter_values(toVectorOfStrings(jsValue));
73 LogDebug("NFCConverter, start setting filter values, tag_types.size() : " << filter_values.size());
74 for (unsigned int i=0; i<filter_values.size(); i++) {
75 nfcTagType filterValue = toNfcTagType(filter_values.at(i));
77 filter->addTagTypeValue(filterValue);
78 LogDebug("NFCConverter, tag_types.at(i): " << filter_values.at(i));
81 LogDebug("NFCConverter, filter size == " << filter->getFilterSize());
87 nfcTagType NFCConverter::toNfcTagType(std::string typeString) {
88 if (typeString == "ISO14443_A")
89 return NFC_TAGTYPE_ISO14443_A_PICC;
90 else if (typeString == "ISO14443_4A")
91 return NFC_TAGTYPE_ISO14443_4A_PICC;
92 else if (typeString == "ISO14443_3A")
93 return NFC_TAGTYPE_ISO14443_3A_PICC;
94 else if (typeString == "MIFARE_MINI")
95 return NFC_TAGTYPE_MIFARE_MINI_PICC;
96 else if (typeString == "MIFARE_1K")
97 return NFC_TAGTYPE_MIFARE_1K_PICC;
98 else if (typeString == "MIFARE_4K")
99 return NFC_TAGTYPE_MIFARE_4K_PICC;
100 else if (typeString == "MIFARE_ULTRA")
101 return NFC_TAGTYPE_MIFARE_ULTRA_PICC;
102 else if (typeString == "MIFARE_DESFIRE")
103 return NFC_TAGTYPE_MIFARE_DESFIRE_PICC;
104 else if (typeString == "ISO14443_B")
105 return NFC_TAGTYPE_ISO14443_B_PICC;
106 else if (typeString == "ISO14443_4B")
107 return NFC_TAGTYPE_ISO14443_4B_PICC;
108 else if (typeString == "ISO14443_BPRIME")
109 return NFC_TAGTYPE_ISO14443_BPRIME_PICC;
110 else if (typeString == "FELICA")
111 return NFC_TAGTYPE_FELICA_PICC;
112 else if (typeString == "JEWEL")
113 return NFC_TAGTYPE_JEWEL_PICC;
114 else if (typeString == "ISO15693")
115 return NFC_TAGTYPE_ISO15693_PICC;
117 ThrowMsg(Commons::InvalidArgumentException, "No Match Tag Type");
120 std::string NFCConverter::toNfcTagTypeString(nfcTagType type) {
122 case NFC_TAGTYPE_GENERIC_PICC:
123 return "GENERIC_TARGET";
125 case NFC_TAGTYPE_ISO14443_A_PICC:
128 case NFC_TAGTYPE_ISO14443_4A_PICC:
129 return "ISO14443_4A";
131 case NFC_TAGTYPE_ISO14443_3A_PICC:
132 return "ISO14443_3A";
134 case NFC_TAGTYPE_MIFARE_MINI_PICC:
135 return "MIFARE_MINI";
137 case NFC_TAGTYPE_MIFARE_1K_PICC:
140 case NFC_TAGTYPE_MIFARE_4K_PICC:
143 case NFC_TAGTYPE_MIFARE_ULTRA_PICC:
144 return "MIFARE_ULTRA";
146 case NFC_TAGTYPE_MIFARE_DESFIRE_PICC:
147 return "MIFARE_DESFIRE";
149 case NFC_TAGTYPE_ISO14443_B_PICC:
152 case NFC_TAGTYPE_ISO14443_4B_PICC:
153 return "ISO14443_4B";
155 case NFC_TAGTYPE_ISO14443_BPRIME_PICC:
156 return "ISO14443_BPRIME";
158 case NFC_TAGTYPE_FELICA_PICC:
161 case NFC_TAGTYPE_JEWEL_PICC:
164 case NFC_TAGTYPE_ISO15693_PICC:
167 case NFC_TAGTYPE_UNKNOWN_TARGET:
169 return "UNKNOWN_TARGET";
174 nfcTextEncodeUTF NFCConverter::toNfcTextEncodeUTF(std::string encodeString) {
175 if (encodeString == "UTF-8")
176 return NFC_TEXT_ENCODE_UTF_8;
177 else if (encodeString == "UTF-16")
178 return NFC_TEXT_ENCODE_UTF_16;
180 Throw(InvalidArgumentException);
183 std::string NFCConverter::toNfcTextEncodeUTFString(nfcTextEncodeUTF encode) {
185 case NFC_TEXT_ENCODE_UTF_8:
188 case NFC_TEXT_ENCODE_UTF_16:
192 Throw(ConversionException);
195 bool NFCConverter::initializeAllowedProperties()
198 //NFC Filter properties
199 m_allowedTagFilterProperties.push_back(NFC_FILTER_ATTRIBUTE_TAG_TYPES);
203 JSValueRef NFCConverter::toJSValueRef(const std::vector<unsigned char>& arg) {
204 JSObjectRef jsResult = JSCreateArrayObject(m_context, 0, NULL);
206 if (NULL == jsResult) {
207 ThrowMsg(Commons::UnknownException, "Could not create js array object");
210 for (std::size_t i = 0; i < arg.size(); ++i) {
211 JSValueRef tmpVal = JSValueMakeNumber(m_context, arg[i]);
212 if (!JSSetArrayElement(m_context, jsResult, i, tmpVal)) {
213 ThrowMsg(Commons::UnknownException, "Could not insert value into js array");
220 JSValueRef NFCConverter::toJSValueRef(NdefRecordData arg) {
221 if (arg.properties.tnf == NFC_TNF_MIME_MEDIA)
222 return JSNdefRecordMedia::createJSObject(m_context, arg.properties, arg.payload);
223 if (arg.properties.tnf == NFC_TNF_WELL_KNOWN) {
224 if (arg.properties.typeName[0] == 0x54)
225 return JSNdefRecordText::createJSObject(m_context, arg.properties, arg.payload);
226 if (arg.properties.typeName[0] == 0x55)
227 return JSNdefRecordURI::createJSObject(m_context, arg.properties, arg.payload);
229 return JSNdefRecord::createJSObject(m_context, arg.properties, arg.payload);
232 JSValueRef NFCConverter::toJSValueRef(std::vector<NFCTagProperties> props) {
233 JSObjectRef jsResult = JSCreateArrayObject(m_context, 0, NULL);
234 if (NULL == jsResult) {
235 ThrowMsg(WrtDeviceApis::Commons::UnknownException,
236 "Could not create js array object");
239 for (std::size_t i = 0; i < props.size(); ++i) {
240 JSValueRef tmpVal = toJSValueRef(props[i].value);
241 if (!JSSetArrayElementInArrayList(m_context, jsResult, props[i].key.c_str(), tmpVal)) {
242 ThrowMsg(WrtDeviceApis::Commons::UnknownException,
243 "Could not insert value into js array");
249 bool NFCConverter::isNdefRecord(const JSValueRef& arg) {
251 if (JSValueIsNull(m_context, arg) || JSValueIsUndefined(m_context, arg)) {
252 LogDebug("Object is Null or Undefied");
255 if (JSValueIsObjectOfClass(m_context, arg, JSNdefRecord::getClassRef())
256 || JSValueIsObjectOfClass(m_context, arg, JSNdefRecordText::getClassRef())
257 || JSValueIsObjectOfClass(m_context, arg, JSNdefRecordURI::getClassRef())
258 || JSValueIsObjectOfClass(m_context, arg, JSNdefRecordMedia::getClassRef()))
264 std::vector<void *> NFCConverter::toVectorOfRecordHandles(const JSValueRef& arg) {
265 if (JSValueIsNull(m_context, arg) || JSValueIsUndefined(m_context, arg)) {
266 ThrowMsg(Commons::ConversionException,
267 "NdefRecordArray is JS null or JS undefined.");
270 if (!JSIsArrayValue(m_context, arg)) {
271 ThrowMsg(Commons::ConversionException, "Argument is not an JS array.");
274 std::vector<void *> result;
275 JSObjectRef objArg = toJSObjectRef(arg);
276 for (std::size_t i = 0; i < JSGetArrayLength(m_context, objArg); ++i) {
277 JSValueRef element = JSGetArrayElement(m_context, objArg, i);
278 if (isNdefRecord(element))
279 result.push_back(getRecordHandle(element));
281 ThrowMsg(Commons::ConversionException, "JS array has no record.");
286 std::string NFCConverter::toRecordClassName(NdefRecordData arg) {
287 if (arg.properties.tnf == NFC_TNF_MIME_MEDIA)
288 return JSNdefRecordMedia::getClassInfo()->className;
289 if (arg.properties.tnf == NFC_TNF_WELL_KNOWN) {
290 if (arg.properties.typeName[0] == 0x54)
291 return JSNdefRecordText::getClassInfo()->className;
292 if (arg.properties.typeName[0] == 0x55)
293 return JSNdefRecordURI::getClassInfo()->className;
295 return JSNdefRecord::getClassInfo()->className;
298 void *NFCConverter::getRecordHandle(const JSValueRef& arg) {
300 if (!isNdefRecord(arg)) {
301 ThrowMsg(Commons::ConversionException,
302 "Message is JS null or JS undefined.");
304 JSObjectRef obj = toJSObjectRef(arg);
307 LogError("Object is null");
308 ThrowMsg(Commons::ConversionException, "Object is null");
310 NdefRecordPrivObject* privateObject = static_cast<NdefRecordPrivObject*>(JSObjectGetPrivate(obj));
311 if (!privateObject) {
312 LogError("Private object is not set.");
313 ThrowMsg(Commons::ConversionException, "Private object not set");
316 INdefRecordPtr record = privateObject->getObject();
318 return record->getHandle();
321 void *NFCConverter::getMessageHandle(const JSValueRef& arg) {
322 if (JSValueIsNull(m_context, arg) || JSValueIsUndefined(m_context, arg) ||
323 (!JSValueIsObjectOfClass(m_context, arg, JSNdefMessage::getClassRef()))) {
324 ThrowMsg(Commons::ConversionException,
325 "Message is JS null or JS undefined.");
327 JSObjectRef obj = toJSObjectRef(arg);
330 LogError("Object is null");
331 ThrowMsg(Commons::ConversionException, "Object is null");
333 NdefMessagePrivObject* privateObject = static_cast<NdefMessagePrivObject*>(JSObjectGetPrivate(obj));
334 if (!privateObject) {
335 LogError("Private object is not set.");
336 ThrowMsg(Commons::ConversionException, "Private object is not set");
339 INdefMessagePtr message = privateObject->getObject();
341 return message->getHandle();
344 NFCChangedCallback NFCConverter::toNFCChangedCallback(const JSValueRef& arg) {
346 JSObjectRef object = toJSObjectRef(arg);
348 NFCChangedCallback result;
349 Validator validator(m_context);
351 result.onAttach= JSUtils::getJSPropertyOrUndefined(
352 m_context, object, NFC_CHANGED_CALLBACK_ONATTATCH
354 if (!validator.isNullOrUndefined(result.onAttach) &&
355 !validator.isCallback(result.onAttach)) {
356 ThrowMsg(Commons::ConversionException, "Not a valid callback.");
359 result.onDetach= JSUtils::getJSPropertyOrUndefined(
360 m_context, object, NFC_CHANGED_CALLBACK_ONDETACH
362 if (!validator.isNullOrUndefined(result.onDetach) &&
363 !validator.isCallback(result.onDetach)) {
364 ThrowMsg(Commons::ConversionException, "Not a valid callback.");