123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671 |
- #include "mainwindow.h"
- #include "ui_mainwindow.h"
- #include <QHeaderView>
- #include <QDebug>
- #include <QMessageBox>
- #include <QDate>
- #include <QDateTime>
- #include <QDir>
- #include <QFile>
- #include <QFileInfo>
- #include <QDesktopWidget>
- #include <QTextCodec>
- #include <QProcess>
- #include <QFileDialog>
- #include <QStandardPaths>
- #include <QPropertyAnimation>
- #include <QJsonDocument>
- #include <QJsonObject>
- #include <QJsonArray>
- #include "dialogappversion.h"
- #include "dialogconfig.h"
- #include "sysinfo.h"
- #include "textfinder.h"
- #include "textedit.h"
- #include "BootGlobal.h"
- #define ENTITY_COLUMN_NAME 0
- #define ENTITY_COLUMN_STATUS 1
- #define ENTITY_COLUMN_PID 2
- #define ENTITY_COLUMN_VERSION 3
- #define ENTITY_COLUMN_BOOTTIME 4
- #define MAX_ENTITY_LIST_COLUMN 5
- //Mapping to SpBase::FrameworkStateEnum
- #define FRAMEWORK_STATE_NOTINIT 0
- #define FRAMEWORK_STATE_NOCONFIG 1
- #define FRAMEWORK_STATE_BOOTING 2
- #define FRAMEWORK_STATE_RUNNING 3
- #define FRAMEWORK_STATE_SERVING 4
- #define FRAMEWORK_STATE_BREAKDOWN 5
- #define FRAMEWORK_STATE_REPAIRING 6
- #define FRAMEWORK_STATE_UPGRADING 7
- #define FRAMEWORK_STATE_ROOLLBACKING 8
- #define FRAMEWORK_STATE_RECOVING 9
- #define FRAMEWORK_STATE_NOTDISTURB 10
- #define STARTUP_SCRIPT "spexplorer.sh"
- #ifdef DEVOPS_ON_ST /*DevOps流水线编译,ST环境*/
- #define RVC_TITLE_STRING "RVC Terminal Application STver."
- #elif defined(DEVOPS_ON_UAT)/*DevOps流水线编译,UAT环境*/
- #define RVC_TITLE_STRING "RVC Terminal Application UATver."
- #elif defined(DEVOPS_ON_PRD)/*DevOps流水线编译,PRD环境*/
- #define RVC_TITLE_STRING "RVC Terminal Application"
- #elif defined(DEVOPS_ON_DEV)/*DevOps流水线编译,Dev环境*/
- #define RVC_TITLE_STRING "RVC Terminal Application DEVver."
- #else/*本地编译等非DevOps环境编译的版本*/
- #define RVC_TITLE_STRING "RVC Terminal Application TESTver."
- #endif
- void setRowBackground(const QBrush& brush, QAbstractItemModel* model, int row, const QModelIndex& parent = QModelIndex())
- {
- if (!model || row < 0 || row >= model->rowCount(parent))
- return;
- if (parent.isValid() && parent.model() != model)
- return;
- for (int i = 0; i < model->columnCount(parent); ++i)
- Q_ASSUME(model->setData(model->index(row, i, parent), brush, Qt::BackgroundRole));
- }
- static QString EntityInfoHeaderString()
- {
- return QString("实体名称\t状态\t进程号\t版本\t启动时间\t文件句柄数");
- }
- static QString EntityRunInfoToString(const EntityRunInfo& entity)
- {
- QString result = QString("%1\t%2\t%3\t%4\t%5\t%6")
- .arg(entity.entityName)
- .arg(MappingSatus2String(entity.state))
- .arg(entity.pid)
- .arg(entity.version)
- .arg(entity.startupTimeStr)
- .arg(entity.fds);
- return result;
- }
- MainWindow::MainWindow(QWidget* parent)
- : QMainWindow(parent)
- , ui(new Ui::MainWindow), mSicon(nullptr), mSilent(false)
- , mIdleEntityCount(0), mTotalEntityCount(0), mFloatWidget(nullptr)
- {
- this->Init(RVC_TITLE_STRING);
- }
- MainWindow::MainWindow(QString systemInfo, int totalEntityCount, QWidget* parent)
- : QMainWindow(parent)
- , ui(new Ui::MainWindow), mSicon(nullptr), mSilent(false)
- , mIdleEntityCount(0), mTotalEntityCount(0), mFloatWidget(nullptr)
- {
- this->Init(systemInfo);
- }
- void MainWindow::Init(QString title)
- {
- ui->setupUi(this);
- setWindowIcon(QIcon(":/res/FavIcon.ico"));
- if (title.startsWith(RVC_TITLE_STRING)) {
- setWindowTitle(title);
- } else {
- setWindowTitle(QString(RVC_TITLE_STRING " [%1]").arg(title));
- }
- QPropertyAnimation* animation = new QPropertyAnimation(this, "windowOpacity");
- animation->setDuration(800);
- animation->setStartValue(0);
- animation->setEndValue(1);
- animation->start();
- //QTextCodec* codec = QTextCodec::codecForName("GBK");
- //QTextCodec::setCodecForLocale(codec);
- this->setMinimumSize(1068, 720);
- QDesktopWidget* desk = QApplication::desktop();
- //const int curScreenIdx = desk->screenNumber(this);
- const int curScreenIdx = desk->primaryScreen();
- QRect rect = desk->screenGeometry(curScreenIdx);
- const int wd = rect.width();
- const int ht = rect.height();
- this->move((wd - width()) / 2, (ht - height()) / 2);
- ui->splitter->setStretchFactor(0, 1);
- ui->splitter->setStretchFactor(1, 6);
- ui->splitter->setStretchFactor(2, 3);
- InitSystemTrayIcon();
- InitEntitiesView();
- #ifndef WITH_QT
- Test_EntityList();
- Test_EventLog();
- #endif
- QStringList selections;
- for (EntityState i = NoStart; i <= All;) {
- selections << MappingSatus2String(i);
- i = EntityState(i + 1);
- }
- ui->comboBoxStatus->addItems(selections);
- ui->comboBoxStatus->setCurrentIndex((int)All);
- connect(ui->comboBoxStatus, SIGNAL(currentIndexChanged(int)), this, SLOT(DisplayEntities()));
- connect(ui->tableWidgetEntities->horizontalHeader(), SIGNAL(sectionClicked(int)), this, SLOT(SortEntityItem(int)));
- InitMenuAction();
- InitStatusBar();
- connect(ui->pushButtonEntStart, SIGNAL(clicked()), this, SLOT(StartEntity()));
- connect(ui->pushButtonEntClose, SIGNAL(clicked()), this, SLOT(TerminateEntity()));
- connect(ui->pushButtonEntPause, SIGNAL(clicked()), this, SLOT(PauseEntity()));
- connect(ui->pushButtonEntContinue, SIGNAL(clicked()), this, SLOT(ContinueEntity()));
- connect(ui->pushButtonEntKill, SIGNAL(clicked()), this, SLOT(KillEntity()));
- connect(ui->pushButtonEntTest, SIGNAL(clicked()), this, SLOT(TestEntity()));
- connect(ui->pushButtonEntLogView, SIGNAL(clicked()), this, SLOT(LogView()));
- connect(ui->pushButtonClearRunCfg, SIGNAL(clicked()), this, SLOT(RemoveEntityRuninfoConfigFile()));
- SysInfo::instance().init();
- QHBoxLayout* cpuLayout = new QHBoxLayout();
- cpuLayout->setContentsMargins(0, 0, 0, 0);
- cpuLayout->setSpacing(0);
- cpuLayout->setMargin(0);
- ui->tab4CPU->setLayout(cpuLayout);
- ui->tab4CPU->layout()->addWidget(&mCpuWidget);
- QHBoxLayout* memoryLayout = new QHBoxLayout();
- memoryLayout->setContentsMargins(0, 0, 0, 0);
- ui->tab4Memory->setLayout(memoryLayout);
- ui->tab4Memory->layout()->addWidget(&mMemoryWidget);
- mPerformWidge = new PerformWidget(this);
- QHBoxLayout* monitorLayout = new QHBoxLayout();
- monitorLayout->setContentsMargins(0, 0, 0, 0);
- monitorLayout->addWidget(mPerformWidge);
- ui->tab4Monitor->setLayout(monitorLayout);
- #if 1//#ifdef WITH_QT
- QWidget* w = ui->splitterMain->widget(1);
- if (w != nullptr) {
- w->setParent(nullptr);
- w->deleteLater();
- }
- #endif
- /*
- QStringList arguments = QApplication::arguments();
- if (arguments.contains("--debug") || arguments.contains("-D")) {
- QTimer* tm = new QTimer(this);
- connect(tm, SIGNAL(timeout()), this, SLOT(RecordEntitySnapshot()));
- tm->start(3000);
- }
- */
- //InitFloatWidget();
- }
- QAction* MainWindow::CreateMenuAction(QString text, QKeySequence keyShot, QString toolTipText, void (MainWindow::* method)())
- {
- QAction* action = new QAction(text, this);
- action->setShortcut(keyShot);
- //action->setStatusTip(toolTipText);
- //connect(clearAct, SIGNAL(triggered()), textViewer, SLOT(clear()));
- connect(action, &QAction::triggered, this, method);
- return action;
- }
- void MainWindow::ProcessStarted()
- {
- qDebug() << "process started! ";
- }
- void MainWindow::GetSubProcessMsg()
- {
- }
- void MainWindow::TriggerAdditionMenu(QAction* action)
- {
- qDebug() << "menu: " << action->text();
- RvcAdditionAction* pAct = reinterpret_cast<RvcAdditionAction*>(action);
- switch (pAct->userData.type) {
- case BootEntity:
- {
- StartEntityFromCustom(pAct->userData.entityName, pAct->userData.cmdLine);
- }
- break;
- case RunShellScript:
- break;
- case CreatesSubProcess:
- default:
- {
- QProcess* process = new QProcess(this);
- //connect(process, SIGNAL(readyReadStandardOutput()), this, SLOT(GetSubProcessMsg()));
- //connect(process, SIGNAL(started()), this, SLOT(ProcessStarted()));
- QString appDir = QCoreApplication::applicationDirPath();
- #ifdef Q_WS_WIN32
- if (appDir.endsWith("\\bin")) {
- appDir = appDir.left(appDir.length() - QString("\\bin").length());
- process->setWorkingDirectory(appDir);
- }
- #else
- if (appDir.endsWith("/bin")) {
- appDir = appDir.left(appDir.length() - QString("/bin").length());
- process->setWorkingDirectory(appDir);
- }
- #endif
- process->setStandardOutputFile(QProcess::nullDevice());
- process->setStandardErrorFile(QProcess::nullDevice());
- qDebug() << "start process: " << pAct->userData.cmdLine;
- process->startDetached(pAct->userData.cmdLine);
- //process->waitForFinished(1000);
- delete process;
- }
- break;
- }
- }
- void MainWindow::InitMenuAction()
- {
- QMenu* mainMenu = menuBar()->addMenu(QString::fromUtf8("菜单(&M)"));
- //mainMenu->addAction(CreateMenuAction(QString::fromUtf8("初始化(&I)"), tr("Alt+I"), QString::fromUtf8("初始化终端")
- // , &MainWindow::InitializeTerminal));
- mainMenu->addAction(CreateMenuAction(QString::fromUtf8("重启当前版本(&T)"), tr("Alt+T"), QString::fromUtf8("重启可视柜台终端应用")
- , &MainWindow::RestartApp));
- mainMenu->addAction(CreateMenuAction(QString::fromUtf8("重启应用(&R)"), tr("Alt+R"), QString::fromUtf8("通过读取 active.txt 重启可视柜台终端应用")
- , &MainWindow::RestartAppThroughSpShell));
- QMenu* sysConfigMenu = mainMenu->addMenu(QString::fromUtf8("关机"));
- sysConfigMenu->addAction(CreateMenuAction(QString::fromUtf8("重启(&P)"), tr("Alt+P"), QString::fromUtf8("重启操作系统")
- , &MainWindow::RestartSystem));
- sysConfigMenu->addAction(CreateMenuAction(QString::fromUtf8("关机(&D)"), tr("Alt+D"), QString::fromUtf8("关闭计算机")
- , &MainWindow::ShutdownSystem));
- mainMenu->addAction(CreateMenuAction(QString::fromUtf8("退出应用(&Q)"), tr("Alt+Q"), QString::fromUtf8("退出可视柜台终端应用")
- , &MainWindow::QuitApp));
- QMenu* configMenu = menuBar()->addMenu(QString::fromUtf8("配置(&C)"));
- configMenu->addAction(CreateMenuAction(QString::fromUtf8("加载控件(&L)"), tr("Alt+L"), QString::fromUtf8("动态加载控件")
- , &MainWindow::LoadCustomPlguins));
- QMenu* toolMenu = menuBar()->addMenu(QString::fromUtf8("工具(&T)"));
- toolMenu->addAction(CreateMenuAction(QString::fromUtf8("选项(&O)"), tr("Alt+O"), QString::fromUtf8("相关选项设置")
- , &MainWindow::ConfigApp));
- toolMenu->addAction(CreateMenuAction(QString::fromUtf8("导出快照(&S)"), tr("Alt+S"), QString::fromUtf8("导出实体即时信息快照")
- , &MainWindow::ExportEntitySnapshot));
- QMenu* addMenu = menuBar()->addMenu(QString::fromUtf8("附加(&A)"));
- const QString configFileName = getFrameworkConfigPath();
- qDebug() << "config file name: " << configFileName;
- QFileInfo fileInfo(configFileName);
- if (fileInfo.exists()) {
- RvcSettings* settings = new RvcSettings(configFileName, QSettings::IniFormat);
- settings->setIniCodec("UTF-8");
- int menuCount = settings->GetConfigData("Menu", "Count").toInt();
- qDebug() << "menu count: " << menuCount;
- int validIdx = 1;
- for (int i = 1; i <= menuCount; ++i) {
- QString strIdx = QString::number(i);
- QString subMenuName = settings->GetConfigData("Menu", strIdx).toString();
- QString textName = settings->GetConfigData(subMenuName, "TextName").toString();
- const int exeType = settings->GetConfigData(subMenuName, "Type").toInt();
- const auto excuteEnum = static_cast<ExecuteType>(exeType);
- QString cmdLine = settings->GetConfigData(subMenuName, "CmdLine").toString();
- if (cmdLine.isNull() || cmdLine.isEmpty()) {
- continue;
- }
- QString strQuick = QString("Alt+%1").arg(validIdx++);
- qDebug() << subMenuName << " " << textName << " " << strIdx << " " << cmdLine << " " << strQuick;
- QString menuName = (!textName.isNull() && !textName.isEmpty()) ? textName : cmdLine;
- RvcAdditionAction* action = new RvcAdditionAction(menuName, this);
- action->setShortcut(strQuick);
- //action->setStatusTip(cmdLine);
- action->userData.type = excuteEnum;
- cmdLine = cmdLine.trimmed();
- if (excuteEnum == BootEntity && -1 != cmdLine.indexOf('\t')) {
- const int idx = cmdLine.indexOf('\t');
- QStringList params = cmdLine.split("\t");
- action->userData.entityName = params.at(0);
- action->userData.cmdLine = cmdLine.mid(idx + 1);
- } else if (excuteEnum == BootEntity) {
- action->userData.entityName = cmdLine;
- action->userData.cmdLine = "";
- } else {
- action->userData.cmdLine = cmdLine;
- }
- addMenu->addAction(action);
- }
- if (menuCount > 0) {
- connect(addMenu, SIGNAL(triggered(QAction*)), this, SLOT(TriggerAdditionMenu(QAction*)));
- }
- }
- QMenu* helpMenu = menuBar()->addMenu(QString::fromUtf8("帮助(&H)"));
- helpMenu->addAction(CreateMenuAction(QString::fromUtf8("关于应用(&A)"), tr("Alt+A"), QString::fromUtf8("可视柜台终端应用版本更新记录")
- , &MainWindow::VersionView));
- helpMenu->addAction(CreateMenuAction(QString::fromUtf8("错误码对照表(&A)"), tr("Alt+E"), QString::fromUtf8("ErrorCode错误码对照表")
- , &MainWindow::ErrorCodeView));
- }
- void MainWindow::ConfigApp()
- {
- qDebug() << "Enter ConfigApp" << endl;
- #ifdef WITH_QT
- std::string path = CSpShellConsole::GetRootConfigPath();
- DialogInParam param;
- param.rootIniPath = path.c_str();
- DialogConfig dial(¶m, this);
- #else
- DialogInParam param;
- param.rootIniPath = "D:\\Run\\hardwarecfg\\root.ini";
- DialogConfig dial(¶m, this);
- #endif
- dial.exec();
- }
- void MainWindow::QuitApp()
- {
- qDebug() << "Enter QuitApp" << endl;
- #ifdef WITH_QT
- qApp->exit(APP_EXIT_CODE_QUIT); //or exit
- #else
- exit(APP_EXIT_CODE_QUIT);
- #endif
- qDebug() << "Leave QuitApp" << endl;
- }
- static void ClearArguments(const QString& program, QStringList& arguments)
- {
- if (arguments.contains(program)) {
- arguments.removeOne(program);
- }
- if (arguments.contains("--restart")) {
- arguments.removeOne("--restart");
- }
- if (arguments.contains("-R")) {
- arguments.removeOne("-R");
- }
- if (!arguments.contains("-Rwait")) {
- arguments.append("-Rwait");
- }
- }
- void MainWindow::RestartApp()
- {
- qDebug() << "Enter RestartApp" << endl;
- qint64 nextProcID(0);
- QString program = QApplication::applicationFilePath();
- QStringList arguments = QApplication::arguments();
- QString workingDirectory = QDir::currentPath();
- ClearArguments(program, arguments);
- qDebug() << "Program: " << program << " " << arguments << " " << workingDirectory << endl;
- bool result = QProcess::startDetached(program, arguments, workingDirectory, &nextProcID);
- qDebug() << "Program result: " << result << " " << nextProcID;
- QApplication::exit(APP_EXIT_CODE_RESTART_CURR);
- }
- void MainWindow::RestartSystem()
- {
- QString str = "确定要重启系统吗?";
- QMessageBox::StandardButton rb = QMessageBox::question(NULL, "Warning", str,
- QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
- if (rb == QMessageBox::Yes) {
- QProcess::startDetached("sudo shutdown -r now");
- }
- }
- void MainWindow::ShutdownSystem()
- {
- QString str = "确定要关机吗?";
- QMessageBox::StandardButton rb = QMessageBox::question(NULL, "Warning", str,
- QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
- if (rb == QMessageBox::Yes) {
- QProcess::startDetached("sudo shutdown --poweroff now");
- }
- }
- /** 该接口暂且放弃使用,因为使用QT创建子进程会继承文件句柄,改用 RestartAppThroughSpShell 与框架重启公用一套接口*/
- void MainWindow::RestartAppThroughActive()
- {
- qDebug() << "Enter " << __FUNCTION__ << endl;
- qint64 nextProcID(0);
- QString program = QApplication::applicationFilePath();
- QStringList arguments = QApplication::arguments();
- QString workingDirectory = QDir::currentPath();
- QString newProgrm = program;
- QString newWorkingDirectory = workingDirectory;
- QDir versionDir = QDir::current();
- versionDir.cdUp();
- #if 0
- QString activeFilePath = versionDir.filePath("active.txt");
- QFile activeFile(activeFilePath);
- if (!activeFile.exists()) {
- QMessageBox::critical(this, "错误", QString("文件 %1 不存在!").arg(activeFilePath));
- return;
- }
- if (!activeFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
- QMessageBox::critical(this, "错误", QString("打开文件 %1 失败:%2").arg(activeFilePath).arg(activeFile.errorString()));
- return;
- }
- QByteArray versionContent = activeFile.readAll();
- versionContent = versionContent.trimmed();
- activeFile.close();
- if (versionContent.isEmpty() || versionContent.isNull()) {
- QMessageBox::critical(this, "错误", QString("文件 %1 内容为空!").arg(activeFilePath));
- return;
- }
- QStringList programPaths = program.split("/");
- QString curVersion = programPaths[programPaths.size() - 3];
- if (curVersion == QString(versionContent)) {
- qDebug() << "Detect is the same version: " << (QString)versionContent;
- } else {
- qDebug() << "Detect diff version, from " << curVersion << " to " << (QString)versionContent;
- programPaths.replace(programPaths.size() - 3/*x.y.z/bin/spshell*/, versionContent);
- newProgrm = programPaths.join("/");
- QStringList workingPaths = workingDirectory.split("/");
- workingPaths.replace(workingPaths.size() - 1/*/x.y.z*/, versionContent);
- newWorkingDirectory = workingPaths.join("/");
- }
- #else
- QString scriptFilePath = versionDir.filePath(STARTUP_SCRIPT);
- QFile scriptFile(scriptFilePath);
- if (!scriptFile.exists()) {
- QMessageBox::critical(this, "错误", QString("启动脚本 %1 不存在!").arg(scriptFilePath));
- return;
- }
- auto permitt = scriptFile.setPermissions(QFileDevice::ReadOwner | QFileDevice::WriteOwner | QFileDevice::ExeOwner
- | QFileDevice::ReadUser | QFileDevice::WriteUser | QFileDevice::ExeUser
- | QFileDevice::ReadGroup | QFileDevice::ReadOther
- | QFileDevice::ExeGroup | QFileDevice::ExeOther);
- if (!permitt) {
- QMessageBox::critical(this, "错误", QString("设置 %1 文件权限失败:%2!").arg(scriptFilePath).arg(scriptFile.errorString()));
- return;
- }
- newProgrm = scriptFilePath;
- newWorkingDirectory = versionDir.currentPath();
- #endif
- ClearArguments(program, arguments);
- qunsetenv("LD_LIBRARY_PATH");
- qDebug() << "newProgrm: " << newProgrm << " " << arguments << " " << newWorkingDirectory << endl;
- bool result = QProcess::startDetached(newProgrm, arguments, newWorkingDirectory, &nextProcID);
- qDebug() << "Program result: " << result << " " << nextProcID;
- QApplication::exit();
- }
- void MainWindow::RestartAppThroughSpShell()
- {
- qDebug() << "Enter " << __FUNCTION__ << endl;
- qint64 nextProcID(0);
- QString program = QApplication::applicationFilePath();
- QStringList arguments = QApplication::arguments();
- QString workingDirectory = QDir::currentPath();
- QString newProgrm = program;
- QString newWorkingDirectory = workingDirectory;
- QDir versionDir = QDir::current();
- versionDir.cdUp();
- QString scriptFilePath = versionDir.filePath(STARTUP_SCRIPT);
- QFile scriptFile(scriptFilePath);
- if (!scriptFile.exists()) {
- QMessageBox::critical(this, "错误", QString("启动脚本 %1 不存在!").arg(scriptFilePath));
- return;
- }
- auto permitt = scriptFile.setPermissions(QFileDevice::ReadOwner | QFileDevice::WriteOwner | QFileDevice::ExeOwner
- | QFileDevice::ReadUser | QFileDevice::WriteUser | QFileDevice::ExeUser
- | QFileDevice::ReadGroup | QFileDevice::ReadOther
- | QFileDevice::ExeGroup | QFileDevice::ExeOther);
- if (!permitt) {
- QMessageBox::critical(this, "错误", QString("设置 %1 文件权限失败:%2!").arg(scriptFilePath).arg(scriptFile.errorString()));
- return;
- }
- #ifdef WITH_QT
- int result = CSpShellConsole::RestartApplication();
- if (result != 0) {
- QMessageBox::critical(this, "错误", QString("执行重启请求失败!"));
- return;
- }
- #endif
- QApplication::exit(APP_EXIT_CODE_RESTART_ACTIVE);
- }
- void MainWindow::InitializeTerminal()
- {
- LogView();
- }
- void MainWindow::LogView()
- {
- qDebug() << "Enter LogView" << endl;
- auto enti = GetCurrentSelectedEntity();
- #ifdef WITH_QT
- if (!enti.entityName.isEmpty()) {
- std::string path = CSpShellConsole::GetEntityLogPath(Q2Str(enti.entityName).c_str());
- TextFinder textFinder(Str2Q(path), enti.entityName, this);
- textFinder.exec();
- }
- #endif
- }
- void MainWindow::ErrorCodeView()
- {
- qDebug() << "Enter ErrorCodeView" << endl;
- #if 1
- DialogAppVersion dial(QLatin1String(":/res/sys_errcode.html"), ("系统错误码对照表"), this);
- dial.exec();
- #else
- TextEdit mw;
- QDesktopWidget* desk = QApplication::desktop();
- const int curScreenIdx = desk->primaryScreen();
- QRect rect = desk->screenGeometry(curScreenIdx);
- const int wd = rect.width();
- const int ht = rect.height();
- mw.resize(wd / 2, (ht * 2) / 3);
- mw.move((wd - mw.width()) / 2,
- (ht - mw.height()) / 2);
- mw.setContents(QLatin1String(":/res/sys_errcode.html"));
- mw.show();
- #endif
- //TextEdit textEdit(this);
- //textEdit.setContents(":/res/sys_errcode.html");
- //textEdit.show();
- }
- void MainWindow::RemoveEntityRuninfoConfigFile()
- {
- auto enti = GetCurrentSelectedEntity();
- #ifdef WITH_QT
- if (!enti.entityName.isEmpty()) {
- std::string path = CSpShellConsole::GetEntityRTPath(Q2Str(enti.entityName).c_str());
- if (!path.empty()) {
- QFile file(path.c_str());
- if (file.exists()) {
- QString str = QString("确定要删除 %1 实体运行时文件?").arg(enti.entityName);
- QMessageBox::StandardButton rb = QMessageBox::question(NULL, "Warning", str,
- QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
- if (rb == QMessageBox::Yes) {
- if (QFile::remove(path.c_str())) {
- QMessageBox::information(this, "提示", "删除成功!请重启应用或实体以立即生效!");
- } else {
- QMessageBox::warning(this, "错误", QString("%1: 删除运行时文件 %2 失败!")
- .arg(enti.entityName).arg(path.c_str()));
- }
- }
- } else {
- QMessageBox::warning(this, "提示", QString("%1: %2 运行时文件不存在!").arg(enti.entityName).arg(path.c_str()));
- }
- } else {
- QMessageBox::critical(this, "错误", QString("%1: 获取运行时文件路径失败!").arg(enti.entityName));
- }
- } else {
- QMessageBox::critical(this, "错误", "无法获取实体名称,请选中实体列表所在行!");
- }
- #endif
- }
- void MainWindow::VersionView()
- {
- qDebug() << "Enter VersionView" << endl;
- DialogAppVersion dial(QLatin1String(":/res/version_history.html"), ("关于可视柜台终端应用程序"), this);
- dial.exec();
- }
- void MainWindow::DisplayEntities()
- {
- EntityState filterState = EntityState(ui->comboBoxStatus->currentIndex());
- QString str = MappingSatus2String(filterState);
- if (filterState == All)
- str = "";
- auto entities = ui->tableWidgetEntities->findItems(str, Qt::MatchExactly);
- const int rows = ui->tableWidgetEntities->rowCount();
- qDebug() << "Enter DisplayEntities " << str << " " << rows << "!" << endl;
- for (int i = 0; i < rows; ++i) {
- const auto strStatus = ui->tableWidgetEntities->item(i, ENTITY_COLUMN_STATUS)->text();
- ui->tableWidgetEntities->setRowHidden(i, !str.isEmpty() && strStatus.compare(str) != 0);
- }
- }
- void MainWindow::ResetAllEntityOperateBtnState(bool enable)
- {
- ui->pushButtonEntStart->setEnabled(enable);
- ui->pushButtonEntClose->setEnabled(enable);
- ui->pushButtonEntPause->setEnabled(enable);
- ui->pushButtonEntContinue->setEnabled(enable);
- ui->pushButtonEntKill->setEnabled(enable);
- ui->pushButtonEntTest->setEnabled(enable);
- }
- void MainWindow::StartEntityFromCustom(const QString& entityName, const QString& cmdLine)
- {
- qDebug() << "Enter StartEntityFromCustom " << entityName << " " << cmdLine << "!" << endl;
- const int entityRow = FindEntityRowIndex(entityName);
- EntityInfo entityInfo = GetEntityInfoByRowIndex(entityRow);
- if (entityInfo.IsValid()) {
- const auto curState = entityInfo.state;
- if (curState != NoStart && curState != Killed && curState != Close) {
- QString str = QString("%1 实体目前处于运行状态,是否要强制重启?").arg(entityName);
- QMessageBox::StandardButton rb = QMessageBox::question(this, "确认", str,
- QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
- if (rb == QMessageBox::Yes) {
- const int result = DealWithEntity(entityInfo, Deal_Kill, "", false);
- if (result != 0) {
- QMessageBox::critical(this, "错误", QString("终止旧实体例程 %1 失败!").arg(entityInfo.entityName));
- return;
- }
- } else {
- return;
- }
- }
- }
- Threadee* nE = new Threadee();
- nE->dealType = Deal_Start;
- nE->entityName = entityName;
- nE->cmdLine = cmdLine;
- OperatThread* ot = new OperatThread(nE, nullptr);
- connect(ot, &QThread::finished, ot, &QObject::deleteLater);
- connect(ot, &OperatThread::OperateResult, this, &MainWindow::ReceiveCustomOperatResult);
- ot->start();
- }
- void MainWindow::UpdateEntityOperateBtnState(EntityState currState)
- {
- switch (currState) {
- case Idle:
- ResetAllEntityOperateBtnState();
- ui->pushButtonEntStart->setEnabled(false);
- ui->pushButtonEntContinue->setEnabled(false);
- break;
- case NoStart:
- ResetAllEntityOperateBtnState(false);
- ui->pushButtonEntStart->setEnabled(true);
- break;
- case Starting:
- ResetAllEntityOperateBtnState(false);
- ui->pushButtonEntKill->setEnabled(true);
- break;
- case Busy:
- ResetAllEntityOperateBtnState(false);
- ui->pushButtonEntKill->setEnabled(true);
- break;
- case Pause:
- ResetAllEntityOperateBtnState(false);
- ui->pushButtonEntContinue->setEnabled(true);
- ui->pushButtonEntKill->setEnabled(true);
- break;
- case UnLoading:
- ResetAllEntityOperateBtnState(false);
- break;
- case Lost:
- ResetAllEntityOperateBtnState(false);
- ui->pushButtonEntKill->setEnabled(true);
- break;
- case Close:
- case Killed:
- ResetAllEntityOperateBtnState(false);
- ui->pushButtonEntStart->setEnabled(true);
- break;
- case Passed:
- case Failed:
- ResetAllEntityOperateBtnState();
- ui->pushButtonEntStart->setEnabled(false);
- ui->pushButtonEntContinue->setEnabled(false);
- break;
- default:
- ResetAllEntityOperateBtnState(false);
- }
- }
- void MainWindow::EntitySelectionChanged()
- {
- const QTableWidgetItem* currentItem = ui->tableWidgetEntities->currentItem();
- qDebug() << QString("Enter EntitySelectionChanged: ") << currentItem->text();
- //ShowMessage(currentItem->text(), 0);
- UpdateEntityOperateBtnState(GetCurrentSelectedEntity().state);
- }
- void MainWindow::SortEntityItem(int n)
- {
- static bool sortStatus[MAX_ENTITY_LIST_COLUMN] = { false };
- ui->tableWidgetEntities->sortItems(n, (sortStatus[n] ? Qt::AscendingOrder : Qt::DescendingOrder));
- sortStatus[n] = !sortStatus[n];
- }
- QTableWidgetItem* MainWindow::FindEnityWidgetItem(QString entityName)
- {
- auto entities = ui->tableWidgetEntities->findItems(entityName, Qt::MatchExactly);
- if (entities.count() > 0)
- return entities[0];
- return nullptr;
- }
- int MainWindow::FindEntityRowIndex(QString entityName)
- {
- int result = -1;
- auto item = FindEnityWidgetItem(entityName);
- if (item)
- result = item->row();
- return result;
- }
- void MainWindow::RemindEntityStateChangeWith(QString entityName, bool bEnd)
- {
- const int row = FindEntityRowIndex(entityName);
- if (row >= 0) {
- qDebug() << entityName << " " << bEnd << endl;
- if (bEnd)
- UpdateItemBackgroundColor(row, MappingString2Status(ui->tableWidgetEntities->item(row, ENTITY_COLUMN_STATUS)->text()));
- else
- UpdateItemBackgroundColor(row, Idle);
- }
- }
- void MainWindow::RemindEntityStateChange(int row, EntityState previousState, EntityState currState)
- {
- UpdateItemBackgroundColor(row, currState);
- #ifndef NDEBUG
- if (currState == Lost) {
- QString info("Entity ");
- QString entity(ui->tableWidgetEntities->item(row, ENTITY_COLUMN_NAME)->text());
- info.append(entity);
- info += " 's State from ";
- info += MappingSatus2String(previousState);
- info += " to ";
- info += MappingSatus2String(currState);
- Note(info, EntityFire, entity, true);
- }
- #endif //NDEBUG
- (new RichTimer(this, ui->tableWidgetEntities->item(row, ENTITY_COLUMN_NAME)->text()));
- }
- void MainWindow::TriggerEntityState(int row, EntityState state, int pid, bool filcker)
- {
- const EntityState previousState = MappingString2Status(ui->tableWidgetEntities->item(row, ENTITY_COLUMN_STATUS)->text());
- if (pid == -1/*for entity reset*/ && (previousState != Passed && previousState != Failed)) {
- return;
- }
- ui->tableWidgetEntities->item(row, ENTITY_COLUMN_STATUS)->setText(MappingSatus2String(state));
- if (state == Close || state == NoStart) {
- ui->tableWidgetEntities->item(row, ENTITY_COLUMN_PID)->setText("0");
- } else if (pid > 0) {
- ui->tableWidgetEntities->item(row, ENTITY_COLUMN_PID)->setText(QString::number(pid));
- }
- if ((state == Idle) && (previousState == NoStart
- || previousState == Starting
- || previousState == UnLoading
- || previousState == Lost
- || previousState == Close
- || previousState == Killed
- )) {
- QDateTime currentTime = QDateTime::currentDateTime();
- QString currentTimeStr = currentTime.toString("MM-dd-hh:mm:ss.zzz");
- ui->tableWidgetEntities->item(row, ENTITY_COLUMN_BOOTTIME)->setText(currentTimeStr);
- }
- if (state != previousState) {
- if (state == Idle) {
- mIdleEntityCount++;
- } else if (previousState == Idle) {
- mIdleEntityCount--;
- }
- UpdateEntityStatistics();
- }
- if (filcker) {
- RemindEntityStateChange(row, previousState, state);
- ui->tableWidgetEntities->setCurrentItem(ui->tableWidgetEntities->item(row, ENTITY_COLUMN_NAME));
- qDebug() << "emit entity select change." << endl;
- emit ui->tableWidgetEntities->itemSelectionChanged();
- } else {
- RemindEntityStateChangeWith(ui->tableWidgetEntities->item(row, ENTITY_COLUMN_NAME)->text(), true);
- }
- }
- int MainWindow::TriggerEntityState(QTableWidgetItem* item, EntityState state, int pid, bool flicker)
- {
- if (!item)
- return -1;
- TriggerEntityState(item->row(), state, pid, flicker);
- return 0;
- }
- int MainWindow::TriggerEntityState(QString entityName, EntityState state, int pid, bool flicker)
- {
- const int row = FindEntityRowIndex(entityName);
- if (row >= 0) {
- TriggerEntityState(row, state, pid, flicker);
- }
- return 0;
- }
- int MainWindow::DealWithEntity(const EntityInfo& entity, DealType dealType, QString extendParam, bool multiThread)
- {
- qDebug() << "Deal with entity: " << entity.entityName << " with " << QString::number(dealType) << endl;
- int result = -1;
- if (!entity.entityName.isEmpty()) {
- Threadee* nE = new Threadee();
- nE->dealType = dealType;
- nE->entityName = entity.entityName;
- nE->cmdLine = extendParam;
- OperatThread* ot = new OperatThread(nE, nullptr);
- if (multiThread) {
- if (dealType == Deal_Test) {
- connect(ot, &OperatThread::OperateResult, this, &MainWindow::ReceiveOperatResult);
- }
- connect(ot, &QThread::finished, ot, &QObject::deleteLater);
- ot->start();
- result = -1 /*forbid changing entity state at screen*/;
- } else {
- bool ret = ot->doSomething();
- result = ret ? 0 : -1;
- }
- }
- return result;
- }
- void MainWindow::StartEntity()
- {
- int optResult = DealWithEntity(GetCurrentSelectedEntity(), Deal_Start);
- if (optResult == 0) {
- TriggerEntityState(GetCurrentSelectedEntity().entityName, Idle, 8888);
- }
- }
- void MainWindow::PauseEntity()
- {
- int optResult = DealWithEntity(GetCurrentSelectedEntity(), Deal_Pause);
- if (optResult == 0) {
- TriggerEntityState(GetCurrentSelectedEntity().entityName, Pause);
- }
- }
- void MainWindow::ContinueEntity()
- {
- int optResult = DealWithEntity(GetCurrentSelectedEntity(), Deal_Continue);
- if (optResult == 0) {
- TriggerEntityState(GetCurrentSelectedEntity().entityName, Idle);
- }
- }
- void MainWindow::TerminateEntity()
- {
- int optResult = DealWithEntity(GetCurrentSelectedEntity(), Deal_Close);
- if (optResult == 0) {
- TriggerEntityState(GetCurrentSelectedEntity().entityName, Close);
- }
- }
- void MainWindow::KillEntity()
- {
- int optResult = DealWithEntity(GetCurrentSelectedEntity(), Deal_Kill);
- if (optResult == 0) {
- TriggerEntityState(GetCurrentSelectedEntity().entityName, Killed);
- }
- }
- void MainWindow::TestEntity()
- {
- int optResult = DealWithEntity(GetCurrentSelectedEntity(), Deal_Test);
- if (optResult == 0) {
- TriggerEntityState(GetCurrentSelectedEntity().entityName, Passed);
- }
- }
- QString MainWindow::GetPerfStorePath()
- {
- #ifdef WITH_QT
- std::string path = CSpShellConsole::GetTempPath();
- #else
- std::string path = "C:\\rvc\\temp";
- #endif
- if (!path.empty()) {
- QDir tempDir(path.c_str());
- tempDir.mkpath(QString("perf"));
- if (tempDir.cd("perf")) {
- return tempDir.absolutePath();
- } else {
- qDebug() << "cd " << tempDir.path() << " failed";
- return QString(path.c_str());
- }
- }
- }
- QStringList MainWindow::ExecuteShellScripts(QString shellCmd)
- {
- QStringList results;
- QProcess* subScriptsProcess = new QProcess(this);
- subScriptsProcess->setProcessChannelMode(QProcess::MergedChannels);
- subScriptsProcess->start("sh", QStringList() << "-c" << shellCmd);
- subScriptsProcess->waitForFinished();
- QString str(subScriptsProcess->readAllStandardOutput());
- results << str;
- results << QString::number(subScriptsProcess->exitCode());
- QMessageBox::warning(this, "Run ShellScripts Info", results.join("\t"), QMessageBox::Ok);
- delete subScriptsProcess;
- return QStringList() << str;
- }
- void MainWindow::RecordEntitySnapshot()
- {
- qDebug() << "Enter " << __FUNCTION__;
- #if 0
- QPixmap p = mPerformWidge->grab();
- QString filePathName = GetPerfStorePath();
- filePathName += "/EntityPerf_";
- filePathName += QDateTime::currentDateTime().toString("yyyyMMdd-hhmmsszzz");
- filePathName += ".png";
- if (!p.save(filePathName, "png")) {
- qDebug() << "save widget screen failed";
- }
- #endif
- ExportEntityInfo(false);
- }
- void MainWindow::ExportEntityInfo(bool fromBtnClick)
- {
- QTableWidget* table = ui->tableWidgetEntities;
- QString fileName;
- if (fromBtnClick) {
- fileName = QFileDialog::getSaveFileName(table,
- "保存"
- , QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)
- , "文本文件(*.txt)");
- } else {
- QDir tempDir(GetPerfStorePath());
- QDateTime currTime = QDateTime::currentDateTime();
- QString currTimeString = currTime.toString("yyyyMMdd");
- QString filePureName = currTimeString + "_EntityInfo.txt";
- fileName = tempDir.filePath(filePureName);
- qDebug() << "entity info file path: " << fileName;
- }
- QFile file(fileName);
- if (!file.open(fromBtnClick ? (QIODevice::ReadWrite | QIODevice::Text) : (QIODevice::ReadWrite | QIODevice::Append))) {
- if (fromBtnClick) QMessageBox::warning(this, tr("错误"), tr("<font size='12' color='red'>打开文件失败,数据保存失败!</font>"));
- else qDebug() << "打开文件失败,数据保存失败! " << file.errorString();
- return;
- }
- if (!file.isReadable()) {
- if (fromBtnClick) QMessageBox::warning(this, tr("错误"), tr("<font size='12' color='red'>该文件不可读,数据保存失败!</font>"));
- else qDebug() << "该文件不可读,数据保存失败! " << file.errorString();
- } else {
- QTextStream out(&file);
- // const int colCounts = table->columnCount();
- const int rowCounts = table->rowCount();
- for (int i = 0; i < rowCounts; ++i) {
- const EntityInfo entityInfo = GetEntityInfoByRowIndex(i);
- EntityRunInfo entityRunInfo(entityInfo);
- entityRunInfo.startupTimeStr = ui->tableWidgetEntities->item(i, ENTITY_COLUMN_BOOTTIME)->text();
- entityRunInfo.fds = PerformWidget::GetProcessFds(entityRunInfo.pid);
- if (i == 0) {
- QString currentTime = QDateTime::currentDateTime().toString("yyyy.MM.dd hh:mm:ss.zzz");
- QString timestamp = QString("\n\nRecord at: %1\n").arg(currentTime);
- file.write(timestamp.toUtf8());
- QString header = EntityInfoHeaderString();
- file.write(header.toUtf8());
- }
- QString str = "\n";
- str += EntityRunInfoToString(entityRunInfo);
- file.write(str.toUtf8());
- }
- if (fromBtnClick) QMessageBox::warning(this, tr("信息"), tr("<font size='12' color='green'>实体信息保存成功!</font>"));
- else qDebug() << "实体信息保存成功!";
- }
- file.close();
- }
- void MainWindow::ExportEntitySnapshot()
- {
- ExportEntityInfo(true);
- }
- void MainWindow::Test_EventLog()
- {
- {
- for (int i = 0; i < 100; ++i) {
- QString str = QString(("我是第%1串字符串字符串字符串字-------符串字符串"
- "字符串字-------符串字符串字串字-------符符串字符"
- "串字符串串字-------符字串字符字串字符字串字符字串"
- "字符字串字符字串字-------符符串字串字-------符符"
- "串字符串字串字-------符符串字符串字符串")).arg(i);
- QtMessageInfo info{ (MessageType)(int)(i % int(MsgTypeMax)) , str,0, 0 };
- InsertConsole(info);
- }
- }
- }
- EntityInfo MainWindow::GetEntityInfoByRowIndex(int row)
- {
- if (row == -1)
- return (EntityInfo{ "", Manual, NoStart, 0, "" });
- return EntityInfo{ ui->tableWidgetEntities->item(row, ENTITY_COLUMN_NAME)->text(), MappingString2StartType(ui->tableWidgetEntities->item(row, ENTITY_COLUMN_STATUS)->text()),
- MappingString2Status(ui->tableWidgetEntities->item(row, ENTITY_COLUMN_STATUS)->text()),
- ui->tableWidgetEntities->item(row, ENTITY_COLUMN_PID)->text().toInt(), ui->tableWidgetEntities->item(row, ENTITY_COLUMN_VERSION)->text() };
- }
- EntityInfo MainWindow::GetCurrentSelectedEntity()
- {
- const QTableWidgetItem* currentItem = ui->tableWidgetEntities->currentItem();
- if (currentItem) {
- auto item = GetEntityInfoByRowIndex(currentItem->row());
- return item;
- }
- return GetEntityInfoByRowIndex(-1);
- }
- void MainWindow::AddEntityEntry(const EntityInfo& entityInst)
- {
- const int currCows = ui->tableWidgetEntities->rowCount();
- ui->tableWidgetEntities->insertRow(currCows);
- ui->tableWidgetEntities->setItem(currCows, ENTITY_COLUMN_NAME, new QTableWidgetItem(entityInst.entityName));
- //ui->tableWidgetEntities->setItem(currCows, 1, new QTableWidgetItem(MappingStartType2String(entityInst.startType)));
- ui->tableWidgetEntities->setItem(currCows, ENTITY_COLUMN_STATUS, new QTableWidgetItem(MappingSatus2String(entityInst.state)));
- ui->tableWidgetEntities->setItem(currCows, ENTITY_COLUMN_PID, new QTableWidgetItem(QString::number(entityInst.pid)));
- ui->tableWidgetEntities->setItem(currCows, ENTITY_COLUMN_VERSION, new QTableWidgetItem(entityInst.version));
- if (entityInst.state == Starting || entityInst.state == Idle) {
- QDateTime currentTime = QDateTime::currentDateTime();
- QString currentTimeStr = currentTime.toString("MM-dd-hh:mm:ss.zzz");
- ui->tableWidgetEntities->setItem(currCows, ENTITY_COLUMN_BOOTTIME, new QTableWidgetItem(currentTimeStr));
- } else {
- ui->tableWidgetEntities->setItem(currCows, ENTITY_COLUMN_BOOTTIME, new QTableWidgetItem("未知"));
- }
- mTotalEntityCount++;
- if (entityInst.state == Idle)
- mIdleEntityCount++;
- UpdateEntityStatistics();
- UpdateItemBackgroundColor(currCows, entityInst.state);
- }
- void MainWindow::UpdateItemBackgroundColor(int row, EntityState state)
- {
- const int columnCount = ui->tableWidgetEntities->columnCount();
- auto curColor = MappingStatus2Color(state);
- qDebug() << "uptate row background color" << endl;
- #if 0
- for (int col = 0; col < columnCount; ++col) {
- QTableWidgetItem* item = ui->tableWidgetEntities->item(row, col);
- item->setBackground(QBrush(curColor));
- //QPalette palette = item->palette();
- //palette.setBrush(QPalette::Base, curColor);
- //item->setPalette(palette);
- }
- #else
- setRowBackground(QBrush(curColor), ui->tableWidgetEntities->model(), row);
- #endif
- }
- void MainWindow::Test_EntityList()
- {
- AddEntityEntry(EntityInfo{ "MobileDial", Manual, Idle, 123, "V1.2.3" });
- AddEntityEntry(EntityInfo{ "IEBrowser", Manual, NoStart, 123, "V1.2.3" });
- AddEntityEntry(EntityInfo{ "Browser", Manual, Lost, 123, "V1.2.3" });
- AddEntityEntry(EntityInfo{ "HelloClient", Manual, Starting, 123, "V1.2.3" });
- AddEntityEntry(EntityInfo{ "HelloService", Manual, Busy, 123, "V1.2.3" });
- AddEntityEntry(EntityInfo{ "PortbleScanner", Manual, Pause, 123, "V1.2.3" });
- AddEntityEntry(EntityInfo{ "HealthManager", Manual, UnLoading, 123, "V1.2.3" });
- AddEntityEntry(EntityInfo{ "MediaController", Manual, Close, 123, "V1.2.3" });
- AddEntityEntry(EntityInfo{ "GPIO", Manual, Killed, 123, "V1.2.3" });
- AddEntityEntry(EntityInfo{ "CardIssuer", Manual, Passed, 123, "V1.2.3" });
- AddEntityEntry(EntityInfo{ "DeviceSwitch", Manual, Failed, 123, "V1.2.3" });
- if (-1 != FindEntityRowIndex("NoExist")) {
- QMessageBox::warning(this, "", "NoExist", QMessageBox::Ok);
- }
- if (1 == FindEntityRowIndex("MobileDial")) {
- QMessageBox::warning(this, "", "NoExist", QMessageBox::Ok);
- }
- }
- bool MainWindow::LoadPlguins()
- {
- return false;
- }
- void MainWindow::LoadCustomPlguins()
- {
- #ifndef WITH_QT
- static bool sw = false;
- if (!sw) {
- this->setWindowState(Qt::WindowMinimized);
- } else {
- this->setWindowState((this->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive);
- }
- sw = !sw;
- #else
- bool result = LoadPlguins();
- if (result) {
- }
- #endif
- }
- void MainWindow::EntityItemContextMenu(QPoint pos)
- {
- auto index = ui->tableWidgetEntities->indexAt(pos);
- if (index.isValid()) {
- mEntityPopMenu->exec(QCursor::pos()); // 菜单出现的位置为当前鼠标的位置
- }
- }
- void MainWindow::InitEntitiesView()
- {
- ui->labelEntCalculate->setText("");
- ui->tableWidgetEntities->setColumnCount(MAX_ENTITY_LIST_COLUMN);
- QStringList header;
- header << "名称" << "状态" << "进程号" << "版本" << "最近启动时间";
- ui->tableWidgetEntities->setHorizontalHeaderLabels(header);
- ui->tableWidgetEntities->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
- ui->tableWidgetEntities->setEditTriggers(QAbstractItemView::NoEditTriggers);
- ui->tableWidgetEntities->setSelectionBehavior(QAbstractItemView::SelectRows);
- ui->tableWidgetEntities->setSelectionMode(QAbstractItemView::SingleSelection);
- //ui->tableWidgetEntities->setSelectionModel(mEntitySelectedModel);
- ui->tableWidgetEntities->verticalHeader()->hide();
- ui->tableWidgetEntities->resizeColumnToContents(1);
- ui->tableWidgetEntities->horizontalHeader()->setStretchLastSection(true);
- ui->tableWidgetEntities->horizontalHeader()->setVisible(true);
- ui->tableWidgetEntities->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft | Qt::AlignVCenter);
- ui->tableWidgetEntities->setStyleSheet("selection-background-color:#1E90FF;");
- connect(ui->tableWidgetEntities, SIGNAL(itemSelectionChanged()), this, SLOT(EntitySelectionChanged()));
- /*
- ui->tableWidgetEntities->setContextMenuPolicy(Qt::CustomContextMenu);
- mEntityPopMenu = new QMenu(ui->tableWidgetEntities);
- QAction *actionUpdateInfo = new QAction();
- QAction *actionDelInfo = new QAction();
- actionUpdateInfo ->setText(QString("修改"));
- actionDelInfo ->setText(QString("删除"));
- mEntityPopMenu->addAction(actionUpdateInfo);
- mEntityPopMenu->addAction(actionDelInfo);
- connect(ui->tableWidgetEntities, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(EntityItemContextMenu(QPoint)));
- */
- mEntityStateChangeReminder = new QTimer(this);
- mEntityStateChangeReminder->setSingleShot(true);
- //connect(mEntityStateChangeReminder, SIGNAL(timeout()),this, SLOT(RemindEntityStateChange()));
- }
- void MainWindow::InitStatusBar()
- {
- mToolsTip = new QLabel("", this);
- QFont ft;
- ft.setPointSize(10);
- mToolsTip->setFont(ft);
- QPalette pa;
- pa.setColor(QPalette::WindowText, QColor(105, 105, 105));
- mToolsTip->setPalette(pa);
- mToolsTip->setStyleSheet("QLabel {padding: 0px 1px 2px 2px;}");
- statusBar()->addPermanentWidget(mToolsTip);
- TimeDateTimer* timer = new TimeDateTimer(this);
- timer->Start(1000);
- //mStatusLabel = new MLabel(this);
- //mStatusLabel->setStyleSheet("QLabel {padding: -10px 2px 2px 1px;}");
- //statusBar()->addWidget(mStatusLabel);
- }
- void MainWindow::TimeUpdate(const QString& timeStr)
- {
- //qDebug() << "enter TimeUpdate" << endl;
- mToolsTip->setText(timeStr);
- }
- void MainWindow::ShowStatusMessage(QString message, int messageType)
- {
- Q_UNUSED(messageType);
- //statusBar()->setStyleSheet("color:green");
- QFontMetrics fontMetrics(statusBar()->font());
- int fontSize = fontMetrics.width(message);
- if (fontSize > statusBar()->width()) {
- message = fontMetrics.elidedText(message, Qt::ElideRight, statusBar()->width());
- }
- statusBar()->showMessage(message);
- //mStatusLabel->setText(message);
- }
- void MainWindow::OnTrayIconActivated(QSystemTrayIcon::ActivationReason activeRson)
- {
- switch (activeRson) {
- // 单击托盘显示窗口
- case QSystemTrayIcon::Trigger:
- {
- showNormal();
- raise();
- activateWindow();
- break;
- }
- // 双击
- case QSystemTrayIcon::DoubleClick:
- {
- // ...
- break;
- }
- default:
- break;
- }
- }
- void MainWindow::messageClicked()
- {
- #ifndef WITH_QT
- QMessageBox::information(nullptr, tr("Systray"),
- tr("Sorry, I already gave what help I could.\n"
- "Maybe you should try asking a human?"));
- #endif
- }
- void MainWindow::InitSystemTrayIcon()
- {
- if (QSystemTrayIcon::supportsMessages() && mSicon == nullptr) {
- mSicon = new QSystemTrayIcon(this);
- QMenu* menusystemTray = new QMenu(this);
- menusystemTray->addAction(tr("Show/Hide"));
- menusystemTray->addAction(tr("About"));
- menusystemTray->addAction(tr("Quit"));
- mSicon->setIcon(QIcon(":/res/FavIcon.ico"));
- mSicon->setToolTip(QString::fromUtf8("RVC Terminal Manager"));
- mSicon->setContextMenu(menusystemTray);
- connect(mSicon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(OnTrayIconActivated(QSystemTrayIcon::ActivationReason)));
- connect(mSicon, &QSystemTrayIcon::messageClicked, this, &MainWindow::messageClicked);
- mSicon->show();
- }
- }
- void MainWindow::Note(QString info, NoteSrcType srcType, QString srcEntity, bool bForce)
- {
- qDebug() << "Note: " << srcEntity << " " << info << endl;
- #ifdef WITH_QT
- if (mSicon && (bForce || CanDisturb())) {
- if (srcEntity.isEmpty()) srcEntity = RVC_TITLE_STRING;
- int showDelayTime = 10000;
- if (srcType == BootStage) {
- showDelayTime = 15000;
- }
- QSystemTrayIcon::MessageIcon msgIcon = QSystemTrayIcon::MessageIcon(QSystemTrayIcon::Critical);
- mSicon->showMessage(srcEntity, info, msgIcon, showDelayTime);
- }
- #endif
- }
- void MainWindow::closeEvent(QCloseEvent* event)
- {
- showMinimized();
- event->ignore();
- }
- namespace
- {
- QString CoverWithTimePrefix(QString content)
- {
- QDateTime time = QDateTime::currentDateTime();
- QString buffer = time.toString("[hh:mm:ss]");
- QString result = QString("%1 %2").arg(buffer).arg(content);
- return result;
- }
- }
- void MainWindow::ReceiveMessage(const QtMessageInfo* message)
- {
- if (!InsertConsole(*message)) {
- QBaseListWidgetItem* item = new QConsoleListWidgetItem(CoverWithTimePrefix(message->content));
- item->AppentToWidget(ui->listWidgetEventLog);
- }
- }
- void MainWindow::ReceiveEntityVariant(QVariant info)
- {
- QEntityActiveInfo entityInfo = info.value<QEntityActiveInfo>();
- int localEntityIndex = -1;
- for (int i = 0; i < mBootEntitiesInfo.size(); ++i) {
- if (mBootEntitiesInfo.at(i).entityName == entityInfo.entityName) {
- localEntityIndex = i;
- break;
- }
- }
- if (localEntityIndex != -1) {
- if (mBootEntitiesInfo[localEntityIndex].entityState != entityInfo.entityState) {
- const auto currState = entityInfo.entityState;
- mBootEntitiesInfo[localEntityIndex].entityState = currState;
- TriggerEntityState(entityInfo.entityName, currState, entityInfo.entityPID);
- }
- } else {
- EntityBootInfo newEntityInfo;
- newEntityInfo.entityName = entityInfo.entityName;
- newEntityInfo.entityState = entityInfo.entityState;
- mBootEntitiesInfo.push_back(newEntityInfo);
- AddEntityEntry(EntityInfo{ entityInfo.entityName, Manual,
- entityInfo.entityState, entityInfo.entityPID, entityInfo.entityVerStr });
- }
- }
- void MainWindow::ReceiveCustomOperatResult(int action, int result, const QString& message)
- {
- qDebug() << "deal with custom operation result: " << message << " result " << result << endl;
- }
- void MainWindow::ReceiveOperatResult(int action, int result, const QString& message)
- {
- qDebug() << "deal with operation result: " << message << " result " << result << endl;
- for (int i = 0; i < mBootEntitiesInfo.size(); ++i) {
- if (mBootEntitiesInfo.at(i).entityName == message) {
- const auto& entityInfo = mBootEntitiesInfo.at(i);
- (new EntityStateRecoverTimer(this, entityInfo.entityName, entityInfo.entityState));
- TriggerEntityState(entityInfo.entityName, result == 0 ? Passed : Failed, 0);
- break;
- }
- }
- }
- void MainWindow::UpdateEntityStatistics()
- {
- QString text = QString("(正在运行%1个模块,其中%2个正常)").arg(mTotalEntityCount).arg(mIdleEntityCount);
- qDebug() << mTotalEntityCount << " " << mIdleEntityCount;
- qDebug() << text;
- ui->labelEntCalculate->setText(text);
- }
- void MainWindow::NotifyLogMessage(MessageType type, const QString& title, const QString& message)
- {
- QString contentMessage = message;
- QJsonParseError parseError;
- QJsonDocument jsonDoc = QJsonDocument::fromJson(message.toUtf8(), &parseError);
- if (parseError.error == QJsonParseError::NoError) {
- QJsonObject jsonObject = jsonDoc.object();
- if (jsonObject.contains(QStringLiteral("errmsg"))) {
- contentMessage = jsonObject["errmsg"].toString();
- }
- }
- if (CanDisturb()) {
- switch (type) {
- case TextNotifyInfo:
- QMessageBox::information(this, title, contentMessage);
- break;
- case TextNotifyWarn:
- QMessageBox::warning(this, title, contentMessage);
- break;
- case TextNotifyError:
- QMessageBox::critical(this, title, contentMessage);
- break;
- default:
- break;
- }
- } else {
- ShowStatusMessage(contentMessage, type);
- }
- }
- static bool GetInterestPointWithRegex(const QString& origin, QString& entiName, QString& content)
- {
- QRegExp rx("^\\[(\\D+)\\]\\s{0,1}(E|W|F|I|D|T):\\s{0,1}\\{(.*)\\}\\(sc:(0x[A-Za-z0-9]+),\\s{0,1}uc:(0x[A-Za-z0-9]+)\\)$");
- const int pos = rx.indexIn(origin);
- if (pos > -1) {
- entiName = rx.cap(1);
- content = rx.cap(3);
- QString systemCode = rx.cap(4);
- QString userCode = rx.cap(5);
- return true;
- }
- return false;
- }
- bool MainWindow::InsertConsole(const QtMessageInfo& message)
- {
- QString content = message.content; //FakeUnicodeToUnicode(message.content);
- bool dealed = true;
- if (message.type == TextNormal || message.type == TextEvent) {
- QBaseListWidgetItem* item = new QConsoleListWidgetItem(CoverWithTimePrefix(content));
- item->AppentToWidget(ui->listWidgetEventLog);
- } else if (message.type == TextWarn) {
- QBaseListWidgetItem* item = new QLightWarnListWidgetItem(CoverWithTimePrefix(content));
- item->AppentToWidget(ui->listWidgetEventLog);
- } else if (message.type == TextError) {
- QBaseListWidgetItem* item = new QLightErrorListWidgetItem(CoverWithTimePrefix(content));
- item->AppentToWidget(ui->listWidgetEventLog);
- } else if (message.type == TextFatal || message.type == TextBlock
- || (message.type >= TextNotifyInfo && message.type <= TextNotifyError)) {
- QString entityName;
- const int existIdx = content.indexOf(":][:");
- if (-1 != existIdx) {
- entityName = content.mid(0, existIdx);
- content = content.mid(existIdx + QString(":][:").length());
- }
-
- #ifndef WITH_QT
- QBaseListWidgetItem* item2 = new QTipErrorListWidgetItem(CoverWithTimePrefix(content));
- item2->AppentToWidget(ui->listWidgetFatalLog);
- #endif
-
- if (message.type == TextFatal || message.type == TextBlock) {
- if (-1 == existIdx) { GetInterestPointWithRegex(content, entityName, content); }
- #ifndef NDEBUG
- Note(content, BootStage, entityName, true);
- #endif //NDEBUG
- } else {
- #ifdef WITH_QT
- NotifyLogMessage(message.type, entityName, content);
- #endif
- }
- } else {
- dealed = false;
- }
- return dealed;
- }
- void MainWindow::ReceiveMessageVariant(QVariant info)
- {
- QtMessageInfo message = info.value<QtMessageInfo>();
- if (InsertConsole(message)) {
- //empty
- } else if (message.type == ModBootInfo) { //entity boot info
- if (message.content.length() == 0 || message.param1 > Failed) {
- return;
- }
- int localEntityIndex = -1;
- for (int i = 0; i < mBootEntitiesInfo.size(); ++i) {
- if (mBootEntitiesInfo.at(i).entityName == message.content) {
- localEntityIndex = i;
- break;
- }
- }
- if (localEntityIndex != -1) {
- if (mBootEntitiesInfo[localEntityIndex].entityState != message.param1) {
- // const auto previousState = mBootEntitiesInfo[localEntityIndex].entityState;
- const auto currState = static_cast<EntityState>(message.param1);
- mBootEntitiesInfo[localEntityIndex].entityState = currState;
- TriggerEntityState(message.content, currState, 0);
- }
- } else {
- EntityBootInfo newEntityInfo;
- newEntityInfo.entityName = message.content;
- newEntityInfo.entityState = static_cast<EntityState>(message.param1);
- mBootEntitiesInfo.push_back(newEntityInfo);
- AddEntityEntry(EntityInfo{ message.content, Manual, static_cast<EntityState>(message.param1), 123, "V1.2.3" });
- }
- } else if (message.type == ModStartupInfo) {
- //ShowMessage(QString::fromLocal8Bit(message.content), message.type);
- ShowStatusMessage(message.content, message.type);
- } else if (message.type == DisplayShow) {
- this->setWindowState((this->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive);
- } else if (message.type == DisplayHide) {
- this->setWindowState(Qt::WindowMinimized);
- } else if (message.type == StageChangeInfo) {
- const bool oldSilent = mSilent;
- if (message.param1 == FRAMEWORK_STATE_RUNNING
- || message.param1 == FRAMEWORK_STATE_SERVING
- || message.param1 == FRAMEWORK_STATE_NOTDISTURB
- || message.param1 == FRAMEWORK_STATE_NOCONFIG) {
- mSilent = true;
- } else {
- mSilent = false;
- }
- if (mSilent != oldSilent) {
- OnSilentStateChange(mSilent);
- }
- }
- }
- bool MainWindow::CanDisturb() const
- {
- if (!mSilent) {
- return true;
- }
- Qt::WindowStates states = this->windowState();
- if (!(states & Qt::WindowMinimized) && (states & Qt::WindowActive)) {
- return true;
- }
- return false;
- }
- void MainWindow::OnSilentStateChange(bool beSilent)
- {
- }
- void MainWindow::InitFloatWidget()
- {
- QDesktopWidget* desk = QApplication::desktop();
- QRect rect = desk->screenGeometry(desk->primaryScreen());
- const int wd = rect.width();
- const int ht = rect.height();
- mFloatWidget = new Widget();
- mFloatWidget->show();
- }
- MainWindow::~MainWindow()
- {
- delete ui;
- }
- void RichTimer::HandleTimeout(bool toStop)
- {
- mTimes++;
- mWin->RemindEntityStateChangeWith(mEntityName, toStop ? true : !(mTimes % 2));
- if (toStop) {
- killTimer(mTimerID);
- delete this;
- }
- }
- void EntityStateRecoverTimer::HandleTimeout()
- {
- qDebug() << "reset entity state to " << MappingSatus2String(mState) << endl;
- mWin->TriggerEntityState(mEntityName, mState, -1, false);
- killTimer(mTimerID);
- delete this;
- }
- void TimeDateTimer::Start(int interval)
- {
- mTimer->start(interval);
- connect(mTimer, SIGNAL(timeout()), this, SLOT(HandleTimeout()));
- }
- void TimeDateTimer::Stop()
- {
- mTimer->stop();
- }
- void TimeDateTimer::HandleTimeout()
- {
- mSeconds++;
- if (mSeconds == 60) {
- mMinutes++;
- mSeconds = 0;
- }
- if (mMinutes == 60) {
- mHours++;
- mMinutes = 0;
- }
- if (mHours == 24) {
- mDays++;
- mHours = 0;
- }
- mWin->TimeUpdate(GetCurrentRunTimeString());
- }
|