diff options
author | Fabian Bumberger <fbumberger@rim.com> | 2014-06-26 00:53:48 +0200 |
---|---|---|
committer | Fabian Bumberger <fbumberger@rim.com> | 2014-07-02 14:41:26 +0200 |
commit | 5eec86183c1d2b593be7485b8a301882d29b2600 (patch) | |
tree | dd8c654aa13168b1dfb6224cd3ae5d96abd70e60 /src/nfc | |
parent | 0477e01feb9b6620c911402bf7ed5ccf783195d2 (diff) |
Implement tag detected and tag lost signals
This patch also implements reading the record pathes from the tag.
Change-Id: Ia19ff235149cb91d3cbf7ae7c043d07d6aeae429
Reviewed-by: Alex Blasche <alexander.blasche@digia.com>
Diffstat (limited to 'src/nfc')
-rw-r--r-- | src/nfc/qnearfieldmanager_neard.cpp | 31 | ||||
-rw-r--r-- | src/nfc/qnearfieldmanager_neard_p.h | 4 | ||||
-rw-r--r-- | src/nfc/qnearfieldtarget_neard_p.h | 52 |
3 files changed, 72 insertions, 15 deletions
diff --git a/src/nfc/qnearfieldmanager_neard.cpp b/src/nfc/qnearfieldmanager_neard.cpp index b91b6b04..faa3c9aa 100644 --- a/src/nfc/qnearfieldmanager_neard.cpp +++ b/src/nfc/qnearfieldmanager_neard.cpp @@ -233,14 +233,37 @@ void QNearFieldManagerPrivateImpl::propertyChanged(QString property, QDBusVarian QDBusObjectPath path; tags >> path; tagList.append(path.path()); - qCDebug(QT_NFC_NEARD) << "New tag" << path.path(); - NearFieldTarget<QNearFieldTarget> *nfTag = - new NearFieldTarget<QNearFieldTarget>(this, path); - emit targetDetected(nfTag); + + // If a tag is not in the tags list we detected a new tag + if (!m_activeTags.value(path.path())) { + NearFieldTarget<QNearFieldTarget> *nfTag = + new NearFieldTarget<QNearFieldTarget>(this, path); + connect(nfTag, SIGNAL(destroyed(QObject*)), this, SLOT(tagDeleted(QObject*))); + emit targetDetected(nfTag); + m_activeTags.insert(path.path(), nfTag); + } } + //Look if a tag was lost + foreach (const QString &target, m_activeTags.keys()) { + if (!tagList.contains(target)) { + emit targetLost(m_activeTags.value(target)); + m_activeTags.remove(target); + } + } + tags.endArray(); qCDebug(QT_NFC_NEARD) << "Tag list changed" << tagList; } } +void QNearFieldManagerPrivateImpl::tagDeleted(QObject *obj) +{ + if (obj == 0) + return; + + const QString key = m_activeTags.key(static_cast<QNearFieldTarget*>(obj)); + if (!key.isEmpty()) + m_activeTags.remove(key); +} + QT_END_NAMESPACE diff --git a/src/nfc/qnearfieldmanager_neard_p.h b/src/nfc/qnearfieldmanager_neard_p.h index 4984a531..a7433c8f 100644 --- a/src/nfc/qnearfieldmanager_neard_p.h +++ b/src/nfc/qnearfieldmanager_neard_p.h @@ -48,6 +48,7 @@ #include <QDBusObjectPath> #include <QDBusVariant> +#include <QMap> class OrgNeardAdapterInterface; class OrgNeardManagerInterface; @@ -81,12 +82,13 @@ public: private Q_SLOTS: void tagFound(const QDBusObjectPath&); void propertyChanged(QString,QDBusVariant); + void tagDeleted(QObject*); private: QString m_adapterPath; OrgNeardAdapterInterface *m_adapter; OrgNeardManagerInterface *m_manager; - + QMap<QString, QNearFieldTarget*> m_activeTags; }; QT_END_NAMESPACE diff --git a/src/nfc/qnearfieldtarget_neard_p.h b/src/nfc/qnearfieldtarget_neard_p.h index ba57c044..4ed596a0 100644 --- a/src/nfc/qnearfieldtarget_neard_p.h +++ b/src/nfc/qnearfieldtarget_neard_p.h @@ -42,8 +42,12 @@ #ifndef QNEARFIELDTARGET_NEARD_P_H #define QNEARFIELDTARGET_NEARD_P_H +#include <QDBusObjectPath> +#include <QDBusVariant> + #include <qnearfieldtarget.h> #include <qnearfieldtarget_p.h> +#include <qndefrecord.h> #include <qndefmessage.h> #include "neard/tag_p.h" @@ -52,8 +56,6 @@ QT_BEGIN_NAMESPACE Q_DECLARE_LOGGING_CATEGORY(QT_NFC_NEARD) -#define TAG_NAME_BUFFER 64 - template <typename T> class NearFieldTarget : public T { @@ -83,8 +85,6 @@ public: m_type = QNearFieldTarget::NfcTagType4; qCDebug(QT_NFC_NEARD) << "Type" << type << m_type; - - } ~NearFieldTarget() @@ -121,12 +121,35 @@ public: QNearFieldTarget::RequestId readNdefMessages() { -// QNearFieldTarget::RequestId requestId = QNearFieldTarget::RequestId(new QNearFieldTarget::RequestIdPrivate()); -// QMetaObject::invokeMethod(this, "requestCompleted", Qt::QueuedConnection, -// Q_ARG(const QNearFieldTarget::RequestId, requestId)); -// return requestId; - emit QNearFieldTarget::error(QNearFieldTarget::UnsupportedError, QNearFieldTarget::RequestId()); - return QNearFieldTarget::RequestId(); + if (isValid()) { + QDBusPendingReply<QVariantMap> reply = m_tagInterface->GetProperties(); + reply.waitForFinished(); + if (reply.isError()) { + emit QNearFieldTarget::error(QNearFieldTarget::UnknownError, QNearFieldTarget::RequestId()); + return QNearFieldTarget::RequestId(); + } + + const QDBusArgument &recordPaths = qvariant_cast<QDBusArgument>(reply.value().value(QStringLiteral("Records"))); + + QNdefMessage newNdefMessage; + recordPaths.beginArray(); + while (!recordPaths.atEnd()) { + QDBusObjectPath path; + recordPaths >> path; + newNdefMessage.append(readRecord(path)); + } + recordPaths.endArray(); + + emit QNearFieldTarget::ndefMessageRead(newNdefMessage); + + QNearFieldTarget::RequestId requestId = QNearFieldTarget::RequestId(new QNearFieldTarget::RequestIdPrivate()); + QMetaObject::invokeMethod(this, "requestCompleted", Qt::QueuedConnection, + Q_ARG(const QNearFieldTarget::RequestId, requestId)); + return requestId; + } else { + emit QNearFieldTarget::error(QNearFieldTarget::UnsupportedError, QNearFieldTarget::RequestId()); + return QNearFieldTarget::RequestId(); + } } QNearFieldTarget::RequestId sendCommand(const QByteArray &command) @@ -145,10 +168,19 @@ public: QNearFieldTarget::RequestId writeNdefMessages(const QList<QNdefMessage> &messages) { + Q_UNUSED(messages); emit QNearFieldTarget::error(QNearFieldTarget::UnsupportedError, QNearFieldTarget::RequestId()); return QNearFieldTarget::RequestId(); } +private: + QNdefRecord readRecord(QDBusObjectPath path) + { + Q_UNUSED(path); + // TODO + return QNdefRecord(); + } + protected: OrgNeardTagInterface *m_tagInterface; QNearFieldTarget::Type m_type; |