diff options
author | Fabian Bumberger <fbumberger@rim.com> | 2012-12-21 14:09:54 +0100 |
---|---|---|
committer | Aaron McCarthy <mccarthy.aaron@gmail.com> | 2013-01-30 12:35:18 +0100 |
commit | 45816afc84db70614687a4c06c06cd12aeec2b5a (patch) | |
tree | 7c75c9aaad1bb0b15b7f4f1fe47e9b552e58ff39 /src/nfc/qnx/qnxnfcmanager.cpp | |
parent | 1061dc86d9df14e49e6fb330644eee80dafbaf8e (diff) |
QNX: Adding ndef registration over the invocation framework
Change-Id: Ie809c19acf96993d8569cd655d92aed5d1b5e6e4
Reviewed-by: Aaron McCarthy <mccarthy.aaron@gmail.com>
Diffstat (limited to 'src/nfc/qnx/qnxnfcmanager.cpp')
-rw-r--r-- | src/nfc/qnx/qnxnfcmanager.cpp | 181 |
1 files changed, 133 insertions, 48 deletions
diff --git a/src/nfc/qnx/qnxnfcmanager.cpp b/src/nfc/qnx/qnxnfcmanager.cpp index cebfda94..a279b590 100644 --- a/src/nfc/qnx/qnxnfcmanager.cpp +++ b/src/nfc/qnx/qnxnfcmanager.cpp @@ -42,6 +42,7 @@ #include "qnxnfcmanager_p.h" #include <QMetaMethod> #include <QMetaObject> +#include "../qllcpsocket_qnx_p.h" QTNFC_BEGIN_NAMESPACE @@ -147,6 +148,10 @@ QNXNFCManager::QNXNFCManager() nfcNotifier = new QSocketNotifier(nfcFD, QSocketNotifier::Read); qQNXNFCDebug() << "Connecting SocketNotifier" << connect(nfcNotifier, SIGNAL(activated(int)), this, SLOT(newNfcEvent(int))); + + ndefEventFilter = new QNXNFCEventFilter(); + ndefEventFilter->installOnEventDispatcher(QAbstractEventDispatcher::instance()); + connect(ndefEventFilter, SIGNAL(ndefEvent(const QNdefMessage&)), this, SLOT(invokeNdefMessage(const QNdefMessage&))); } QNXNFCManager::~QNXNFCManager() @@ -155,6 +160,7 @@ QNXNFCManager::~QNXNFCManager() if (nfcNotifier) delete nfcNotifier; + ndefEventFilter->uninstallEventFilter(); } QList<QNdefMessage> QNXNFCManager::decodeTargetMessage(nfc_target_t *target) @@ -170,49 +176,7 @@ QList<QNdefMessage> QNXNFCManager::decodeTargetMessage(nfc_target_t *target) if (nfc_get_ndef_message(target, i, &nextMessage) != NFC_RESULT_SUCCESS) { qWarning() << Q_FUNC_INFO << "Could not get ndef message"; } else { - QNdefMessage newNdefMessage; - unsigned int recordCount; - nfc_get_ndef_record_count(nextMessage, &recordCount); - for (unsigned int j=0; j<recordCount; j++) { - nfc_ndef_record_t *newRecord; - char *recordType; - uchar_t *payLoad; - char *recordId; - size_t payLoadSize; - tnf_type_t typeNameFormat; - - nfc_get_ndef_record(nextMessage, j, &newRecord); - - nfc_get_ndef_record_type(newRecord, &recordType); - QNdefRecord newNdefRecord; - newNdefRecord.setType(QByteArray(recordType)); - - nfc_get_ndef_record_payload(newRecord, &payLoad, &payLoadSize); - newNdefRecord.setPayload(QByteArray(reinterpret_cast<const char*>(payLoad), payLoadSize)); - - nfc_get_ndef_record_id(newRecord, &recordId); - newNdefRecord.setId(QByteArray(recordId)); - - nfc_get_ndef_record_tnf(newRecord, &typeNameFormat); - QNdefRecord::TypeNameFormat recordTnf; - switch (typeNameFormat) { - case NDEF_TNF_WELL_KNOWN: recordTnf = QNdefRecord::NfcRtd; break; - case NDEF_TNF_EMPTY: recordTnf = QNdefRecord::Empty; break; - case NDEF_TNF_MEDIA: recordTnf = QNdefRecord::Mime; break; - case NDEF_TNF_ABSOLUTE_URI: recordTnf = QNdefRecord::Uri; break; - case NDEF_TNF_EXTERNAL: recordTnf = QNdefRecord::ExternalRtd; break; - case NDEF_TNF_UNKNOWN: recordTnf = QNdefRecord::Unknown; break; - //TODO add the rest - case NDEF_TNF_UNCHANGED: recordTnf = QNdefRecord::Unknown; break; - } - - newNdefRecord.setTypeNameFormat(recordTnf); - qQNXNFCDebug() << "Adding NFC record"; - newNdefMessage << newNdefRecord; - delete recordType; - delete payLoad; - delete recordId; - } + QNdefMessage newNdefMessage = decodeMessage(nextMessage); ndefMessages.append(newNdefMessage); } } @@ -251,6 +215,11 @@ void QNXNFCManager::newNfcEvent(int fd) nfc_free_event (nfcEvent); } +void QNXNFCManager::invokeNdefMessage(const QNdefMessage &msg) +{ + Q_EMIT ndefMessage(msg, 0); +} + void QNXNFCManager::llcpReadComplete(nfc_event_t *nfcEvent) { nfc_target_t *target; @@ -289,7 +258,7 @@ void QNXNFCManager::llcpReadComplete(nfc_event_t *nfcEvent) for (int i=0; i<nfcTargets.size(); i++) { if (nfcTargets.at(i).first == targetId) { - nfcTargets.at(i).second->dataRead(QByteArray&, data); + qobject_cast<QLlcpSocketPrivate*>(nfcTargets.at(i).second)->dataRead(data); } } } @@ -313,7 +282,7 @@ void QNXNFCManager::llcpWriteComplete(nfc_event_t *nfcEvent) for (int i=0; i<nfcTargets.size(); i++) { if (nfcTargets.at(i).first == targetId) { - nfcTargets.at(i).second_>dataWritten(); + qobject_cast<QLlcpSocketPrivate*>(nfcTargets.at(i).second)->dataWritten(); } } } @@ -334,9 +303,7 @@ void QNXNFCManager::nfcReadWriteEvent(nfc_event_t *nfcEvent) NearFieldTarget<QNearFieldTarget> *bbNFTarget = new NearFieldTarget<QNearFieldTarget>(this, target, targetMessages); emit targetDetected(bbNFTarget, targetMessages); for (int i=0; i< targetMessages.count(); i++) { - for (int j=0; j<ndefMessageHandlers.count(); j++) { - emit ndefMessage(targetMessages.at(i), reinterpret_cast<QNearFieldTarget *> (bbNFTarget)); - } + emit ndefMessage(targetMessages.at(i), reinterpret_cast<QNearFieldTarget *> (bbNFTarget)); } } @@ -364,6 +331,39 @@ void QNXNFCManager::llcpConnectionEvent(nfc_event_t *nfcEvent) } } } +void QNXNFCManager::setupInvokeTarget() { + qQNXNFCDebug() << "Setting up invoke target"; + QByteArray uriFilter; + bool registerAll = false; + + if (!absNdefFilters.isEmpty()) { + uriFilter = "uris="; + } + for (int i=0; i<absNdefFilters.size(); i++) { + if (absNdefFilters.at(i) == "*") { + registerAll = true; + break; + } + uriFilter.append(absNdefFilters.at(i)); + if (i==absNdefFilters.size()-1) + uriFilter += ";"; + else + uriFilter += ","; + } + if (registerAll) { + uriFilter = "uris=ndef://;"; + } + + const char *filters[1]; + QByteArray filter = "actions=bb.action.OPEN;types=application/vnd.rim.nfc.ndef;" + uriFilter; + filters[0] = filter.constData(); + + if (BPS_SUCCESS != navigator_invoke_set_filters("20", "org.qtm.NFCTest", filters, 1)) { + qWarning() << "NFC Error setting share target filter"; + } else { + qQNXNFCDebug() << "NFC share target filter set" << filters[0]; + } +} void QNXNFCManager::targetLostEvent(nfc_event_t *nfcEvent) { @@ -396,4 +396,89 @@ bool QNXNFCManager::startTargetDetection(const QList<QNearFieldTarget::Type> &ta } } +void QNXNFCManager::updateNdefFilters(QList<QByteArray> filters, QObject *obj) +{ + qQNXNFCDebug() << Q_FUNC_INFO << "NDEF Filter update"; + //Updating the filters for an object + if (!filters.isEmpty()) { + if (ndefFilters.contains(obj)) { + ndefFilters[obj] = filters; + qQNXNFCDebug() << "Updateing filter list for"<< obj; + } else { + qQNXNFCDebug() << "Appending new filter for"<< obj; + ndefFilters[obj] = filters; + } + } else { + ndefFilters.remove(obj); + } + + //Iterate over all registered object filters and construct a filter list for the application + QList<QByteArray> newFilters; + if (ndefFilters.size() > 0) { + QHash<QObject*, QList<QByteArray> >::const_iterator it=ndefFilters.constBegin(); + do { + foreach (const QByteArray filter, it.value()) { + if (!newFilters.contains(filter)) { + newFilters.append(filter); + qQNXNFCDebug() << "Appending Filter" << filter; + } + } + it++; + } while (it != ndefFilters.constEnd()); + } + + if (newFilters != absNdefFilters) { + absNdefFilters = newFilters; + setupInvokeTarget(); + } +} + +QNdefMessage QNXNFCManager::decodeMessage(nfc_ndef_message_t *nextMessage) +{ + QNdefMessage newNdefMessage; + unsigned int recordCount; + nfc_get_ndef_record_count(nextMessage, &recordCount); + for (unsigned int j=0; j<recordCount; j++) { + nfc_ndef_record_t *newRecord; + char *recordType; + uchar_t *payLoad; + char *recordId; + size_t payLoadSize; + tnf_type_t typeNameFormat; + + nfc_get_ndef_record(nextMessage, j, &newRecord); + + nfc_get_ndef_record_type(newRecord, &recordType); + QNdefRecord newNdefRecord; + newNdefRecord.setType(QByteArray(recordType)); + + nfc_get_ndef_record_payload(newRecord, &payLoad, &payLoadSize); + newNdefRecord.setPayload(QByteArray(reinterpret_cast<const char*>(payLoad), payLoadSize)); + + nfc_get_ndef_record_id(newRecord, &recordId); + newNdefRecord.setId(QByteArray(recordId)); + + nfc_get_ndef_record_tnf(newRecord, &typeNameFormat); + QNdefRecord::TypeNameFormat recordTnf; + switch (typeNameFormat) { + case NDEF_TNF_WELL_KNOWN: recordTnf = QNdefRecord::NfcRtd; break; + case NDEF_TNF_EMPTY: recordTnf = QNdefRecord::Empty; break; + case NDEF_TNF_MEDIA: recordTnf = QNdefRecord::Mime; break; + case NDEF_TNF_ABSOLUTE_URI: recordTnf = QNdefRecord::Uri; break; + case NDEF_TNF_EXTERNAL: recordTnf = QNdefRecord::ExternalRtd; break; + case NDEF_TNF_UNKNOWN: recordTnf = QNdefRecord::Unknown; break; + //TODO add the rest + case NDEF_TNF_UNCHANGED: recordTnf = QNdefRecord::Unknown; break; + } + + newNdefRecord.setTypeNameFormat(recordTnf); + qQNXNFCDebug() << "Adding NFC record"; + newNdefMessage << newNdefRecord; + delete recordType; + delete payLoad; + delete recordId; + } + return newNdefMessage; +} + QTNFC_END_NAMESPACE |