X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=homescreen%2Fsrc%2Faglsocketwrapper.cpp;fp=homescreen%2Fsrc%2Faglsocketwrapper.cpp;h=8352660868edfb4b0ad0a262d4a36754211b944f;hb=0349f05f5885987952a2d8de03983b36722b264e;hp=0000000000000000000000000000000000000000;hpb=0bdd39b247661c1a0406d450d578d4ff3fd171b0;p=apps%2Fhomescreen.git diff --git a/homescreen/src/aglsocketwrapper.cpp b/homescreen/src/aglsocketwrapper.cpp new file mode 100644 index 0000000..8352660 --- /dev/null +++ b/homescreen/src/aglsocketwrapper.cpp @@ -0,0 +1,90 @@ +#include "aglsocketwrapper.h" +#include "constants.h" + +#include +#include +#include +#include +#include + +#include + +namespace { +enum MessageTypes { + Call = 2, + Success = 3, + Error = 4, + Event = 5 +}; +} + +AglSocketWrapper::AglSocketWrapper(QObject *parent) : + QObject(parent) + , m_socket(new QWebSocket(QString(), QWebSocketProtocol::VersionLatest, this)) +{ + connect(m_socket, &QWebSocket::connected, this, &AglSocketWrapper::connected); + connect(m_socket, &QWebSocket::disconnected, this, &AglSocketWrapper::disconnected); + connect(m_socket, QOverload::of(&QWebSocket::error), + [](QAbstractSocket::SocketError error) -> void { + qWarning() << "AglSocketWrapper internal socket error" << error; + }); + connect(m_socket, &QWebSocket::textMessageReceived, + this, [this](const QString &msg) -> void { + const QJsonDocument doc = QJsonDocument::fromJson(msg.toUtf8()); + if (doc.isArray()) { + const QJsonArray msgArray = doc.array(); + if (msgArray.count() >= 3) { + const int msgType = msgArray.at(0).toInt(); + switch (msgType) { + case Success: + case Error: { + auto callbackIt = m_callbacks.find( msgArray.at(1).toString()); + if (callbackIt != m_callbacks.constEnd()) { + (*callbackIt)(msgType == Success, msgArray.at(2)); + m_callbacks.erase(callbackIt); + } + } + break; + case Event: { + const QJsonObject eventObj = msgArray.at(2).toObject(); + emit eventReceived(msgArray.at(1).toString(), eventObj.value(vshl::DATA_TAG)); + } + break; + default: + break; + } + return; + } + } + qWarning() << "Unsupported message format:" << msg; + }); +} + +void AglSocketWrapper::open(const QUrl &url) +{ + m_socket->open(url); +} + +void AglSocketWrapper::close() +{ + m_socket->close(); +} + +void AglSocketWrapper::apiCall(const QString &api, const QString &verb, const QJsonValue &args, + AglSocketWrapper::ApiCallback callback) +{ + const QString id = QUuid::createUuid().toString(); + if (callback) + m_callbacks.insert(id, callback); + + QJsonArray callData; + callData.append(Call); + callData.append(id); + callData.append(api + QLatin1String("/") + verb); + callData.append(args); + + const QString msg = QLatin1String(QJsonDocument(callData).toJson(QJsonDocument::Compact)); + m_socket->sendTextMessage(msg); + + qDebug() << Q_FUNC_INFO << "Data sent:" << msg; +}