#pragma once #include #include #include class QTemporaryFile; class QUrlQuery; namespace FileManagement { struct ThpServerInformation { int exerciseId { 0 }; int scriptId { 0 }; qint64 uploadTime { 0 }; // msecs / epoch qint64 fileSize { 0 }; QString exerciseName; QString description; QString md5sumHex; }; class HttpException { public: HttpException(const QString &error, int status = 500) : error(error) , status(status) {} QString error; int status { 500 }; }; class LoggerFactory; class Logger : public httq::Logger { Q_OBJECT public: Logger(LoggerFactory *loggerFactory, QObject *parent); void debug(const QString &message) override; void warning(const QString &message) override; void error(const QString &message) override; private: NGL::INGLLogger &m_logger; }; class LoggerFactory : public httq::LoggerFactory { Q_OBJECT public: LoggerFactory(QObject *parent); virtual Logger *createLogger(QObject *parent); }; class ThpScriptServer : public httq::AbstractServer { Q_OBJECT public : ThpScriptServer(QObject *parent = nullptr); private: QWebSocketServer *mWsSvr; NGL::INGLLogger &m_logger; static QJsonObject noError(); bool newHttpConnection(httq::HttpRequest *request) override; virtual QWebSocketServer *webSocketServer() const override { return mWsSvr; } bool handleRequestSync(httq::HttpRequest &request) noexcept(false); bool handleRequest(httq::HttpRequest *request) noexcept(false); const QString readScriptsJsFile() const; const QString readContentFile() const; void changeList(const ThpServerInformation &tsi, httq::HttpRequest *request, bool remove); void errorHandler(httq::HttpRequest *request, const HttpException &e) const; int queryGetInt(const QUrlQuery &q, const QString &key); QString queryGetString(const QUrlQuery &q, const QString &key); LoggerFactory *createLoggerFactory() override; static QString thpDirectory(); static QString thpDirectory(int exerciseId); static QString thpFileName(int exerciseId, int scriptId); static QJsonObject toJson(const ThpServerInformation &tsi); static ThpServerInformation fromJson(const QJsonValue &val); signals: void signalBroadcastNewContentFile(); void signalBroadcastNewScriptsJsFile(); void signalBroadcastMessage(const QString &msg); void signalBroadcastMessage2(const QString &msg); }; } // namespace FileManagement