From 66263b2c54d6f34ed57eb422fc51ad80c6f1cc30 Mon Sep 17 00:00:00 2001 From: Philippe Lelong Date: Fri, 16 Dec 2016 09:21:21 +0100 Subject: [PATCH] websockets mechanism implemented Signed-off-by: Philippe Lelong --- 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 aadf6df..d8315cc 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 25c66d7..2966539 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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.png Utility_Radio_Background-01.png AGL_HMI_Background_NoCar-01.png + Utility_Logo_Red-01.png diff --git a/HomeScreen/src/main.cpp b/HomeScreen/src/main.cpp index 4d21394..f103990 100644 --- a/HomeScreen/src/main.cpp +++ b/HomeScreen/src/main.cpp @@ -59,10 +59,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("Home"); - QObject *shortcutArea = engine.rootObjects().first()->findChild("ShortcutArea"); - QObject *statusArea = engine.rootObjects().first()->findChild("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 #include -UserManagement::UserManagement(QObject *home, QObject *shortcutArea, QObject *statusArea) : QObject() +#include +#include +UserManagement::UserManagement(QObject *root) : QObject() { - this->home = home; + home = root->findChild("Home"); + logo = root->findChild("Logo_colour"); + shortcutArea = root->findChild("ShortcutArea"); + statusArea = root->findChild("StatusArea"); this->appModel = home->findChild("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:"< &list, QByteArray *json) const +{ + QVariant v(list); + *json = QJsonDocument::fromVariant(v).toJson(QJsonDocument::Compact); + return true; +} +bool UserManagement::jsonToList(const QByteArray &buf, QList *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(); + 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(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:"<sendTextMessage(reply); +} +void UserManagement::processBinaryMessage(QByteArray message) +{ + QWebSocket *pClient = qobject_cast(sender()); + qDebug() << "Binary Message received ????:" << message; + if (pClient) { + // pClient->sendBinaryMessage(message); + } +} +void UserManagement::serverSocketDisconnected() +{ + QWebSocket *pClient = qobject_cast(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 #include "applicationmodel.h" #include +#include #include +#ifndef REAL_SERVER +#include +#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 *list) const; + bool listToJson(const QList &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