diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/imports/nfc/qdeclarativenearfield.cpp | 98 | ||||
-rw-r--r-- | src/imports/nfc/qdeclarativenearfield_p.h | 11 |
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(); |