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.
18 #include <dpl/log/log.h>
19 #include <dpl/scoped_ptr.h>
20 #include <Commons/Exception.h>
21 #include <JSTizenException.h>
23 #include "NFCDefaultAdapter.h"
24 #include "NFCAdapter.h"
31 NFCAdapter::NFCAdapter() {
32 LogDebug("NFCAdapter");
33 if (!NFCDefaultAdapterSingleton::Instance().isSupported())
34 ThrowMsg(UnsupportedException, "Not Support");
36 m_NFCTagEmitterPtr.Reset();
37 m_NFCTargetEmitterPtr.Reset();
39 m_EventNFCChangedSetPoweredPtr.Reset();
40 m_eventNFCSetCardEmulationPtr.Reset();
41 m_NFCChangedCardEmulations.Reset();
44 NFCAdapter::~NFCAdapter() {
48 m_EventNFCChangedSetPoweredPtr.Reset();
49 m_eventNFCSetCardEmulationPtr.Reset();
50 unsetCardEmulationChangeListener();
53 int NFCAdapter::setTagListener(const EventNFCChangedEmitterPtr& emitter, const TagFilterPtr& filter) {
54 LogDebug(" NFCAdapter::setTagListener Entered");
55 if (m_NFCTagEmitterPtr.Get() != NULL)
56 ThrowMsg(PlatformException, "It has already set Tag Listener");
58 m_NFCTagEmitterPtr = emitter;
61 return NFCDefaultAdapterSingleton::Instance().setTagListener(this);
64 int NFCAdapter::setPeerListener(const EventNFCChangedEmitterPtr& emitter) {
65 LogDebug(" NFCAdapter::setPeerListener Entered");
67 if (m_NFCTargetEmitterPtr.Get() != NULL)
68 ThrowMsg(PlatformException, "It has already set Peer Listener");
70 m_NFCTargetEmitterPtr = emitter;
71 return NFCDefaultAdapterSingleton::Instance().setPeerListener(this);
73 void NFCAdapter::unsetTagListener() {
74 LogDebug(" NFCAdapter::unsetTagListener Entered");
75 m_NFCTagEmitterPtr.Reset();
77 NFCDefaultAdapterSingleton::Instance().unsetTagListener(this);
80 void NFCAdapter::unsetPeerListener() {
81 LogDebug(" NFCAdapter::unsetPeerListener Entered");
82 m_NFCTargetEmitterPtr.Reset();
83 NFCDefaultAdapterSingleton::Instance().unsetPeerListener(this);
86 void NFCAdapter::NFCTagHasDetected(void *props)
88 if (m_NFCTagEmitterPtr.Get() != NULL) {
89 if ((props != NULL) && (m_tagFilter->getFilterSize() > 0)) {
90 nfc_tag_type_e tagType;
92 if (nfc_tag_get_type((nfc_tag_h)props, &tagType) == NFC_ERROR_NONE) {
93 LogDebug("NFCAdapter::NFCTagHasDetected Tag real type : " << tagType);
95 for (cnt = 0; cnt < m_tagFilter->getFilterSize(); cnt++) {
97 if (util.convertTonfcTagType(static_cast<unsigned short>(tagType)) == m_tagFilter->getFilterValue(cnt))
100 if (cnt == m_tagFilter->getFilterSize()) {
101 LogDebug("Filter doesn't have this tag type ");
105 LogDebug("It can't get real nfc tag type");
107 for (cnt = 0; cnt < m_tagFilter->getFilterSize(); cnt++) {
108 if (NFC_TAGTYPE_GENERIC_PICC == m_tagFilter->getFilterValue(cnt))
112 if (cnt == m_tagFilter->getFilterSize()) {
113 LogDebug("Filter doesn't have this tag type ");
119 EventNFCChangedPtr event(new EventNFCChanged());
121 event->setNFCStatus(NFC_DETATCHED);
123 event->setNFCStatus(NFC_ATTATCHED);
125 event->setNFCProperties(props);
126 event->setNFCType(NFC_TAG_TYPE);
127 LogDebug("emit event with nfc tag info");
128 m_NFCTagEmitterPtr->emit(event);
132 void NFCAdapter::NFCTargetHasDetected(void *props)
134 if (m_NFCTargetEmitterPtr.Get() != NULL) {
135 EventNFCChangedPtr event(new EventNFCChanged());
137 event->setNFCStatus(NFC_DETATCHED);
139 event->setNFCStatus(NFC_ATTATCHED);
140 event->setNFCProperties(props);
141 event->setNFCType(NFC_TARGET_TYPE);
142 LogDebug("emit event with nfc target info");
143 m_NFCTargetEmitterPtr->emit(event);
147 void *NFCAdapter::getCachedMessage() {
148 return NFCDefaultAdapterSingleton::Instance().getCachedMessage();
151 bool NFCAdapter::getPowerState() {
152 return NFCDefaultAdapterSingleton::Instance().getPowerState();
155 void NFCAdapter::setPowered(const EventNFCChangedSetPoweredPtr& event) {
157 EventRequestReceiver<EventNFCChangedSetPowered>::PostRequest(event);
160 void NFCAdapter::OnRequestReceived(const EventNFCChangedSetPoweredPtr& event) {
161 if (getPowerState() == event->getState()) {
162 event->setResult(true);
165 if (m_EventNFCChangedSetPoweredPtr.Get() !=NULL) {
166 event->setResult(false);
167 event->setError(DeviceAPI::Common::JSTizenException::SERVICE_NOT_AVAILABLE);
168 event->setErrorMessage("Progressing Identical Operation");
172 event->switchToManualAnswer();
173 m_EventNFCChangedSetPoweredPtr = event;
175 NFCDefaultAdapterSingleton::Instance().setPowered(event->getState(), this);
177 } Catch(PlatformException) {
178 LogError("Exception: " << _rethrown_exception.GetMessage());
179 event->setResult(false);
180 event->setError(DeviceAPI::Common::JSTizenException::SERVICE_NOT_AVAILABLE);
181 event->setErrorMessage("Progressing Identical Operation");
182 EventRequestReceiver<EventNFCChangedSetPowered>::ManualAnswer(event);
183 } Catch(WrtDeviceApis::Commons::Exception) {
184 LogError("Exception: " << _rethrown_exception.GetMessage());
185 setPoweredManualAnswer(NFC_ERROR_OPERATION_FAILED);
189 void NFCAdapter::setPoweredManualAnswer(int error) {
190 if (m_EventNFCChangedSetPoweredPtr.Get() != NULL) {
191 if (error == NFC_ERROR_NONE) {
192 m_EventNFCChangedSetPoweredPtr->setResult(true);
195 m_EventNFCChangedSetPoweredPtr->setResult(false);
196 m_EventNFCChangedSetPoweredPtr->setError(util.getNFCErrorString(error));
197 m_EventNFCChangedSetPoweredPtr->setErrorMessage(util.getNFCErrorMessage(error));
199 EventRequestReceiver<EventNFCChangedSetPowered>::ManualAnswer(m_EventNFCChangedSetPoweredPtr);
200 m_EventNFCChangedSetPoweredPtr.Reset();
204 EventNFCSEType NFCAdapter::getSEType() {
205 return NFCDefaultAdapterSingleton::Instance().getSEType();
208 void NFCAdapter::setCardEmulation(const EventNFCSetCardEmulationPtr& event) {
210 EventRequestReceiver<EventNFCSetCardEmulation>::PostRequest(event);
213 void NFCAdapter::OnRequestReceived(const EventNFCSetCardEmulationPtr& event) {
214 if (getSEType() == event->getSEType()) {
215 event->setResult(true);
218 if (m_eventNFCSetCardEmulationPtr.Get() !=NULL) {
219 event->setResult(false);
220 event->setError(DeviceAPI::Common::JSTizenException::SERVICE_NOT_AVAILABLE);
221 event->setErrorMessage("Progressing Identical Operation");
225 event->switchToManualAnswer();
226 m_eventNFCSetCardEmulationPtr = event;
228 NFCDefaultAdapterSingleton::Instance().setCardEmulation(event->getSEType(), this);
230 } Catch(PlatformException) {
231 LogError("Exception: " << _rethrown_exception.GetMessage());
232 event->setResult(false);
233 event->setError(DeviceAPI::Common::JSTizenException::SERVICE_NOT_AVAILABLE);
234 event->setErrorMessage("Progressing Identical Operation");
235 EventRequestReceiver<EventNFCSetCardEmulation>::ManualAnswer(event);
236 } Catch(WrtDeviceApis::Commons::Exception) {
237 LogError("Exception: " << _rethrown_exception.GetMessage());
238 setCardEmulationManualAnswer(NFC_ERROR_OPERATION_FAILED);
242 void NFCAdapter::setCardEmulationManualAnswer(int error) {
243 if (m_eventNFCSetCardEmulationPtr.Get() != NULL) {
244 if (error == NFC_ERROR_NONE) {
245 m_eventNFCSetCardEmulationPtr->setResult(true);
248 m_eventNFCSetCardEmulationPtr->setResult(false);
249 if (error == NFC_ERROR_INVALID_PARAMETER) {
250 m_eventNFCSetCardEmulationPtr->setError(DeviceAPI::Common::JSTizenException::NOT_FOUND_ERROR);
251 m_eventNFCSetCardEmulationPtr->setErrorMessage("Not Found Error");
253 m_eventNFCSetCardEmulationPtr->setError(util.getNFCErrorString(error));
254 m_eventNFCSetCardEmulationPtr->setErrorMessage(util.getNFCErrorMessage(error));
257 EventRequestReceiver<EventNFCSetCardEmulation>::ManualAnswer(m_eventNFCSetCardEmulationPtr);
258 m_eventNFCSetCardEmulationPtr.Reset();
262 void NFCAdapter::setCardEmulationChangeListener(const EventNFCChangedCardEmulationEmitterPtr& emitter) {
265 if (m_NFCChangedCardEmulations.Get() != NULL)
266 ThrowMsg(PlatformException, "It has already set Card Emulation Change Listener");
268 m_NFCChangedCardEmulations = emitter;
270 NFCDefaultAdapterSingleton::Instance().setCardEmulationChangeListener(this);
273 void NFCAdapter::seChanged(EventNFCSEType seType) {
274 if (m_NFCChangedCardEmulations.Get() != NULL) {
275 EventNFCChangedCardEmulationPtr event(new EventNFCChangedCardEmulation());
276 event->setSEType(seType);
277 LogDebug("emit event with seChanged(type:" << seType << ")");
278 m_NFCChangedCardEmulations->emit(event);
281 void NFCAdapter::unsetCardEmulationChangeListener() {
282 m_NFCChangedCardEmulations.Reset();
283 NFCDefaultAdapterSingleton::Instance().unsetCardEmulationChangeListener(this);