summaryrefslogtreecommitdiffstats
path: root/src/nfc
diff options
context:
space:
mode:
authorFabian Bumberger <fbumberger@rim.com>2014-06-26 00:53:48 +0200
committerFabian Bumberger <fbumberger@rim.com>2014-07-02 14:41:26 +0200
commit5eec86183c1d2b593be7485b8a301882d29b2600 (patch)
treedd8c654aa13168b1dfb6224cd3ae5d96abd70e60 /src/nfc
parent0477e01feb9b6620c911402bf7ed5ccf783195d2 (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.cpp31
-rw-r--r--src/nfc/qnearfieldmanager_neard_p.h4
-rw-r--r--src/nfc/qnearfieldtarget_neard_p.h52
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;