Quellcode durchsuchen

plugin delete && enabled state changed

xuqiang vor 4 Monaten
Ursprung
Commit
396b412c2a
6 geänderte Dateien mit 201 neuen und 19 gelöschten Zeilen
  1. 1 0
      include/httpserver.h
  2. 2 0
      include/mainwindow.h
  3. 2 0
      include/pluginmanager.h
  4. 96 4
      src/httpserver.cpp
  5. 62 0
      src/mainwindow.cpp
  6. 38 15
      src/pluginmanager.cpp

+ 1 - 0
include/httpserver.h

@@ -28,6 +28,7 @@ private:
 
 signals:
     void monitorConfigureUpdate(const QString &filename);
+    void reloadCanvas();
 
 private slots:
     void run_hhttp_sever();

+ 2 - 0
include/mainwindow.h

@@ -16,6 +16,7 @@ public:
 
 protected:
     void init_ui();
+    void reloadCanvas();
 
 private:
     QStackedWidget *m_pStackedWidget;
@@ -24,6 +25,7 @@ public slots:
     void onUpdateScreen(const QJsonObject &obj);
     void onPageSwitdh(int state);
     void onConfigureUpdate(const QString &filename);
+    void onReloadCanvas();
     
 };
 

+ 2 - 0
include/pluginmanager.h

@@ -22,11 +22,13 @@ public:
     explicit PluginManager(QObject *parent = nullptr);
     ~PluginManager();
 
+    const QJsonObject pluginInfo();
     void initPluginInfo();
     void savePluginInfo();
     void loadPlugins();
     void loadPlugin(QString fileName);
     void unloadPlugin(QString fileName);
+    bool updatePluginInfo(QString fileName, bool isEnabled);
     bool delPlugin(QString fileName, bool kepInfo = false);
     bool upgradePlugin(QString fileName, QString srcFile);
     bool addPlugin(QString srcFile);

+ 96 - 4
src/httpserver.cpp

@@ -4,6 +4,7 @@
 #include <QJsonObject>
 #include <QJsonDocument>
 #include <QDir>
+#include "appcontext.h"
 
 HttpServer::HttpServer(QObject *parent)
     : QObject{parent}
@@ -60,7 +61,98 @@ void HttpServer::run_hhttp_sever()
         doc.setObject(obj);
         
         res.status = httplib::StatusCode::OK_200;
-        res.set_content(doc.toJson().data(), "application/json");
+        res.set_content(doc.toJson(QJsonDocument::Compact).data(), "application/json");
+    });
+
+    // 插件库信息
+    m_server.Get("/plugininfo", [&](const httplib::Request &req, httplib::Response &res) {
+        PluginManager &pluginMgr = AppContext::instance().pluginManager();
+        QJsonObject info = pluginMgr.pluginInfo();
+        QJsonDocument doc;
+        doc.setObject(info);
+        res.status = httplib::StatusCode::OK_200;
+        res.set_content(doc.toJson(QJsonDocument::Compact).data(), "application/json");
+    });
+
+    m_server.Post("/plugininfo/delete", [&](const httplib::Request &req, httplib::Response &res) {
+        if(req.body.empty()) {
+            res.status = httplib::StatusCode::BadRequest_400;
+            res.set_content(R"({"message": "Request error"})", "application/json");
+            return;
+        }
+        PluginManager &pluginMgr = AppContext::instance().pluginManager();
+        QString jsonStr = QString::fromStdString(req.body);
+        QJsonParseError error;
+        QString pluginName;
+        QJsonDocument doc = QJsonDocument::fromJson(jsonStr.toUtf8(), &error);
+        if(error.error == QJsonParseError::NoError && doc.isObject()) {
+            QJsonObject obj = doc.object();
+            if(obj.contains("name")) {
+                pluginName = obj["name"].toString();
+
+                if(pluginMgr.delPlugin(pluginName)) {
+                    QJsonObject reply = {
+                        {"message", QString("Plugin delete successfully")}
+                    };
+                    doc.setObject(reply);
+                    res.status = httplib::StatusCode::OK_200;
+                    res.set_content(doc.toJson(QJsonDocument::Compact).data(), "application/json");
+                    return;
+                } else {
+                    QJsonObject reply = {
+                        {"message", QString("Plugin delete failed")}
+                    };
+                    doc.setObject(reply);
+                    res.status = httplib::StatusCode::InternalServerError_500;
+                    res.set_content(doc.toJson(QJsonDocument::Compact).data(), "application/json");
+                    return;
+                }
+            }
+        } 
+
+        res.status = httplib::StatusCode::BadRequest_400;
+        res.set_content(R"({"message": "Invalid json"})", "application/json");
+    });
+
+    m_server.Post("/plugininfo/update", [&](const httplib::Request &req, httplib::Response &res) {
+        if(req.body.empty()) {
+            res.status = httplib::StatusCode::BadRequest_400;
+            res.set_content(R"({"message": "Request error"})", "application/json");
+            return;
+        }
+        PluginManager &pluginMgr = AppContext::instance().pluginManager();
+        QString jsonStr = QString::fromStdString(req.body);
+        QJsonParseError error;
+        QString pluginName;
+        QJsonDocument doc = QJsonDocument::fromJson(jsonStr.toUtf8(), &error);
+        if(error.error == QJsonParseError::NoError && doc.isObject()) {
+            QJsonObject obj = doc.object();
+            if(obj.contains("name") && obj.contains("enabled")) {
+                pluginName = obj["name"].toString();
+
+                if(pluginMgr.updatePluginInfo(pluginName, obj["enabled"].toBool())) {
+                    emit reloadCanvas();
+                    QJsonObject reply = {
+                        {"message", QString("Plugin update successfully")}
+                    };
+                    doc.setObject(reply);
+                    res.status = httplib::StatusCode::OK_200;
+                    res.set_content(doc.toJson(QJsonDocument::Compact).data(), "application/json");
+                    return;
+                } else {
+                    QJsonObject reply = {
+                        {"message", QString("Plugin update failed")}
+                    };
+                    doc.setObject(reply);
+                    res.status = httplib::StatusCode::InternalServerError_500;
+                    res.set_content(doc.toJson(QJsonDocument::Compact).data(), "application/json");
+                    return;
+                }
+            }
+        } 
+
+        res.status = httplib::StatusCode::BadRequest_400;
+        res.set_content(R"({"message": "Invalid json"})", "application/json");
     });
 
     // 画面配置文件更新接口
@@ -92,7 +184,7 @@ void HttpServer::run_hhttp_sever()
                     doc.setObject(obj);
                     
                     res.status = httplib::StatusCode::BadRequest_400;
-                    res.set_content(doc.toJson().data(), "application/json");
+                    res.set_content(doc.toJson(QJsonDocument::Compact).data(), "application/json");
                 } else {
                     // File
                     QString currentPath = QDir::currentPath();
@@ -121,7 +213,7 @@ void HttpServer::run_hhttp_sever()
                     doc.setObject(obj);
                     
                     res.status = httplib::StatusCode::OK_200;
-                    res.set_content(doc.toJson().data(), "application/json");
+                    res.set_content(doc.toJson(QJsonDocument::Compact).data(), "application/json");
                 }
             }
         } else {
@@ -137,7 +229,7 @@ void HttpServer::run_hhttp_sever()
             doc.setObject(obj);
             
             res.status = httplib::StatusCode::BadRequest_400;
-            res.set_content(doc.toJson().data(), "application/json");
+            res.set_content(doc.toJson(QJsonDocument::Compact).data(), "application/json");
         }
     });
 

+ 62 - 0
src/mainwindow.cpp

@@ -24,6 +24,7 @@ MainWindow::MainWindow(QWidget *parent)
 
     HttpServer &httpServer = AppContext::instance().httpServer();
     connect(&httpServer, &HttpServer::monitorConfigureUpdate, this, &MainWindow::onConfigureUpdate);
+    connect(&httpServer, &HttpServer::reloadCanvas, this, &MainWindow::onReloadCanvas);
 }
 
 MainWindow::~MainWindow()
@@ -65,6 +66,62 @@ void MainWindow::init_ui()
     m_pStackedWidget->setCurrentIndex(index);
 }
 
+void MainWindow::reloadCanvas()
+{
+    ProjectManager &projectMgr = AppContext::instance().projectManager();
+    LOG_INFO("begin release exist canvas");
+    {
+        QList<QWidget*> widgets;
+        for (int i = 0; i < m_pStackedWidget->count(); ++i) {
+            widgets << m_pStackedWidget->widget(i);
+        }
+
+        for (QWidget *w : widgets) {
+            Canvas *pCanvas = static_cast<Canvas *>(w);
+            pCanvas->clear();
+            m_pStackedWidget->removeWidget(w);
+            delete w;
+        }
+    }
+    LOG_INFO("release exist canvas complete, widget count: {}", m_pStackedWidget->count());
+
+    QString fileName = QString("%1/%2").arg(QDir::currentPath(), "conf/monitor.xml");
+    bool result = projectMgr.openProject(fileName);
+    if(result)
+    {
+        LOG_INFO("open monitor config xml success: {}, canvas count: {}", fileName.toUtf8().data(), projectMgr.canvasCount());
+    }
+    else
+    {
+        LOG_ERROR("open monitor config xml failed: {}", fileName.toUtf8().data());
+        return;
+    }
+
+    LOG_INFO("start reload monitor configure");
+    int canvasCount = projectMgr.canvasCount();
+    for(int i = 0; i < canvasCount; i++)
+    {
+        LOG_DEBUG("----------------canvas {}----------------", i);
+        Canvas *pCanvas = new Canvas(projectMgr.canvas(i), m_pStackedWidget);
+        pCanvas->resize(1280, 720);
+        m_pStackedWidget->insertWidget(i, pCanvas);
+    }
+    LOG_INFO("reload monitor configure complete");
+
+    int index = 0;
+    QSettings settings("settings.ini", QSettings::IniFormat);
+    settings.setIniCodec("UTF-8");
+    settings.beginGroup("CANVAS");
+    if(settings.contains("INDEX")) {
+        index = settings.value("INDEX").toInt();
+        LOG_INFO("find saved canvas index, set index {}", index);
+    } else {
+        LOG_INFO("not find saved canvas index, set index 0");
+    }
+    settings.endGroup();
+    m_pStackedWidget->setCurrentIndex(index);
+}
+
 void MainWindow::onUpdateScreen(const QJsonObject &obj)
 {
     QElapsedTimer timer;
@@ -253,3 +310,8 @@ void MainWindow::onConfigureUpdate(const QString &filename)
     settings.setValue("INDEX", index);
     settings.endGroup();
 }
+
+void MainWindow::onReloadCanvas()
+{
+    reloadCanvas();
+}

+ 38 - 15
src/pluginmanager.cpp

@@ -10,6 +10,7 @@ PluginManager::PluginManager(QObject *parent)
     : QObject{parent}
 {
     initPluginInfo();
+    savePluginInfo();
     loadPlugins();
 }
 
@@ -19,6 +20,24 @@ PluginManager::~PluginManager()
     clear();
 }
 
+const QJsonObject PluginManager::pluginInfo()
+{
+    QJsonObject info;
+    QJsonArray array;
+
+    QList<plugin_info_st> pluginInfoList = m_pluginInfoMap.values();
+    foreach(auto info, pluginInfoList)
+    {
+        QJsonObject obj;
+        obj["name"] = info.fileName;
+        obj["path"] = info.filePath;
+        obj["enabled"] = info.isEnabled;
+        array.push_back(obj);
+    }
+    info["configure"] = array;
+    return info;
+}
+
 void PluginManager::initPluginInfo()
 {
     QString fileName = QString("%1/%2").arg(QDir::currentPath(), "plugininfo.json");
@@ -72,25 +91,11 @@ void PluginManager::initPluginInfo()
         info.isEnabled = true;
         m_pluginInfoMap.insert(fileInfo.fileName(), info);
     }
-
-    savePluginInfo();
 }
 
 void PluginManager::savePluginInfo()
 {
-    QJsonObject info;
-    QJsonArray array;
-
-    QList<plugin_info_st> pluginInfoList = m_pluginInfoMap.values();
-    foreach(auto info, pluginInfoList)
-    {
-        QJsonObject obj;
-        obj["name"] = info.fileName;
-        obj["path"] = info.filePath;
-        obj["enabled"] = info.isEnabled;
-        array.push_back(obj);
-    }
-    info["configure"] = array;
+    QJsonObject info = pluginInfo();
 
     QJsonDocument doc(info);
     QString fileName = QString("%1/%2").arg(QDir::currentPath(), "plugininfo.json");
@@ -166,6 +171,24 @@ void PluginManager::unloadPlugin(QString fileName)
     it.value()->unload();
 }
 
+bool PluginManager::updatePluginInfo(QString fileName, bool isEnabled)
+{
+    auto it = m_pluginInfoMap.find(fileName);
+    if(it == m_pluginInfoMap.end())
+        return false;
+    if(it.value().isEnabled != isEnabled)
+    {
+        if(isEnabled)
+            loadPlugin(fileName);
+        else
+            unloadPlugin(fileName);
+
+        it.value().isEnabled = isEnabled;
+    }
+    savePluginInfo();
+    return true;
+}
+
 bool PluginManager::delPlugin(QString fileName, bool keepInfo)
 {
     auto it = m_pluginLoaderMap.find(fileName);