1659725704a94be82355f9b557acd4f9622a51f8
[framework/web/wrt-plugins-tizen.git] / src / NFC / NFCStaticController.cpp
1 //
2 // Tizen Web Device API
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 //
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
8 //
9 // http://www.apache.org/licenses/LICENSE-2.0
10 //
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.
16 //
17
18
19 #include <dpl/log/log.h>
20 #include <dpl/shared_ptr.h>
21
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>
29
30 #include "NFCStaticController.h"
31 #include "EventNFCChangedPrivateData.h"
32 #include "JSNFCTag.h"
33 #include "JSNFCTarget.h"
34 #include "JSNdefMessage.h"
35 #include "NFCConverter.h"
36 #include "NFCAsyncCallbackManager.h"
37
38 using namespace DeviceAPI::Common;
39 using namespace WrtDeviceApis::CommonsJavaScript;
40 using namespace WrtDeviceApis::Commons;
41
42 namespace DeviceAPI {
43 namespace NFC {
44
45 NFCStaticController& NFCStaticController::getInstance() {
46         static NFCStaticController controller;
47         return controller;
48 }
49
50 NFCStaticController::NFCStaticController() :
51         EventNFCChangedListener(ThreadEnum::NULL_THREAD), 
52         setPoweredAnswerReceiver(ThreadEnum::NULL_THREAD),
53         setCardEmulationAnswerReceiver(ThreadEnum::NULL_THREAD),
54         EventNFCChangedCardEmulationListener(ThreadEnum::NULL_THREAD) {
55 }
56
57 void NFCStaticController::onAnswerReceived(const EventNFCChangedPtr& event) {
58         LogDebug("onAnswerReceived Enter");
59
60         EventNFCChangedPrivateDataPtr privateData =
61         DPL::DynamicPointerCast<EventNFCChangedPrivateData>(event->getPrivateData());
62
63         void *nfcProp = event->getNFCProperties();
64
65         Try {
66                 /**
67                 *When received answer from platform, create an NFCTag JSObject and then call success function.
68                 */
69                 if (nfcProp != NULL) {
70                         JSObjectRef nfcObj;
71                         JSCallbackManagerPtr callbackManager = privateData->getCallbackManager();
72                         JSContextRef context = callbackManager->getContext();
73                         
74                         if (event->getNFCType() == NFC_TAG_TYPE)
75                                 nfcObj = JSNFCTag::createJSObject(context, nfcProp);
76                         else
77                                 nfcObj = JSNFCTarget::createJSObject(context, nfcProp);
78                         LogDebug("callOnSuccess");
79                         callbackManager->callOnSuccess(static_cast<JSValueRef>(nfcObj));
80                 } else {
81                         JSCallbackManagerPtr detachedCallbackManager = privateData->getDetachedCallbackManager();
82
83                         detachedCallbackManager->callOnSuccess();
84                 }
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");
93         }
94
95 }
96
97 void NFCStaticController::OnAnswerReceived(const EventNFCChangedSetPoweredPtr &event)
98 {
99         JSCallbackManagerPtr cbm =
100             DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
101
102         Try {
103                 if (!cbm) {
104                         LogDebug("no callback manager");
105                         return;
106                 }
107                 NFCAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(cbm);
108                 if (event->getResult()) {
109                         LogDebug("result success");
110                         cbm->callOnSuccess();
111                         return;
112                 }
113                 LogDebug("result fail");
114                 std::string error = event->getError();
115                 std::string errorMessage = event->getErrorMessage();
116                 JSValueRef errorObject;
117                 if (error != "") {
118                         if (errorMessage != "")
119                                 errorObject = JSTizenExceptionFactory::makeErrorObject(cbm->getContext(), error, errorMessage);
120                         else
121                                 errorObject = JSTizenExceptionFactory::makeErrorObject(cbm->getContext(), error, error);
122                 } else
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);  
137         }
138 }
139
140 void NFCStaticController::OnAnswerReceived(const EventNFCSetCardEmulationPtr &event)
141 {
142         JSCallbackManagerPtr cbm =
143             DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
144
145         Try {
146                 if (!cbm) {
147                         LogDebug("no callback manager");
148                         return;
149                 }
150                 NFCAsyncCallbackManagerSingleton::Instance().unregisterCallbackManager(cbm);
151                 if (event->getResult()) {
152                         LogDebug("result success");
153                         cbm->callOnSuccess();
154                         return;
155                 }
156                 LogDebug("result fail");
157                 std::string error = event->getError();
158                 std::string errorMessage = event->getErrorMessage();
159                 JSValueRef errorObject;
160                 if (error != "") {
161                         if (errorMessage != "")
162                                 errorObject = JSTizenExceptionFactory::makeErrorObject(cbm->getContext(), error, errorMessage);
163                         else
164                                 errorObject = JSTizenExceptionFactory::makeErrorObject(cbm->getContext(), error, error);
165                 } else
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);  
180         }
181 }
182
183 void NFCStaticController::onAnswerReceived(const EventNFCChangedCardEmulationPtr& event) {
184         LogDebug("Enter");
185
186         Try {
187                 JSCallbackManagerPtr cbm =
188                     DPL::StaticPointerCast<JSCallbackManager>(event->getPrivateData());
189                 EventNFCSEType seType = event->getSEType();
190
191                 if (seType != NFC_SE_INVALID) {
192                         JSContextRef context = cbm->getContext();
193                         LogDebug("callOnSuccess");
194                         NFCConverter converter(context);
195                         cbm->callOnSuccess(converter.toJSValueRefSEType(seType));
196                 }
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");
205         }
206
207 }
208
209 } // NFC
210 } // DeviceAPI