From 2a803ddcf479ba70b08b199e0448521969796a14 Mon Sep 17 00:00:00 2001
From: Philippe Lelong <lelong.ph@meltemus.com>
Date: Fri, 16 Dec 2016 09:21:21 +0100
Subject: [PATCH] websockets mechanism implemented

Signed-off-by: Philippe Lelong <lelong.ph@meltemus.com>
---
 HomeScreen/qml/Home.qml                       |  16 +-
 HomeScreen/qml/MediaAreaBlank.qml             |   4 +
 HomeScreen/qml/StatusArea.qml                 |   1 +
 HomeScreen/qml/images/Utility_Logo_Red-01.png | Bin 0 -> 7306 bytes
 HomeScreen/qml/images/images.qrc              |   1 +
 HomeScreen/src/main.cpp                       |   5 +-
 HomeScreen/src2/usermanagement.cpp            | 279 +++++++++++++++++++++++---
 HomeScreen/src2/usermanagement.h              |  63 +++++-
 8 files changed, 328 insertions(+), 41 deletions(-)
 create mode 100644 HomeScreen/qml/images/Utility_Logo_Red-01.png

diff --git a/HomeScreen/qml/Home.qml b/HomeScreen/qml/Home.qml
index 8753d29..63bb385 100644
--- a/HomeScreen/qml/Home.qml
+++ b/HomeScreen/qml/Home.qml
@@ -51,6 +51,17 @@ Item {
         anchors.topMargin: 20
         source: './images/visa.png'
         visible: false
+        Label {
+            id: cardNumber
+            anchors.top: parent.bottom
+            anchors.topMargin: 10
+            anchors.horizontalCenter: parent.horizontalCenter
+            horizontalAlignment:  Text.AlignHCenter
+            color: "white"
+            text: "111"
+            font.pixelSize: 20
+            font.family: "Roboto"
+        }
     }
     Item {
         id: hello
@@ -62,7 +73,7 @@ Item {
             id: helloText
             anchors.centerIn: parent
             color: "white"
-            text: "Hello José!"
+            text: ""
             font.pixelSize: 40
             font.family: "Roboto"
             SequentialAnimation on font.letterSpacing {
@@ -95,8 +106,9 @@ Item {
         sign90.visible = show
     }
 
-    function showVisa(show) {
+    function showVisa(show, num) {
         visa.visible = show
+        cardNumber.text = num;
     }
     GridView {
         anchors.centerIn: parent
diff --git a/HomeScreen/qml/MediaAreaBlank.qml b/HomeScreen/qml/MediaAreaBlank.qml
index 3d53061..48595eb 100644
--- a/HomeScreen/qml/MediaAreaBlank.qml
+++ b/HomeScreen/qml/MediaAreaBlank.qml
@@ -23,7 +23,11 @@ Image {
     source: './images/Utility_Logo_Background-01.png'
 
     Image {
+        objectName: "Logo_colour"
         anchors.centerIn: parent
         source: './images/Utility_Logo_Colour-01.png'
+        function setImage(imagePath) {
+            source = imagePath
+        }
     }
 }
diff --git a/HomeScreen/qml/StatusArea.qml b/HomeScreen/qml/StatusArea.qml
index 12d0d46..3d55947 100644
--- a/HomeScreen/qml/StatusArea.qml
+++ b/HomeScreen/qml/StatusArea.qml
@@ -144,6 +144,7 @@ Item {
                     }
                 }
             }
+            Component.onCompleted: root.languageChanged("en")
         }
         ColumnLayout {
             id: icons
diff --git a/HomeScreen/qml/images/Utility_Logo_Red-01.png b/HomeScreen/qml/images/Utility_Logo_Red-01.png
new file mode 100644
index 0000000000000000000000000000000000000000..8c49068373a2bbd218aef1ff1074e8b6ec2ae623
GIT binary patch
literal 7306
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

literal 0
HcmV?d00001

diff --git a/HomeScreen/qml/images/images.qrc b/HomeScreen/qml/images/images.qrc
index 2d8e902..1323107 100644
--- a/HomeScreen/qml/images/images.qrc
+++ b/HomeScreen/qml/images/images.qrc
@@ -6,5 +6,6 @@
         <file>Utility_Music_Background-01.png</file>
         <file>Utility_Radio_Background-01.png</file>
         <file>AGL_HMI_Background_NoCar-01.png</file>
+        <file>Utility_Logo_Red-01.png</file>
     </qresource>
 </RCC>
diff --git a/HomeScreen/src/main.cpp b/HomeScreen/src/main.cpp
index 4e928c6..37648a0 100644
--- a/HomeScreen/src/main.cpp
+++ b/HomeScreen/src/main.cpp
@@ -75,10 +75,7 @@ int main(int argc, char *argv[])
     engine.rootContext()->setContextProperty("layoutHandler", layoutHandler);
 
     engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
-    QObject *home = engine.rootObjects().first()->findChild<QObject *>("Home");
-    QObject *shortcutArea = engine.rootObjects().first()->findChild<QObject *>("ShortcutArea");
-    QObject *statusArea = engine.rootObjects().first()->findChild<QObject *>("StatusArea");
-    UserManagement userManagement(home, shortcutArea, statusArea);
+    UserManagement userManagement(engine.rootObjects().first());
     Q_UNUSED(userManagement);
     return a.exec();
 }
diff --git a/HomeScreen/src2/usermanagement.cpp b/HomeScreen/src2/usermanagement.cpp
index f973001..54aff23 100644
--- a/HomeScreen/src2/usermanagement.cpp
+++ b/HomeScreen/src2/usermanagement.cpp
@@ -1,62 +1,281 @@
 #include "usermanagement.h"
 #include <QApplication>
 #include <QDebug>
-UserManagement::UserManagement(QObject *home, QObject *shortcutArea, QObject *statusArea) : QObject()
+#include <QtCore/QJsonDocument>
+#include <QByteArray>
+UserManagement::UserManagement(QObject *root) : QObject()
 {
-    this->home = home;
+    home = root->findChild<QObject *>("Home");
+    logo = root->findChild<QObject *>("Logo_colour");
+    shortcutArea = root->findChild<QObject *>("ShortcutArea");
+    statusArea = root->findChild<QObject *>("StatusArea");
     this->appModel = home->findChild<ApplicationModel *>("ApplicationModel");
-    this->shortcutArea = shortcutArea;
-    this->statusArea = statusArea;
-    this->currentLanguage = "en";
+    sequence = 0;
+#ifdef REAL_SERVER
+    connectWebsockets();
+#else
+    pSocket = NULL;
     connect(&timerTest, SIGNAL(timeout()), this, SLOT(slot_timerTest()));
     timerTest.setSingleShot(false);
     timerTest.start(5000);
-    connectWebsockets(QStringLiteral("wss://echo.websocket.org"));
+    launchServer();
+#endif
 }
-void UserManagement::slot_timerTest()
+void UserManagement::setUser(const User &user)
 {
-    if(currentLanguage == "fr")
-        currentLanguage = "en";
-    else
-        currentLanguage = "fr";
-    appModel->changeLanguage(currentLanguage);
+    appModel->changeLanguage(user.graphPreferredLanguage);
+    QMetaObject::invokeMethod(logo, "setImage", Q_ARG(QVariant, "./images/Utility_Logo_Colour-01.png"));
     QMetaObject::invokeMethod(home, "languageChanged");
-    QMetaObject::invokeMethod(shortcutArea, "languageChanged", Q_ARG(QVariant, currentLanguage));
-    QMetaObject::invokeMethod(statusArea, "languageChanged", Q_ARG(QVariant, currentLanguage));
-    if(currentLanguage == "fr") {
-        QLocale::setDefault(QLocale("fr_FR"));
-        QMetaObject::invokeMethod(home, "showSign90", Q_ARG(QVariant, true));
-        QMetaObject::invokeMethod(home, "showVisa", Q_ARG(QVariant, false));
-        QMetaObject::invokeMethod(home, "showHello", Q_ARG(QVariant, "Bonjour José!"));
-    } else {
-        QLocale::setDefault(QLocale("en_US"));
-        QMetaObject::invokeMethod(home, "showSign90", Q_ARG(QVariant, false));
-        QMetaObject::invokeMethod(home, "showVisa", Q_ARG(QVariant, true));
-        QMetaObject::invokeMethod(home, "showHello", Q_ARG(QVariant, "Hello José!"));
-    }
-}
-void UserManagement::connectWebsockets(const QUrl &url)
+    QMetaObject::invokeMethod(shortcutArea, "languageChanged", Q_ARG(QVariant, user.graphPreferredLanguage));
+    QMetaObject::invokeMethod(statusArea, "languageChanged", Q_ARG(QVariant, user.graphPreferredLanguage));
+    QMetaObject::invokeMethod(home, "showSign90", Q_ARG(QVariant, true));
+    QMetaObject::invokeMethod(home, "showVisa", Q_ARG(QVariant, true), Q_ARG(QVariant, "---- ---- ---- " + user.ccNumberMasked));
+    const QString welcome = QString("%1").arg(user.graphPreferredLanguage == "fr" ? "Bonjour " : "Hello") + " ";
+    QMetaObject::invokeMethod(home, "showHello", Q_ARG(QVariant, welcome + user.first_name));
+}
+void UserManagement::connectWebsockets()
 {
+#ifdef REAL_SERVER
+    const QUrl url(REAL_SERVER);
+#else
+    const QUrl url(QStringLiteral("ws://localhost:1234"));
+#endif
     QSslConfiguration config = QSslConfiguration::defaultConfiguration();
     config.setProtocol(QSsl::SecureProtocols);
     webSocket.setSslConfiguration(config);
     connect(&webSocket, &QWebSocket::connected, this, &UserManagement::onConnected);
     connect(&webSocket, &QWebSocket::disconnected, this, &UserManagement::onClosed);
+    if(!connect(&webSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onWebSocketError(QAbstractSocket::SocketError)))) {
+        qWarning() << "Failed to connect to QWebSocket::error";
+    }
     webSocket.open(QUrl(url));
 }
+void UserManagement::onWebSocketError(QAbstractSocket::SocketError)
+{
+    qWarning()<<"Websocket error:" << webSocket.errorString();
+}
+
 void UserManagement::onConnected()
 {
     connect(&webSocket, &QWebSocket::textMessageReceived,
             this, &UserManagement::onTextMessageReceived);
-    webSocket.sendTextMessage(QStringLiteral("Hello, world!"));
-
+    QVariantList list;
+    QByteArray json;
+    list << 2 << QString().setNum(++sequence) << "agl-identity-agent/subscribe" << true;
+    listToJson(list, &json);
+    webSocket.sendTextMessage(QString(json));
+    list .clear();
+    list << 2 << QString().setNum(++sequence) << "agl-identity-agent/scan" << true;
+    listToJson(list, &json);
+    webSocket.sendTextMessage(QString(json));
 }
 void UserManagement::onTextMessageReceived(QString message)
 {
-    qWarning()<<"message received:"<<message;
+    QVariantList list;
+    const bool ok = jsonToList(message.toUtf8(), &list);
+    if(!ok || list.size() < 3) {
+        qWarning()<<"error 1 decoding json"<<list.size()<<message;
+        return;
+    }
+    QVariantMap map  = list.at(2).toMap();
+    if(list.first().toInt() == 5) {
+        QMetaObject::invokeMethod(logo, "setImage", Q_ARG(QVariant, "./images/Utility_Logo_Red-01.png"));
+        map = map["data"].toMap();
+        if(map["eventName"].toString() == "login") {
+            //qWarning()<<"login received in client";
+            list.clear();
+            list << 2 << QString().setNum(++sequence) << "agl-identity-agent/get" << true;
+            listToJson(list, &data);
+            QTimer::singleShot(300, this, SLOT(slot_sendData()));
+        }
+        return;
+    }
+    if(list.first().toInt() == 3) {
+        if(!map.contains("response")) {
+            return;
+        }
+        map = map["response"].toMap();
+        User user;
+        user.postal_address = map["postal_address"].toString();
+        QStringList temp  = map["loc"].toString().split(",");
+        if(temp.size() == 2) {
+            user.loc.setX(temp.at(0).toDouble());
+            user.loc.setY(temp.at(1).toDouble());
+        }
+        user.country = map["country"].toString();
+        user.mail = map["mail"].toString();
+        user.city = map["city"].toString();
+        user.graphEmail = map["graphEmail"].toString();
+        user.graphPreferredLanguage = map["graphPreferredLanguage"].toString();
+        user.ccNumberMasked = map["ccNumberMasked"].toString();
+        user.ccExpYear = map["ccExpYear"].toString();
+        user.ccExpMonth = map["ccExpMonth"].toString();
+        user.description = map["description"].toString();
+        user.groups = map["groups"].toStringList();
+        user.last_name = map["last_name"].toString();
+        user.ccNumber = map["ccNumber"].toString();
+        user.house_identifier = map["house_identifier"].toString();
+        user.phone = map["phone"].toString();
+        user.name = map["name"].toString();
+        user.state = map["state"].toString();
+        user.common_name = map["common_name"].toString();
+        user.fax = map["fax"].toString();
+        user.postal_code = map["postal_code"].toString();
+        user.first_name = map["first_name"].toString();
+        user.keytoken = map["keytoken"].toString();
+        setUser(user);
+    }
+}
+void UserManagement::slot_sendData()
+{
+    webSocket.sendTextMessage(QString(data));
 }
 
 void UserManagement::onClosed()
 {
     qWarning()<<"webSocket closed";
 }
+bool UserManagement::listToJson(const QList<QVariant> &list, QByteArray *json) const
+{
+    QVariant v(list);
+    *json = QJsonDocument::fromVariant(v).toJson(QJsonDocument::Compact);
+    return true;
+}
+bool UserManagement::jsonToList(const QByteArray &buf, QList<QVariant> *list) const
+{
+    if(!list)
+        return false;
+    QJsonParseError err;
+    QVariant v = QJsonDocument::fromJson(buf, &err).toVariant();
+    if(err.error != 0) {
+        qWarning() << "Error parsing json data" << err.errorString() << buf;
+        *list = QList<QVariant>();
+        return false;
+    }
+    *list = v.toList();
+    return true;
+}
+bool UserManagement::mapToJson( const QVariantMap &map, QByteArray *json) const
+{
+    if(!json)
+        return false;
+    QVariant v(map);
+    *json = QJsonDocument::fromVariant(v).toJson(QJsonDocument::Compact);
+    return true;
+}
+bool UserManagement::jsonToMap(const QByteArray &buf, QVariantMap *map) const
+{
+    if(!map)
+        return false;
+    QJsonParseError err;
+    QVariant v = QJsonDocument::fromJson(buf, &err).toVariant();
+    if(err.error != 0) {
+        qWarning() << "Error parsing json data" << err.errorString() << buf;
+        *map = QVariantMap();
+        return false;
+    }
+    *map = v.toMap();
+    return true;
+}
+#ifndef REAL_SERVER
+void UserManagement::launchServer()
+{
+      webSocketServer = new QWebSocketServer(QStringLiteral("My Server"),
+                                              QWebSocketServer::NonSecureMode, this);
+      if(webSocketServer->listen(QHostAddress::Any, 1234)) {
+          connect(webSocketServer, &QWebSocketServer::newConnection,
+                  this, &UserManagement::onServerNewConnection);
+          connect(webSocketServer, &QWebSocketServer::closed, this, &UserManagement::onServerClosed);
+          QTimer::singleShot(100, this, SLOT(connectWebsockets()));
+      } else {
+          qWarning()<<"unable to launch webSocket server";
+      }
+}
+void UserManagement::onServerNewConnection()
+{
+    pSocket = webSocketServer->nextPendingConnection();
+    connect(pSocket, &QWebSocket::textMessageReceived, this, &UserManagement::processTextMessage, Qt::UniqueConnection);
+    connect(pSocket, &QWebSocket::binaryMessageReceived, this, &UserManagement::processBinaryMessage, Qt::UniqueConnection);
+    connect(pSocket, &QWebSocket::disconnected, this, &UserManagement::serverSocketDisconnected, Qt::UniqueConnection);
+}
+void UserManagement::processTextMessage(QString message)
+{
+    QString clientDetails_1 = "{\"postal_address\":\"201 Mission Street\",\"loc\":\"37.7914374,-122.3950694\""
+                              ",\"country\":\"USA\",\"mail\":\"bjensen@example.com\",\"city\":\"San Francisco\",\"graphEmail\":"
+                              "\"bjensen@example.com\",\"graphPreferredLanguage\":\"en\",\"ccNumberMasked\":\"-111\",\"ccExpYear\""
+                              ":\"19\",\"ccExpMonth\":\"01\",\"description\":\"Original description\",\"groups\":[],\"last_name\":\""
+                              "Jensen\",\"ccNumber\":\"111-2343-1121-111\",\"house_identifier\":\"ForgeRock\",\"phone\":\""
+                              "+1 408 555 1862\",\"name\":\"bjensen\",\"state\":\"CA\",\"common_name\":\"Barbara Jensen\",\"fax\":\""
+                              "+1 408 555 1862\",\"postal_code\":\"94105\",\"first_name\":\"Barbara\",\"keytoken\":\"a123456\"}";
+    QString clientDetails_2 = "{\"postal_address\":\"201 Mission Street\",\"loc\":\"37.7914374,-122.3950694\""
+                              ",\"country\":\"USA\",\"mail\":\"bjensen@example.com\",\"city\":\"San Francisco\",\"graphEmail\":"
+                              "\"bjensen@example.com\",\"graphPreferredLanguage\":\"fr\",\"ccNumberMasked\":\"-222\",\"ccExpYear\""
+                              ":\"19\",\"ccExpMonth\":\"01\",\"description\":\"Original description\",\"groups\":[],\"last_name\":\""
+                              "Jensen\",\"ccNumber\":\"111-2343-1121-111\",\"house_identifier\":\"ForgeRock\",\"phone\":\""
+                              "+1 408 555 1862\",\"name\":\"bjensen\",\"state\":\"CA\",\"common_name\":\"Barbara Jensen\",\"fax\":\""
+                              "+1 408 555 1862\",\"postal_code\":\"94105\",\"first_name\":\"José\",\"keytoken\":\"a123456\"}";
+    QString clientDetails = clientDetails_1;
+    if(sequence % 2 == 1)
+        clientDetails = clientDetails_2;
+    QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
+    //qDebug() << "message received in server:" << message;
+    if (!pClient)
+        return;
+    QVariantList list;
+    if(!jsonToList(message.toUtf8(), &list))
+        return;
+    if(list.size() < 2)
+        return;
+    const int messType = list.at(0).toInt();
+    const QString messId = list.at(1).toString();
+    const QString cmd = list.at(2).toString();
+    list.clear();
+    QString reply;
+    switch(messType) {
+    case 2:
+        if(cmd == "agl-identity-agent/subscribe") {
+            reply = "[3,\"999maitai999\",{\"jtype\":\"afb-reply\",\"request\":{\"status\":\"success\",\"uuid\":\"1f2f7678-6f2e-4f54-b7b5-d0d4dcbf2e41\"}}]";
+        } else if (cmd == "agl-identity-agent/get") {
+            reply = "[3,\"999maitai99\",{\"jtype\":\"afb-reply\",\"request\":{\"status\":\"success\"},\"response\":....}]";
+            reply = reply.replace("....", clientDetails);
+        } else {
+            qWarning()<<"invalid cmd received:"<<cmd;
+            return;
+        }
+        break;
+    default:
+        qWarning()<<"invalid message type"<<messType;
+        return;
+        break;
+    }
+    reply = reply.replace("999maitai999", messId);
+    pClient->sendTextMessage(reply);
+}
+void UserManagement::processBinaryMessage(QByteArray message)
+{
+    QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
+    qDebug() << "Binary Message received ????:" << message;
+    if (pClient) {
+       // pClient->sendBinaryMessage(message);
+    }
+}
+void UserManagement::serverSocketDisconnected()
+{
+    QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
+    qDebug() << "socketDisconnected:" << pClient;
+    if (pClient) {
+        pClient->deleteLater();
+    }
+}
+void UserManagement::slot_timerTest()
+{
+    if(!pSocket)
+        return;
+    pSocket->sendTextMessage("[5,\"agl-identity-agent/event\",{\"event\":\"agl-identity-agent\/event\",\"data\":{\"eventName\":\"incoming\",\"accountid\":\"D2:D4:71:0D:B5:F1\",\"nickname\":\"D2:D4:71:0D:B5:F1\"},\"jtype\":\"afb-event\"}]");
+    pSocket->sendTextMessage("[5,\"agl-identity-agent/event\",{\"event\":\"agl-identity-agent\/event\",\"data\":{\"eventName\":\"login\",\"accountid\":\"null\"},\"jtype\":\"afb-event\"}]");
+}
+void UserManagement::onServerClosed()
+{
+    qWarning()<<"websocket server closed";
+}
+#endif
diff --git a/HomeScreen/src2/usermanagement.h b/HomeScreen/src2/usermanagement.h
index 099c991..382d1ac 100644
--- a/HomeScreen/src2/usermanagement.h
+++ b/HomeScreen/src2/usermanagement.h
@@ -1,32 +1,85 @@
 #ifndef USERMANAGEMENT_H
 #define USERMANAGEMENT_H
 
+#define REAL_SERVER "ws://your_server.com:1234"
+
 #include <QObject>
 #include "applicationmodel.h"
 #include <QTimer>
+#include <QPointF>
 #include <QtWebSockets/QWebSocket>
+#ifndef REAL_SERVER
+#include <QtWebSockets/QWebSocketServer>
+#endif
+struct User {
+    QString postal_address;
+    QPointF loc;
+    QString country;
+    QString mail;
+    QString city;
+    QString graphEmail;
+    QString graphPreferredLanguage;
+    QString ccNumberMasked;
+    QString ccExpYear;
+    QString ccExpMonth;
+    QString description;
+    QStringList groups;
+    QString last_name;
+    QString ccNumber;
+    QString house_identifier;
+    QString phone;
+    QString name;
+    QString state;
+    QString common_name;
+    QString fax;
+    QString postal_code;
+    QString first_name;
+    QString keytoken;
+};
+
 class UserManagement : public QObject
 {
     Q_OBJECT
 public:
-    explicit UserManagement(QObject *home, QObject *shortcutArea, QObject *statusArea);
+    explicit UserManagement(QObject *root);
 
 signals:
 
 public slots:
-    void slot_timerTest();
+    void connectWebsockets();
     void onConnected();
     void onClosed();
     void onTextMessageReceived(QString message);
+    void onWebSocketError(QAbstractSocket::SocketError);
+    void slot_sendData();
+#ifndef REAL_SERVER
+    void onServerNewConnection();
+    void onServerClosed();
+    void processBinaryMessage(QByteArray message);
+    void processTextMessage(QString message);
+    void serverSocketDisconnected();
+    void slot_timerTest();
+#endif
 private:
     QObject *home;
     QObject *shortcutArea;
     QObject *statusArea;
+    QObject *logo;
+    QByteArray data;
     ApplicationModel *appModel;
-    QTimer timerTest;
-    QString currentLanguage;
     QWebSocket webSocket;
-    void connectWebsockets(const QUrl &url);
+    int sequence;
+    bool jsonToMap(const QByteArray &buf, QVariantMap *map) const;
+    bool mapToJson(const QVariantMap &map, QByteArray *json) const;
+    bool jsonToList(const QByteArray &buf, QList<QVariant> *list) const;
+    bool listToJson(const QList<QVariant> &list, QByteArray *json) const;
+    void setUser(const User &user);
+#ifndef REAL_SERVER
+    QTimer timerTest;
+    QWebSocket *pSocket;
+    QWebSocketServer *webSocketServer;
+    void launchServer();
+#endif
 };
 
 #endif // USERMANAGEMENT_H
-- 
2.16.6