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/singleton.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 LoggerD("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 LoggerE("Callback private data is NULL.");
51 static void TargetDetectedCallback(nfc_discovered_type_e type, nfc_p2p_target_h target, void *data) {
52 LoggerD("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 LoggerE("Callback private data is NULL.");
65 static void NFCInitializeCompletedCallback(nfc_error_e result, void *user_data) {
66 LoggerD("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 LoggerD("Callback NFCSetActivationCompletedCallback.");
72 NFCDefaultAdapterSingleton::Instance().setPoweredManualAnswer(error);
77 NFCDefaultAdapter::NFCDefaultAdapter()
78 :m_initialized(false) {
81 m_NFCTagListeners.clear();
82 m_NFCTargetListeners.clear();
83 m_poweredAdapter = NULL;
86 NFCDefaultAdapter::~NFCDefaultAdapter() {
91 void NFCDefaultAdapter::setExclusiveMode(bool mode) {
93 LoggerD("initilized:" << m_initialized);
96 if (nfc_manager_initialize_sync() != NFC_ERROR_NONE) {
97 ThrowMsg(UnknownException, "Could not initialize NFC.");
101 if (initialize() != NFC_ERROR_NONE) {
102 m_NFCTagListeners.clear();
103 ThrowMsg(PlatformException, "Could not initialize NFC.");
105 m_initialized = true;
108 bool bEnabled = !mode;
109 LoggerD("system handeler enable?" << bEnabled);
110 // If exclusive mode is true, system handler has to be disabled.
111 if (nfc_manager_set_system_handler_enable(bEnabled) != NFC_ERROR_NONE)
112 ThrowMsg(UnknownException, "Failed to set exclusive mode.");
116 bool NFCDefaultAdapter::isSupported() {
117 return nfc_manager_is_supported();
120 void NFCDefaultAdapter::deinitialze() {
124 m_NFCTagListeners.clear();
125 m_NFCTargetListeners.clear();
126 m_poweredAdapter = NULL;
128 nfc_manager_unset_tag_discovered_cb();
129 nfc_manager_unset_p2p_target_discovered_cb();
131 unsetExclusiveMode();
133 if(m_initialized == true)
135 result = nfc_manager_deinitialize ();
136 if (result !=NFC_ERROR_NONE) {
137 LoggerI("failed to deinitialize nfc");
140 m_initialized = false;
142 LoggerD("destroy nfc");
145 void NFCDefaultAdapter::unsetExclusiveMode() {
148 if (nfc_manager_set_system_handler_enable(true) != NFC_ERROR_NONE)
149 LoggerD("failed to unset exclusive mode");
152 int NFCDefaultAdapter::setTagListener(NFCAdapter * adapter) {
153 LoggerD(" NFCDefaultAdapter::setTagListener Entered");
156 m_NFCTagListeners.push_back(adapter);
158 if (!m_initialized) {
159 if (initialize() != NFC_ERROR_NONE) {
160 m_NFCTagListeners.clear();
161 ThrowMsg(PlatformException, "Could not initialize NFC.");
163 nfc_manager_set_tag_filter(NFC_TAG_FILTER_ALL_ENABLE);
165 nfc_tag_h currentTag;
166 if (nfc_manager_get_connected_tag(¤tTag) == NFC_ERROR_NONE)
167 adapter->NFCTagHasDetected((void *)currentTag);
170 if (m_NFCTagListeners.size() > 1)
173 result = nfc_manager_set_tag_discovered_cb (TagDetectedCallback, this);
176 if (result != NFC_ERROR_NONE) {
177 m_NFCTagListeners.pop_back();
178 util.throwNFCException(result, "failed to set callback of nfc_manager_set_tag_discovered_cb");
181 LoggerI("NFCDefaultAdapter::setTagListener : result << " << result);
185 int NFCDefaultAdapter::setPeerListener(NFCAdapter *adapter) {
186 LoggerD(" NFCDefaultAdapter::setPeerListener Entered");
189 m_NFCTargetListeners.push_back(adapter);
191 if (!m_initialized) {
192 if (initialize() != NFC_ERROR_NONE) {
193 m_NFCTargetListeners.clear();
194 ThrowMsg(PlatformException, "Could not initialize NFC.");
197 nfc_p2p_target_h currentTarget;
198 if (nfc_manager_get_connected_target(¤tTarget) == NFC_ERROR_NONE)
199 adapter->NFCTargetHasDetected((void *)currentTarget);
202 if (m_NFCTargetListeners.size() > 1)
205 result = nfc_manager_set_p2p_target_discovered_cb (TargetDetectedCallback, this);
208 if (result != NFC_ERROR_NONE) {
209 m_NFCTargetListeners.pop_back();
210 Util.throwNFCException(result, "failed to set callback of nfc_manager_set_p2p_target_discovered_cb");
213 LoggerI("NFCDefaultAdapter::setPeerListener : result << " << result);
217 void NFCDefaultAdapter::unsetTagListener(NFCAdapter * adapter) {
218 LoggerD(" NFCDefaultAdapter::unsetTagListener Entered");
220 if (!m_initialized) {
221 m_NFCTagListeners.clear();
225 std::vector<NFCAdapter *>::iterator it;
226 for (it = m_NFCTagListeners.begin(); it != m_NFCTagListeners.end(); ++it) {
227 if (*it == adapter) {
228 m_NFCTagListeners.erase(it);
229 LoggerD("emitter is removed. (" << m_NFCTagListeners.size() << ")");
234 if (m_NFCTagListeners.empty())
235 nfc_manager_unset_tag_discovered_cb ();
238 void NFCDefaultAdapter::unsetPeerListener(NFCAdapter * adapter) {
239 LoggerD(" NFCDefaultAdapter::unsetPeerListener Entered");
241 if (!m_initialized) {
242 m_NFCTargetListeners.clear();
246 std::vector<NFCAdapter *>::iterator it;
247 for (it = m_NFCTargetListeners.begin(); it != m_NFCTargetListeners.end(); ++it) {
248 if (*it == adapter) {
249 m_NFCTargetListeners.erase(it);
250 LoggerD("emitter is removed. (" << m_NFCTargetListeners.size() << ")");
255 if (m_NFCTargetListeners.empty())
256 nfc_manager_unset_p2p_target_discovered_cb();
260 void NFCDefaultAdapter::NFCTagHasDetected(void *props)
262 LoggerD("NFCDefaultAdapter::NFCTagHasDetected Enter type");
264 std::vector<NFCAdapter *>::iterator it;
265 for (it = m_NFCTagListeners.begin(); it != m_NFCTagListeners.end(); ++it) {
266 (*it)->NFCTagHasDetected(props);
270 void NFCDefaultAdapter::NFCTargetHasDetected(void *props)
272 std::vector<NFCAdapter *>::iterator it;
273 for (it = m_NFCTargetListeners.begin(); it != m_NFCTargetListeners.end(); ++it) {
274 (*it)->NFCTargetHasDetected(props);
278 void NFCDefaultAdapter::getCurrentNFC() {
281 if (!m_initialized) {
282 LoggerE("No Initialized");
286 if (!m_NFCTagListeners.empty()) {
287 nfc_tag_h currentTag;
288 if (nfc_manager_get_connected_tag(¤tTag) == NFC_ERROR_NONE) {
289 NFCTagHasDetected((void *)currentTag);
294 if (!m_NFCTargetListeners.empty()) {
295 nfc_p2p_target_h currentTarget;
296 if (nfc_manager_get_connected_target(¤tTarget) == NFC_ERROR_NONE) {
297 NFCTargetHasDetected((void *)currentTarget);
302 int NFCDefaultAdapter::initialize() {
303 LoggerD("NFCDefaultAdapter::initialize Entered");
305 //nfc_manager_deinitialize();
306 result = nfc_manager_initialize(NFCInitializeCompletedCallback, this);
307 if (result != NFC_ERROR_NONE) {
308 LoggerE("Could not initialize NFC.");
309 m_initialized = false;
311 m_initialized = true;
316 void *NFCDefaultAdapter::getCachedMessage() {
318 nfc_ndef_message_h messageHandle = NULL;
319 int result = nfc_manager_get_cached_message(&messageHandle);
320 if ((result == NFC_ERROR_INVALID_NDEF_MESSAGE) || (result == NFC_ERROR_NO_NDEF_MESSAGE)) {
322 nfc_ndef_message_destroy(messageHandle);
328 if (result != NFC_ERROR_NONE) {
329 util.throwNFCException(result, "Can't get cached message");
331 return (void *)(messageHandle);
334 bool NFCDefaultAdapter::getPowerState() {
335 return nfc_manager_is_activated();
338 void NFCDefaultAdapter::setPowered(const bool state, NFCAdapter * poweredAdapter) {
341 if (m_poweredAdapter != NULL) {
342 ThrowMsg(PlatformException, "Progressing Identical Operation");
344 } else if (getPowerState() == state) {
345 poweredAdapter->setPoweredManualAnswer(NFC_ERROR_NONE);
349 int result = NFC_ERROR_NONE;
351 result = initialize();
353 if (result == NFC_ERROR_NONE) {
354 m_poweredAdapter = poweredAdapter;
355 result = nfc_manager_set_activation(state, NFCSetActivationCompletedCallback, NULL);
358 if (result != NFC_ERROR_NONE) {
359 poweredAdapter->setPoweredManualAnswer(result);
360 m_poweredAdapter = NULL;
362 } catch (const WrtDeviceApis::Commons::Exception& ex) {
363 LoggerE("Exception: " << ex.GetMessage());
364 poweredAdapter->setPoweredManualAnswer(NFC_ERROR_OPERATION_FAILED);
365 m_poweredAdapter = NULL;
369 void NFCDefaultAdapter::setPoweredManualAnswer(int error) {
370 if (m_poweredAdapter != NULL) {
371 m_poweredAdapter->setPoweredManualAnswer(error);
372 m_poweredAdapter = NULL;