8352660868edfb4b0ad0a262d4a36754211b944f
[apps/homescreen.git] / homescreen / src / aglsocketwrapper.cpp
1 #include "aglsocketwrapper.h"
2 #include "constants.h"
3
4 #include <QWebSocket>
5 #include <QUuid>
6 #include <QJsonArray>
7 #include <QJsonObject>
8 #include <QJsonDocument>
9
10 #include <QDebug>
11
12 namespace {
13 enum MessageTypes {
14     Call = 2,
15     Success = 3,
16     Error = 4,
17     Event = 5
18 };
19 }
20
21 AglSocketWrapper::AglSocketWrapper(QObject *parent) :
22     QObject(parent)
23   , m_socket(new QWebSocket(QString(), QWebSocketProtocol::VersionLatest, this))
24 {
25     connect(m_socket, &QWebSocket::connected, this, &AglSocketWrapper::connected);
26     connect(m_socket, &QWebSocket::disconnected, this, &AglSocketWrapper::disconnected);
27     connect(m_socket, QOverload<QAbstractSocket::SocketError>::of(&QWebSocket::error),
28             [](QAbstractSocket::SocketError error) -> void {
29         qWarning() << "AglSocketWrapper internal socket error" << error;
30     });
31     connect(m_socket, &QWebSocket::textMessageReceived,
32             this, [this](const QString &msg) -> void {
33         const QJsonDocument doc = QJsonDocument::fromJson(msg.toUtf8());
34         if (doc.isArray()) {
35             const QJsonArray msgArray = doc.array();
36             if (msgArray.count() >= 3) {
37                 const int msgType = msgArray.at(0).toInt();
38                 switch (msgType) {
39                 case Success:
40                 case Error: {
41                     auto callbackIt = m_callbacks.find( msgArray.at(1).toString());
42                     if (callbackIt != m_callbacks.constEnd()) {
43                         (*callbackIt)(msgType == Success, msgArray.at(2));
44                         m_callbacks.erase(callbackIt);
45                     }
46                 }
47                     break;
48                 case Event: {
49                     const QJsonObject eventObj = msgArray.at(2).toObject();
50                     emit eventReceived(msgArray.at(1).toString(), eventObj.value(vshl::DATA_TAG));
51                 }
52                     break;
53                 default:
54                     break;
55                 }
56                 return;
57             }
58         }
59         qWarning() << "Unsupported message format:" << msg;
60     });
61 }
62
63 void AglSocketWrapper::open(const QUrl &url)
64 {
65     m_socket->open(url);
66 }
67
68 void AglSocketWrapper::close()
69 {
70     m_socket->close();
71 }
72
73 void AglSocketWrapper::apiCall(const QString &api, const QString &verb, const QJsonValue &args,
74                                AglSocketWrapper::ApiCallback callback)
75 {
76     const QString id = QUuid::createUuid().toString();
77     if (callback)
78         m_callbacks.insert(id, callback);
79
80     QJsonArray callData;
81     callData.append(Call);
82     callData.append(id);
83     callData.append(api + QLatin1String("/") + verb);
84     callData.append(args);
85
86     const QString msg = QLatin1String(QJsonDocument(callData).toJson(QJsonDocument::Compact));
87     m_socket->sendTextMessage(msg);
88
89     qDebug() << Q_FUNC_INFO << "Data sent:" << msg;
90 }