2 // Tizen Web Device API
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
19 #include <dpl/log/log.h>
20 #include <dpl/shared_ptr.h>
22 #include <JavaScriptCore/JavaScript.h>
23 #include <CommonsJavaScript/PrivateObject.h>
24 #include <CommonsJavaScript/JSCallbackManager.h>
25 #include <CommonsJavaScript/ScopedJSStringRef.h>
26 #include <Commons/IEvent.h>
27 #include <JSTizenExceptionFactory.h>
28 #include <JSTizenException.h>
30 #include "NFCStaticController.h"
31 #include "EventNFCChangedPrivateData.h"
33 #include "JSNFCTarget.h"
34 #include "JSNdefMessage.h"
35 #include "NFCConverter.h"
36 #include "NFCAsyncCallbackManager.h"
38 using namespace DeviceAPI::Common;
39 using namespace WrtDeviceApis::CommonsJavaScript;
40 using namespace WrtDeviceApis::Commons;
45 NFCStaticController& NFCStaticController::getInstance() {
46 static NFCStaticController controller;
50 NFCStaticController::NFCStaticController() :
51 EventNFCChangedListener(ThreadEnum::NULL_THREAD),
52 setPoweredAnswerReceiver(ThreadEnum::NULL_THREAD),
53 setCardEmulationAnswerReceiver(ThreadEnum::NULL_THREAD),
54 EventNFCChangedCardEmulationListener(ThreadEnum::NULL_THREAD) {
57 void NFCStaticController::onAnswerReceived(const EventNFCChangedPtr& event) {
58 LogDebug("onAnswerReceived Enter");
60 EventNFCChangedPrivateDataPtr privateData =
61 DPL::DynamicPointerCast<EventNFCChangedPrivateData>(event->getPrivateData());
63 void *nfcProp = event->getNFCProperties();
67 *When received answer from platform, create an NFCTag JSObject and then call success function.
69 if (nfcProp != NULL) {
71 JSCallbackManagerPtr callbackManager = privateData->getCallbackManager();
72 JSContextRef context = callbackManager->getContext();
74 if (event->getNFCType() == NFC_TAG_TYPE)
75 nfcObj = JSNFCTag::createJSObject(context, nfcProp);
77 nfcObj = JSNFCTarget::createJSObject(context, nfcProp);
78 LogDebug("callOnSuccess");
79 callbackManager->callOnSuccess(static_cast<JSValueRef>(nfcObj));
81 JSCallbackManagerPtr detachedCallbackManager = privateData->getDetachedCallbackManager();
83 detachedCallbackManager->callOnSuccess();
85 } Catch (ConversionException) {
86 LogError("Conversion exception while processing EventNFCChanged");
87 } Catch (PlatformException) {
88 LogError("PlatformException:Platform can't create NFCTag" << _rethrown_exception.GetMessage());
89 } Catch (UnknownException) {
90 LogError("UnknownException:Platform can't create NFCTag" << _rethrown_exception.GetMessage());
91 } Catch (NullPointerException) {
92 LogError("NullPointer exception while processing EventNFCChanged");
97 void NFCStaticController::OnAnswerReceived(const EventNFCChangedSetPoweredPtr &event)
99 JSCallbackManagerPtr cbm =
100 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
104 LogDebug("no callback manager");
107 NFCAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(cbm);
108 if (event->getResult()) {
109 LogDebug("result success");
110 cbm->callOnSuccess();
113 LogDebug("result fail");
114 std::string error = event->getError();
115 std::string errorMessage = event->getErrorMessage();
116 JSValueRef errorObject;
118 if (errorMessage != "")
119 errorObject = JSTizenExceptionFactory::makeErrorObject(cbm->getContext(), error, errorMessage);
121 errorObject = JSTizenExceptionFactory::makeErrorObject(cbm->getContext(), error, error);
123 errorObject = JSTizenExceptionFactory::makeErrorObject(cbm->getContext(), JSTizenException::UNKNOWN_ERROR,"Unknown Error");
124 cbm->callOnError(errorObject);
125 } Catch (PlatformException) {
126 LogError("PlatformException" << _rethrown_exception.GetMessage());
127 JSValueRef errorObject = JSTizenExceptionFactory::makeErrorObject(cbm->getContext(), JSTizenException::SERVICE_NOT_AVAILABLE,"Service Not Available");
128 cbm->callOnError(errorObject);
129 } Catch (UnknownException) {
130 LogError("UnknownException" << _rethrown_exception.GetMessage());
131 JSValueRef errorObject = JSTizenExceptionFactory::makeErrorObject(cbm->getContext(), JSTizenException::UNKNOWN_ERROR,"Unknown Error");
132 cbm->callOnError(errorObject);
133 } Catch (Exception) {
134 LogError("Exception: " << _rethrown_exception.GetMessage());
135 JSValueRef errorObject = JSTizenExceptionFactory::makeErrorObject(cbm->getContext(), JSTizenException::UNKNOWN_ERROR,"Unknown Error");
136 cbm->callOnError(errorObject);
140 void NFCStaticController::OnAnswerReceived(const EventNFCSetCardEmulationPtr &event)
142 JSCallbackManagerPtr cbm =
143 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
147 LogDebug("no callback manager");
150 NFCAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(cbm);
151 if (event->getResult()) {
152 LogDebug("result success");
153 cbm->callOnSuccess();
156 LogDebug("result fail");
157 std::string error = event->getError();
158 std::string errorMessage = event->getErrorMessage();
159 JSValueRef errorObject;
161 if (errorMessage != "")
162 errorObject = JSTizenExceptionFactory::makeErrorObject(cbm->getContext(), error, errorMessage);
164 errorObject = JSTizenExceptionFactory::makeErrorObject(cbm->getContext(), error, error);
166 errorObject = JSTizenExceptionFactory::makeErrorObject(cbm->getContext(), JSTizenException::UNKNOWN_ERROR,"Unknown Error");
167 cbm->callOnError(errorObject);
168 } Catch (PlatformException) {
169 LogError("PlatformException" << _rethrown_exception.GetMessage());
170 JSValueRef errorObject = JSTizenExceptionFactory::makeErrorObject(cbm->getContext(), JSTizenException::SERVICE_NOT_AVAILABLE,"Service Not Available");
171 cbm->callOnError(errorObject);
172 } Catch (UnknownException) {
173 LogError("UnknownException" << _rethrown_exception.GetMessage());
174 JSValueRef errorObject = JSTizenExceptionFactory::makeErrorObject(cbm->getContext(), JSTizenException::UNKNOWN_ERROR,"Unknown Error");
175 cbm->callOnError(errorObject);
176 } Catch (Exception) {
177 LogError("Exception: " << _rethrown_exception.GetMessage());
178 JSValueRef errorObject = JSTizenExceptionFactory::makeErrorObject(cbm->getContext(), JSTizenException::UNKNOWN_ERROR,"Unknown Error");
179 cbm->callOnError(errorObject);
183 void NFCStaticController::onAnswerReceived(const EventNFCChangedCardEmulationPtr& event) {
187 JSCallbackManagerPtr cbm =
188 DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
189 EventNFCSEType seType = event->getSEType();
191 if (seType != NFC_SE_INVALID) {
192 JSContextRef context = cbm->getContext();
193 LogDebug("callOnSuccess");
194 NFCConverter converter(context);
195 cbm->callOnSuccess(converter.toJSValueRefSEType(seType));
197 } Catch (ConversionException) {
198 LogError("Conversion exception while processing EventNFCChanged");
199 } Catch (PlatformException) {
200 LogError("PlatformException:Platform can't create NFCTag" << _rethrown_exception.GetMessage());
201 } Catch (UnknownException) {
202 LogError("UnknownException:Platform can't create NFCTag" << _rethrown_exception.GetMessage());
203 } Catch (NullPointerException) {
204 LogError("NullPointer exception while processing EventNFCChanged");