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