From e983a12aa84a154896a01844879ce107f44ff77f Mon Sep 17 00:00:00 2001 From: Daniel Schukies Date: Sat, 17 Nov 2018 11:49:37 +0100 Subject: [PATCH] Add server project --- ScreenPlay.pro | 3 +- ScreenPlayServer/ScreenPlayServer.pro | 28 ++++++ ScreenPlayServer/main.cpp | 31 +++++++ ScreenPlayServer/src/aimberserver.cpp | 125 ++++++++++++++++++++++++++ ScreenPlayServer/src/aimberserver.h | 40 +++++++++ 5 files changed, 226 insertions(+), 1 deletion(-) create mode 100644 ScreenPlayServer/ScreenPlayServer.pro create mode 100644 ScreenPlayServer/main.cpp create mode 100644 ScreenPlayServer/src/aimberserver.cpp create mode 100644 ScreenPlayServer/src/aimberserver.h diff --git a/ScreenPlay.pro b/ScreenPlay.pro index b2e07a5a..e801d656 100644 --- a/ScreenPlay.pro +++ b/ScreenPlay.pro @@ -7,7 +7,8 @@ SUBDIRS = \ ScreenPlay/ThirdParty/qt-google-analytics/qt-google-analytics.pro \ ScreenPlay/ThirdParty/stomt-qt-sdk/sdk/stomt-qt-sdk.pro \ ScreenPlayWidget/ScreenPlayWidget.pro \ - ScreenPlayWorkshop/ScreenPlayWorkshop.pro + ScreenPlayWorkshop/ScreenPlayWorkshop.pro \ + ScreenPlayServer ScreenPlayWindow.depends = ScreenPlaySDK ScreenPlayWidget.depends = ScreenPlaySDK diff --git a/ScreenPlayServer/ScreenPlayServer.pro b/ScreenPlayServer/ScreenPlayServer.pro new file mode 100644 index 00000000..baa9954c --- /dev/null +++ b/ScreenPlayServer/ScreenPlayServer.pro @@ -0,0 +1,28 @@ +QT -= gui + +CONFIG += c++17 console +QT += sql websockets network +CONFIG -= app_bundle + +# The following define makes your compiler emit warnings if you use +# any feature of Qt which as been marked deprecated (the exact warnings +# depend on your compiler). Please consult the documentation of the +# deprecated API in order to know how to port your code away from it. +DEFINES += QT_DEPRECATED_WARNINGS + +# You can also make your code fail to compile if you use deprecated APIs. +# In order to do so, uncomment the following line. +# You can also select to disable deprecated APIs only up to a certain version of Qt. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 + +SOURCES += \ + main.cpp \ + src/aimberserver.cpp + +# Default rules for deployment. +qnx: target.path = /tmp/$${TARGET}/bin +else: unix:!android: target.path = /opt/$${TARGET}/bin +!isEmpty(target.path): INSTALLS += target + +HEADERS += \ + src/aimberserver.h diff --git a/ScreenPlayServer/main.cpp b/ScreenPlayServer/main.cpp new file mode 100644 index 00000000..fc3eb13c --- /dev/null +++ b/ScreenPlayServer/main.cpp @@ -0,0 +1,31 @@ +#include +#include +#include + +#include +#include +#include +#include + +#include "src/aimberserver.h" + +int main(int argc, char *argv[]) +{ + QCoreApplication a(argc, argv); + + AimberServer ps(16395); +/* + QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL"); + db.setHostName("localhost"); + db.setDatabaseName("ProtoLogin"); + db.setUserName("CommunityUser"); + //db.setPassword("windowsPW2"); + qDebug() << "Open Database " << db.open(); + + QSqlQueryModel* model = new QSqlQueryModel(); + model->setQuery("SELECT * FROM public.\"User\""); + qDebug() << model->rowCount(); +*/ + + return a.exec(); +} diff --git a/ScreenPlayServer/src/aimberserver.cpp b/ScreenPlayServer/src/aimberserver.cpp new file mode 100644 index 00000000..06564858 --- /dev/null +++ b/ScreenPlayServer/src/aimberserver.cpp @@ -0,0 +1,125 @@ +#include "aimberserver.h" +//#include +//#include . + + +AimberServer::AimberServer(int port, QObject* parent) : QObject(parent) +{ + /** --------- SSL --------- **/ +/* + QSslConfiguration sslConfiguration; + + // Create a cert & key + // https://developer.salesforce.com/blogs/developer-relations/2011/05/generating-valid-self-signed-certificates.html + QFile certFile(QStringLiteral("server.crt")); + QFile keyFile(QStringLiteral("server.key")); + + certFile.open(QIODevice::ReadOnly); + keyFile.open(QIODevice::ReadOnly); + + QSslCertificate certificate(&certFile, QSsl::Pem); + + if(certificate.isNull()) + { + qDebug() << "Invalid certificate!"; + } + + QSslKey sslKey(&keyFile, QSsl::Rsa,QSsl::Pem, QSsl::PrivateKey, QByteArray("1234")); + if(sslKey.isNull()) + { + qDebug() << "Invalid key!"; + } + + certFile.close(); + keyFile.close(); + sslConfiguration.setPeerVerifyMode(QSslSocket::VerifyNone); + sslConfiguration.setLocalCertificate(certificate); + sslConfiguration.setPrivateKey(sslKey); + sslConfiguration.setProtocol(QSsl::SecureProtocols); + +*/ + /** --------- SocketServer --------- **/ + + m_pWebSocketServer = new QWebSocketServer(QStringLiteral("Community Login Server"), QWebSocketServer::NonSecureMode, this); + + //m_pWebSocketServer->setSslConfiguration(sslConfiguration); + + if (m_pWebSocketServer->listen(QHostAddress::LocalHost, port)) + { + qDebug() << "SSL Echo Server listening on port" << port; + connect(m_pWebSocketServer, &QWebSocketServer::newConnection, this, &AimberServer::onNewConnection); + connect(m_pWebSocketServer, &QWebSocketServer::sslErrors, this, &AimberServer::onSslErrors); + } + + //community::Login Login; + //Login.set_password("test"); +} + +AimberServer::~AimberServer() +{ + m_pWebSocketServer->close(); + qDeleteAll(m_clients.begin(), m_clients.end()); +} + +void AimberServer::onNewConnection() +{ + QWebSocket* pSocket = m_pWebSocketServer->nextPendingConnection(); + + qDebug() << "Client connected:" << pSocket->peerName() << pSocket->origin(); + + connect(pSocket, &QWebSocket::textMessageReceived, this, &AimberServer::processTextMessage); + connect(pSocket, &QWebSocket::binaryMessageReceived, this, &AimberServer::processBinaryMessage); + connect(pSocket, &QWebSocket::disconnected, this, &AimberServer::socketDisconnected); + + m_clients << pSocket; +} + +void AimberServer::processTextMessage(QString message) +{ + qDebug() << message; + + //google::protobuf::MessageLite m; +/* + community::MessageContainer messageContainer; + messageContainer.ParseFromString(message.toStdString()); + + for (const google::protobuf::Any& cmessage : messageContainer.message()) + { + if (cmessage.Is()) + { + //NetworkErrorDetails network_error; + //detail.UnpackTo(&network_error); + //... processing network_error ... + } + } + + + */ +} + +void AimberServer::processBinaryMessage(QByteArray message) +{ + qDebug() << "Binary Message Received"; +} + +void AimberServer::socketDisconnected() +{ + qDebug() << "Client disconnected"; + QWebSocket* pClient = qobject_cast(sender()); + + if (pClient) + { + m_clients.removeAll(pClient); + pClient->deleteLater(); + } +} + +void AimberServer::onSslErrors(const QList& errors) +{ + qDebug() << "SSL errors occurred: \n"; + + for (int i = 0; i < errors.length(); ++i) + { + qDebug() << errors.at(i).errorString(); + } +} diff --git a/ScreenPlayServer/src/aimberserver.h b/ScreenPlayServer/src/aimberserver.h new file mode 100644 index 00000000..0afec450 --- /dev/null +++ b/ScreenPlayServer/src/aimberserver.h @@ -0,0 +1,40 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//#include "Source/ProtocolBufferSub/GenCode/container.pb.h" +//#include "Source/ProtocolBufferSub/GenCode/account.pb.h" + +class AimberServer : public QObject +{ + Q_OBJECT +public: + explicit AimberServer(int port, QObject* parent = nullptr); + ~AimberServer(); + +signals: + +private slots: + void onNewConnection(); + void processTextMessage(QString message); + void processBinaryMessage(QByteArray message); + void socketDisconnected(); + void onSslErrors(const QList& errors); + +public slots: + +private: + QWebSocketServer* m_pWebSocketServer = nullptr; + QVector m_clients; + +};