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/scoped_ptr.h>
19 #include <Commons/Exception.h>
21 #include <JSWebAPIErrorFactory.h>
22 #include "NFCDefaultAdapter.h"
23 #include "NFCAdapter.h"
31 NFCAdapter::NFCAdapter() {
32 LoggerD("NFCAdapter");
33 if (!NFCDefaultAdapterSingleton::Instance().isSupported())
34 ThrowMsg(UnsupportedException, "Not Support");
36 m_NFCTagEmitterPtr.Reset();
37 m_NFCTargetEmitterPtr.Reset();
39 m_EventNFCChangedSetPoweredPtr.Reset();
42 NFCAdapter::~NFCAdapter() {
46 m_EventNFCChangedSetPoweredPtr.Reset();
49 int NFCAdapter::setTagListener(const EventNFCChangedEmitterPtr& emitter, const TagFilterPtr& filter) {
50 LoggerD(" NFCAdapter::setTagListener Entered");
52 ThrowMsg(PlatformException, "NFC is OFF.");
53 if (m_NFCTagEmitterPtr.Get() != NULL)
54 ThrowMsg(PlatformException, "It has already set Tag Listener");
56 m_NFCTagEmitterPtr = emitter;
59 return NFCDefaultAdapterSingleton::Instance().setTagListener(this);
62 int NFCAdapter::setPeerListener(const EventNFCChangedEmitterPtr& emitter) {
63 LoggerD(" NFCAdapter::setPeerListener Entered");
65 ThrowMsg(PlatformException, "NFC is OFF.");
66 if (m_NFCTargetEmitterPtr.Get() != NULL)
67 ThrowMsg(PlatformException, "It has already set Peer Listener");
69 m_NFCTargetEmitterPtr = emitter;
70 return NFCDefaultAdapterSingleton::Instance().setPeerListener(this);
72 void NFCAdapter::unsetTagListener() {
73 LoggerD(" NFCAdapter::unsetTagListener Entered");
75 ThrowMsg(PlatformException, "NFC is OFF.");
76 m_NFCTagEmitterPtr.Reset();
78 NFCDefaultAdapterSingleton::Instance().unsetTagListener(this);
81 void NFCAdapter::unsetPeerListener() {
82 LoggerD(" NFCAdapter::unsetPeerListener Entered");
84 ThrowMsg(PlatformException, "NFC is OFF.");
85 m_NFCTargetEmitterPtr.Reset();
86 NFCDefaultAdapterSingleton::Instance().unsetPeerListener(this);
89 void NFCAdapter::NFCTagHasDetected(void *props)
91 if (m_NFCTagEmitterPtr.Get() != NULL) {
92 if ((props != NULL) && (m_tagFilter->getFilterSize() > 0)) {
93 nfc_tag_type_e tagType = NFC_UNKNOWN_TARGET;
95 if (nfc_tag_get_type((nfc_tag_h)props, &tagType) == NFC_ERROR_NONE) {
96 LoggerD("NFCAdapter::NFCTagHasDetected Tag real type : " << tagType);
98 for (cnt = 0; cnt < m_tagFilter->getFilterSize(); cnt++) {
100 if (util.convertTonfcTagType(static_cast<unsigned short>(tagType)) == m_tagFilter->getFilterValue(cnt))
103 if (cnt == m_tagFilter->getFilterSize()) {
104 LoggerD("Filter doesn't have this tag type ");
108 LoggerD("It can't get real nfc tag type");
110 for (cnt = 0; cnt < m_tagFilter->getFilterSize(); cnt++) {
111 if (NFC_TAGTYPE_GENERIC_PICC == m_tagFilter->getFilterValue(cnt))
115 if (cnt == m_tagFilter->getFilterSize()) {
116 LoggerD("Filter doesn't have this tag type ");
122 EventNFCChangedPtr event(new EventNFCChanged());
124 event->setNFCStatus(NFC_DETATCHED);
126 event->setNFCStatus(NFC_ATTATCHED);
128 event->setNFCProperties(props);
129 event->setNFCType(NFC_TAG_TYPE);
130 LoggerD("emit event with nfc tag info");
131 m_NFCTagEmitterPtr->emit(event);
135 void NFCAdapter::NFCTargetHasDetected(void *props)
137 if (m_NFCTargetEmitterPtr.Get() != NULL) {
138 EventNFCChangedPtr event(new EventNFCChanged());
140 event->setNFCStatus(NFC_DETATCHED);
142 event->setNFCStatus(NFC_ATTATCHED);
143 event->setNFCProperties(props);
144 event->setNFCType(NFC_TARGET_TYPE);
145 LoggerD("emit event with nfc target info");
146 m_NFCTargetEmitterPtr->emit(event);
150 void *NFCAdapter::getCachedMessage() {
151 return NFCDefaultAdapterSingleton::Instance().getCachedMessage();
154 bool NFCAdapter::getPowerState() {
155 return NFCDefaultAdapterSingleton::Instance().getPowerState();
158 void NFCAdapter::setPowered(const EventNFCChangedSetPoweredPtr& event) {
160 EventRequestReceiver<EventNFCChangedSetPowered>::PostRequest(event);
163 void NFCAdapter::OnRequestReceived(const EventNFCChangedSetPoweredPtr& event) {
164 if (getPowerState() == event->getState()) {
165 event->setResult(true);
168 if (m_EventNFCChangedSetPoweredPtr.Get() !=NULL) {
169 event->setResult(false);
170 event->setError(DeviceAPI::Common::JSWebAPIErrorFactory::SERVICE_NOT_AVAILABLE_ERROR);
171 event->setErrorMessage("Progressing Identical Operation");
175 event->switchToManualAnswer();
176 m_EventNFCChangedSetPoweredPtr = event;
178 NFCDefaultAdapterSingleton::Instance().setPowered(event->getState(), this);
180 } Catch(PlatformException) {
181 LoggerE("Exception: " << _rethrown_exception.GetMessage());
182 event->setResult(false);
183 event->setError(DeviceAPI::Common::JSWebAPIErrorFactory::SERVICE_NOT_AVAILABLE_ERROR);
184 event->setErrorMessage("Progressing Identical Operation");
185 EventRequestReceiver<EventNFCChangedSetPowered>::ManualAnswer(event);
186 } Catch(WrtDeviceApis::Commons::Exception) {
187 LoggerE("Exception: " << _rethrown_exception.GetMessage());
188 setPoweredManualAnswer(NFC_ERROR_OPERATION_FAILED);
192 void NFCAdapter::setPoweredManualAnswer(int error) {
193 if (m_EventNFCChangedSetPoweredPtr.Get() != NULL) {
194 EventNFCChangedSetPoweredPtr event = m_EventNFCChangedSetPoweredPtr;
195 m_EventNFCChangedSetPoweredPtr.Reset();
197 if (error == NFC_ERROR_NONE) {
198 event->setResult(true);
201 event->setResult(false);
202 event->setError(util.getNFCErrorString(error));
203 event->setErrorMessage(util.getNFCErrorMessage(error));
205 EventRequestReceiver<EventNFCChangedSetPowered>::ManualAnswer(event);