DPS/DataPlatform/mainwindow.cpp

313 lines
9.6 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma execution_character_set("utf-8")
#include "mainwindow.h"
#include "QWebEngineView"
#include "QVBoxLayout"
#include <QtWidgets>
#include <iostream>
//#include <QApplication>
#include <QWebEngineView.h>
#include "TitleBar.h"
#include "SideBar.h"
//#include "ProjectManager.h"
//#include "CodeGenerate.h"
//#include "DataModelListView.h"
//#include "DataModelGraphView.h"
#include "SystemSettingModule.h"
#include "Session.h"
#include "SettingDialog.h"
#include "Base.h"
#include "HomePage.h"
#include "ProjectEventModule.h"
#include "DataModelEventModule.h"
#include "DataPackEventModule.h"
#include "DataManager.h"
#include "CodeGenerateEventModule.h"
#include"SearchEditEventModule.h"
#include "XmlEditEventModule.h"
#include "easylogging++.h"
INITIALIZE_EASYLOGGINGPP
//#define WEBDEGUB
bool CanFileWritable(QString fileName)
{
bool bret = false;
#ifdef Q_OS_WIN
DWORD length = 0;
TCHAR* c_str = nullptr;
if (sizeof(TCHAR) == 1)
c_str = (TCHAR*)fileName.toLocal8Bit().constData();
else
c_str = (TCHAR*)fileName.utf16();
TCHAR* tfn = nullptr;
if (!::GetFileSecurity(c_str, OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION
| DACL_SECURITY_INFORMATION, NULL, NULL, &length) &&
ERROR_INSUFFICIENT_BUFFER == ::GetLastError()) {
PSECURITY_DESCRIPTOR security = static_cast<PSECURITY_DESCRIPTOR>(::malloc(length));
if (security && ::GetFileSecurity(c_str, OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION
| DACL_SECURITY_INFORMATION, security, length, &length)) {
HANDLE hToken = NULL;
if (::OpenProcessToken(::GetCurrentProcess(), TOKEN_IMPERSONATE | TOKEN_QUERY |
TOKEN_DUPLICATE | STANDARD_RIGHTS_READ, &hToken)) {
HANDLE hImpersonatedToken = NULL;
if (::DuplicateToken(hToken, SecurityImpersonation, &hImpersonatedToken)) {
GENERIC_MAPPING mapping = { 0xFFFFFFFF };
PRIVILEGE_SET privileges = { 0 };
DWORD grantedAccess = 0, privilegesLength = sizeof(privileges);
BOOL result = FALSE;
mapping.GenericRead = FILE_GENERIC_READ | FILE_GENERIC_READ;
mapping.GenericWrite = FILE_GENERIC_WRITE;
mapping.GenericExecute = FILE_GENERIC_EXECUTE;
mapping.GenericAll = FILE_ALL_ACCESS;
DWORD genericAccessRights = FILE_GENERIC_WRITE;
::MapGenericMask(&genericAccessRights, &mapping);
if (::AccessCheck(security, hImpersonatedToken, genericAccessRights,
&mapping, &privileges, &privilegesLength, &grantedAccess, &result))
{
if (result == TRUE) {
if (((grantedAccess & GENERIC_WRITE) == GENERIC_WRITE)
|| ((grantedAccess & FILE_GENERIC_WRITE) == FILE_GENERIC_WRITE))
bret = true;
}
}
::CloseHandle(hImpersonatedToken);
}
::CloseHandle(hToken);
}
::free(security);
}
}
#else
bret = true;
#endif
return QFileInfo(fileName).isWritable() && QFileInfo(fileName).isReadable() && bret;
}
//#define WEBDEGUB
MainWindow::MainWindow(QWidget* parent)
: QMainWindow(parent), _webView(nullptr)
{
LOG(INFO) << CommonHelper::utf8ToStdString("---------DPS is begin!-------------");
#ifdef WEBDEGUB
_webView = new WebEngineView(QUrl(BaseUrl + "#/debug/SearchEditModule/save-data-to-file"), this);
#else
_webView = new WebEngineView(QUrl(BaseUrl), this);
#endif // WEBDEGUB
this->setCentralWidget(_webView);
_eventModule = new SignalEventModule("MainWindow");
QObject::connect(_eventModule, &SignalEventModule::onmessage, this, &MainWindow::onMessage);
_webView->addEventModule(_eventModule);
// _pDataRoot = new DataManager();
DataManager& root = GetDataRoot();
//<2F><>ʼ<EFBFBD><CABC>Session<6F><6E><EFBFBD>ݡ<EFBFBD>
Session::_session = new Session(this);
Session::_session->_titleBar = new TitleBar(this);
_webView->addEventModule(Session::getSession()->titleBar());
Session::_session->_sideBar = new SideBar(this);
_webView->addEventModule(Session::getSession()->sideBar());
// Session::_session->_projectManager = new ProjectManager((QMainWindow*)this);
// eventDispatch->addEventModule(Session::getSession()->projectManager());
Session::_session->_homePage = new HomePage((QMainWindow*)this, &root);
_webView->addEventModule(Session::getSession()->homePage());
Session::_session->_codeGenerate = new CodeGenerateEventModule((QMainWindow*)this, &root);
_webView->addEventModule(Session::getSession()->codeGenerate());
_webView->addEventModule(new SystemSettingModule(nullptr, &root));
Session::_session->_projectEventModule = new ProjectEventModule((QMainWindow*)this, &root);
_webView->addEventModule(Session::getSession()->projectEventModule());
Session::_session->_dataModelEventModule = new DataModelEventModule((QMainWindow*)this, &root);
_webView->addEventModule(Session::getSession()->dataModelEventModule());
Session::_session->_dataPackEvenModule = new DataPackEventModule((QMainWindow*)this, &root);
_webView->addEventModule(Session::getSession()->dataPackEventModule());
Session::_session->_searchEditModule = new SearchEditEventModule((QMainWindow*)this, &root);
_webView->addEventModule(Session::getSession()->searchEditEventModule());
Session::_session->_xmlEditModule = new XmlEditEventModule((QMainWindow*)this, &root);
_webView->addEventModule(Session::getSession()->xmlEditEventModule());
#ifdef Q_OS_WIN
_frameless = std::move(std::unique_ptr<QFramelessHelper>(new QFramelessHelper(this, _webView, true, (QMainWindow*)this)));
#endif
}
MainWindow::~MainWindow()
{
}
void MainWindow::Close()
{
if (Session::_session->_codeGenerate)
{
Session::_session->_codeGenerate->closeCodeDisplay();
}
this->close();
}
#if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))
bool MainWindow::nativeEvent(const QByteArray& eventType, void* message, qintptr* result)
#else
bool MainWindow::nativeEvent(const QByteArray& eventType, void* message, long* result)
#endif
{
if (_frameless && _frameless->nativeEvent(eventType, message, result))
return true;
return QMainWindow::nativeEvent(eventType, message, result);
}
bool MainWindow::onMessage(const std::string& eventName, json& parameter)
{
LOG(INFO) << CommonHelper::utf8ToStdString("MainWindow receive message.......");
LOG(INFO) << eventName;
LOG(INFO) << CommonHelper::jsonToString(parameter);
TRY{
if (eventName == "opened") {
initalApplication();
return true;
}
else if (eventName == "db-connect")
{
DBConnect(parameter);
return true;
}
}
CATCH(parameter);
return false;
}
void MainWindow::message(const QString& message, int type)
{
json j;
j["value"] = CommonHelper::qstringToUtf8(message);
j["type"] = type;
_eventModule->send("message", j);
}
void MainWindow::initalApplication()
{
changeModule("Homepage");
}
void MainWindow::changeModule(const std::string& moduleName)
{
Session::getSession()->sideBar()->changeModule(moduleName);
}
void MainWindow::changeMaximize()
{
if (this->isMaximized())
this->showNormal();
else
this->showMaximized();
Session::getSession()->titleBar()->send("maximized", this->isMaximized());
}
void MainWindow::changeEvent(QEvent* event)
{
if (event->type() != QEvent::WindowStateChange) return;
Session::getSession()->titleBar()->send("maximized", this->isMaximized());
}
void MainWindow::openSettingDialog()
{
_settingDialog = std::move(std::unique_ptr<SettingDialog>(new SettingDialog(this)));
_settingDialog->setMinimumSize(800, 600);
_settingDialog->setModal(true);
_settingDialog->show();
}
bool MainWindow::DBConnect(json& parameter)
{
using namespace DBPlatformSpace;
ResultMsg rm;
auto data = parameter["data"];
// std::string sysDBPath = data["sysDBPath"];
QString sysDBPath = CommonHelper::utf8ToQString(data["sysDBPath"]);
DataManager& dataRoot = GetDataRoot();
QString dbFile;
if (sysDBPath == "")
{
SysManager& sysMgr = GetSysManager();
dbFile = sysMgr._sysDBPath;
}
else
{
dbFile = sysDBPath;
}
//<2F>Ƿ<EFBFBD><C7B7>ع<EFBFBD>ʧ<EFBFBD>ܺ<EFBFBD><DCBA><EFBFBD><EFBFBD><EFBFBD>
QString tempFile = QCoreApplication::applicationDirPath() + "/rollback.txt";
QFile rollBackFile(tempFile);
if (rollBackFile.exists())
{
if (rollBackFile.open(QIODevice::ReadOnly))
{
message("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD>ͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
QTextStream stream(&rollBackFile);
QStringList list = stream.readAll().split(",");
QString tmpFile = list.at(0);
LOG(INFO) << CommonHelper::qstringToStdString(tmpFile);
rollBackFile.close();
bool ret = QFile::remove(tmpFile);
ret = QFile::rename(tmpFile + ".bak", dbFile);
if (!ret)
{
LOG(INFO) << "rename failed";
}
LOG(INFO) << "remove and rename " << CommonHelper::qstringToStdString(dbFile);
QFile::remove(tempFile);
}
}
QString msg = "MainWindow::DBConnect: DBFile:" + dbFile;
LOG(INFO) << CommonHelper::qstringToString(msg);
QFile file(dbFile);
if (!file.exists() || !CanFileWritable(dbFile))
{
//dbp<62>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
message("<EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڻ<EFBFBD><EFBFBD><EFBFBD>дȨ<EFBFBD>޲<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԱȨ<D4B1><C8A8>", 2);
LOG(ERROR) << CommonHelper::utf8ToStdString("MainWindow::DBConnect<63><74> no dbFile<6C><65> db<64><62><EFBFBD><EFBFBD>дȨ<D0B4><C8A8>");
_eventModule->broadcast("connect-status-change", json({ {"status",false} }));
return false;
}
if (dataRoot.pTheDBPlatform)
{
delete dataRoot.pTheDBPlatform;
dataRoot.pTheDBPlatform = nullptr;
dataRoot.clearAllProject();
}
try {
dataRoot.pTheDBPlatform = new DBPlatformSpace::DBPlatformNew(CommonHelper::qstringToStdString(dbFile));
}
catch (...) {
parameter["error"] = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><EFBFBD>ļ<EFBFBD>ʧ<EFBFBD><EFBFBD>";
return false;
}
string st = DBPlatformNew::getCurrPlatformStatus();
if (st == "OK")
{
dataRoot._dbConnected = true;
LOG(INFO) << CommonHelper::utf8ToStdString("MainWindow DBConnect::DBPlatformNew connect success");
_eventModule->broadcast("connect-status-change", json({ {"status",true} }));
return true;
}
LOG(INFO) << CommonHelper::utf8ToStdString("MainWindow DBConnect::DBPlatformNew connect failed");
_eventModule->broadcast("connect-status-change", json({ {"status",false} }));
return false;
}