summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/imports/nfc/qdeclarativenearfield.cpp98
-rw-r--r--src/imports/nfc/qdeclarativenearfield_p.h11
2 files changed, 103 insertions, 6 deletions
diff --git a/src/imports/nfc/qdeclarativenearfield.cpp b/src/imports/nfc/qdeclarativenearfield.cpp
index b1aeced7..ffba30d0 100644
--- a/src/imports/nfc/qdeclarativenearfield.cpp
+++ b/src/imports/nfc/qdeclarativenearfield.cpp
@@ -49,6 +49,8 @@
#include <qndefnfctextrecord.h>
#include <qndefnfcurirecord.h>
+#include <QtNfc/QNearFieldTarget>
+
/*!
\qmltype NearField
\instantiates QDeclarativeNearField
@@ -69,6 +71,9 @@
and \l orderMatch properties to match the required NDEF messages. Once an NDEF message is
successfully read from a tag the \l messageRecords property is updated.
+ \note For platforms using neard filtering is currently not implemented. For more information
+ on neard see \relates QNearFieldManager.
+
\snippet doc_src_qtnfc.qml QML register for messages
*/
@@ -85,6 +90,8 @@
set to NDEF messages which match the filter. If no filter is set, a message handler for
all NDEF messages will be registered.
+ \note Filtering is not supported when using neard.
+
\l QNearFieldManager::registerNdefMessageHandler()
*/
@@ -92,13 +99,44 @@
\qmlproperty bool NearField::orderMatch
This property indicates whether the order of records should be taken into account when matching
- messages.
+ messages. This is not supported when using neard.
+*/
+
+/*!
+ \qmlproperty bool NearField::polling
+
+ This property indicates if the underlying adapter is currently in polling state. If set to \c true
+ the adapter will start polling and stop polling if set to \c false.
+
+ \note On platforms using neard, the adapter will stop polling as soon as a tag has been detected.
+ For more information see \relates QNearFieldManager.
+*/
+
+/*!
+ \qmlsignal NearField::tagFound()
+
+ This signal will be emitted when a tag has been detected.
+*/
+
+/*!
+ \qmlsignal NearField::tagRemoved()
+
+ This signal will be emitted when a tag has been removed.
*/
QDeclarativeNearField::QDeclarativeNearField(QObject *parent)
-: QObject(parent), m_orderMatch(false), m_componentCompleted(false), m_messageUpdating(false),
- m_manager(0), m_messageHandlerId(-1)
+ : QObject(parent),
+ m_orderMatch(false),
+ m_componentCompleted(false),
+ m_messageUpdating(false),
+ m_manager(new QNearFieldManager(this)),
+ m_messageHandlerId(-1),
+ m_polling(false)
{
+ connect(m_manager, SIGNAL(targetDetected(QNearFieldTarget*)),
+ this, SLOT(_q_handleTargetDetected(QNearFieldTarget*)));
+ connect(m_manager, SIGNAL(targetLost(QNearFieldTarget*)),
+ this, SLOT(_q_handleTargetLost(QNearFieldTarget*)));
}
QQmlListProperty<QQmlNdefRecord> QDeclarativeNearField::messageRecords()
@@ -141,11 +179,30 @@ void QDeclarativeNearField::componentComplete()
registerMessageHandler();
}
-void QDeclarativeNearField::registerMessageHandler()
+bool QDeclarativeNearField::polling() const
+{
+ return m_polling;
+}
+
+void QDeclarativeNearField::setPolling(bool on)
{
- if (!m_manager)
- m_manager = new QNearFieldManager(this);
+ if (m_polling == on)
+ return;
+
+ if (on) {
+ if (m_manager->startTargetDetection()) {
+ m_polling = true;
+ emit pollingChanged();
+ }
+ } else {
+ m_manager->stopTargetDetection();
+ m_polling = false;
+ emit pollingChanged();
+ }
+}
+void QDeclarativeNearField::registerMessageHandler()
+{
if (m_messageHandlerId != -1)
m_manager->unregisterNdefMessageHandler(m_messageHandlerId);
@@ -160,6 +217,12 @@ void QDeclarativeNearField::registerMessageHandler()
}
m_messageHandlerId = m_manager->registerNdefMessageHandler(ndefFilter, this, SLOT(_q_handleNdefMessage(QNdefMessage)));
+
+ // FIXME: if a message handler has been registered we just assume that constant polling is done
+ if (m_messageHandlerId >= 0) {
+ m_polling = true;
+ emit pollingChanged();
+ }
}
void QDeclarativeNearField::_q_handleNdefMessage(const QNdefMessage &message)
@@ -178,6 +241,29 @@ void QDeclarativeNearField::_q_handleNdefMessage(const QNdefMessage &message)
emit messageRecordsChanged();
}
+void QDeclarativeNearField::_q_handleTargetLost(QNearFieldTarget *target)
+{
+ Q_UNUSED(target);
+ // FIXME: only notify that polling stopped when there is no registered message handler
+ if (m_messageHandlerId == -1) {
+ m_polling = false;
+ emit pollingChanged();
+ }
+
+ emit tagRemoved();
+}
+
+void QDeclarativeNearField::_q_handleTargetDetected(QNearFieldTarget *target)
+{
+ Q_UNUSED(target);
+
+ if (m_messageHandlerId == -1) {
+ connect(target, SIGNAL(ndefMessageRead(QNdefMessage)),
+ this, SLOT(_q_handleNdefMessage(QNdefMessage)));
+ target->readNdefMessages();
+ }
+}
+
void QDeclarativeNearField::append_messageRecord(QQmlListProperty<QQmlNdefRecord> *list,
QQmlNdefRecord *record)
{
diff --git a/src/imports/nfc/qdeclarativenearfield_p.h b/src/imports/nfc/qdeclarativenearfield_p.h
index 14a6d986..af6b947c 100644
--- a/src/imports/nfc/qdeclarativenearfield_p.h
+++ b/src/imports/nfc/qdeclarativenearfield_p.h
@@ -60,6 +60,7 @@ class QDeclarativeNearField : public QObject, public QQmlParserStatus
Q_PROPERTY(QQmlListProperty<QQmlNdefRecord> messageRecords READ messageRecords NOTIFY messageRecordsChanged)
Q_PROPERTY(QQmlListProperty<QDeclarativeNdefFilter> filter READ filter NOTIFY filterChanged)
Q_PROPERTY(bool orderMatch READ orderMatch WRITE setOrderMatch NOTIFY orderMatchChanged)
+ Q_PROPERTY(bool polling READ polling WRITE setPolling NOTIFY pollingChanged)
Q_INTERFACES(QQmlParserStatus)
@@ -77,13 +78,22 @@ public:
void classBegin() { }
void componentComplete();
+ bool polling() const;
+ void setPolling(bool on);
+
signals:
void messageRecordsChanged();
void filterChanged();
void orderMatchChanged();
+ void pollingChanged();
+
+ void tagFound();
+ void tagRemoved();
private slots:
void _q_handleNdefMessage(const QNdefMessage &message);
+ void _q_handleTargetLost(QNearFieldTarget*);
+ void _q_handleTargetDetected(QNearFieldTarget*);
private:
QList<QQmlNdefRecord *> m_message;
@@ -94,6 +104,7 @@ private:
QNearFieldManager *m_manager;
int m_messageHandlerId;
+ bool m_polling;
void registerMessageHandler();