diff options
author | Fabian Bumberger <fbumberger@rim.com> | 2014-07-01 17:29:34 +0200 |
---|---|---|
committer | Fabian Bumberger <fbumberger@rim.com> | 2014-07-08 10:33:36 +0200 |
commit | 249741c0ec267bbb21cca9a2873cb068bdae6db7 (patch) | |
tree | 475140a14f6e622e24c1f69776f065b9c62d788e /src/nfc/qnearfieldtarget_neard_p.h | |
parent | fdc3a1702218657a965a0b820fdf8756d37919c8 (diff) | |
download | qtconnectivity-249741c0ec267bbb21cca9a2873cb068bdae6db7.tar.gz |
Neard: Implement tag write
Change-Id: I423658f5365ed51ccb117f5e388b93cc3ab2b8f9
Reviewed-by: Alex Blasche <alexander.blasche@digia.com>
Diffstat (limited to 'src/nfc/qnearfieldtarget_neard_p.h')
-rw-r--r-- | src/nfc/qnearfieldtarget_neard_p.h | 78 |
1 files changed, 75 insertions, 3 deletions
diff --git a/src/nfc/qnearfieldtarget_neard_p.h b/src/nfc/qnearfieldtarget_neard_p.h index f11f7158..cb489498 100644 --- a/src/nfc/qnearfieldtarget_neard_p.h +++ b/src/nfc/qnearfieldtarget_neard_p.h @@ -130,6 +130,25 @@ public: bool hasNdefMessage() { + if (isValid()) { + QDBusPendingReply<QVariantMap> reply = m_tagInterface->GetProperties(); + reply.waitForFinished(); + if (reply.isError()) + return false; + + const QDBusArgument &recordPaths = qvariant_cast<QDBusArgument>(reply.value().value(QStringLiteral("Records"))); + + recordPaths.beginArray(); + while (!recordPaths.atEnd()) { + QDBusObjectPath path; + recordPaths >> path; + if (!path.path().isEmpty()) { + recordPaths.endArray(); + return true; + } + } + recordPaths.endArray(); + } return false; } @@ -182,9 +201,62 @@ public: QNearFieldTarget::RequestId writeNdefMessages(const QList<QNdefMessage> &messages) { - Q_UNUSED(messages); - emit QNearFieldTarget::error(QNearFieldTarget::UnsupportedError, QNearFieldTarget::RequestId()); - return QNearFieldTarget::RequestId(); + if (messages.isEmpty() || messages.first().isEmpty()) { + qCWarning(QT_NFC_NEARD) << "No record specified"; + //TODO + emit QNearFieldTarget::error(QNearFieldTarget::UnsupportedError, QNearFieldTarget::RequestId()); + return QNearFieldTarget::RequestId(); + } + if (messages.count() > 1 || messages.first().count() > 1) { + // neard only supports one ndef record per tag + qCWarning(QT_NFC_NEARD) << "Writing of only one NDEF record and message is supported"; + emit QNearFieldTarget::error(QNearFieldTarget::UnsupportedError, QNearFieldTarget::RequestId()); + return QNearFieldTarget::RequestId(); + } + QNdefRecord record = messages.first().first(); + + QDBusPendingReply<> reply; + if (record.typeNameFormat() == QNdefRecord::NfcRtd) { + QVariantMap recordProperties; + if (record.isRecordType<QNdefNfcUriRecord>()) { + recordProperties.insert(QStringLiteral("Type"), QStringLiteral("URI")); + QNdefNfcUriRecord uriRecord = static_cast<QNdefNfcUriRecord>(record); + recordProperties.insert(QStringLiteral("URI"), uriRecord.uri().path()); + } else if (record.isRecordType<QNdefNfcSmartPosterRecord>()) { + recordProperties.insert(QStringLiteral("Type"), QStringLiteral("SmartPoster")); + QNdefNfcSmartPosterRecord spRecord = static_cast<QNdefNfcSmartPosterRecord>(record); + recordProperties.insert(QStringLiteral("URI"), spRecord.uri().path()); + // Currently neard only supports the uri property for writing + } else if (record.isRecordType<QNdefNfcTextRecord>()) { + recordProperties.insert(QStringLiteral("Type"), QStringLiteral("Text")); + QNdefNfcTextRecord textRecord = static_cast<QNdefNfcTextRecord>(record); + recordProperties.insert(QStringLiteral("Representation"), textRecord.text()); + recordProperties.insert(QStringLiteral("Encoding"), + textRecord.encoding() == QNdefNfcTextRecord::Utf8 ? + QStringLiteral("UTF-8") : QStringLiteral("UTF-16") ); + recordProperties.insert(QStringLiteral("Language"), textRecord.locale()); + } else { + qCWarning(QT_NFC_NEARD) << "Record type not supported for writing"; + emit QNearFieldTarget::error(QNearFieldTarget::UnsupportedError, QNearFieldTarget::RequestId()); + return QNearFieldTarget::RequestId(); + } + + reply = m_tagInterface->Write(recordProperties); + } + + reply.waitForFinished(); + if (reply.isError()) { + qCWarning(QT_NFC_NEARD) << "Error writing to NFC tag" << reply.error(); + emit QNearFieldTarget::error(QNearFieldTarget::UnknownError, QNearFieldTarget::RequestId()); + return QNearFieldTarget::RequestId(); + } + + emit QNearFieldTarget::ndefMessagesWritten(); + + QNearFieldTarget::RequestId requestId = QNearFieldTarget::RequestId(new QNearFieldTarget::RequestIdPrivate()); + QMetaObject::invokeMethod(this, "requestCompleted", Qt::QueuedConnection, + Q_ARG(const QNearFieldTarget::RequestId, requestId)); + return requestId; } private: |