Update change log and spec for wrt-plugins-tizen_0.4.65
[platform/framework/web/wrt-plugins-tizen.git] / src / NFC / NFCAdapter.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 #include <dpl/scoped_ptr.h>
19 #include <Commons/Exception.h>
20 #include <nfc.h>
21 #include <JSWebAPIErrorFactory.h>
22 #include "NFCDefaultAdapter.h"
23 #include "NFCAdapter.h"
24 #include "NFCUtil.h"
25 #include <Logger.h>
26
27
28 namespace DeviceAPI {
29 namespace NFC {
30
31 NFCAdapter::NFCAdapter() {
32         LoggerD("NFCAdapter");
33         if (!NFCDefaultAdapterSingleton::Instance().isSupported())
34                 ThrowMsg(UnsupportedException, "Not Support");
35
36         m_NFCTagEmitterPtr.Reset();
37         m_NFCTargetEmitterPtr.Reset();
38         m_tagFilter.Reset();
39         m_EventNFCChangedSetPoweredPtr.Reset();
40 }
41
42 NFCAdapter::~NFCAdapter() {
43         LoggerD("Enter");
44         unsetTagListener();
45         unsetPeerListener();
46         m_EventNFCChangedSetPoweredPtr.Reset();
47 }
48
49 int NFCAdapter::setTagListener(const EventNFCChangedEmitterPtr& emitter, const TagFilterPtr& filter) {
50         LoggerD(" NFCAdapter::setTagListener Entered");
51         if (!getPowerState())
52                 ThrowMsg(PlatformException, "NFC is OFF.");
53         if (m_NFCTagEmitterPtr.Get() != NULL)
54                 ThrowMsg(PlatformException, "It has already set Tag Listener");
55
56         m_NFCTagEmitterPtr = emitter;
57         m_tagFilter = filter;
58
59         return NFCDefaultAdapterSingleton::Instance().setTagListener(this);
60 }
61
62 int NFCAdapter::setPeerListener(const EventNFCChangedEmitterPtr& emitter) {
63         LoggerD(" NFCAdapter::setPeerListener Entered");
64         if (!getPowerState())
65                 ThrowMsg(PlatformException, "NFC is OFF.");
66         if (m_NFCTargetEmitterPtr.Get() != NULL)
67                 ThrowMsg(PlatformException, "It has already set Peer Listener");
68
69         m_NFCTargetEmitterPtr = emitter;
70         return NFCDefaultAdapterSingleton::Instance().setPeerListener(this);
71 }
72 void NFCAdapter::unsetTagListener() {
73         LoggerD(" NFCAdapter::unsetTagListener Entered");
74         if (!getPowerState())
75                 ThrowMsg(PlatformException, "NFC is OFF.");
76         m_NFCTagEmitterPtr.Reset();
77         m_tagFilter.Reset();
78         NFCDefaultAdapterSingleton::Instance().unsetTagListener(this);
79 }
80
81 void NFCAdapter::unsetPeerListener() {
82         LoggerD(" NFCAdapter::unsetPeerListener Entered");
83         if (!getPowerState())
84                 ThrowMsg(PlatformException, "NFC is OFF.");
85         m_NFCTargetEmitterPtr.Reset();
86         NFCDefaultAdapterSingleton::Instance().unsetPeerListener(this);
87 }
88
89 void NFCAdapter::NFCTagHasDetected(void *props)
90 {
91         if (m_NFCTagEmitterPtr.Get() != NULL) {
92                 if ((props != NULL) && (m_tagFilter->getFilterSize() > 0)) {
93                         nfc_tag_type_e tagType = NFC_UNKNOWN_TARGET;
94
95                         if (nfc_tag_get_type((nfc_tag_h)props, &tagType) == NFC_ERROR_NONE) {
96                                 LoggerD("NFCAdapter::NFCTagHasDetected Tag real type : " << tagType);
97                                 int cnt;
98                                 for (cnt = 0; cnt < m_tagFilter->getFilterSize(); cnt++) {
99                                         NFCUtil util;
100                                         if (util.convertTonfcTagType(static_cast<unsigned short>(tagType)) == m_tagFilter->getFilterValue(cnt))
101                                                 break;
102                                 }
103                                 if (cnt == m_tagFilter->getFilterSize()) {
104                                         LoggerD("Filter doesn't have this tag type ");
105                                         return;
106                                 }
107                         } else {
108                                 LoggerD("It can't get real nfc tag type");
109                                 int cnt;
110                                 for (cnt = 0; cnt < m_tagFilter->getFilterSize(); cnt++) {
111                                         if (NFC_TAGTYPE_GENERIC_PICC == m_tagFilter->getFilterValue(cnt))
112                                                 break;
113                                 }
114
115                                 if (cnt == m_tagFilter->getFilterSize()) {
116                                         LoggerD("Filter doesn't have this tag type ");
117                                         return;
118                                 }
119
120                         }
121                 }
122                 EventNFCChangedPtr event(new EventNFCChanged());
123                 if (props == NULL)
124                         event->setNFCStatus(NFC_DETATCHED);
125                 else
126                         event->setNFCStatus(NFC_ATTATCHED);
127
128                 event->setNFCProperties(props);
129                 event->setNFCType(NFC_TAG_TYPE);
130                 LoggerD("emit event with nfc tag info");
131                 m_NFCTagEmitterPtr->emit(event);
132         }
133 }
134
135 void NFCAdapter::NFCTargetHasDetected(void *props)
136 {
137         if (m_NFCTargetEmitterPtr.Get() != NULL) {
138                 EventNFCChangedPtr event(new EventNFCChanged());
139                 if (props == NULL)
140                         event->setNFCStatus(NFC_DETATCHED);
141                 else
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);
147         }
148 }
149
150 void *NFCAdapter::getCachedMessage() {
151         return NFCDefaultAdapterSingleton::Instance().getCachedMessage();
152 }
153
154 bool NFCAdapter::getPowerState() {
155         return NFCDefaultAdapterSingleton::Instance().getPowerState();
156 }
157
158 void NFCAdapter::setPowered(const EventNFCChangedSetPoweredPtr& event) {
159         LoggerD("Enter");
160         EventRequestReceiver<EventNFCChangedSetPowered>::PostRequest(event);
161 }
162
163 void NFCAdapter::OnRequestReceived(const EventNFCChangedSetPoweredPtr& event) {
164         if (getPowerState() == event->getState()) {
165                 event->setResult(true);
166                 return;
167         }
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");
172                 return;
173         }
174
175         event->switchToManualAnswer();
176         m_EventNFCChangedSetPoweredPtr = event;
177         Try {
178                 NFCDefaultAdapterSingleton::Instance().setPowered(event->getState(), this);
179                 return;
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);
189         }
190 }
191
192 void NFCAdapter::setPoweredManualAnswer(int error) {
193         if (m_EventNFCChangedSetPoweredPtr.Get() != NULL) {
194                 EventNFCChangedSetPoweredPtr event = m_EventNFCChangedSetPoweredPtr;
195                 m_EventNFCChangedSetPoweredPtr.Reset();
196
197                 if (error == NFC_ERROR_NONE) {
198                         event->setResult(true);
199                 } else {
200                         NFCUtil util;
201                         event->setResult(false);
202                         event->setError(util.getNFCErrorString(error));
203                         event->setErrorMessage(util.getNFCErrorMessage(error));
204                 }
205                 EventRequestReceiver<EventNFCChangedSetPowered>::ManualAnswer(event);
206         }
207 }
208
209 }
210 }