From 0ed292d3ccf93c889734960676a321d1166d3f66 Mon Sep 17 00:00:00 2001 From: Raquel Medina Date: Wed, 18 Mar 2020 23:56:31 +0100 Subject: 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 Change-Id: I3a7a6325209ddeca2293f1ac745371861a947bfb --- messageengine.cpp | 130 +++++++++--------------------------------------------- 1 file changed, 21 insertions(+), 109 deletions(-) (limited to 'messageengine.cpp') diff --git a/messageengine.cpp b/messageengine.cpp index 6f31d0f..2633545 100644 --- a/messageengine.cpp +++ b/messageengine.cpp @@ -14,24 +14,13 @@ * limitations under the License. */ +#include +#include + #include "message.h" +#include "messagefactory.h" #include "messageengine.h" -#include "bluetoothmessage.h" -#include "guimetadatamessage.h" -#include "hvacmessage.h" -#include "mapmessage.h" -#include "mediaplayermessage.h" -#include "navigationmessage.h" -#include "networkmessage.h" -#include "pbapmessage.h" -#include "radiomessage.h" -#include "responsemessage.h" -#include "signalcomposermessage.h" -#include "telephonymessage.h" -#include "weathermessage.h" -#include "voicemessage.h" -#include MessageEngine::MessageEngine(const QUrl &url, QObject *parent) : QObject(parent), @@ -44,31 +33,17 @@ MessageEngine::MessageEngine(const QUrl &url, QObject *parent) : m_websocket.open(url); } -unsigned int MessageEngine::requestCallId() -{ - int callid; - - m_mutex.lock(); - callid = ++m_callid; - m_mutex.unlock(); - - return callid; -} - -bool MessageEngine::sendMessage(Message *message) +bool MessageEngine::sendMessage(std::unique_ptr msg) { - if (!message->isValid()) + if (!msg) return false; - auto callid = requestCallId(); - message->setCallId(callid); - - QByteArray data = message->toJson().data(); - qint64 size = m_websocket.sendTextMessage(data); - if (size == 0) + unsigned int callid = m_callid++; + QByteArray forkeeps = msg->send(m_websocket, callid); + if (forkeeps.isEmpty()) return false; - m_calls.insert(callid, data); + m_calls.insert(callid, forkeeps); return true; } @@ -94,83 +69,20 @@ void MessageEngine::onTextMessageReceived(QString jsonStr) return; } - QJsonArray msg = jdoc.array(); - int msgid = msg[0].toInt(); + MessageId id = Message::isValid(jdoc); + if (id == MessageId::Invalid) { + qWarning() << "Received unknown message, discarding"; + return; + } - Message *message; - MessageType type; + std::shared_ptr message = MessageFactory::getInstance().createInboundMessage(id, jdoc); - switch (msgid) { - case RetOk: - case RetErr: { - auto callid = msg[1].toString().toInt(); - message = new ResponseMessage(m_calls[callid]); - type = MessageType::ResponseRequestMessage; + unsigned int callid; + if (message->isReply() && message->getCallId(&callid)) { + message->setAdditionalData(m_calls[callid]); m_calls.remove(callid); - break; - } - case Event: { - QStringList api_str_list = msg[1].toString().split(QRegExp("/")); - QString api = api_str_list[0].toLower(); - - // FIXME: This should be rewritten using a factory class with a - // parser parameter to remove API specific handling here - if (api == "bluetooth-manager") { - message = new BluetoothMessage; - type = MessageType::BluetoothEventMessage; - } else if (api == "bluetooth-pbap") { - message = new PbapMessage; - type = MessageType::PbapEventMessage; - } else if (api == "telephony") { - message = new TelephonyMessage; - type = MessageType::TelephonyEventMessage; - } else if (api == "weather") { - message = new WeatherMessage; - type = MessageType::WeatherEventMessage; - } else if (api == "mediaplayer") { - message = new MediaplayerMessage; - type = MessageType::MediaplayerEventMessage; - } else if (api == "navigation") { - message = new NavigationMessage; - type = MessageType::NavigationEventMessage; - } else if (api == "network-manager") { - message = new NetworkMessage; - type = MessageType::NetworkEventMessage; - } else if (api == "radio") { - message = new RadioMessage; - type = MessageType::RadioEventMessage; - } else if (api == "bluetooth-map") { - message = new MapMessage; - type = MessageType::MapEventMessage; - } else if (api == "vshl-core" ) { - message = new VoiceMessage; - type = MessageType::VoiceEventMessage; - } else if (api == "vshl-capabilities" ) { - // NOTE: Will need to look at event name to differentiate - // capabilities if more support (e.g. navigation or - // local media control) is added. - message = new GuiMetadataCapabilityMessage; - type = MessageType::GuiMetadataCapabilityEventMessage; - } else if (api == "signal-composer") { - message = new SignalComposerMessage; - type = MessageType::SignalComposerEventMessage; - } else if (api == "hvac") { - message = new HVACMessage; - type = MessageType::HVACEventMessage; - } else { - message = new Message; - type = MessageType::GenericMessage; - } - break; - } - default: - break; - } - - if (message->fromJDoc(jdoc) == false) { - delete message; - return; } - emit messageReceived(type, message); + if (message->isComplete()) + emit messageReceived(message); } -- cgit 1.2.3-korg