diff options
author | Raquel Medina <raquel.medina@konsulko.com> | 2020-03-18 23:56:31 +0100 |
---|---|---|
committer | Raquel Medina <raquel.medina@konsulko.com> | 2020-03-23 14:02:28 +0100 |
commit | 0ed292d3ccf93c889734960676a321d1166d3f66 (patch) | |
tree | b8d64d1685d2f4bf599ab3867a0d3ff557ff0479 /message.cpp | |
parent | 5c750385d02116a92fa4c120ccc26abb8267bc97 (diff) |
rework message hierarchy
Rework message hierarchy with the final objective
of splitting libqtappfw into several libraries.
This commit carries the following changes:
- Simplify message hierarchy, keeping abstract
Message class, adding specialization for call and
event messages, keeping ResponseMessage, and
removing all module specific specializations.
- Add MessageFactory class to create message
objects.
- Change messages life cycle: using smart pointers
and removing QObject from message hierarchy (a
Message is not a QObject anymore and thus
'deleteLater()' is not available).
- Adapt all modules to use new message hierarchy.
- Keep ResponseMessage original constructor to
avoid breaking TaskManager.
- Message constructors have been kept public, but
will go private on a follow-up patch (once
TaskManager class has been modified to use new
MessageFactory).
Bug-AGL: SPEC-3112
Signed-off-by: Raquel Medina <raquel.medina@konsulko.com>
Change-Id: I3a7a6325209ddeca2293f1ac745371861a947bfb
Diffstat (limited to 'message.cpp')
-rw-r--r-- | message.cpp | 135 |
1 files changed, 31 insertions, 104 deletions
diff --git a/message.cpp b/message.cpp index 3cd4bb9..1865f14 100644 --- a/message.cpp +++ b/message.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017 Konsulko Group + * Copyright (C) 2017-2020 Konsulko Group * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,59 +17,25 @@ #include <QDebug> #include <QJsonArray> #include <QJsonDocument> -#include <QJsonObject> -#include <QJsonValue> +#include <QWebSocket> #include "message.h" -Message::Message() - : m_init(false), m_event(false), m_reply(false) -{ -} - -bool Message::createRequest(QString api, QString verb, QJsonValue parameter) -{ - if (!m_request.isEmpty()){ - qWarning("Message instance has already been used. Cannot send another request."); - return false; - } - - m_request["msgid"] = Call; - m_request["callid"] = 0; - m_request["api"] = api; - m_request["verb"] = verb; - m_request["parameter"] = parameter; - - m_init = true; - - return true; -} - -bool Message::fromJson(QByteArray jsonData) +MessageId Message::isValid(QJsonDocument candidate) { - QJsonDocument jdoc(QJsonDocument::fromJson(jsonData)); - - if (jdoc.isNull()) { - qWarning("Imported invalid JSON: empty appfw message"); - return false; - } - - return Message::fromJDoc(jdoc); -} + MessageId id = MessageId::Invalid; -bool Message::fromJDoc(QJsonDocument jdoc) -{ // Validate message is array - if (!jdoc.isArray()) { + if (!candidate.isArray()) { qWarning("Invalid appfw message: not an array"); - return false; + return id; } - QJsonArray msg = jdoc.array(); + QJsonArray msg = candidate.array(); // Validate array is proper length if ((msg.size() < 3) || (msg.size() > 4)) { qWarning("Invalid appfw message: invalid array size"); - return false; + return id; } // Validate msgid type @@ -78,75 +44,36 @@ bool Message::fromJDoc(QJsonDocument jdoc) msgid = msg[0].toDouble(); } else { qWarning("Invalid appfw message: invalid msgid type"); - return false; + return id; } // Validate msgid element - if ((msgid < Call) || (msgid > Event)) { - qWarning("Invalid appfw message: msgid out of range"); - return false; - } - - // Validate that the payload has a request object - QJsonObject payload; - if (msg[2].isObject()) { - payload = msg[2].toObject(); - } else { - qWarning("Invalid appfw payload: no JSON object"); - return false; - } - - if ((msgid == RetOk) || (msgid == RetErr)) { - auto request_iter = payload.find("request"); - auto request = request_iter.value().toObject(); - if (request.empty()) { - qWarning("Invalid appfw reply message: empty request data"); - return false; - } - auto status_iter = request.find("status"); - auto info_iter = request.find("info"); - auto response_iter = payload.find("response"); - auto response = response_iter.value().toObject(); - m_reply_status = status_iter.value().toString(); - m_reply_info = info_iter.value().toString(); - m_reply_data = response; - m_reply = true; - } else if (msgid == Event) { - // If event, save data object - auto data_iter = payload.find("data"); - m_event_data = data_iter.value().toObject(); + if ((msgid >= static_cast<double>(MessageId::Call)) && (msgid <= static_cast<double>(MessageId::Event))) + id = static_cast<MessageId>(msgid); - auto event_iter = payload.find("event"); - auto event_string = event_iter.value().toString(); - if (event_string.isEmpty()) { - qWarning("Invalid appfw event message: empty event name"); - return false; - } - QStringList event_strings = event_string.split(QRegExp("/")); - if (event_strings.size() != 2) { - qWarning("Invalid appfw event message: malformed event name"); - return false; - } - m_event_api = event_strings[0]; - m_event_name = event_strings[1]; - m_event = true; - } - - m_jdoc = jdoc; - m_init = true; - return m_init; + return id; } -QByteArray Message::toJson(QJsonDocument::JsonFormat format) +Message::Message() + : m_init(false) { - QJsonArray array; - array.append(m_request["msgid"].toInt()); - array.append(m_request["callid"].toInt()); - array.append(m_request["api"].toString() + "/" + m_request["verb"].toString()); - array.append(m_request["parameter"].toJsonValue()); +} - QJsonDocument jdoc; - jdoc.setArray(array); +QByteArray Message::serialize(QJsonDocument::JsonFormat format) +{ + QByteArray dummy; + return dummy; + } - return jdoc.toJson(format).data(); +QByteArray Message::send(QWebSocket& transport, unsigned int id) +{ + QByteArray blob; + qint64 size = 0; + updateCallId(id); + if (m_init) + blob = serialize().data(); + if (!blob.isEmpty()) + size = transport.sendTextMessage(blob); + + return blob; } |