Skip to content
Snippets Groups Projects
websocketserver.cpp 14.9 KiB
Newer Older
akiraohgaki's avatar
akiraohgaki committed
#include "websocketserver.h"

#include <QHostAddress>
#include <QWebSocketServer>
akiraohgaki's avatar
akiraohgaki committed
#include <QWebSocket>
#include "qtlib_json.h"

akiraohgaki's avatar
akiraohgaki committed
#include "handlers/confighandler.h"
#include "handlers/systemhandler.h"
akiraohgaki's avatar
akiraohgaki committed
#include "handlers/ocsapihandler.h"
akiraohgaki's avatar
akiraohgaki committed
#include "handlers/itemhandler.h"
#include "handlers/updatehandler.h"
#include "handlers/desktopthemehandler.h"
akiraohgaki's avatar
akiraohgaki committed

WebSocketServer::WebSocketServer(ConfigHandler *configHandler, const QString &serverName, quint16 serverPort, QObject *parent)
    : QObject(parent), configHandler_(configHandler), serverName_(serverName), serverPort_(serverPort)
akiraohgaki's avatar
akiraohgaki committed
    wsServer_ = new QWebSocketServer(serverName_, QWebSocketServer::NonSecureMode, this);
akiraohgaki's avatar
akiraohgaki committed
    connect(wsServer_, &QWebSocketServer::newConnection, this, &WebSocketServer::wsNewConnection);
    connect(wsServer_, &QWebSocketServer::closed, this, &WebSocketServer::stopped);
akiraohgaki's avatar
akiraohgaki committed

    configHandler_->setParent(this);
    systemHandler_ = new SystemHandler(this);
akiraohgaki's avatar
akiraohgaki committed
    ocsApiHandler_ = new OcsApiHandler(configHandler_, this);
akiraohgaki's avatar
akiraohgaki committed
    itemHandler_ = new ItemHandler(configHandler_, this);
    updateHandler_ = new UpdateHandler(configHandler_, this);
    desktopThemeHandler_ = new DesktopThemeHandler(this);
akiraohgaki's avatar
akiraohgaki committed
    connect(itemHandler_, &ItemHandler::metadataSetChanged, this, &WebSocketServer::itemMetadataSetChanged);
    connect(itemHandler_, &ItemHandler::downloadStarted, this, &WebSocketServer::itemDownloadStarted);
    connect(itemHandler_, &ItemHandler::downloadFinished, this, &WebSocketServer::itemDownloadFinished);
    connect(itemHandler_, &ItemHandler::downloadProgress, this, &WebSocketServer::itemDownloadProgress);
akiraohgaki's avatar
akiraohgaki committed
    connect(itemHandler_, &ItemHandler::saveStarted, this, &WebSocketServer::itemSaveStarted);
    connect(itemHandler_, &ItemHandler::saveFinished, this, &WebSocketServer::itemSaveFinished);
akiraohgaki's avatar
akiraohgaki committed
    connect(itemHandler_, &ItemHandler::installStarted, this, &WebSocketServer::itemInstallStarted);
    connect(itemHandler_, &ItemHandler::installFinished, this, &WebSocketServer::itemInstallFinished);
    connect(itemHandler_, &ItemHandler::uninstallStarted, this, &WebSocketServer::itemUninstallStarted);
    connect(itemHandler_, &ItemHandler::uninstallFinished, this, &WebSocketServer::itemUninstallFinished);
akiraohgaki's avatar
akiraohgaki committed

    connect(updateHandler_, &UpdateHandler::checkAllStarted, this, &WebSocketServer::updateCheckAllStarted);
    connect(updateHandler_, &UpdateHandler::checkAllFinished, this, &WebSocketServer::updateCheckAllFinished);
    connect(updateHandler_, &UpdateHandler::updateStarted, this, &WebSocketServer::updateUpdateStarted);
    connect(updateHandler_, &UpdateHandler::updateFinished, this, &WebSocketServer::updateUpdateFinished);
    connect(updateHandler_, &UpdateHandler::updateProgress, this, &WebSocketServer::updateUpdateProgress);
akiraohgaki's avatar
akiraohgaki committed
}

WebSocketServer::~WebSocketServer()
{
akiraohgaki's avatar
akiraohgaki committed
    stop();
akiraohgaki's avatar
akiraohgaki committed
    wsServer_->deleteLater();
akiraohgaki's avatar
akiraohgaki committed
}

bool WebSocketServer::start()
{
akiraohgaki's avatar
akiraohgaki committed
    if (wsServer_->listen(QHostAddress::Any, serverPort_)) {
akiraohgaki's avatar
akiraohgaki committed
        emit started();
        return true;
    }
    return false;
akiraohgaki's avatar
akiraohgaki committed
}

void WebSocketServer::stop()
{
akiraohgaki's avatar
akiraohgaki committed
    wsServer_->close();
akiraohgaki's avatar
akiraohgaki committed

akiraohgaki's avatar
akiraohgaki committed
bool WebSocketServer::isError() const
akiraohgaki's avatar
akiraohgaki committed
{
akiraohgaki's avatar
akiraohgaki committed
    if (wsServer_->error() != QWebSocketProtocol::CloseCodeNormal) {
akiraohgaki's avatar
akiraohgaki committed
        return true;
    }
    return false;
}

akiraohgaki's avatar
akiraohgaki committed
QString WebSocketServer::errorString() const
akiraohgaki's avatar
akiraohgaki committed
{
akiraohgaki's avatar
akiraohgaki committed
    return wsServer_->errorString();
akiraohgaki's avatar
akiraohgaki committed
}

akiraohgaki's avatar
akiraohgaki committed
QUrl WebSocketServer::serverUrl() const
akiraohgaki's avatar
akiraohgaki committed
{
akiraohgaki's avatar
akiraohgaki committed
    return wsServer_->serverUrl();
}

void WebSocketServer::wsNewConnection()
{
akiraohgaki's avatar
akiraohgaki committed
    auto *wsClient = wsServer_->nextPendingConnection();
akiraohgaki's avatar
akiraohgaki committed
    connect(wsClient, &QWebSocket::disconnected, this, &WebSocketServer::wsDisconnected);
akiraohgaki's avatar
akiraohgaki committed
    connect(wsClient, &QWebSocket::textMessageReceived, this, &WebSocketServer::wsTextMessageReceived);
    connect(wsClient, &QWebSocket::binaryMessageReceived, this, &WebSocketServer::wsBinaryMessageReceived);
akiraohgaki's avatar
akiraohgaki committed
    wsClients_ << wsClient;
}

akiraohgaki's avatar
akiraohgaki committed
void WebSocketServer::wsDisconnected()
akiraohgaki's avatar
akiraohgaki committed
{
akiraohgaki's avatar
akiraohgaki committed
    auto *wsClient = qobject_cast<QWebSocket *>(sender());
akiraohgaki's avatar
akiraohgaki committed
    if (wsClient) {
akiraohgaki's avatar
akiraohgaki committed
        wsClients_.removeAll(wsClient);
        wsClient->deleteLater();
akiraohgaki's avatar
akiraohgaki committed
    }
}

void WebSocketServer::wsTextMessageReceived(const QString &message)
{
akiraohgaki's avatar
akiraohgaki committed
    auto *wsClient = qobject_cast<QWebSocket *>(sender());
akiraohgaki's avatar
akiraohgaki committed
    if (wsClient) {
        qtlib::Json json(message.toUtf8());
akiraohgaki's avatar
akiraohgaki committed
        if (json.isObject()) {
akiraohgaki's avatar
akiraohgaki committed
            auto object = json.toObject();
akiraohgaki's avatar
akiraohgaki committed
            receiveMessage(object["id"].toString(), object["func"].toString(), object["data"].toArray());
akiraohgaki's avatar
akiraohgaki committed
void WebSocketServer::wsBinaryMessageReceived(const QByteArray &message)
akiraohgaki's avatar
akiraohgaki committed
{
akiraohgaki's avatar
akiraohgaki committed
    auto *wsClient = qobject_cast<QWebSocket *>(sender());
akiraohgaki's avatar
akiraohgaki committed
    if (wsClient) {
akiraohgaki's avatar
akiraohgaki committed
        qtlib::Json json(message);
akiraohgaki's avatar
akiraohgaki committed
        if (json.isObject()) {
akiraohgaki's avatar
akiraohgaki committed
            auto object = json.toObject();
akiraohgaki's avatar
akiraohgaki committed
            receiveMessage(object["id"].toString(), object["func"].toString(), object["data"].toArray());
akiraohgaki's avatar
akiraohgaki committed
        }
akiraohgaki's avatar
akiraohgaki committed
    }
akiraohgaki's avatar
akiraohgaki committed
}
akiraohgaki's avatar
akiraohgaki committed

akiraohgaki's avatar
akiraohgaki committed
void WebSocketServer::itemMetadataSetChanged()
{
akiraohgaki's avatar
akiraohgaki committed
    QJsonArray data;
    sendMessage("", "ItemHandler::metadataSetChanged", data);
akiraohgaki's avatar
akiraohgaki committed
}

void WebSocketServer::itemDownloadStarted(QJsonObject result)
{
akiraohgaki's avatar
akiraohgaki committed
    QJsonArray data;
akiraohgaki's avatar
akiraohgaki committed
    data.append(result);
akiraohgaki's avatar
akiraohgaki committed
    sendMessage("", "ItemHandler::downloadStarted", data);
akiraohgaki's avatar
akiraohgaki committed
}

void WebSocketServer::itemDownloadFinished(QJsonObject result)
{
akiraohgaki's avatar
akiraohgaki committed
    QJsonArray data;
akiraohgaki's avatar
akiraohgaki committed
    data.append(result);
akiraohgaki's avatar
akiraohgaki committed
    sendMessage("", "ItemHandler::downloadFinished", data);
akiraohgaki's avatar
akiraohgaki committed
}

void WebSocketServer::itemDownloadProgress(QString id, qint64 bytesReceived, qint64 bytesTotal)
{
akiraohgaki's avatar
akiraohgaki committed
    QJsonArray data;
akiraohgaki's avatar
akiraohgaki committed
    data.append(id);
    data.append(bytesReceived);
    data.append(bytesTotal);
akiraohgaki's avatar
akiraohgaki committed
    sendMessage("", "ItemHandler::downloadProgress", data);
akiraohgaki's avatar
akiraohgaki committed
}

akiraohgaki's avatar
akiraohgaki committed
void WebSocketServer::itemSaveStarted(QJsonObject result)
{
    QJsonArray data;
    data.append(result);
    sendMessage("", "ItemHandler::saveStarted", data);
}

void WebSocketServer::itemSaveFinished(QJsonObject result)
{
    QJsonArray data;
    data.append(result);
    sendMessage("", "ItemHandler::saveFinished", data);
}

akiraohgaki's avatar
akiraohgaki committed
void WebSocketServer::itemInstallStarted(QJsonObject result)
{
akiraohgaki's avatar
akiraohgaki committed
    QJsonArray data;
akiraohgaki's avatar
akiraohgaki committed
    data.append(result);
akiraohgaki's avatar
akiraohgaki committed
    sendMessage("", "ItemHandler::installStarted", data);
akiraohgaki's avatar
akiraohgaki committed
}

void WebSocketServer::itemInstallFinished(QJsonObject result)
{
akiraohgaki's avatar
akiraohgaki committed
    QJsonArray data;
akiraohgaki's avatar
akiraohgaki committed
    data.append(result);
akiraohgaki's avatar
akiraohgaki committed
    sendMessage("", "ItemHandler::installFinished", data);
akiraohgaki's avatar
akiraohgaki committed
}

void WebSocketServer::itemUninstallStarted(QJsonObject result)
{
akiraohgaki's avatar
akiraohgaki committed
    QJsonArray data;
akiraohgaki's avatar
akiraohgaki committed
    data.append(result);
akiraohgaki's avatar
akiraohgaki committed
    sendMessage("", "ItemHandler::uninstallStarted", data);
akiraohgaki's avatar
akiraohgaki committed
}

void WebSocketServer::itemUninstallFinished(QJsonObject result)
{
akiraohgaki's avatar
akiraohgaki committed
    QJsonArray data;
akiraohgaki's avatar
akiraohgaki committed
    data.append(result);
akiraohgaki's avatar
akiraohgaki committed
    sendMessage("", "ItemHandler::uninstallFinished", data);
akiraohgaki's avatar
akiraohgaki committed
}

void WebSocketServer::updateCheckAllStarted()
{
    QJsonArray data;
akiraohgaki's avatar
akiraohgaki committed
    sendMessage("", "UpdateHandler::checkAllStarted", data);
}

void WebSocketServer::updateCheckAllFinished()
{
    QJsonArray data;
akiraohgaki's avatar
akiraohgaki committed
    sendMessage("", "UpdateHandler::checkAllFinished", data);
akiraohgaki's avatar
akiraohgaki committed
void WebSocketServer::updateUpdateStarted(QString fileKey)
akiraohgaki's avatar
akiraohgaki committed
{
    QJsonArray data;
akiraohgaki's avatar
akiraohgaki committed
    data.append(fileKey);
    sendMessage("", "UpdateHandler::updateStarted", data);
akiraohgaki's avatar
akiraohgaki committed
}

akiraohgaki's avatar
akiraohgaki committed
void WebSocketServer::updateUpdateFinished(QString fileKey)
akiraohgaki's avatar
akiraohgaki committed
{
    QJsonArray data;
akiraohgaki's avatar
akiraohgaki committed
    data.append(fileKey);
    sendMessage("", "UpdateHandler::updateFinished", data);
akiraohgaki's avatar
akiraohgaki committed
}

akiraohgaki's avatar
akiraohgaki committed
void WebSocketServer::updateUpdateProgress(QString fileKey, int progress)
akiraohgaki's avatar
akiraohgaki committed
{
    QJsonArray data;
akiraohgaki's avatar
akiraohgaki committed
    data.append(fileKey);
akiraohgaki's avatar
akiraohgaki committed
    data.append(progress);
    sendMessage("", "UpdateHandler::updateProgress", data);
akiraohgaki's avatar
akiraohgaki committed
}

akiraohgaki's avatar
akiraohgaki committed
void WebSocketServer::receiveMessage(const QString &id, const QString &func, const QJsonArray &data)
akiraohgaki's avatar
akiraohgaki committed
{
akiraohgaki's avatar
akiraohgaki committed
    /* message object format
akiraohgaki's avatar
akiraohgaki committed
    {
        "id": "example",
akiraohgaki's avatar
akiraohgaki committed
        "func": "functionName",
akiraohgaki's avatar
akiraohgaki committed
        "data": ["value", 2, true]
akiraohgaki's avatar
akiraohgaki committed
    }
    */
akiraohgaki's avatar
akiraohgaki committed
    QJsonArray resultData;
akiraohgaki's avatar
akiraohgaki committed

akiraohgaki's avatar
akiraohgaki committed
    // WebSocketServer
akiraohgaki's avatar
akiraohgaki committed
    if (func == "WebSocketServer::stop") {
akiraohgaki's avatar
akiraohgaki committed
        stop();
    }
akiraohgaki's avatar
akiraohgaki committed
    else if (func == "WebSocketServer::isError") {
akiraohgaki's avatar
akiraohgaki committed
        resultData.append(isError());
akiraohgaki's avatar
akiraohgaki committed
    }
akiraohgaki's avatar
akiraohgaki committed
    else if (func == "WebSocketServer::errorString") {
akiraohgaki's avatar
akiraohgaki committed
        resultData.append(errorString());
akiraohgaki's avatar
akiraohgaki committed
    }
akiraohgaki's avatar
akiraohgaki committed
    else if (func == "WebSocketServer::serverUrl") {
akiraohgaki's avatar
akiraohgaki committed
        resultData.append(serverUrl().toString());
akiraohgaki's avatar
akiraohgaki committed
    }
akiraohgaki's avatar
akiraohgaki committed
    // ConfigHandler
akiraohgaki's avatar
akiraohgaki committed
    else if (func == "ConfigHandler::getAppConfigApplication") {
akiraohgaki's avatar
akiraohgaki committed
        resultData.append(configHandler_->getAppConfigApplication());
akiraohgaki's avatar
akiraohgaki committed
    }
akiraohgaki's avatar
akiraohgaki committed
    else if (func == "ConfigHandler::getAppConfigInstallTypes") {
akiraohgaki's avatar
akiraohgaki committed
        resultData.append(configHandler_->getAppConfigInstallTypes());
akiraohgaki's avatar
akiraohgaki committed
    }
akiraohgaki's avatar
akiraohgaki committed
    else if (func == "ConfigHandler::getUsrConfigApplication") {
akiraohgaki's avatar
akiraohgaki committed
        resultData.append(configHandler_->getUsrConfigApplication());
akiraohgaki's avatar
akiraohgaki committed
    }
akiraohgaki's avatar
akiraohgaki committed
    else if (func == "ConfigHandler::setUsrConfigApplication") {
akiraohgaki's avatar
akiraohgaki committed
        resultData.append(configHandler_->setUsrConfigApplication(data.at(0).toObject()));
akiraohgaki's avatar
akiraohgaki committed
    }
akiraohgaki's avatar
akiraohgaki committed
    else if (func == "ConfigHandler::getUsrConfigProviders") {
akiraohgaki's avatar
akiraohgaki committed
        resultData.append(configHandler_->getUsrConfigProviders());
akiraohgaki's avatar
akiraohgaki committed
    }
akiraohgaki's avatar
akiraohgaki committed
    else if (func == "ConfigHandler::setUsrConfigProviders") {
akiraohgaki's avatar
akiraohgaki committed
        resultData.append(configHandler_->setUsrConfigProviders(data.at(0).toObject()));
akiraohgaki's avatar
akiraohgaki committed
    }
akiraohgaki's avatar
akiraohgaki committed
    else if (func == "ConfigHandler::getUsrConfigCategories") {
akiraohgaki's avatar
akiraohgaki committed
        resultData.append(configHandler_->getUsrConfigCategories());
akiraohgaki's avatar
akiraohgaki committed
    }
akiraohgaki's avatar
akiraohgaki committed
    else if (func == "ConfigHandler::setUsrConfigCategories") {
akiraohgaki's avatar
akiraohgaki committed
        resultData.append(configHandler_->setUsrConfigCategories(data.at(0).toObject()));
akiraohgaki's avatar
akiraohgaki committed
    }
akiraohgaki's avatar
akiraohgaki committed
    else if (func == "ConfigHandler::getUsrConfigInstalledItems") {
akiraohgaki's avatar
akiraohgaki committed
        resultData.append(configHandler_->getUsrConfigInstalledItems());
akiraohgaki's avatar
akiraohgaki committed
    }
akiraohgaki's avatar
akiraohgaki committed
    else if (func == "ConfigHandler::setUsrConfigInstalledItems") {
akiraohgaki's avatar
akiraohgaki committed
        resultData.append(configHandler_->setUsrConfigInstalledItems(data.at(0).toObject()));
akiraohgaki's avatar
akiraohgaki committed
    }
akiraohgaki's avatar
akiraohgaki committed
    else if (func == "ConfigHandler::getUsrConfigUpdateAvailable") {
        resultData.append(configHandler_->getUsrConfigUpdateAvailable());
    }
    else if (func == "ConfigHandler::setUsrConfigUpdateAvailable") {
        resultData.append(configHandler_->setUsrConfigUpdateAvailable(data.at(0).toObject()));
    }
akiraohgaki's avatar
akiraohgaki committed
    else if (func == "ConfigHandler::setUsrConfigProvidersProvider") {
akiraohgaki's avatar
akiraohgaki committed
        resultData.append(configHandler_->setUsrConfigProvidersProvider(data.at(0).toString(), data.at(1).toObject()));
akiraohgaki's avatar
akiraohgaki committed
    }
akiraohgaki's avatar
akiraohgaki committed
    else if (func == "ConfigHandler::removeUsrConfigProvidersProvider") {
akiraohgaki's avatar
akiraohgaki committed
        resultData.append(configHandler_->removeUsrConfigProvidersProvider(data.at(0).toString()));
akiraohgaki's avatar
akiraohgaki committed
    }
akiraohgaki's avatar
akiraohgaki committed
    else if (func == "ConfigHandler::setUsrConfigCategoriesProvider") {
akiraohgaki's avatar
akiraohgaki committed
        resultData.append(configHandler_->setUsrConfigCategoriesProvider(data.at(0).toString(), data.at(1).toObject()));
akiraohgaki's avatar
akiraohgaki committed
    }
akiraohgaki's avatar
akiraohgaki committed
    else if (func == "ConfigHandler::removeUsrConfigCategoriesProvider") {
akiraohgaki's avatar
akiraohgaki committed
        resultData.append(configHandler_->removeUsrConfigCategoriesProvider(data.at(0).toString()));
akiraohgaki's avatar
akiraohgaki committed
    }
akiraohgaki's avatar
akiraohgaki committed
    else if (func == "ConfigHandler::setUsrConfigCategoriesInstallType") {
akiraohgaki's avatar
akiraohgaki committed
        resultData.append(configHandler_->setUsrConfigCategoriesInstallType(data.at(0).toString(), data.at(1).toString(), data.at(2).toString()));
akiraohgaki's avatar
akiraohgaki committed
    }
akiraohgaki's avatar
akiraohgaki committed
    else if (func == "ConfigHandler::setUsrConfigInstalledItemsItem") {
akiraohgaki's avatar
akiraohgaki committed
        resultData.append(configHandler_->setUsrConfigInstalledItemsItem(data.at(0).toString(), data.at(1).toObject()));
akiraohgaki's avatar
akiraohgaki committed
    }
akiraohgaki's avatar
akiraohgaki committed
    else if (func == "ConfigHandler::removeUsrConfigInstalledItemsItem") {
akiraohgaki's avatar
akiraohgaki committed
        resultData.append(configHandler_->removeUsrConfigInstalledItemsItem(data.at(0).toString()));
akiraohgaki's avatar
akiraohgaki committed
    }
akiraohgaki's avatar
akiraohgaki committed
    else if (func == "ConfigHandler::setUsrConfigUpdateAvailableFile") {
        resultData.append(configHandler_->setUsrConfigUpdateAvailableFile(data.at(0).toString(), data.at(1).toObject()));
    }
    else if (func == "ConfigHandler::removeUsrConfigUpdateAvailableFile") {
        resultData.append(configHandler_->removeUsrConfigUpdateAvailableFile(data.at(0).toString()));
    }
akiraohgaki's avatar
akiraohgaki committed
    // SystemHandler
akiraohgaki's avatar
akiraohgaki committed
    else if (func == "SystemHandler::isUnix") {
akiraohgaki's avatar
akiraohgaki committed
        resultData.append(systemHandler_->isUnix());
akiraohgaki's avatar
akiraohgaki committed
    }
akiraohgaki's avatar
akiraohgaki committed
    else if (func == "SystemHandler::isMobileDevice") {
        resultData.append(systemHandler_->isMobileDevice());
    }
    else if (func == "SystemHandler::openUrl") {
        resultData.append(systemHandler_->openUrl(data.at(0).toString()));
    }
akiraohgaki's avatar
akiraohgaki committed
    // OcsApiHandler
    else if (func == "OcsApiHandler::addProviders") {
        resultData.append(ocsApiHandler_->addProviders(data.at(0).toString()));
akiraohgaki's avatar
akiraohgaki committed
    }
akiraohgaki's avatar
akiraohgaki committed
    else if (func == "OcsApiHandler::removeProvider") {
        resultData.append(ocsApiHandler_->removeProvider(data.at(0).toString()));
akiraohgaki's avatar
akiraohgaki committed
    }
akiraohgaki's avatar
akiraohgaki committed
    else if (func == "OcsApiHandler::updateAllCategories") {
        resultData.append(ocsApiHandler_->updateAllCategories(data.at(0).toBool()));
akiraohgaki's avatar
akiraohgaki committed
    }
akiraohgaki's avatar
akiraohgaki committed
    else if (func == "OcsApiHandler::updateCategories") {
        resultData.append(ocsApiHandler_->updateCategories(data.at(0).toString(), data.at(1).toBool()));
akiraohgaki's avatar
akiraohgaki committed
    }
akiraohgaki's avatar
akiraohgaki committed
    else if (func == "OcsApiHandler::getContents") {
        resultData.append(ocsApiHandler_->getContents(data.at(0).toString(), data.at(1).toString(),
akiraohgaki's avatar
akiraohgaki committed
                                                      data.at(2).toString(), data.at(3).toString(),
                                                      data.at(4).toString(), data.at(5).toString(), data.at(6).toInt(), data.at(7).toInt()));
akiraohgaki's avatar
akiraohgaki committed
    }
akiraohgaki's avatar
akiraohgaki committed
    else if (func == "OcsApiHandler::getContent") {
        resultData.append(ocsApiHandler_->getContent(data.at(0).toString(), data.at(1).toString()));
akiraohgaki's avatar
akiraohgaki committed
    }
akiraohgaki's avatar
akiraohgaki committed
    // ItemHandler
akiraohgaki's avatar
akiraohgaki committed
    else if (func == "ItemHandler::metadataSet") {
akiraohgaki's avatar
akiraohgaki committed
        resultData.append(itemHandler_->metadataSet());
akiraohgaki's avatar
akiraohgaki committed
    }
akiraohgaki's avatar
akiraohgaki committed
    else if (func == "ItemHandler::getItem") {
        itemHandler_->getItem(data.at(0).toString(), data.at(1).toString(), data.at(2).toString(), data.at(3).toString(),
                              data.at(4).toString(), data.at(5).toString());
    }
    else if (func == "ItemHandler::getItemByOcsUrl") {
        itemHandler_->getItemByOcsUrl(data.at(0).toString(), data.at(1).toString(), data.at(2).toString());
akiraohgaki's avatar
akiraohgaki committed
    }
akiraohgaki's avatar
akiraohgaki committed
    else if (func == "ItemHandler::uninstall") {
akiraohgaki's avatar
akiraohgaki committed
        itemHandler_->uninstall(data.at(0).toString());
akiraohgaki's avatar
akiraohgaki committed
    }
    // UpdateHandler
    else if (func == "UpdateHandler::checkAll") {
akiraohgaki's avatar
akiraohgaki committed
        updateHandler_->checkAll();
    else if (func == "UpdateHandler::update") {
akiraohgaki's avatar
akiraohgaki committed
        updateHandler_->update(data.at(0).toString());
    }
    // DesktopThemeHandler
    else if (func == "DesktopThemeHandler::desktopEnvironment") {
        resultData.append(desktopThemeHandler_->desktopEnvironment());
    }
    else if (func == "DesktopThemeHandler::isApplicableType") {
        resultData.append(desktopThemeHandler_->isApplicableType(data.at(0).toString()));
    }
    else if (func == "DesktopThemeHandler::applyTheme") {
        resultData.append(desktopThemeHandler_->applyTheme(data.at(0).toString(), data.at(1).toString()));
    }
akiraohgaki's avatar
akiraohgaki committed
    // Not supported
akiraohgaki's avatar
akiraohgaki committed
    else {
        return;
    }
akiraohgaki's avatar
akiraohgaki committed

akiraohgaki's avatar
akiraohgaki committed
    sendMessage(id, func, resultData);
akiraohgaki's avatar
akiraohgaki committed
void WebSocketServer::sendMessage(const QString &id, const QString &func, const QJsonArray &data)
akiraohgaki's avatar
akiraohgaki committed
{
akiraohgaki's avatar
akiraohgaki committed
    /* message object format
akiraohgaki's avatar
akiraohgaki committed
    {
        "id": "example",
        "func": "functionName",
akiraohgaki's avatar
akiraohgaki committed
        "data": ["value", 2, true]
akiraohgaki's avatar
akiraohgaki committed
    QJsonObject object;
    object["id"] = id;
    object["func"] = func;
    object["data"] = data;

akiraohgaki's avatar
akiraohgaki committed
    auto binaryMessage = qtlib::Json(object).toJson();
    auto textMessage = QString::fromUtf8(binaryMessage);
akiraohgaki's avatar
akiraohgaki committed
    for (auto *wsClient : wsClients_) {
akiraohgaki's avatar
akiraohgaki committed
        wsClient->sendTextMessage(textMessage);
        //wsClient->sendBinaryMessage(binaryMessage);
akiraohgaki's avatar
akiraohgaki committed
    }
akiraohgaki's avatar
akiraohgaki committed
}