summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--examples/nfc/annotatedurl/annotatedurl.cpp3
-rw-r--r--examples/nfc/poster/poster.qml5
-rw-r--r--src/imports/nfc/qdeclarativendeffilter.cpp12
-rw-r--r--src/imports/nfc/qdeclarativenearfield.cpp2
-rw-r--r--src/nfc/qnearfieldmanager_android.cpp59
-rw-r--r--src/nfc/qnearfieldmanager_qnx.cpp59
-rw-r--r--src/nfc/qnearfieldmanagervirtualbase.cpp3
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 {