2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include <dpl/log/log.h>
19 #include <dpl/scoped_ptr.h>
20 #include <Commons/Exception.h>
22 #include "NFCManager.h"
25 using namespace TizenApis::Api::NFC;
34 static void TagDetectedCallback(nfc_discovered_type_e type, nfc_tag_h tag, void *data) {
35 LogDebug("Callback TagDetectedCallback.");
38 if (NFC_DISCOVERED_TYPE_ATTACHED == type) {
39 (static_cast<NFCManager*>(data))->updateCurrentHandle((void *)tag);
40 (static_cast<NFCManager*>(data))->NFCHasDetected((void *)tag, NFC_TAG_TYPE);
42 (static_cast<NFCManager*>(data))->updateCurrentHandle(NULL);
43 (static_cast<NFCManager*>(data))->NFCHasDetected(NULL, NFC_TAG_TYPE);
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<NFCManager*>(data))->updateCurrentHandle((void *)target);
57 (static_cast<NFCManager*>(data))->NFCHasDetected((void *)target, NFC_TARGET_TYPE);
59 (static_cast<NFCManager*>(data))->updateCurrentHandle(NULL);
60 (static_cast<NFCManager*>(data))->NFCHasDetected(NULL, NFC_TARGET_TYPE);
63 LogError("Callback private data is NULL.");
68 static void NDEFDetectedCallback(nfc_ndef_message_h message, void *data) {
69 LogDebug("Callback NDEFDetectedCallback.");
71 unsigned char *UrawData;
74 if (nfc_ndef_message_get_rawdata(message, &UrawData, &size) != NFC_ERROR_NONE) {
75 LogError("Can't get rawdata of message");
80 (static_cast<NFCManager*>(data))->NDEFHasDetected(Util.toVector(UrawData, size));
83 LogError("Callback private data is NULL.");
87 static void SeEventCallback(nfc_se_event_e event, void *data) {
88 LogDebug("Callback NDEFDetectedCallback.");
90 nfcSeEventType seEvent = NFC_SE_EVENTTYPE_END_TRANSACTION;
92 case NFC_SE_EVENT_START_TRANSACTION:
93 seEvent = NFC_SE_EVENTTYPE_START_TRANSACTION;
95 case NFC_SE_EVENT_END_TRANSACTION:
96 seEvent = NFC_SE_EVENTTYPE_END_TRANSACTION;
98 case NFC_SE_EVENT_CONNECTIVITY:
99 seEvent = NFC_SE_EVENTTYPE_CONNECTIVITY;
101 case NFC_SE_EVENT_FIELD_ON:
102 seEvent = NFC_SE_EVENTTYPE_FIELD_ON;
104 case NFC_SE_EVENT_FIELD_OFF:
105 seEvent = NFC_SE_EVENTTYPE_FIELD_OFF;
108 (static_cast<NFCManager*>(data))->SeEventHasDetected(seEvent);
111 LogError("Callback private data is NULL.");
116 NFCManager::NFCManager()
117 :m_initialized(false) {
118 LogDebug("Platform::NFC Enter");
122 m_managerPriv = NULL;
124 m_NFCTagEmitterPtr.Reset();
125 m_NFCTargetEmitterPtr.Reset();
126 m_NdefEmitterPtr.Reset();
127 m_SeEventEmitterPtr.Reset();
133 NFCManager::~NFCManager() {
136 if(m_initialized == true)
138 result = nfc_manager_deinitialize ();
139 if (result !=NFC_ERROR_NONE) {
140 LogInfo("failed to deinitialize nfc");
144 nfc_manager_unset_tag_discovered_cb();
145 nfc_manager_unset_p2p_target_discovered_cb();
146 nfc_manager_unset_ndef_discovered_cb();
147 nfc_manager_unset_se_event_cb();
149 m_managerPriv = NULL;
151 LogDebug("destroy nfc");
154 int NFCManager::setTagListener(const EventNFCChangedEmitterPtr& emitter,
155 TagFilterPtr pFilter, void *managerPriv) {
156 LogDebug(" NFCManager::setTagListener Entered");
159 if (m_NFCTagEmitterPtr.Get() != NULL)
160 Throw(WrtDeviceApis::Commons::AlreadyInUseException);
162 m_NFCTagEmitterPtr = emitter;
163 m_managerPriv = managerPriv;
165 LogDebug(" NFCManager::setTagListener set discovered callback, filter size == " << pFilter->getFilterSize());
167 m_tagFilter = pFilter;
168 if (pFilter->getFilterSize() > 0) {
169 int filter = NFC_TAG_FILTER_ALL_DISABLE;
170 for (int cnt = 0; cnt < pFilter->getFilterSize() ; cnt++) {
171 LogDebug(" NFCManager::setTagListener filter == " << pFilter->getFilterValue(cnt));
172 if ((pFilter->getFilterValue(cnt) >= NFC_TAGTYPE_ISO14443_A_PICC) && (pFilter->getFilterValue(cnt) <= NFC_TAGTYPE_MIFARE_DESFIRE_PICC))
173 filter = filter |NFC_TAG_FILTER_ISO14443A_ENABLE;
174 else if ((pFilter->getFilterValue(cnt) >= NFC_TAGTYPE_ISO14443_B_PICC) && (pFilter->getFilterValue(cnt) <= NFC_TAGTYPE_ISO14443_BPRIME_PICC))
175 filter = filter |NFC_TAG_FILTER_ISO14443B_ENABLE;
176 else if (pFilter->getFilterValue(cnt) == NFC_TAGTYPE_FELICA_PICC)
177 filter = filter |NFC_TAG_FILTER_FELICA_ENABLE ;
178 else if (pFilter->getFilterValue(cnt) == NFC_TAGTYPE_JEWEL_PICC)
179 filter = filter |NFC_TAG_FILTER_JEWEL_ENABLE ;
180 else if (pFilter->getFilterValue(cnt) == NFC_TAGTYPE_ISO15693_PICC)
181 filter = filter |NFC_TAG_FILTER_ISO15693_ENABLE ;
183 nfc_manager_set_tag_filter(filter);
185 nfc_manager_set_tag_filter(NFC_TAG_FILTER_ALL_ENABLE);
188 result = nfc_manager_set_tag_discovered_cb (TagDetectedCallback, this);
189 if (result != NFC_ERROR_NONE)
191 LogInfo("failed to set callback of nfc_manager_set_ndef_discovered_cb");
194 LogInfo("NFCManager::setTagListener : result << " << result);
198 int NFCManager::setPeerListener(const EventNFCChangedEmitterPtr& emitter, void *managerPriv) {
199 LogDebug(" NFCManager::setPeerListener Entered");
202 if (m_NFCTargetEmitterPtr.Get() != NULL)
203 Throw(WrtDeviceApis::Commons::AlreadyInUseException);
205 m_NFCTargetEmitterPtr = emitter;
206 m_managerPriv = managerPriv;
207 result = nfc_manager_set_p2p_target_discovered_cb (TargetDetectedCallback, this);
209 if (result != NFC_ERROR_NONE)
211 LogInfo("failed to set callback of nfc_manager_set_p2p_target_discovered_cb");
215 LogInfo("NFCManager::setPeerListener : result << " << result);
219 int NFCManager::setNDEFListener(const EventNFCChangedNdefEmitterPtr& emitter) {
220 LogDebug(" NFCManager::setNDEFListener Entered");
223 if (m_NdefEmitterPtr.Get() != NULL)
224 Throw(WrtDeviceApis::Commons::AlreadyInUseException);
226 m_NdefEmitterPtr = emitter;
227 result = nfc_manager_set_ndef_discovered_cb(NDEFDetectedCallback, this);
228 if (result != NFC_ERROR_NONE)
230 LogInfo("failed to set callback of nfc_manager_set_ndef_discovered_cb");
233 nfc_manager_set_tag_filter(NFC_TAG_FILTER_ALL_ENABLE);
234 LogInfo("NFCManager::setNDEFListener : result << " << result);
238 int NFCManager::setSEEventListener(const EventNFCChangedSeEventEmitterPtr& emitter) {
239 LogDebug(" NFCManager::setNDEFListener Entered");
242 if (m_SeEventEmitterPtr.Get() != NULL)
243 Throw(WrtDeviceApis::Commons::AlreadyInUseException);
245 m_SeEventEmitterPtr = emitter;
246 result = nfc_manager_set_se_event_cb (SeEventCallback, this);
247 if (result != NFC_ERROR_NONE)
249 LogInfo("failed to set callback of NFC_manager_set_tag_discovered_cb");
252 LogInfo("NFCManager::setSEEventListener : result << " << result);
256 void NFCManager::unsetTagListener(/*EventNFCChangedEmitter::IdType id*/) {
257 LogDebug(" NFCManager::unsetTagListener Entered");
259 nfc_manager_unset_tag_discovered_cb ();
260 m_NFCTagEmitterPtr.Reset();
263 void NFCManager::unsetPeerListener(/*EventNFCChangedEmitter::IdType id*/) {
264 LogDebug(" NFCManager::unsetPeerListener Entered");
265 nfc_manager_unset_p2p_target_discovered_cb();
266 m_NFCTargetEmitterPtr.Reset();
270 void NFCManager::unsetNDEFListener() {
271 LogDebug(" NFCManager::unsetNDEFListener Entered");
272 nfc_manager_unset_ndef_discovered_cb();
273 m_NdefEmitterPtr.Reset();
276 void NFCManager::unsetSEEventListener() {
277 LogDebug(" NFCManager::unsetSEEventListener Entered");
278 nfc_manager_unset_se_event_cb();
279 m_SeEventEmitterPtr.Reset();
282 void NFCManager::NFCHasDetected(void *props, EventNFCType type)
284 LogDebug("NFCManager::NFCHasDetected Enter type : " << type);
286 if (((m_NFCTagEmitterPtr.Get() != NULL) && (type == NFC_TAG_TYPE)) ||
287 ((m_NFCTargetEmitterPtr.Get() != NULL) && (type == NFC_TARGET_TYPE))){
288 EventNFCType nfcType = type;
290 if ((props != NULL) && (type == NFC_TAG_TYPE)) {
292 nfc_tag_type_e tagType;
294 if (nfc_tag_get_type((nfc_tag_h)props, &tagType) == NFC_ERROR_NONE) {
295 LogDebug("NFCManager::NFCHasDetected Tag real type : " << tagType);
297 for (cnt = 0; cnt < m_tagFilter->getFilterSize() ; cnt++) {
299 if (Util.convertTonfcTagType(static_cast<unsigned short>(tagType)) == m_tagFilter->getFilterValue(cnt))
302 if ((m_tagFilter->getFilterSize() > 0) && (cnt == m_tagFilter->getFilterSize())) {
303 LogDebug("Filter doesn't have this tag type ");
308 case NFC_MIFARE_MINI_PICC:
309 case NFC_MIFARE_1K_PICC:
310 case NFC_MIFARE_4K_PICC:
311 nfcType = NFC_TAG_MIFARE_CLASSIC_TYPE;
313 case NFC_MIFARE_ULTRA_PICC:
314 nfcType = NFC_TAG_MIFARE_ULTRA_TYPE;
317 nfcType = NFC_TAG_TYPE;
321 LogDebug("It can't get real nfc tag type");
323 for (cnt = 0; cnt < m_tagFilter->getFilterSize() ; cnt++) {
324 if (NFC_TAGTYPE_GENERIC_PICC == m_tagFilter->getFilterValue(cnt))
328 if (cnt == m_tagFilter->getFilterSize()) {
329 LogDebug("Filter doesn't have this tag type ");
336 EventNFCChangedPtr event( new EventNFCChanged() );
337 LogDebug("nfc type was detected");
339 event->setNFCStatus(NFC_DETATCHED);
341 event->setNFCStatus(NFC_ATTATCHED);
342 event->setNFCProperties(props);
343 event->setNFCType(nfcType);
344 event->setPrivateNFCManagerPtr(m_managerPriv);
345 LogDebug("emit event with nfc tag info");
346 if (type == NFC_TARGET_TYPE)
347 m_NFCTargetEmitterPtr->emit(event);
349 m_NFCTagEmitterPtr->emit(event);
351 LogDebug("m_NFCTagEmitterPtr.Get() != NULL ? " << (m_NFCTagEmitterPtr.Get() != NULL));
357 void NFCManager::NDEFHasDetected(std::vector<unsigned char> data)
359 LogDebug("NFCManager::NFCHasDetected Enter");
361 if (m_NdefEmitterPtr.Get() != NULL) {
362 EventNFCChangedNdefPtr event( new EventNFCChangedNdef() );
363 LogDebug("nfc type was detected");
365 event->setReadNdefResult(data);
366 LogDebug("emit event with nfc tag info");
367 m_NdefEmitterPtr->emit(event);
371 void NFCManager::SeEventHasDetected(nfcSeEventType eventType)
373 LogDebug("NDEF is detected Enter");
375 if (m_SeEventEmitterPtr.Get() != NULL) {
376 EventNFCChangedSeEventPtr event( new EventNFCChangedSeEvent() );
377 event->setSeEvent(eventType);
378 m_SeEventEmitterPtr->emit(event);
382 void NFCManager::initialize() {
383 LogDebug("NFCManager::initialize Entered");
385 result = nfc_manager_initialize();
386 if (result != NFC_ERROR_NONE) {
387 LogError("Could not initialize NFC.");
388 Throw(WrtDeviceApis::Commons::UnsupportedException);
389 m_initialized = false;
391 m_initialized = true;
395 void *NFCManager::getCachedMessage() {
397 nfc_ndef_message_h messageHandle;
398 int result = nfc_manager_get_cached_message(&messageHandle);
399 if (result == NFC_ERROR_INVALID_NDEF_MESSAGE)
401 if (result != NFC_ERROR_NONE)
402 ThrowMsg(PlatformException, "Can't get cached message");
404 return (void *)(messageHandle);
407 bool NFCManager::isValidHandle(void * handle) {
409 if ((handle != NULL) && (handle == curHandle))
415 void NFCManager::updateCurrentHandle(void *handle) {
416 LogDebug("Updated!");