aboutsummaryrefslogtreecommitdiffstats
path: root/src/coap/qcoapdiscoveryreply.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/coap/qcoapdiscoveryreply.cpp')
-rw-r--r--src/coap/qcoapdiscoveryreply.cpp45
1 files changed, 44 insertions, 1 deletions
diff --git a/src/coap/qcoapdiscoveryreply.cpp b/src/coap/qcoapdiscoveryreply.cpp
index 379277a..def9d19 100644
--- a/src/coap/qcoapdiscoveryreply.cpp
+++ b/src/coap/qcoapdiscoveryreply.cpp
@@ -58,7 +58,7 @@ void QCoapDiscoveryReplyPrivate::_q_setContent(const QHostAddress &sender, const
if (QtCoap::isError(responseCode)) {
_q_setError(responseCode);
} else {
- auto res = QCoapProtocol::resourcesFromCoreLinkList(sender, message.payload());
+ auto res = QCoapDiscoveryReply::resourcesFromCoreLinkList(sender, message.payload());
resources.append(res);
emit q->discovered(q, res);
}
@@ -114,4 +114,47 @@ QVector<QCoapResource> QCoapDiscoveryReply::resources() const
return d->resources;
}
+/*!
+ Decodes the \a data received from the \a sender to a list of QCoapResource
+ objects. The \a data byte array contains the frame returned by the
+ discovery request.
+*/
+QVector<QCoapResource>
+QCoapDiscoveryReply::resourcesFromCoreLinkList(const QHostAddress &sender, const QByteArray &data)
+{
+ QVector<QCoapResource> resourceList;
+
+ QLatin1String quote = QLatin1String("\"");
+ const QList<QByteArray> links = data.split(',');
+ for (QByteArray link : links) {
+ QCoapResource resource;
+ resource.setHost(sender);
+
+ const QList<QByteArray> parameterList = link.split(';');
+ for (QByteArray parameter : parameterList) {
+ QString parameterString = QString::fromUtf8(parameter);
+ int length = parameterString.length();
+ if (parameter.startsWith('<'))
+ resource.setPath(parameterString.mid(1, length - 2));
+ else if (parameter.startsWith("title="))
+ resource.setTitle(parameterString.mid(6).remove(quote));
+ else if (parameter.startsWith("rt="))
+ resource.setResourceType(parameterString.mid(3).remove(quote));
+ else if (parameter.startsWith("if="))
+ resource.setInterface(parameterString.mid(3).remove(quote));
+ else if (parameter.startsWith("sz="))
+ resource.setMaximumSize(parameterString.mid(3).remove(quote).toInt());
+ else if (parameter.startsWith("ct="))
+ resource.setContentFormat(parameterString.mid(3).remove(quote).toUInt());
+ else if (parameter == "obs")
+ resource.setObservable(true);
+ }
+
+ if (!resource.path().isEmpty())
+ resourceList.push_back(resource);
+ }
+
+ return resourceList;
+}
+
QT_END_NAMESPACE