diff options
-rw-r--r-- | examples/nfc/annotatedurl/annotatedurl.cpp | 3 | ||||
-rw-r--r-- | examples/nfc/poster/poster.qml | 5 | ||||
-rw-r--r-- | src/imports/nfc/qdeclarativendeffilter.cpp | 12 | ||||
-rw-r--r-- | src/imports/nfc/qdeclarativenearfield.cpp | 2 | ||||
-rw-r--r-- | src/nfc/qnearfieldmanager_android.cpp | 59 | ||||
-rw-r--r-- | src/nfc/qnearfieldmanager_qnx.cpp | 59 | ||||
-rw-r--r-- | src/nfc/qnearfieldmanagervirtualbase.cpp | 3 |
7 files changed, 117 insertions, 26 deletions
diff --git a/examples/nfc/annotatedurl/annotatedurl.cpp b/examples/nfc/annotatedurl/annotatedurl.cpp index cd35c4ef..cf7dd17a 100644 --- a/examples/nfc/annotatedurl/annotatedurl.cpp +++ b/examples/nfc/annotatedurl/annotatedurl.cpp @@ -70,6 +70,9 @@ AnnotatedUrl::AnnotatedUrl(QObject *parent) filter.setOrderMatch(false); filter.appendRecord<QNdefNfcTextRecord>(1, UINT_MAX); filter.appendRecord<QNdefNfcUriRecord>(); + // type parameter cannot specify substring so filter for "image/" below + filter.appendRecord(QNdefRecord::Mime, QByteArray(), 0, 1); + int result = manager->registerNdefMessageHandler(filter, this, SLOT(handleMessage(QNdefMessage,QNearFieldTarget*))); //! [QNearFieldManager register handler] diff --git a/examples/nfc/poster/poster.qml b/examples/nfc/poster/poster.qml index 89e6af19..a70a998b 100644 --- a/examples/nfc/poster/poster.qml +++ b/examples/nfc/poster/poster.qml @@ -63,8 +63,9 @@ Rectangle { } filter: [ - NdefFilter { type: "U"; typeNameFormat: NdefRecord.NfcRtd; minimum: 1; maximum: 1 }, - NdefFilter { type: "T"; typeNameFormat: NdefRecord.NfcRtd; minimum: 1 } + NdefFilter { type: "U"; typeNameFormat: NdefRecord.NfcRtd; maximum: 1 }, + NdefFilter { type: "T"; typeNameFormat: NdefRecord.NfcRtd }, + NdefFilter { typeNameFormat: NdefRecord.Mime; minimum: 0; maximum: 1 } ] onMessageRecordsChanged: { diff --git a/src/imports/nfc/qdeclarativendeffilter.cpp b/src/imports/nfc/qdeclarativendeffilter.cpp index a3fb1581..508b9d2d 100644 --- a/src/imports/nfc/qdeclarativendeffilter.cpp +++ b/src/imports/nfc/qdeclarativendeffilter.cpp @@ -70,12 +70,18 @@ */ /*! + \qmlproperty QQmlNdefRecord::TypeNameFormat NdefFilter::typeNameFormat + + This property holds the NDEF record name format type \enum QQmlNdefRecord::TypeNameFormat. +*/ + +/*! \qmlproperty int NdefFilter::minimum This property holds the minimum number of records of the given type that must be in the NDEF message for it match. - To match any number of records set both the minimum and maximum properties to -1. + The default minimum is 1. \sa maximum */ @@ -86,13 +92,13 @@ This property holds the maximum number of records of the given type that must be in the NDEF message for it match. - To match any number of records set both the minimum and maximum properties to -1. + The default maximum is UINT_MAX. \sa minimum */ QDeclarativeNdefFilter::QDeclarativeNdefFilter(QObject *parent) -: QObject(parent), m_minimum(-1), m_maximum(-1) +: QObject(parent), m_minimum(1), m_maximum(UINT_MAX) { } diff --git a/src/imports/nfc/qdeclarativenearfield.cpp b/src/imports/nfc/qdeclarativenearfield.cpp index 3e45047b..17e6b177 100644 --- a/src/imports/nfc/qdeclarativenearfield.cpp +++ b/src/imports/nfc/qdeclarativenearfield.cpp @@ -92,6 +92,8 @@ This property indicates whether the order of records should be taken into account when matching messages. This is not supported when using neard. + + The default of orderMatch is false. */ /*! diff --git a/src/nfc/qnearfieldmanager_android.cpp b/src/nfc/qnearfieldmanager_android.cpp index 7cb1829f..d1434840 100644 --- a/src/nfc/qnearfieldmanager_android.cpp +++ b/src/nfc/qnearfieldmanager_android.cpp @@ -88,6 +88,12 @@ void QNearFieldManagerPrivateImpl::handlerTargetLost(QNearFieldTarget *target) m_idToTarget.remove(m_idToTarget.key(target)); } +struct VerifyRecord +{ + QNdefFilter::Record filterRecord; + unsigned int count; +}; + void QNearFieldManagerPrivateImpl::handlerNdefMessageRead(const QNdefMessage &message, const QNearFieldTarget::RequestId &id) { QNearFieldTarget *target = m_idToTarget.value(id); @@ -98,20 +104,53 @@ void QNearFieldManagerPrivateImpl::handlerNdefMessageRead(const QNdefMessage &me //For message handlers that specified a filter for (int i = 0; i < ndefFilterHandlers.count(); ++i) { + bool matched = true; + QNdefFilter filter = ndefFilterHandlers.at(i).second.first; - if (filter.recordCount() > message.count()) - continue; - - int j; - for (j = 0; j < filter.recordCount();) { - if (message.at(j).typeNameFormat() != filter.recordAt(j).typeNameFormat - || message.at(j).type() != filter.recordAt(j).type ) { - break; + + QList<VerifyRecord> filterRecords; + for (int j = 0; j < filter.recordCount(); ++j) { + VerifyRecord vr; + vr.count = 0; + vr.filterRecord = filter.recordAt(j); + + filterRecords.append(vr); + } + + foreach (const QNdefRecord &record, message) { + for (int j = 0; matched && (j < filterRecords.count()); ++j) { + VerifyRecord &vr = filterRecords[j]; + + if (vr.filterRecord.typeNameFormat == record.typeNameFormat() && + ( vr.filterRecord.type == record.type() || + vr.filterRecord.type.isEmpty()) ) { + ++vr.count; + break; + } else { + if (filter.orderMatch()) { + if (vr.filterRecord.minimum <= vr.count && + vr.count <= vr.filterRecord.maximum) { + continue; + } else { + matched = false; + } + } + } } - ++j; } - if (j == filter.recordCount()) + + for (int j = 0; matched && (j < filterRecords.count()); ++j) { + const VerifyRecord &vr = filterRecords.at(j); + + if (vr.filterRecord.minimum <= vr.count && vr.count <= vr.filterRecord.maximum) + continue; + else + matched = false; + } + + if (matched) { ndefFilterHandlers.at(i).second.second.invoke(ndefFilterHandlers.at(i).first.second, Q_ARG(QNdefMessage, message), Q_ARG(QNearFieldTarget*, target)); + } } } diff --git a/src/nfc/qnearfieldmanager_qnx.cpp b/src/nfc/qnearfieldmanager_qnx.cpp index 2c3c7077..f4508bd8 100644 --- a/src/nfc/qnearfieldmanager_qnx.cpp +++ b/src/nfc/qnearfieldmanager_qnx.cpp @@ -140,6 +140,12 @@ void QNearFieldManagerPrivateImpl::releaseAccess(QNearFieldManager::TargetAccess //Do nothing, because we don't have access modes for the target } +struct VerifyRecord +{ + QNdefFilter::Record filterRecord; + unsigned int count; +}; + void QNearFieldManagerPrivateImpl::handleMessage(const QNdefMessage &message, QNearFieldTarget *target) { qQNXNFCDebug() << "Handling message in near field manager. Filtercount:" @@ -151,20 +157,53 @@ void QNearFieldManagerPrivateImpl::handleMessage(const QNdefMessage &message, QN //For message handlers that specified a filter for (int i = 0; i < ndefFilterHandlers.count(); i++) { + bool matched = true; + QNdefFilter filter = ndefFilterHandlers.at(i).second.first; - if (filter.recordCount() > message.count()) - continue; - - int j=0; - for (j = 0; j < filter.recordCount();) { - if (message.at(j).typeNameFormat() != filter.recordAt(j).typeNameFormat - || message.at(j).type() != filter.recordAt(j).type ) { - break; + + QList<VerifyRecord> filterRecords; + for (int j = 0; j < filter.recordCount(); ++j) { + VerifyRecord vr; + vr.count = 0; + vr.filterRecord = filter.recordAt(j); + + filterRecords.append(vr); + } + + foreach (const QNdefRecord &record, message) { + for (int j = 0; matched && (j < filterRecords.count()); ++j) { + VerifyRecord &vr = filterRecords[j]; + + if (vr.filterRecord.typeNameFormat == record.typeNameFormat() && + ( vr.filterRecord.type == record.type() || + vr.filterRecord.type.isEmpty()) ) { + ++vr.count; + break; + } else { + if (filter.orderMatch()) { + if (vr.filterRecord.minimum <= vr.count && + vr.count <= vr.filterRecord.maximum) { + continue; + } else { + matched = false; + } + } + } } - j++; } - if (j == filter.recordCount()) + + for (int j = 0; matched && (j < filterRecords.count()); ++j) { + const VerifyRecord &vr = filterRecords.at(j); + + if (vr.filterRecord.minimum <= vr.count && vr.count <= vr.filterRecord.maximum) + continue; + else + matched = false; + } + + if (matched) { ndefFilterHandlers.at(i).second.second.invoke(ndefFilterHandlers.at(i).first.second, Q_ARG(QNdefMessage, message), Q_ARG(QNearFieldTarget*, target)); + } } } diff --git a/src/nfc/qnearfieldmanagervirtualbase.cpp b/src/nfc/qnearfieldmanagervirtualbase.cpp index cf25ed2b..b0f77e2f 100644 --- a/src/nfc/qnearfieldmanagervirtualbase.cpp +++ b/src/nfc/qnearfieldmanagervirtualbase.cpp @@ -172,7 +172,8 @@ void QNearFieldManagerPrivateVirtualBase::ndefReceived(const QNdefMessage &messa VerifyRecord &vr = filterRecords[j]; if (vr.filterRecord.typeNameFormat == record.typeNameFormat() && - vr.filterRecord.type == record.type()) { + ( vr.filterRecord.type == record.type() || + vr.filterRecord.type.isEmpty()) ) { ++vr.count; break; } else { |