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 <dpl/singleton_impl.h>
21 #include <Commons/Exception.h>
22 #include <JSTizenException.h>
24 #include "NFCDefaultAdapter.h"
29 IMPLEMENT_SINGLETON(DeviceAPI::NFC::NFCDefaultAdapter)
36 static void TagDetectedCallback(nfc_discovered_type_e type, nfc_tag_h tag, void *data) {
37 LogDebug("Callback TagDetectedCallback.");
40 if (NFC_DISCOVERED_TYPE_ATTACHED == type) {
41 (static_cast<NFCDefaultAdapter*>(data))->NFCTagHasDetected((void *)tag);
43 (static_cast<NFCDefaultAdapter*>(data))->NFCTagHasDetected(NULL);
46 LogError("Callback private data is NULL.");
51 static void TargetDetectedCallback(nfc_discovered_type_e type, nfc_p2p_target_h target, void *data) {
52 LogDebug("Callback TargetDetectedCallback.");
55 if (NFC_DISCOVERED_TYPE_ATTACHED == type) {
56 (static_cast<NFCDefaultAdapter*>(data))->NFCTargetHasDetected((void *)target);
58 (static_cast<NFCDefaultAdapter*>(data))->NFCTargetHasDetected(NULL);
61 LogError("Callback private data is NULL.");
65 static void NFCInitializeCompletedCallback(nfc_error_e result, void *user_data) {
66 LogDebug("Callback NFCInitializeCompletedCallback. result : " << (int)result);
67 if (user_data && (result == NFC_ERROR_NONE))
68 (static_cast<NFCDefaultAdapter*>(user_data))->getCurrentNFC();
70 static void NFCSetActivationCompletedCallback(nfc_error_e error, void *user_data) {
71 LogDebug("Callback NFCSetActivationCompletedCallback.");
72 NFCDefaultAdapterSingleton::Instance().setPoweredManualAnswer(error);
74 static void NFCSetCardEmulationCompletedCallback(nfc_error_e error, void *user_data) {
75 LogDebug("Callback NFCSetActivationCompletedCallback.");
76 NFCDefaultAdapterSingleton::Instance().setCardEmulationManualAnswer(error, user_data);
78 static void NFCSetSEEventCallback(nfc_se_event_e event, void *user_data) {
79 LogDebug("Callback NFCSetSEEventCallback.");
80 if (event == NFC_SE_EVENT_SE_TYPE_CHANGED)
81 NFCDefaultAdapterSingleton::Instance().seChanged();
85 NFCDefaultAdapter::NFCDefaultAdapter()
86 :m_initialized(false) {
87 LogDebug("NFC Enter");
89 m_NFCTagListeners.clear();
90 m_NFCTargetListeners.clear();
91 m_NFCChangedSETypes.clear();
92 m_poweredAdapter = NULL;
93 m_seType = NFC_SE_INVALID;
96 NFCDefaultAdapter::~NFCDefaultAdapter() {
101 bool NFCDefaultAdapter::isSupported() {
102 return nfc_manager_is_supported();
105 void NFCDefaultAdapter::deinitialze() {
109 m_NFCTagListeners.clear();
110 m_NFCTargetListeners.clear();
111 m_poweredAdapter = NULL;
113 nfc_manager_unset_tag_discovered_cb();
114 nfc_manager_unset_p2p_target_discovered_cb();
116 if(m_initialized == true)
118 result = nfc_manager_deinitialize ();
119 if (result !=NFC_ERROR_NONE) {
120 LogInfo("failed to deinitialize nfc");
123 m_initialized = false;
125 LogDebug("destroy nfc");
128 int NFCDefaultAdapter::setTagListener(NFCAdapter * adapter) {
129 LogDebug(" NFCDefaultAdapter::setTagListener Entered");
132 m_NFCTagListeners.push_back(adapter);
134 if (!m_initialized) {
135 if (initialize() != NFC_ERROR_NONE) {
136 m_NFCTagListeners.clear();
137 ThrowMsg(PlatformException, "Could not initialize NFC.");
140 nfc_tag_h currentTag;
141 if (nfc_manager_get_connected_tag(¤tTag) == NFC_ERROR_NONE)
142 adapter->NFCTagHasDetected((void *)currentTag);
145 if (m_NFCTagListeners.size() > 1)
148 result = nfc_manager_set_tag_discovered_cb (TagDetectedCallback, this);
151 if (result != NFC_ERROR_NONE) {
152 m_NFCTagListeners.pop_back();
153 util.throwNFCException(result, "failed to set callback of nfc_manager_set_tag_discovered_cb");
156 LogInfo("NFCDefaultAdapter::setTagListener : result << " << result);
160 int NFCDefaultAdapter::setPeerListener(NFCAdapter *adapter) {
161 LogDebug(" NFCDefaultAdapter::setPeerListener Entered");
164 m_NFCTargetListeners.push_back(adapter);
166 if (!m_initialized) {
167 if (initialize() != NFC_ERROR_NONE) {
168 m_NFCTargetListeners.clear();
169 ThrowMsg(PlatformException, "Could not initialize NFC.");
172 nfc_p2p_target_h currentTarget;
173 if (nfc_manager_get_connected_target(¤tTarget) == NFC_ERROR_NONE)
174 adapter->NFCTargetHasDetected((void *)currentTarget);
177 if (m_NFCTargetListeners.size() > 1)
180 result = nfc_manager_set_p2p_target_discovered_cb (TargetDetectedCallback, this);
183 if (result != NFC_ERROR_NONE) {
184 m_NFCTargetListeners.pop_back();
185 Util.throwNFCException(result, "failed to set callback of nfc_manager_set_p2p_target_discovered_cb");
188 LogInfo("NFCDefaultAdapter::setPeerListener : result << " << result);
192 void NFCDefaultAdapter::unsetTagListener(NFCAdapter * adapter) {
193 LogDebug(" NFCDefaultAdapter::unsetTagListener Entered");
195 if (!m_initialized) {
196 if (initialize() != NFC_ERROR_NONE) {
197 ThrowMsg(PlatformException, "Could not initialize NFC.");
201 std::vector<NFCAdapter *>::iterator it;
202 for (it = m_NFCTagListeners.begin(); it != m_NFCTagListeners.end(); ++it) {
203 if (*it == adapter) {
204 m_NFCTagListeners.erase(it);
205 LogDebug("emitter is removed. (" << m_NFCTagListeners.size() << ")");
210 if (m_NFCTagListeners.empty())
211 nfc_manager_unset_tag_discovered_cb ();
214 void NFCDefaultAdapter::unsetPeerListener(NFCAdapter * adapter) {
215 LogDebug(" NFCDefaultAdapter::unsetPeerListener Entered");
217 if (!m_initialized) {
218 if (initialize() != NFC_ERROR_NONE) {
219 ThrowMsg(PlatformException, "Could not initialize NFC.");
223 std::vector<NFCAdapter *>::iterator it;
224 for (it = m_NFCTargetListeners.begin(); it != m_NFCTargetListeners.end(); ++it) {
225 if (*it == adapter) {
226 m_NFCTargetListeners.erase(it);
227 LogDebug("emitter is removed. (" << m_NFCTargetListeners.size() << ")");
232 if (m_NFCTargetListeners.empty())
233 nfc_manager_unset_p2p_target_discovered_cb();
237 void NFCDefaultAdapter::NFCTagHasDetected(void *props)
239 LogDebug("NFCDefaultAdapter::NFCTagHasDetected Enter type");
241 std::vector<NFCAdapter *>::iterator it;
242 for (it = m_NFCTagListeners.begin(); it != m_NFCTagListeners.end(); ++it) {
243 (*it)->NFCTagHasDetected(props);
247 void NFCDefaultAdapter::NFCTargetHasDetected(void *props)
249 std::vector<NFCAdapter *>::iterator it;
250 for (it = m_NFCTargetListeners.begin(); it != m_NFCTargetListeners.end(); ++it) {
251 (*it)->NFCTargetHasDetected(props);
255 void NFCDefaultAdapter::getCurrentNFC() {
258 if (!m_initialized) {
259 LogError("No Initialized");
263 if (!m_NFCTagListeners.empty()) {
264 nfc_tag_h currentTag;
265 if (nfc_manager_get_connected_tag(¤tTag) == NFC_ERROR_NONE) {
266 NFCTagHasDetected((void *)currentTag);
271 if (!m_NFCTargetListeners.empty()) {
272 nfc_p2p_target_h currentTarget;
273 if (nfc_manager_get_connected_target(¤tTarget) == NFC_ERROR_NONE) {
274 NFCTargetHasDetected((void *)currentTarget);
279 int NFCDefaultAdapter::initialize() {
280 LogDebug("NFCDefaultAdapter::initialize Entered");
282 //nfc_manager_deinitialize();
283 result = nfc_manager_initialize(NFCInitializeCompletedCallback, this);
284 if (result != NFC_ERROR_NONE) {
285 LogError("Could not initialize NFC.");
286 m_initialized = false;
288 m_initialized = true;
289 nfc_manager_set_tag_filter(NFC_TAG_FILTER_ALL_ENABLE);
294 void *NFCDefaultAdapter::getCachedMessage() {
296 nfc_ndef_message_h messageHandle = NULL;
297 int result = nfc_manager_get_cached_message(&messageHandle);
298 if ((result == NFC_ERROR_INVALID_NDEF_MESSAGE) || (result == NFC_ERROR_NO_NDEF_MESSAGE)) {
300 nfc_ndef_message_destroy(messageHandle);
306 if (result != NFC_ERROR_NONE) {
308 nfc_ndef_message_destroy(messageHandle);
310 util.throwNFCException(result, "Can't get cached message");
312 return (void *)(messageHandle);
315 bool NFCDefaultAdapter::getPowerState() {
316 return nfc_manager_is_activated();
319 void NFCDefaultAdapter::setPowered(const bool state, NFCAdapter * poweredAdapter) {
322 if (m_poweredAdapter != NULL) {
323 ThrowMsg(PlatformException, "Progressing Identical Operation");
325 } else if (getPowerState() == state) {
326 poweredAdapter->setPoweredManualAnswer(NFC_ERROR_NONE);
330 int result = NFC_ERROR_NONE;
332 result = initialize();
334 if (result == NFC_ERROR_NONE) {
335 m_poweredAdapter = poweredAdapter;
336 result = nfc_manager_set_activation(state, NFCSetActivationCompletedCallback, NULL);
339 if (result != NFC_ERROR_NONE) {
340 poweredAdapter->setPoweredManualAnswer(result);
341 m_poweredAdapter = NULL;
343 } catch (const WrtDeviceApis::Commons::Exception& ex) {
344 LogError("Exception: " << ex.GetMessage());
345 poweredAdapter->setPoweredManualAnswer(NFC_ERROR_OPERATION_FAILED);
346 m_poweredAdapter = NULL;
350 void NFCDefaultAdapter::setPoweredManualAnswer(int error) {
351 if (m_poweredAdapter != NULL) {
352 m_poweredAdapter->setPoweredManualAnswer(error);
353 m_poweredAdapter = NULL;
357 EventNFCSEType NFCDefaultAdapter::getSEType() {
359 nfc_se_type_e type = NFC_SE_TYPE_DISABLE;
360 if (nfc_manager_get_card_emulation_se_type(&type) == NFC_ERROR_NONE) {
362 if (util.convertTonfcSEType(type) != NFC_SE_INVALID)
363 return util.convertTonfcSEType(type);
365 ThrowMsg(PlatformException, "Wrong SE Type or operation to get SE Type is failed");
368 void NFCDefaultAdapter::setCardEmulation(const EventNFCSEType seType, NFCAdapter * adapter) {
371 if (getSEType() == seType) {
372 adapter->setCardEmulationManualAnswer(NFC_ERROR_NONE);
377 nfc_se_type_e nfcSeType = NFC_SE_TYPE_DISABLE;
378 if (seType == NFC_SE_NONE)
379 nfcSeType = NFC_SE_TYPE_DISABLE;
380 else if (seType == NFC_SE_ESE)
381 nfcSeType = NFC_SE_TYPE_ESE;
382 else if (seType == NFC_SE_UICC)
383 nfcSeType = NFC_SE_TYPE_UICC;
385 ThrowMsg(PlatformException, "Wrong SE TYPE");
387 int result = NFC_ERROR_NONE;
389 result = initialize();
391 if (result == NFC_ERROR_NONE) {
392 result = nfc_manager_set_card_emulation_se_type(nfcSeType, NFCSetCardEmulationCompletedCallback, (void *)adapter);
395 if (result != NFC_ERROR_NONE)
396 adapter->setCardEmulationManualAnswer(result);
397 } catch (const WrtDeviceApis::Commons::Exception& ex) {
398 LogError("Exception: " << ex.GetMessage());
399 adapter->setCardEmulationManualAnswer(NFC_ERROR_OPERATION_FAILED);
403 void NFCDefaultAdapter::setCardEmulationManualAnswer(int error, void *adapter) {
404 if (adapter != NULL) {
405 ((NFCAdapter *)adapter)->setCardEmulationManualAnswer(error);
406 if (error == NFC_ERROR_NONE)
411 void NFCDefaultAdapter::setCardEmulationChangeListener(NFCAdapter *adapter) {
415 m_NFCChangedSETypes.push_back(adapter);
417 if (!m_initialized) {
418 if (initialize() != NFC_ERROR_NONE) {
419 m_NFCChangedSETypes.clear();
420 ThrowMsg(PlatformException, "Could not initialize NFC.");
423 if (m_NFCChangedSETypes.size() > 1)
426 m_seType = getSEType();
427 result = nfc_manager_set_se_event_cb(NFCSetSEEventCallback, this);
430 if (result != NFC_ERROR_NONE) {
431 m_NFCTargetListeners.pop_back();
432 util.throwNFCException(result, "failed to set callback of nfc_manager_set_p2p_target_discovered_cb");
435 LogInfo("NFCDefaultAdapter::setPeerListener : result << " << result);
438 void NFCDefaultAdapter::unsetCardEmulationChangeListener(NFCAdapter * adapter) {
441 if (!m_initialized) {
442 if (initialize() != NFC_ERROR_NONE) {
443 ThrowMsg(PlatformException, "Could not initialize NFC.");
447 std::vector<NFCAdapter *>::iterator it;
448 for (it = m_NFCChangedSETypes.begin(); it != m_NFCChangedSETypes.end(); ++it) {
449 if (*it == adapter) {
450 m_NFCChangedSETypes.erase(it);
451 LogDebug("emitter is removed. (" << m_NFCChangedSETypes.size() << ")");
456 if (m_NFCChangedSETypes.empty()) {
457 nfc_manager_unset_se_event_cb();
458 m_seType = NFC_SE_INVALID;
462 void NFCDefaultAdapter::seChanged() {
463 if (m_seType != NFC_SE_INVALID) {
464 if (m_seType != getSEType()) {
465 m_seType = getSEType();
466 std::vector<NFCAdapter *>::iterator it;
467 for (it = m_NFCChangedSETypes.begin(); it != m_NFCChangedSETypes.end(); ++it) {
468 (*it)->seChanged(m_seType);