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 "JSNdefMessage.h"
20 #include "JSNFCManager.h"
21 #include "NFCConverter.h"
22 #include "ResponseDispatcher.h"
23 #include <dpl/log/log.h>
25 #include <CommonsJavaScript/Validator.h>
26 #include <Commons/Exception.h>
27 #include <CommonsJavaScript/PrivateObject.h>
28 #include <CommonsJavaScript/JSUtils.h>
29 #include <CommonsJavaScript/JSCallbackManager.h>
30 #include <CommonsJavaScript/Utils.h>
31 #include <Tizen/Common/JSTizenExceptionFactory.h>
32 #include <Tizen/Common/JSTizenException.h>
33 #include <Tizen/Common/SecurityExceptions.h>
34 #include <API/NFC/NFCFactory.h>
35 #include <API/NFC/EventTagAction.h>
37 #include "plugin_config.h"
40 using namespace TizenApis::Api::NFC;
41 using namespace TizenApis::Commons;
42 using namespace WrtDeviceApis::Commons;
43 using namespace WrtDeviceApis::CommonsJavaScript;
46 #define TIZEN10_NFCTAG_ATTRIBUTENAME "NFCTag"
48 #define TIZEN10_NFCTAG_TYPE "type"
49 #define TIZEN10_NFCTAG_ISSUPPORTEDNDEF "isSupportedNDEF"
50 #define TIZEN10_NFCTAG_NDEFSIZE "ndefSize"
51 #define TIZEN10_NFCTAG_PROPERTIES "properties"
52 #define TIZEN10_NFCTAG_ISCONNECTED "isConnected"
57 JSClassDefinition JSNFCTag::m_classInfo =
60 kJSClassAttributeNone,
61 TIZEN10_NFCTAG_ATTRIBUTENAME,
70 NULL, //DeleteProperty,
71 NULL, //GetPropertyNames,
72 NULL, //CallAsFunction,
73 NULL, //CallAsConstructor,
78 JSStaticValue JSNFCTag::m_property[] =
81 { TIZEN10_NFCTAG_TYPE, getProperty,
82 NULL, kJSPropertyAttributeReadOnly},
83 { TIZEN10_NFCTAG_ISSUPPORTEDNDEF, getProperty,
84 NULL, kJSPropertyAttributeReadOnly},
85 { TIZEN10_NFCTAG_NDEFSIZE, getProperty,
86 NULL, kJSPropertyAttributeReadOnly},
87 { TIZEN10_NFCTAG_PROPERTIES, getProperty,
88 NULL, kJSPropertyAttributeReadOnly},
89 { TIZEN10_NFCTAG_ISCONNECTED, getProperty,
90 NULL, kJSPropertyAttributeReadOnly},
94 JSStaticFunction JSNFCTag::m_function[] = {
95 {"readNDEF", JSNFCTag::readNDEF, kJSPropertyAttributeNone},
96 {"writeNDEF", JSNFCTag::writeNDEF, kJSPropertyAttributeNone},
97 {"transceive", JSNFCTag::transceive, kJSPropertyAttributeNone},
98 {"formatNDEF", JSNFCTag::formatNDEF, kJSPropertyAttributeNone},
102 JSClassRef JSNFCTag::m_jsClassRef = JSClassCreate(JSNFCTag::getClassInfo());
104 JSObjectRef JSNFCTag::createJSObject(JSContextRef context, void *tagHandle, void* privManager) {
107 INFCTagPtr NFCTag = NFCFactory::getInstance().createNFCTagObject(tagHandle);
108 NFCTag->setPrivateNFCManagerPtr(privManager);
110 NFCTagPrivObject *priv = new NFCTagPrivObject(context, NFCTag);
113 ThrowMsg(NullPointerException, "Can not new a NFCTag object");
116 return JSObjectMake(context, getClassRef(), priv);
119 void JSNFCTag::initialize(JSContextRef context, JSObjectRef object)
123 void JSNFCTag::finalize(JSObjectRef object)
125 LogDebug( "entered" );
126 NFCTagPrivObject *priv = static_cast<NFCTagPrivObject*>( JSObjectGetPrivate( object ) ) ;
127 JSObjectSetPrivate(object, NULL);
128 LogDebug("Deleting timezone object");
133 const JSClassRef JSNFCTag::getClassRef()
136 m_jsClassRef = JSClassCreate(&m_classInfo);
141 const JSClassDefinition* JSNFCTag::getClassInfo()
146 JSValueRef JSNFCTag::getProperty(JSContextRef context, JSObjectRef object,
147 JSStringRef propertyName, JSValueRef* exception)
152 NFCTagPrivObject* privateObject = static_cast<NFCTagPrivObject*>(JSObjectGetPrivate(object));
153 if (!privateObject) {
154 LogError("Private object is not set.");
155 ThrowMsg(NullPointerException, "Private object not initialized");
158 INFCTagPtr NFCTag(privateObject->getObject());
159 NFCConverter convert(context);
161 LogDebug("propertyName : " << convert.toString(propertyName));
162 if (JSStringIsEqualToUTF8CString(propertyName, TIZEN10_NFCTAG_TYPE)) {
163 return convert.toJSValueRef(convert.toNfcTagTypeString(NFCTag->getTagType()));
164 } else if (JSStringIsEqualToUTF8CString(propertyName, TIZEN10_NFCTAG_ISSUPPORTEDNDEF)) {
165 return convert.toJSValueRef(NFCTag->isNDEFSupport());
166 } else if (JSStringIsEqualToUTF8CString(propertyName, TIZEN10_NFCTAG_NDEFSIZE)) {
167 return convert.toJSValueRefLong(NFCTag->getNdefSize());
168 } else if (JSStringIsEqualToUTF8CString(propertyName, TIZEN10_NFCTAG_PROPERTIES)) {
169 LogDebug("get Properties");
170 return convert.toJSValueRef(NFCTag->getProperties());
171 } else if (JSStringIsEqualToUTF8CString(propertyName, TIZEN10_NFCTAG_ISCONNECTED)) {
172 NFCManagerPrivObject* privateNFCManager = static_cast<NFCManagerPrivObject*>(NFCTag->getPrivateNFCManagerPtr());
173 if (!privateNFCManager) {
174 LogError("NFC Manager Private object is not set.");
175 ThrowMsg(NullPointerException, "Private object not initialized");
177 INFCManagerPtr NFCManager(privateNFCManager->getObject());
178 return convert.toJSValueRef(NFCManager->isValidHandle(NFCTag->getHandle()));
180 } Catch (ConversionException) {
181 LogError("ConversionException: " << _rethrown_exception.GetMessage());
182 } Catch (WrtDeviceApis::Commons::Exception) {
183 LogError("Exception: " << _rethrown_exception.GetMessage());
185 return JSValueMakeUndefined(context);
188 JSValueRef JSNFCTag::readNDEF(JSContextRef context,
190 JSObjectRef thisObject,
191 size_t argumentCount,
192 const JSValueRef arguments[],
193 JSValueRef* exception)
195 LogDebug("Entered ");
197 NFCTagPrivObject* privateObject = static_cast<NFCTagPrivObject*>(JSObjectGetPrivate(thisObject));
198 if (NULL == privateObject) {
199 LogError("private object is null");
200 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Unknown Error");
203 AceSecurityStatus status = NFC_CHECK_ACCESS(privateObject->getContext(),NFC_FUNCTION_API_TAG_FUNCS);
204 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
206 Validator validator(context, exception);
208 if (argumentCount < 1) {
209 LogError("JSNFCTag::readNDEF TypeMismatchException");
210 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Type Mismatch");
212 if (JSValueIsNull(context, arguments[0]) || JSValueIsUndefined(context, arguments[0]) || !validator.isCallback(arguments[0])) {
213 /* 1st argument is mandatory. And 1st argument must be Callback. */
214 LogError("JSNFCTag::readNDEF TypeMismatchException!");
215 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Type Mismatch");
217 if ((argumentCount > 1) && !JSValueIsNull(context, arguments[1])) {
218 if (JSValueIsUndefined(context, arguments[1]) || !validator.isCallback(arguments[1])) {
219 /* 2nd argument must be Callback. */
220 LogError("JSNFCTag::readNDEF TypeMismatchException!");
221 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Type Mismatch");
225 JSValueRef onSuccessForCbm = NULL, onErrorForCbm = NULL;
226 if (validator.isCallback(arguments[0])) {
227 onSuccessForCbm = arguments[0];
229 if (argumentCount > 1) {
230 if (validator.isCallback(arguments[1])) {
231 onErrorForCbm = arguments[1];
235 INFCTagPtr NFCTag(privateObject->getObject());
236 JSCallbackManagerPtr callbackManager = JSCallbackManager::createObject(privateObject->getContext(), onSuccessForCbm, onErrorForCbm, true, true);
238 EventTagActionReadPtr event(new EventTagActionRead());
239 event->setPrivateData( StaticPointerCast<IEventPrivateData>(callbackManager) );
240 event->setForAsynchronousCall(&NFCResponseDispatcher::getInstance());
242 NFCTag->readNdef(event);
244 return JSValueMakeNull(context);
245 } Catch (ConversionException) {
246 LogError("JSNFCManager::readNDEF : ConversionException");
247 callbackManager->callOnError(JSTizenExceptionFactory::makeErrorObject(context, JSTizenException::INVALID_VALUES_ERROR,"Invalid Parameter"));
248 } Catch (InvalidArgumentException) {
249 LogError("JSNFCManager::readNDEF InvalidArgumentException");
250 callbackManager->callOnError(JSTizenExceptionFactory::makeErrorObject(context, JSTizenException::INVALID_VALUES_ERROR,"Invalid Parameter"));
251 } Catch (WrtDeviceApis::Commons::Exception) {
252 LogError("Exception: " << _rethrown_exception.GetMessage());
253 callbackManager->callOnError(JSTizenExceptionFactory::makeErrorObject(context, JSTizenException::UNKNOWN_ERROR,"Unknown Error"));
256 return JSValueMakeNull(context);
259 JSValueRef JSNFCTag::writeNDEF(JSContextRef context,
261 JSObjectRef thisObject,
262 size_t argumentCount,
263 const JSValueRef arguments[],
264 JSValueRef* exception)
266 LogDebug("Entered ");
268 NFCTagPrivObject* privateObject = static_cast<NFCTagPrivObject*>(JSObjectGetPrivate(thisObject));
269 if (NULL == privateObject) {
270 LogError("private object is null");
271 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Unknown Error");
274 AceSecurityStatus status = NFC_CHECK_ACCESS(privateObject->getContext(),NFC_FUNCTION_API_TAG_FUNCS);
275 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
277 NFCConverter convert(context);
278 Validator validator(context, exception);
280 if (argumentCount < 2 ) {
281 LogError("JSNFCTag::writeNdef TypeMismatchException");
282 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Type Mismatch");
284 if (JSValueIsNull(context, arguments[1]) || JSValueIsUndefined(context, arguments[1]) || !validator.isCallback(arguments[1])) {
285 /* 1st argument is mandatory. And 1st argument must be Callback. */
286 LogError("JSNFCTag::writeNdef TypeMismatchException!");
287 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Type Mismatch");
289 if ((argumentCount > 2) && (!JSValueIsNull(context, arguments[2]) && (JSValueIsUndefined(context, arguments[2]) || !validator.isCallback(arguments[2])))) {
290 /* 2nd argument must be Callback. */
291 LogError("JSNFCTag::writeNdef TypeMismatchException!");
292 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Type Mismatch");
295 JSValueRef onSuccessForCbm = NULL, onErrorForCbm = NULL;
296 if (validator.isCallback(arguments[1])) {
297 onSuccessForCbm = arguments[1];
300 if ((argumentCount > 2) && (validator.isCallback(arguments[2]))) {
301 onErrorForCbm = arguments[2];
304 void *messageHandle = convert.getMessageHandle(arguments[0]);
306 INFCTagPtr NFCTag(privateObject->getObject());
307 JSCallbackManagerPtr callbackManager = JSCallbackManager::createObject(privateObject->getContext(), onSuccessForCbm, onErrorForCbm, true, true);
309 EventTagActionWritePtr event(new EventTagActionWrite());
310 event->writeNdef(messageHandle);
311 event->setPrivateData( StaticPointerCast<IEventPrivateData>(callbackManager) );
312 event->setForAsynchronousCall(&NFCResponseDispatcher::getInstance());
313 NFCTag->writeNdef(event);
315 return JSValueMakeNull(context);
316 } Catch (ConversionException) {
317 LogError("JSNFCManager::writeNDEF : ConversionException");
318 callbackManager->callOnError(JSTizenExceptionFactory::makeErrorObject(context, JSTizenException::INVALID_VALUES_ERROR,"Invalid Parameter"));
319 } Catch (InvalidArgumentException) {
320 LogError("JSNFCManager::writeNDEF InvalidArgumentException");
321 callbackManager->callOnError(JSTizenExceptionFactory::makeErrorObject(context, JSTizenException::INVALID_VALUES_ERROR,"Invalid Parameter"));
322 } Catch (WrtDeviceApis::Commons::Exception) {
323 LogError("Exception: " << _rethrown_exception.GetMessage());
324 callbackManager->callOnError(JSTizenExceptionFactory::makeErrorObject(context, JSTizenException::UNKNOWN_ERROR,"Unknown Error"));
327 return JSValueMakeNull(context);
330 JSValueRef JSNFCTag::transceive(JSContextRef context,
332 JSObjectRef thisObject,
333 size_t argumentCount,
334 const JSValueRef arguments[],
335 JSValueRef* exception)
337 LogDebug("Entered ");
339 NFCTagPrivObject* privateObject = static_cast<NFCTagPrivObject*>(JSObjectGetPrivate(thisObject));
340 if (NULL == privateObject) {
341 LogError("private object is null");
342 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Unknown Error");
345 AceSecurityStatus status = NFC_CHECK_ACCESS(privateObject->getContext(),NFC_FUNCTION_API_TAG_FUNCS);
346 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
348 NFCConverter convert(context);
349 Validator validator(context, exception);
351 if (argumentCount < 2 ) {
352 LogError("JSNFCTag::transceive TypeMismatchException");
353 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Type Mismatch");
356 if (JSValueIsNull(context, arguments[0]) || JSValueIsUndefined(context, arguments[0]) || !JSIsArrayValue(context, arguments[0])) {
357 /* 2nd argument must be Callback. */
358 LogError("JSNFCTag::transceive TypeMismatchException!");
359 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Type Mismatch");
362 if (JSValueIsNull(context, arguments[1]) || JSValueIsUndefined(context, arguments[1]) || !validator.isCallback(arguments[1])) {
363 /* 1st argument is mandatory. And 1st argument must be Callback. */
364 LogError("JSNFCTag::transceive TypeMismatchException!");
365 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Type Mismatch");
367 if ((argumentCount > 2) && (!JSValueIsNull(context, arguments[2]) && (JSValueIsUndefined(context, arguments[2]) || !validator.isCallback(arguments[2])))) {
368 /* 2nd argument must be Callback. */
369 LogError("JSNFCTag::transceive TypeMismatchException!");
370 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Type Mismatch");
373 std::vector<unsigned char> data = convert.toVectorOfUChars(arguments[0]);
375 JSValueRef onSuccessForCbm = NULL, onErrorForCbm = NULL;
376 if (validator.isCallback(arguments[1])) {
377 onSuccessForCbm = arguments[1];
380 if ((argumentCount > 2) && (validator.isCallback(arguments[2]))) {
381 onErrorForCbm = arguments[2];
384 INFCTagPtr NFCTag(privateObject->getObject());
385 JSCallbackManagerPtr callbackManager = JSCallbackManager::createObject(privateObject->getContext(), onSuccessForCbm, onErrorForCbm, true, true);
387 EventTagActionTransceivePtr event(new EventTagActionTransceive());
388 event->transceive(data);
389 event->setPrivateData( StaticPointerCast<IEventPrivateData>(callbackManager) );
390 event->setForAsynchronousCall(&NFCResponseDispatcher::getInstance());
391 NFCTag->transceive(event);
393 return JSValueMakeNull(context);
394 } Catch (ConversionException) {
395 LogError("JSNFCManager::transceive : ConversionException");
396 callbackManager->callOnError(JSTizenExceptionFactory::makeErrorObject(context, JSTizenException::INVALID_VALUES_ERROR,"Invalid Parameter"));
397 } Catch (InvalidArgumentException) {
398 LogError("JSNFCManager::transceive InvalidArgumentException");
399 callbackManager->callOnError(JSTizenExceptionFactory::makeErrorObject(context, JSTizenException::INVALID_VALUES_ERROR,"Invalid Parameter"));
400 } Catch (WrtDeviceApis::Commons::Exception) {
401 LogError("Exception: " << _rethrown_exception.GetMessage());
402 callbackManager->callOnError(JSTizenExceptionFactory::makeErrorObject(context, JSTizenException::UNKNOWN_ERROR,"Unknown Error"));
405 return JSValueMakeNull(context);
408 JSValueRef JSNFCTag::formatNDEF(JSContextRef context,
410 JSObjectRef thisObject,
411 size_t argumentCount,
412 const JSValueRef arguments[],
413 JSValueRef* exception)
415 LogDebug("Entered ");
417 NFCTagPrivObject* privateObject = static_cast<NFCTagPrivObject*>(JSObjectGetPrivate(thisObject));
418 if (NULL == privateObject) {
419 LogError("private object is null");
420 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::UNKNOWN_ERROR, "Unknown Error");
423 AceSecurityStatus status = NFC_CHECK_ACCESS(privateObject->getContext(),NFC_FUNCTION_API_TAG_FUNCS);
424 TIZEN_SYNC_ACCESS_HANDLER(status, context, exception);
426 NFCConverter convert(context);
427 Validator validator(context, exception);
429 if (argumentCount < 1) {
430 LogError("JSNFCTag::formatNDEF TypeMismatchException");
431 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Type Mismatch");
433 if (JSValueIsNull(context, arguments[0]) || JSValueIsUndefined(context, arguments[0]) || !validator.isCallback(arguments[0])) {
434 /* 1st argument is mandatory. And 1st argument must be Callback. */
435 LogError("JSNFCTag::formatNDEF TypeMismatchException!");
436 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Type Mismatch");
438 if ((argumentCount > 1) && !JSValueIsNull(context, arguments[1]) && (JSValueIsUndefined(context, arguments[1]) || !validator.isCallback(arguments[1]))) {
439 /* 2nd argument must be Callback. */
440 LogError("JSNFCTag::formatNDEF TypeMismatchException!");
441 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Type Mismatch");
444 JSValueRef onSuccessForCbm = NULL, onErrorForCbm = NULL;
445 if (validator.isCallback(arguments[0])) {
446 onSuccessForCbm = arguments[0];
449 if ((argumentCount > 1) && (validator.isCallback(arguments[1]))) {
450 onErrorForCbm = arguments[1];
453 std::vector<unsigned char> key;
454 if ((argumentCount > 2) && !JSValueIsNull(context, arguments[2])){
455 if (JSValueIsUndefined(context, arguments[2]) || !JSIsArrayValue(context, arguments[2])) {
456 /* 2nd argument must be Callback. */
457 LogError("JSNFCTag::formatNDEF TypeMismatchException!");
458 return JSTizenExceptionFactory::postException(context, exception, JSTizenException::TYPE_MISMATCH_ERROR, "Type Mismatch");
460 key = convert.toVectorOfUChars(arguments[2]);
463 INFCTagPtr NFCTag(privateObject->getObject());
464 JSCallbackManagerPtr callbackManager = JSCallbackManager::createObject(privateObject->getContext(), onSuccessForCbm, onErrorForCbm, true, true);
466 EventTagActionFormatPtr event(new EventTagActionFormat());
468 event->setPrivateData( StaticPointerCast<IEventPrivateData>(callbackManager) );
469 event->setForAsynchronousCall(&NFCResponseDispatcher::getInstance());
470 NFCTag->format(event);
472 return JSValueMakeNull(context);
473 } Catch (ConversionException) {
474 LogError("JSNFCManager::formatNDEF : ConversionException");
475 callbackManager->callOnError(JSTizenExceptionFactory::makeErrorObject(context, JSTizenException::INVALID_VALUES_ERROR,"Invalid Parameter"));
476 } Catch (InvalidArgumentException) {
477 LogError("JSNFCManager::formatNDEF InvalidArgumentException");
478 callbackManager->callOnError(JSTizenExceptionFactory::makeErrorObject(context, JSTizenException::INVALID_VALUES_ERROR,"Invalid Parameter"));
479 } Catch (WrtDeviceApis::Commons::Exception) {
480 LogError("Exception: " << _rethrown_exception.GetMessage());
481 callbackManager->callOnError(JSTizenExceptionFactory::makeErrorObject(context, JSTizenException::UNKNOWN_ERROR,"Unknown Error"));
484 return JSValueMakeNull(context);