mirror of
https://gitea.msk.dinamika-avia.ru/Constanta-Design/RRJServer.git
synced 2026-03-27 19:45:43 +03:00
Merge branch 'startIntegrate' into DEV
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -21,3 +21,5 @@ GUIdataBaseLMS/GUIdataBaseLMS/CMakeLists.txt.user
|
||||
DB_LMS/DataBaseLMS/CMakeLists.txt.user
|
||||
DB_LMS/DataBaseLMS/CMakeLists.txt.user
|
||||
GUIdataBaseLMS/GUIdataBaseLMS/CMakeLists.txt.user
|
||||
DOCS/.obsidian
|
||||
GUIdataBaseLMS/GUIdataBaseLMS/StaticData
|
||||
|
||||
@@ -122,16 +122,25 @@ target_include_directories(InstructorsAndTrainees PUBLIC ${CMAKE_CURRENT_SOURCE_
|
||||
if(PROJECT_TYPE_DEBUG)
|
||||
target_link_directories(InstructorsAndTrainees PUBLIC ${REPO_PATH}/BUILDS/DB_LMS/Debug64)
|
||||
elseif()
|
||||
target_link_directories(InstructorsAndTrainees PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../../QT/BUILDS/LMS/DB_LMS/Release64)
|
||||
target_link_directories(InstructorsAndTrainees PUBLIC ${REPO_PATH}/BUILDS/DB_LMS/Release64)
|
||||
endif()
|
||||
target_link_libraries(InstructorsAndTrainees PRIVATE libDataBaseLMS.dll)
|
||||
|
||||
|
||||
add_custom_command(TARGET InstructorsAndTrainees
|
||||
POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
||||
${REPO_PATH}/BUILDS/DB_IaT/Debug64/libInstructorsAndTrainees.dll
|
||||
${REPO_PATH}/BUILDS/GUIdataBaseLMS/Debug64)
|
||||
if(PROJECT_TYPE_DEBUG)
|
||||
add_custom_command(TARGET InstructorsAndTrainees
|
||||
POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
||||
${REPO_PATH}/BUILDS/DB_IaT/Debug64/libInstructorsAndTrainees.dll
|
||||
${REPO_PATH}/BUILDS/GUIdataBaseLMS/Debug64)
|
||||
elseif()
|
||||
add_custom_command(TARGET InstructorsAndTrainees
|
||||
POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
||||
${REPO_PATH}/BUILDS/DB_IaT/Release64/libInstructorsAndTrainees.dll
|
||||
${REPO_PATH}/BUILDS/GUIdataBaseLMS/Release64)
|
||||
endif()
|
||||
|
||||
|
||||
#Только для TSMP!
|
||||
#install(TARGETS InstructorsAndTrainees DESTINATION ${VEYON_LIB_DIR})
|
||||
|
||||
@@ -274,6 +274,10 @@ void DocTasksWidget::addModuleToTreeWidget(Module *module, QTreeWidgetItem* pare
|
||||
{
|
||||
DM* DMmodul = static_cast<DM*>(module);
|
||||
text = DMmodul->getLangStructRus().techName;
|
||||
|
||||
itemModule->setFlags(itemModule->flags() | Qt::ItemIsUserCheckable);
|
||||
itemModule->setCheckState(0, Qt::Checked);
|
||||
itemModule->setIcon(0, QIcon(":/resources/icons/procedure.png"));
|
||||
}
|
||||
|
||||
itemModule->setText(ColumnsTree::clmn_PMorDM, text);
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#include <QDomDocument>
|
||||
#include <QFile>
|
||||
#include <QMessageBox>
|
||||
#include <QTreeWidget>
|
||||
#include "fimtaskswidget.h"
|
||||
#include "ui_fimtaskswidget.h"
|
||||
#include "tasksAmmFim.h"
|
||||
@@ -12,7 +13,10 @@ FIMtasksWidget::FIMtasksWidget(QWidget *parent) :
|
||||
ui->setupUi(this);
|
||||
|
||||
loadTasksAmmFimFromXML();
|
||||
updateListWidget();
|
||||
|
||||
preparationTreeWidget();
|
||||
|
||||
fillTree();
|
||||
}
|
||||
|
||||
FIMtasksWidget::~FIMtasksWidget()
|
||||
@@ -60,63 +64,111 @@ void FIMtasksWidget::loadTasksAmmFimFromXML()
|
||||
nodeMap.namedItem("changed").nodeValue());
|
||||
|
||||
QDomElement malfunctionElement = taskElement.firstChildElement();
|
||||
if(malfunctionElement.isNull())
|
||||
break;
|
||||
if(!malfunctionElement.isNull())
|
||||
{
|
||||
do
|
||||
{/*malfunction*/
|
||||
QString name = malfunctionElement.nodeName();
|
||||
QDomNamedNodeMap nodeMap = malfunctionElement.attributes();
|
||||
|
||||
do
|
||||
{/*malfunction*/
|
||||
QString name = malfunctionElement.nodeName();
|
||||
QDomNamedNodeMap nodeMap = malfunctionElement.attributes();
|
||||
if(name == "malfunction")
|
||||
{
|
||||
Malfunction malfunction;
|
||||
|
||||
if(name == "malfunction")
|
||||
{
|
||||
Malfunction malfunction;
|
||||
malfunction.initialize(nodeMap.namedItem("dmCode").nodeValue(),
|
||||
nodeMap.namedItem("num").nodeValue(),
|
||||
nodeMap.namedItem("description").nodeValue());
|
||||
|
||||
malfunction.initialize(nodeMap.namedItem("dmCode").nodeValue(),
|
||||
nodeMap.namedItem("num").nodeValue(),
|
||||
nodeMap.namedItem("description").nodeValue());
|
||||
|
||||
QDomElement signElement = malfunctionElement.firstChildElement();
|
||||
if(signElement.isNull())
|
||||
break;
|
||||
|
||||
do
|
||||
{/*malfunctionSign*/
|
||||
QString name = signElement.nodeName();
|
||||
QDomNamedNodeMap nodeMap = signElement.attributes();
|
||||
|
||||
if(name == "malfunctionSign")
|
||||
QDomElement signElement = malfunctionElement.firstChildElement();
|
||||
if(!signElement.isNull())
|
||||
{
|
||||
MalfunctionSign sign;
|
||||
do
|
||||
{/*malfunctionSign*/
|
||||
QString name = signElement.nodeName();
|
||||
QDomNamedNodeMap nodeMap = signElement.attributes();
|
||||
|
||||
sign.initialize(nodeMap.namedItem("type").nodeValue().toInt(),
|
||||
nodeMap.namedItem("description").nodeValue());
|
||||
if(name == "malfunctionSign")
|
||||
{
|
||||
MalfunctionSign sign;
|
||||
|
||||
malfunction.addMalfunctionSign(sign);
|
||||
sign.initialize(nodeMap.namedItem("type").nodeValue().toInt(),
|
||||
nodeMap.namedItem("description").nodeValue());
|
||||
|
||||
malfunction.addMalfunctionSign(sign);
|
||||
}
|
||||
|
||||
}while(! (signElement = signElement.nextSiblingElement()).isNull());
|
||||
}
|
||||
|
||||
}while(! (signElement = signElement.nextSiblingElement()).isNull());
|
||||
|
||||
task.addMalfunction(malfunction);
|
||||
}
|
||||
|
||||
}while(! (malfunctionElement = malfunctionElement.nextSiblingElement()).isNull());
|
||||
|
||||
task.addMalfunction(malfunction);
|
||||
}
|
||||
}while(! (malfunctionElement = malfunctionElement.nextSiblingElement()).isNull());
|
||||
}
|
||||
listTaskAmmFim.append(task);
|
||||
}
|
||||
}while (! (taskElement = taskElement.nextSiblingElement()).isNull());
|
||||
}
|
||||
}
|
||||
|
||||
void FIMtasksWidget::updateListWidget()
|
||||
void FIMtasksWidget::fillTree()
|
||||
{
|
||||
for(TaskAmmFim taskFim : listTaskAmmFim)
|
||||
{
|
||||
addTaskFimToListWidget(taskFim);
|
||||
for(int i = 0; i < listTaskAmmFim.count(); i++)
|
||||
{/*Задачи*/
|
||||
TaskAmmFim task = listTaskAmmFim.at(i);
|
||||
|
||||
QTreeWidgetItem* itemTask = new QTreeWidgetItem();
|
||||
|
||||
itemTask->setText(0, task.title);
|
||||
itemTask->setText(1, QString::number(task.id));
|
||||
itemTask->setFlags(itemTask->flags() | Qt::ItemIsUserCheckable);
|
||||
itemTask->setCheckState(0, Qt::Checked);
|
||||
itemTask->setIcon(0, QIcon(":/resources/icons/procedure.png"));
|
||||
|
||||
ui->treeWidget->addTopLevelItem(itemTask);
|
||||
|
||||
for (int j = 0; j < task.malfunctionList.count(); j++)
|
||||
{/*Неисправности*/
|
||||
Malfunction malfunction = task.malfunctionList.at(j);
|
||||
|
||||
QTreeWidgetItem* itemMalfunction = new QTreeWidgetItem();
|
||||
|
||||
itemMalfunction->setText(0, malfunction.description);
|
||||
itemMalfunction->setFlags(itemMalfunction->flags() | Qt::ItemIsUserCheckable);
|
||||
itemMalfunction->setCheckState(0, Qt::Checked);
|
||||
itemMalfunction->setIcon(0, QIcon(":/resources/icons/malfunction.png"));
|
||||
|
||||
itemTask->addChild(itemMalfunction);
|
||||
|
||||
for (int k = 0; k < malfunction.malfunctionSigns.count(); k++)
|
||||
{/*Сигнализация*/
|
||||
MalfunctionSign sign = malfunction.malfunctionSigns.at(k);
|
||||
|
||||
QTreeWidgetItem* itemSign = new QTreeWidgetItem();
|
||||
|
||||
itemSign->setText(0, sign.description);
|
||||
//itemSign->setFlags(itemSign->flags() | Qt::ItemIsUserCheckable);
|
||||
//itemSign->setCheckState(0, Qt::Checked);
|
||||
itemSign->setIcon(0, QIcon(":/resources/icons/sign.png"));
|
||||
|
||||
itemMalfunction->addChild(itemSign);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void FIMtasksWidget::addTaskFimToListWidget(TaskAmmFim taskFim)
|
||||
void FIMtasksWidget::preparationTreeWidget()
|
||||
{
|
||||
ui->treeWidget->setColumnCount(2);
|
||||
|
||||
reSetHeadTreeWidget();
|
||||
|
||||
ui->treeWidget->setColumnWidth(ColumnsTree::clmn_ID, 20);
|
||||
ui->treeWidget->setColumnWidth(ColumnsTree::clmn_Title, 500);
|
||||
|
||||
//ui->treeWidget->setColumnHidden(ColumnsTree::clmn_ID, true);
|
||||
}
|
||||
|
||||
void FIMtasksWidget::reSetHeadTreeWidget()
|
||||
{
|
||||
QStringList listHeaders = {tr("Title"), tr("ID")};
|
||||
ui->treeWidget->setHeaderLabels(listHeaders);
|
||||
}
|
||||
|
||||
@@ -12,14 +12,21 @@ class FIMtasksWidget : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
private:
|
||||
enum ColumnsTree{
|
||||
clmn_Title = 0,
|
||||
clmn_ID
|
||||
};
|
||||
|
||||
public:
|
||||
explicit FIMtasksWidget(QWidget *parent = nullptr);
|
||||
~FIMtasksWidget();
|
||||
|
||||
public:
|
||||
private:
|
||||
void loadTasksAmmFimFromXML();
|
||||
void updateListWidget();
|
||||
void addTaskFimToListWidget(TaskAmmFim taskFim);
|
||||
void fillTree();
|
||||
void preparationTreeWidget();
|
||||
void reSetHeadTreeWidget();
|
||||
|
||||
|
||||
public:
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>400</width>
|
||||
<height>409</height>
|
||||
<height>472</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
@@ -22,29 +22,14 @@
|
||||
<string>FIM</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_3">
|
||||
<item row="5" column="0">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>ID</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="lineEditID"/>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>Type</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="lineEditType"/>
|
||||
</item>
|
||||
</layout>
|
||||
<item row="4" column="0">
|
||||
<widget class="QTreeWidget" name="treeWidget">
|
||||
<column>
|
||||
<property name="text">
|
||||
<string notr="true">1</string>
|
||||
</property>
|
||||
</column>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QLabel" name="label_5">
|
||||
@@ -53,43 +38,6 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QListWidget" name="listWidgetTasks"/>
|
||||
</item>
|
||||
<item row="6" column="0">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="text">
|
||||
<string>Title</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="lineEditTitle"/>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="10" column="0">
|
||||
<widget class="QTableWidget" name="tableWidgetSigns"/>
|
||||
</item>
|
||||
<item row="8" column="0">
|
||||
<widget class="QListWidget" name="listWidgetMalfunctions"/>
|
||||
</item>
|
||||
<item row="9" column="0">
|
||||
<widget class="QLabel" name="label_4">
|
||||
<property name="text">
|
||||
<string>Signs</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="7" column="0">
|
||||
<widget class="QLabel" name="label_6">
|
||||
<property name="text">
|
||||
<string>Malfunctions</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
|
||||
@@ -12,6 +12,7 @@ InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) :
|
||||
viewerInstructors(nullptr),
|
||||
messangerWidget(nullptr),
|
||||
docTasksWidget(nullptr),
|
||||
fIMtasksWidget(nullptr),
|
||||
adminMode(false),
|
||||
loginInstructorLoggedInLocal(QStringLiteral("")),
|
||||
nameInstructorLoggedInLocal(QStringLiteral(""))
|
||||
@@ -68,7 +69,7 @@ InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) :
|
||||
messangerWidget->setMinimumSize(500, 600);
|
||||
messangerWidget->setMaximumWidth(500);
|
||||
|
||||
ui->btnAuthorizationInstructor->setEnabled(false);
|
||||
//ui->btnAuthorizationInstructor->setEnabled(false);
|
||||
|
||||
updateMyStyleSheet();
|
||||
}
|
||||
@@ -79,6 +80,7 @@ InstructorsAndTraineesWidget::~InstructorsAndTraineesWidget()
|
||||
deAuthorizationInstructor(loginInstructorLoggedInLocal);
|
||||
|
||||
delete docTasksWidget;
|
||||
delete fIMtasksWidget;
|
||||
delete messangerWidget;
|
||||
delete viewerInstructors;
|
||||
delete viewerTrainees;
|
||||
@@ -119,7 +121,8 @@ void InstructorsAndTraineesWidget::updateMyStyleSheet()
|
||||
|
||||
QString InstructorsAndTraineesWidget::loadStyleSheet()
|
||||
{
|
||||
QString fileName = ":/resources/css/styleSheetMain.css";
|
||||
//QString fileName = ":/resources/css/styleSheetMain.css";
|
||||
QString fileName = "./resources/css/styleSheetMain.css";
|
||||
QFile styleSheetFile(fileName);
|
||||
if (!styleSheetFile.open(QFile::ReadOnly | QFile::Text))
|
||||
{
|
||||
|
||||
@@ -36,5 +36,9 @@
|
||||
<file>resources/icons/traineeArchive.png</file>
|
||||
<file>resources/icons/traineeFromArchive.png</file>
|
||||
<file>resources/icons/vline.png</file>
|
||||
<file>resources/icons/sign.png</file>
|
||||
<file>resources/icons/task.png</file>
|
||||
<file>resources/icons/procedure.png</file>
|
||||
<file>resources/icons/malfunction.png</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
||||
BIN
DB_IaT/InstructorsAndTrainees/resources/icons/malfunction.png
Normal file
BIN
DB_IaT/InstructorsAndTrainees/resources/icons/malfunction.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 18 KiB |
BIN
DB_IaT/InstructorsAndTrainees/resources/icons/procedure.png
Normal file
BIN
DB_IaT/InstructorsAndTrainees/resources/icons/procedure.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 29 KiB |
BIN
DB_IaT/InstructorsAndTrainees/resources/icons/sign.png
Normal file
BIN
DB_IaT/InstructorsAndTrainees/resources/icons/sign.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 17 KiB |
BIN
DB_IaT/InstructorsAndTrainees/resources/icons/sign.png.bak
Normal file
BIN
DB_IaT/InstructorsAndTrainees/resources/icons/sign.png.bak
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.1 KiB |
BIN
DB_IaT/InstructorsAndTrainees/resources/icons/task.png
Normal file
BIN
DB_IaT/InstructorsAndTrainees/resources/icons/task.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.7 KiB |
@@ -12,6 +12,14 @@ set(CMAKE_AUTORCC ON)
|
||||
set(CMAKE_CXX_STANDARD 11)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||
set(PROJECT_TYPE_DEBUG TRUE)
|
||||
endif()
|
||||
|
||||
if(PROJECT_TYPE_DEBUG)
|
||||
add_definitions(-DPROJECT_TYPE_DEBUG)
|
||||
endif()
|
||||
|
||||
find_package(Qt5 COMPONENTS Widgets REQUIRED)
|
||||
find_package(Qt5 COMPONENTS Sql REQUIRED)
|
||||
find_package(Qt5 COMPONENTS LinguistTools REQUIRED)
|
||||
@@ -46,14 +54,34 @@ target_link_libraries(DataBaseLMS PRIVATE Qt5::Sql)
|
||||
target_compile_definitions(DataBaseLMS PRIVATE DATABASELMS_LIBRARY)
|
||||
|
||||
message("${REPO_PATH}")
|
||||
add_custom_command(TARGET DataBaseLMS
|
||||
POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
||||
${REPO_PATH}/BUILDS/DB_LMS/Debug64/libDataBaseLMS.dll
|
||||
${REPO_PATH}/BUILDS/TestServerLMS/Debug64)
|
||||
|
||||
add_custom_command(TARGET DataBaseLMS
|
||||
POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
||||
${REPO_PATH}/BUILDS/DB_LMS/Debug64/libDataBaseLMS.dll
|
||||
${REPO_PATH}/BUILDS/GUIdataBaseLMS/Debug64)
|
||||
if(PROJECT_TYPE_DEBUG)
|
||||
|
||||
add_custom_command(TARGET DataBaseLMS
|
||||
POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
||||
${REPO_PATH}/BUILDS/DB_LMS/Debug64/libDataBaseLMS.dll
|
||||
${REPO_PATH}/BUILDS/TestServerLMS/Debug64)
|
||||
|
||||
add_custom_command(TARGET DataBaseLMS
|
||||
POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
||||
${REPO_PATH}/BUILDS/DB_LMS/Debug64/libDataBaseLMS.dll
|
||||
${REPO_PATH}/BUILDS/GUIdataBaseLMS/Debug64)
|
||||
elseif()
|
||||
|
||||
add_custom_command(TARGET DataBaseLMS
|
||||
POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
||||
${REPO_PATH}/BUILDS/DB_LMS/Release64/libDataBaseLMS.dll
|
||||
${REPO_PATH}/BUILDS/TestServerLMS/Release64)
|
||||
|
||||
add_custom_command(TARGET DataBaseLMS
|
||||
POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
||||
${REPO_PATH}/BUILDS/DB_LMS/Release64/libDataBaseLMS.dll
|
||||
${REPO_PATH}/BUILDS/GUIdataBaseLMS/Release64)
|
||||
endif()
|
||||
|
||||
|
||||
|
||||
|
||||
1
DOCS/.obsidian/app.json
vendored
1
DOCS/.obsidian/app.json
vendored
@@ -1 +0,0 @@
|
||||
{}
|
||||
3
DOCS/.obsidian/appearance.json
vendored
3
DOCS/.obsidian/appearance.json
vendored
@@ -1,3 +0,0 @@
|
||||
{
|
||||
"theme": "obsidian"
|
||||
}
|
||||
4
DOCS/.obsidian/community-plugins.json
vendored
4
DOCS/.obsidian/community-plugins.json
vendored
@@ -1,4 +0,0 @@
|
||||
[
|
||||
"obsidian-excalidraw-plugin",
|
||||
"obsidian-kanban"
|
||||
]
|
||||
30
DOCS/.obsidian/core-plugins.json
vendored
30
DOCS/.obsidian/core-plugins.json
vendored
@@ -1,30 +0,0 @@
|
||||
{
|
||||
"file-explorer": true,
|
||||
"global-search": true,
|
||||
"switcher": true,
|
||||
"graph": true,
|
||||
"backlink": true,
|
||||
"canvas": true,
|
||||
"outgoing-link": true,
|
||||
"tag-pane": true,
|
||||
"properties": false,
|
||||
"page-preview": true,
|
||||
"daily-notes": true,
|
||||
"templates": true,
|
||||
"note-composer": true,
|
||||
"command-palette": true,
|
||||
"slash-command": false,
|
||||
"editor-status": true,
|
||||
"bookmarks": true,
|
||||
"markdown-importer": false,
|
||||
"zk-prefixer": false,
|
||||
"random-note": false,
|
||||
"outline": true,
|
||||
"word-count": true,
|
||||
"slides": false,
|
||||
"audio-recorder": false,
|
||||
"workspaces": false,
|
||||
"file-recovery": true,
|
||||
"publish": false,
|
||||
"sync": false
|
||||
}
|
||||
22
DOCS/.obsidian/graph.json
vendored
22
DOCS/.obsidian/graph.json
vendored
@@ -1,22 +0,0 @@
|
||||
{
|
||||
"collapse-filter": true,
|
||||
"search": "",
|
||||
"showTags": false,
|
||||
"showAttachments": false,
|
||||
"hideUnresolved": false,
|
||||
"showOrphans": true,
|
||||
"collapse-color-groups": true,
|
||||
"colorGroups": [],
|
||||
"collapse-display": true,
|
||||
"showArrow": false,
|
||||
"textFadeMultiplier": 0,
|
||||
"nodeSizeMultiplier": 1,
|
||||
"lineSizeMultiplier": 1,
|
||||
"collapse-forces": true,
|
||||
"centerStrength": 0.518713248970312,
|
||||
"repelStrength": 10,
|
||||
"linkStrength": 1,
|
||||
"linkDistance": 250,
|
||||
"scale": 1,
|
||||
"close": true
|
||||
}
|
||||
@@ -1,788 +0,0 @@
|
||||
{
|
||||
"folder": "Excalidraw",
|
||||
"cropFolder": "",
|
||||
"annotateFolder": "",
|
||||
"embedUseExcalidrawFolder": false,
|
||||
"templateFilePath": "Excalidraw/Template.excalidraw",
|
||||
"scriptFolderPath": "Excalidraw/Scripts",
|
||||
"fontAssetsPath": "Excalidraw/CJK Fonts",
|
||||
"loadChineseFonts": false,
|
||||
"loadJapaneseFonts": false,
|
||||
"loadKoreanFonts": false,
|
||||
"compress": true,
|
||||
"decompressForMDView": false,
|
||||
"onceOffCompressFlagReset": true,
|
||||
"onceOffGPTVersionReset": true,
|
||||
"autosave": true,
|
||||
"autosaveIntervalDesktop": 60000,
|
||||
"autosaveIntervalMobile": 30000,
|
||||
"drawingFilenamePrefix": "Drawing ",
|
||||
"drawingEmbedPrefixWithFilename": true,
|
||||
"drawingFilnameEmbedPostfix": " ",
|
||||
"drawingFilenameDateTime": "YYYY-MM-DD HH.mm.ss",
|
||||
"useExcalidrawExtension": true,
|
||||
"cropPrefix": "cropped_",
|
||||
"annotatePrefix": "annotated_",
|
||||
"annotatePreserveSize": false,
|
||||
"previewImageType": "SVGIMG",
|
||||
"allowImageCache": true,
|
||||
"allowImageCacheInScene": true,
|
||||
"displayExportedImageIfAvailable": false,
|
||||
"previewMatchObsidianTheme": false,
|
||||
"width": "400",
|
||||
"height": "",
|
||||
"overrideObsidianFontSize": false,
|
||||
"dynamicStyling": "colorful",
|
||||
"isLeftHanded": false,
|
||||
"iframeMatchExcalidrawTheme": true,
|
||||
"matchTheme": false,
|
||||
"matchThemeAlways": false,
|
||||
"matchThemeTrigger": false,
|
||||
"defaultMode": "normal",
|
||||
"defaultPenMode": "never",
|
||||
"penModeDoubleTapEraser": true,
|
||||
"penModeSingleFingerPanning": true,
|
||||
"penModeCrosshairVisible": true,
|
||||
"renderImageInMarkdownReadingMode": false,
|
||||
"renderImageInHoverPreviewForMDNotes": false,
|
||||
"renderImageInMarkdownToPDF": false,
|
||||
"allowPinchZoom": false,
|
||||
"allowWheelZoom": false,
|
||||
"zoomToFitOnOpen": true,
|
||||
"zoomToFitOnResize": true,
|
||||
"zoomToFitMaxLevel": 2,
|
||||
"linkPrefix": "📍",
|
||||
"urlPrefix": "🌐",
|
||||
"parseTODO": false,
|
||||
"todo": "☐",
|
||||
"done": "🗹",
|
||||
"hoverPreviewWithoutCTRL": false,
|
||||
"linkOpacity": 1,
|
||||
"openInAdjacentPane": true,
|
||||
"showSecondOrderLinks": true,
|
||||
"focusOnFileTab": true,
|
||||
"openInMainWorkspace": true,
|
||||
"showLinkBrackets": true,
|
||||
"allowCtrlClick": true,
|
||||
"forceWrap": false,
|
||||
"pageTransclusionCharLimit": 200,
|
||||
"wordWrappingDefault": 0,
|
||||
"removeTransclusionQuoteSigns": true,
|
||||
"iframelyAllowed": true,
|
||||
"pngExportScale": 1,
|
||||
"exportWithTheme": true,
|
||||
"exportWithBackground": true,
|
||||
"exportPaddingSVG": 10,
|
||||
"exportEmbedScene": false,
|
||||
"keepInSync": false,
|
||||
"autoexportSVG": false,
|
||||
"autoexportPNG": false,
|
||||
"autoExportLightAndDark": false,
|
||||
"autoexportExcalidraw": false,
|
||||
"embedType": "excalidraw",
|
||||
"embedMarkdownCommentLinks": true,
|
||||
"embedWikiLink": true,
|
||||
"syncExcalidraw": false,
|
||||
"experimentalFileType": false,
|
||||
"experimentalFileTag": "✏️",
|
||||
"experimentalLivePreview": true,
|
||||
"fadeOutExcalidrawMarkup": false,
|
||||
"loadPropertySuggestions": true,
|
||||
"experimentalEnableFourthFont": false,
|
||||
"experimantalFourthFont": "Virgil",
|
||||
"addDummyTextElement": false,
|
||||
"zoteroCompatibility": false,
|
||||
"fieldSuggester": true,
|
||||
"compatibilityMode": false,
|
||||
"drawingOpenCount": 0,
|
||||
"library": "deprecated",
|
||||
"library2": {
|
||||
"type": "excalidrawlib",
|
||||
"version": 2,
|
||||
"source": "https://github.com/zsviczian/obsidian-excalidraw-plugin/releases/tag/2.7.2",
|
||||
"libraryItems": []
|
||||
},
|
||||
"imageElementNotice": true,
|
||||
"mdSVGwidth": 500,
|
||||
"mdSVGmaxHeight": 800,
|
||||
"mdFont": "Virgil",
|
||||
"mdFontColor": "Black",
|
||||
"mdBorderColor": "Black",
|
||||
"mdCSS": "",
|
||||
"scriptEngineSettings": {},
|
||||
"defaultTrayMode": true,
|
||||
"previousRelease": "2.7.2",
|
||||
"showReleaseNotes": true,
|
||||
"showNewVersionNotification": true,
|
||||
"latexBoilerplate": "\\color{blue}",
|
||||
"taskboneEnabled": false,
|
||||
"taskboneAPIkey": "",
|
||||
"pinnedScripts": [],
|
||||
"customPens": [
|
||||
{
|
||||
"type": "default",
|
||||
"freedrawOnly": false,
|
||||
"strokeColor": "#000000",
|
||||
"backgroundColor": "transparent",
|
||||
"fillStyle": "hachure",
|
||||
"strokeWidth": 0,
|
||||
"roughness": 0,
|
||||
"penOptions": {
|
||||
"highlighter": false,
|
||||
"constantPressure": false,
|
||||
"hasOutline": false,
|
||||
"outlineWidth": 1,
|
||||
"options": {
|
||||
"thinning": 0.6,
|
||||
"smoothing": 0.5,
|
||||
"streamline": 0.5,
|
||||
"easing": "easeOutSine",
|
||||
"start": {
|
||||
"cap": true,
|
||||
"taper": 0,
|
||||
"easing": "linear"
|
||||
},
|
||||
"end": {
|
||||
"cap": true,
|
||||
"taper": 0,
|
||||
"easing": "linear"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "highlighter",
|
||||
"freedrawOnly": true,
|
||||
"strokeColor": "#FFC47C",
|
||||
"backgroundColor": "#FFC47C",
|
||||
"fillStyle": "solid",
|
||||
"strokeWidth": 2,
|
||||
"roughness": null,
|
||||
"penOptions": {
|
||||
"highlighter": true,
|
||||
"constantPressure": true,
|
||||
"hasOutline": true,
|
||||
"outlineWidth": 4,
|
||||
"options": {
|
||||
"thinning": 1,
|
||||
"smoothing": 0.5,
|
||||
"streamline": 0.5,
|
||||
"easing": "linear",
|
||||
"start": {
|
||||
"taper": 0,
|
||||
"cap": true,
|
||||
"easing": "linear"
|
||||
},
|
||||
"end": {
|
||||
"taper": 0,
|
||||
"cap": true,
|
||||
"easing": "linear"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "finetip",
|
||||
"freedrawOnly": false,
|
||||
"strokeColor": "#3E6F8D",
|
||||
"backgroundColor": "transparent",
|
||||
"fillStyle": "hachure",
|
||||
"strokeWidth": 0.5,
|
||||
"roughness": 0,
|
||||
"penOptions": {
|
||||
"highlighter": false,
|
||||
"hasOutline": false,
|
||||
"outlineWidth": 1,
|
||||
"constantPressure": true,
|
||||
"options": {
|
||||
"smoothing": 0.4,
|
||||
"thinning": -0.5,
|
||||
"streamline": 0.4,
|
||||
"easing": "linear",
|
||||
"start": {
|
||||
"taper": 5,
|
||||
"cap": false,
|
||||
"easing": "linear"
|
||||
},
|
||||
"end": {
|
||||
"taper": 5,
|
||||
"cap": false,
|
||||
"easing": "linear"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "fountain",
|
||||
"freedrawOnly": false,
|
||||
"strokeColor": "#000000",
|
||||
"backgroundColor": "transparent",
|
||||
"fillStyle": "hachure",
|
||||
"strokeWidth": 2,
|
||||
"roughness": 0,
|
||||
"penOptions": {
|
||||
"highlighter": false,
|
||||
"constantPressure": false,
|
||||
"hasOutline": false,
|
||||
"outlineWidth": 1,
|
||||
"options": {
|
||||
"smoothing": 0.2,
|
||||
"thinning": 0.6,
|
||||
"streamline": 0.2,
|
||||
"easing": "easeInOutSine",
|
||||
"start": {
|
||||
"taper": 150,
|
||||
"cap": true,
|
||||
"easing": "linear"
|
||||
},
|
||||
"end": {
|
||||
"taper": 1,
|
||||
"cap": true,
|
||||
"easing": "linear"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "marker",
|
||||
"freedrawOnly": true,
|
||||
"strokeColor": "#B83E3E",
|
||||
"backgroundColor": "#FF7C7C",
|
||||
"fillStyle": "dashed",
|
||||
"strokeWidth": 2,
|
||||
"roughness": 3,
|
||||
"penOptions": {
|
||||
"highlighter": false,
|
||||
"constantPressure": true,
|
||||
"hasOutline": true,
|
||||
"outlineWidth": 4,
|
||||
"options": {
|
||||
"thinning": 1,
|
||||
"smoothing": 0.5,
|
||||
"streamline": 0.5,
|
||||
"easing": "linear",
|
||||
"start": {
|
||||
"taper": 0,
|
||||
"cap": true,
|
||||
"easing": "linear"
|
||||
},
|
||||
"end": {
|
||||
"taper": 0,
|
||||
"cap": true,
|
||||
"easing": "linear"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "thick-thin",
|
||||
"freedrawOnly": true,
|
||||
"strokeColor": "#CECDCC",
|
||||
"backgroundColor": "transparent",
|
||||
"fillStyle": "hachure",
|
||||
"strokeWidth": 0,
|
||||
"roughness": null,
|
||||
"penOptions": {
|
||||
"highlighter": true,
|
||||
"constantPressure": true,
|
||||
"hasOutline": false,
|
||||
"outlineWidth": 1,
|
||||
"options": {
|
||||
"thinning": 1,
|
||||
"smoothing": 0.5,
|
||||
"streamline": 0.5,
|
||||
"easing": "linear",
|
||||
"start": {
|
||||
"taper": 0,
|
||||
"cap": true,
|
||||
"easing": "linear"
|
||||
},
|
||||
"end": {
|
||||
"cap": true,
|
||||
"taper": true,
|
||||
"easing": "linear"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "thin-thick-thin",
|
||||
"freedrawOnly": true,
|
||||
"strokeColor": "#CECDCC",
|
||||
"backgroundColor": "transparent",
|
||||
"fillStyle": "hachure",
|
||||
"strokeWidth": 0,
|
||||
"roughness": null,
|
||||
"penOptions": {
|
||||
"highlighter": true,
|
||||
"constantPressure": true,
|
||||
"hasOutline": false,
|
||||
"outlineWidth": 1,
|
||||
"options": {
|
||||
"thinning": 1,
|
||||
"smoothing": 0.5,
|
||||
"streamline": 0.5,
|
||||
"easing": "linear",
|
||||
"start": {
|
||||
"cap": true,
|
||||
"taper": true,
|
||||
"easing": "linear"
|
||||
},
|
||||
"end": {
|
||||
"cap": true,
|
||||
"taper": true,
|
||||
"easing": "linear"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "default",
|
||||
"freedrawOnly": false,
|
||||
"strokeColor": "#000000",
|
||||
"backgroundColor": "transparent",
|
||||
"fillStyle": "hachure",
|
||||
"strokeWidth": 0,
|
||||
"roughness": 0,
|
||||
"penOptions": {
|
||||
"highlighter": false,
|
||||
"constantPressure": false,
|
||||
"hasOutline": false,
|
||||
"outlineWidth": 1,
|
||||
"options": {
|
||||
"thinning": 0.6,
|
||||
"smoothing": 0.5,
|
||||
"streamline": 0.5,
|
||||
"easing": "easeOutSine",
|
||||
"start": {
|
||||
"cap": true,
|
||||
"taper": 0,
|
||||
"easing": "linear"
|
||||
},
|
||||
"end": {
|
||||
"cap": true,
|
||||
"taper": 0,
|
||||
"easing": "linear"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "default",
|
||||
"freedrawOnly": false,
|
||||
"strokeColor": "#000000",
|
||||
"backgroundColor": "transparent",
|
||||
"fillStyle": "hachure",
|
||||
"strokeWidth": 0,
|
||||
"roughness": 0,
|
||||
"penOptions": {
|
||||
"highlighter": false,
|
||||
"constantPressure": false,
|
||||
"hasOutline": false,
|
||||
"outlineWidth": 1,
|
||||
"options": {
|
||||
"thinning": 0.6,
|
||||
"smoothing": 0.5,
|
||||
"streamline": 0.5,
|
||||
"easing": "easeOutSine",
|
||||
"start": {
|
||||
"cap": true,
|
||||
"taper": 0,
|
||||
"easing": "linear"
|
||||
},
|
||||
"end": {
|
||||
"cap": true,
|
||||
"taper": 0,
|
||||
"easing": "linear"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "default",
|
||||
"freedrawOnly": false,
|
||||
"strokeColor": "#000000",
|
||||
"backgroundColor": "transparent",
|
||||
"fillStyle": "hachure",
|
||||
"strokeWidth": 0,
|
||||
"roughness": 0,
|
||||
"penOptions": {
|
||||
"highlighter": false,
|
||||
"constantPressure": false,
|
||||
"hasOutline": false,
|
||||
"outlineWidth": 1,
|
||||
"options": {
|
||||
"thinning": 0.6,
|
||||
"smoothing": 0.5,
|
||||
"streamline": 0.5,
|
||||
"easing": "easeOutSine",
|
||||
"start": {
|
||||
"cap": true,
|
||||
"taper": 0,
|
||||
"easing": "linear"
|
||||
},
|
||||
"end": {
|
||||
"cap": true,
|
||||
"taper": 0,
|
||||
"easing": "linear"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"numberOfCustomPens": 0,
|
||||
"pdfScale": 4,
|
||||
"pdfBorderBox": true,
|
||||
"pdfFrame": false,
|
||||
"pdfGapSize": 20,
|
||||
"pdfGroupPages": false,
|
||||
"pdfLockAfterImport": true,
|
||||
"pdfNumColumns": 1,
|
||||
"pdfNumRows": 1,
|
||||
"pdfDirection": "right",
|
||||
"pdfImportScale": 0.3,
|
||||
"gridSettings": {
|
||||
"DYNAMIC_COLOR": true,
|
||||
"COLOR": "#000000",
|
||||
"OPACITY": 50
|
||||
},
|
||||
"laserSettings": {
|
||||
"DECAY_LENGTH": 50,
|
||||
"DECAY_TIME": 1000,
|
||||
"COLOR": "#ff0000"
|
||||
},
|
||||
"embeddableMarkdownDefaults": {
|
||||
"useObsidianDefaults": false,
|
||||
"backgroundMatchCanvas": false,
|
||||
"backgroundMatchElement": true,
|
||||
"backgroundColor": "#fff",
|
||||
"backgroundOpacity": 60,
|
||||
"borderMatchElement": true,
|
||||
"borderColor": "#fff",
|
||||
"borderOpacity": 0,
|
||||
"filenameVisible": false
|
||||
},
|
||||
"markdownNodeOneClickEditing": false,
|
||||
"canvasImmersiveEmbed": true,
|
||||
"startupScriptPath": "",
|
||||
"openAIAPIToken": "",
|
||||
"openAIDefaultTextModel": "gpt-3.5-turbo-1106",
|
||||
"openAIDefaultVisionModel": "gpt-4o",
|
||||
"openAIDefaultImageGenerationModel": "dall-e-3",
|
||||
"openAIURL": "https://api.openai.com/v1/chat/completions",
|
||||
"openAIImageGenerationURL": "https://api.openai.com/v1/images/generations",
|
||||
"openAIImageEditsURL": "https://api.openai.com/v1/images/edits",
|
||||
"openAIImageVariationURL": "https://api.openai.com/v1/images/variations",
|
||||
"modifierKeyConfig": {
|
||||
"Mac": {
|
||||
"LocalFileDragAction": {
|
||||
"defaultAction": "image-import",
|
||||
"rules": [
|
||||
{
|
||||
"shift": false,
|
||||
"ctrl_cmd": false,
|
||||
"alt_opt": false,
|
||||
"meta_ctrl": false,
|
||||
"result": "image-import"
|
||||
},
|
||||
{
|
||||
"shift": true,
|
||||
"ctrl_cmd": false,
|
||||
"alt_opt": true,
|
||||
"meta_ctrl": false,
|
||||
"result": "link"
|
||||
},
|
||||
{
|
||||
"shift": true,
|
||||
"ctrl_cmd": false,
|
||||
"alt_opt": false,
|
||||
"meta_ctrl": false,
|
||||
"result": "image-url"
|
||||
},
|
||||
{
|
||||
"shift": false,
|
||||
"ctrl_cmd": false,
|
||||
"alt_opt": true,
|
||||
"meta_ctrl": false,
|
||||
"result": "embeddable"
|
||||
}
|
||||
]
|
||||
},
|
||||
"WebBrowserDragAction": {
|
||||
"defaultAction": "image-url",
|
||||
"rules": [
|
||||
{
|
||||
"shift": false,
|
||||
"ctrl_cmd": false,
|
||||
"alt_opt": false,
|
||||
"meta_ctrl": false,
|
||||
"result": "image-url"
|
||||
},
|
||||
{
|
||||
"shift": true,
|
||||
"ctrl_cmd": false,
|
||||
"alt_opt": true,
|
||||
"meta_ctrl": false,
|
||||
"result": "link"
|
||||
},
|
||||
{
|
||||
"shift": false,
|
||||
"ctrl_cmd": false,
|
||||
"alt_opt": true,
|
||||
"meta_ctrl": false,
|
||||
"result": "embeddable"
|
||||
},
|
||||
{
|
||||
"shift": true,
|
||||
"ctrl_cmd": false,
|
||||
"alt_opt": false,
|
||||
"meta_ctrl": false,
|
||||
"result": "image-import"
|
||||
}
|
||||
]
|
||||
},
|
||||
"InternalDragAction": {
|
||||
"defaultAction": "link",
|
||||
"rules": [
|
||||
{
|
||||
"shift": false,
|
||||
"ctrl_cmd": false,
|
||||
"alt_opt": false,
|
||||
"meta_ctrl": false,
|
||||
"result": "link"
|
||||
},
|
||||
{
|
||||
"shift": false,
|
||||
"ctrl_cmd": false,
|
||||
"alt_opt": false,
|
||||
"meta_ctrl": true,
|
||||
"result": "embeddable"
|
||||
},
|
||||
{
|
||||
"shift": true,
|
||||
"ctrl_cmd": false,
|
||||
"alt_opt": false,
|
||||
"meta_ctrl": false,
|
||||
"result": "image"
|
||||
},
|
||||
{
|
||||
"shift": true,
|
||||
"ctrl_cmd": false,
|
||||
"alt_opt": false,
|
||||
"meta_ctrl": true,
|
||||
"result": "image-fullsize"
|
||||
}
|
||||
]
|
||||
},
|
||||
"LinkClickAction": {
|
||||
"defaultAction": "new-tab",
|
||||
"rules": [
|
||||
{
|
||||
"shift": false,
|
||||
"ctrl_cmd": false,
|
||||
"alt_opt": false,
|
||||
"meta_ctrl": false,
|
||||
"result": "active-pane"
|
||||
},
|
||||
{
|
||||
"shift": false,
|
||||
"ctrl_cmd": true,
|
||||
"alt_opt": false,
|
||||
"meta_ctrl": false,
|
||||
"result": "new-tab"
|
||||
},
|
||||
{
|
||||
"shift": false,
|
||||
"ctrl_cmd": true,
|
||||
"alt_opt": true,
|
||||
"meta_ctrl": false,
|
||||
"result": "new-pane"
|
||||
},
|
||||
{
|
||||
"shift": true,
|
||||
"ctrl_cmd": true,
|
||||
"alt_opt": true,
|
||||
"meta_ctrl": false,
|
||||
"result": "popout-window"
|
||||
},
|
||||
{
|
||||
"shift": false,
|
||||
"ctrl_cmd": true,
|
||||
"alt_opt": false,
|
||||
"meta_ctrl": true,
|
||||
"result": "md-properties"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"Win": {
|
||||
"LocalFileDragAction": {
|
||||
"defaultAction": "image-import",
|
||||
"rules": [
|
||||
{
|
||||
"shift": false,
|
||||
"ctrl_cmd": false,
|
||||
"alt_opt": false,
|
||||
"meta_ctrl": false,
|
||||
"result": "image-import"
|
||||
},
|
||||
{
|
||||
"shift": false,
|
||||
"ctrl_cmd": true,
|
||||
"alt_opt": false,
|
||||
"meta_ctrl": false,
|
||||
"result": "link"
|
||||
},
|
||||
{
|
||||
"shift": true,
|
||||
"ctrl_cmd": false,
|
||||
"alt_opt": false,
|
||||
"meta_ctrl": false,
|
||||
"result": "image-url"
|
||||
},
|
||||
{
|
||||
"shift": true,
|
||||
"ctrl_cmd": true,
|
||||
"alt_opt": false,
|
||||
"meta_ctrl": false,
|
||||
"result": "embeddable"
|
||||
}
|
||||
]
|
||||
},
|
||||
"WebBrowserDragAction": {
|
||||
"defaultAction": "image-url",
|
||||
"rules": [
|
||||
{
|
||||
"shift": false,
|
||||
"ctrl_cmd": false,
|
||||
"alt_opt": false,
|
||||
"meta_ctrl": false,
|
||||
"result": "image-url"
|
||||
},
|
||||
{
|
||||
"shift": false,
|
||||
"ctrl_cmd": true,
|
||||
"alt_opt": false,
|
||||
"meta_ctrl": false,
|
||||
"result": "link"
|
||||
},
|
||||
{
|
||||
"shift": true,
|
||||
"ctrl_cmd": true,
|
||||
"alt_opt": false,
|
||||
"meta_ctrl": false,
|
||||
"result": "embeddable"
|
||||
},
|
||||
{
|
||||
"shift": true,
|
||||
"ctrl_cmd": false,
|
||||
"alt_opt": false,
|
||||
"meta_ctrl": false,
|
||||
"result": "image-import"
|
||||
}
|
||||
]
|
||||
},
|
||||
"InternalDragAction": {
|
||||
"defaultAction": "link",
|
||||
"rules": [
|
||||
{
|
||||
"shift": false,
|
||||
"ctrl_cmd": false,
|
||||
"alt_opt": false,
|
||||
"meta_ctrl": false,
|
||||
"result": "link"
|
||||
},
|
||||
{
|
||||
"shift": true,
|
||||
"ctrl_cmd": true,
|
||||
"alt_opt": false,
|
||||
"meta_ctrl": false,
|
||||
"result": "embeddable"
|
||||
},
|
||||
{
|
||||
"shift": true,
|
||||
"ctrl_cmd": false,
|
||||
"alt_opt": false,
|
||||
"meta_ctrl": false,
|
||||
"result": "image"
|
||||
},
|
||||
{
|
||||
"shift": false,
|
||||
"ctrl_cmd": true,
|
||||
"alt_opt": true,
|
||||
"meta_ctrl": false,
|
||||
"result": "image-fullsize"
|
||||
}
|
||||
]
|
||||
},
|
||||
"LinkClickAction": {
|
||||
"defaultAction": "new-tab",
|
||||
"rules": [
|
||||
{
|
||||
"shift": false,
|
||||
"ctrl_cmd": false,
|
||||
"alt_opt": false,
|
||||
"meta_ctrl": false,
|
||||
"result": "active-pane"
|
||||
},
|
||||
{
|
||||
"shift": false,
|
||||
"ctrl_cmd": true,
|
||||
"alt_opt": false,
|
||||
"meta_ctrl": false,
|
||||
"result": "new-tab"
|
||||
},
|
||||
{
|
||||
"shift": false,
|
||||
"ctrl_cmd": true,
|
||||
"alt_opt": true,
|
||||
"meta_ctrl": false,
|
||||
"result": "new-pane"
|
||||
},
|
||||
{
|
||||
"shift": true,
|
||||
"ctrl_cmd": true,
|
||||
"alt_opt": true,
|
||||
"meta_ctrl": false,
|
||||
"result": "popout-window"
|
||||
},
|
||||
{
|
||||
"shift": false,
|
||||
"ctrl_cmd": true,
|
||||
"alt_opt": false,
|
||||
"meta_ctrl": true,
|
||||
"result": "md-properties"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"slidingPanesSupport": false,
|
||||
"areaZoomLimit": 1,
|
||||
"longPressDesktop": 500,
|
||||
"longPressMobile": 500,
|
||||
"doubleClickLinkOpenViewMode": true,
|
||||
"isDebugMode": false,
|
||||
"rank": "Bronze",
|
||||
"modifierKeyOverrides": [
|
||||
{
|
||||
"modifiers": [
|
||||
"Mod"
|
||||
],
|
||||
"key": "Enter"
|
||||
},
|
||||
{
|
||||
"modifiers": [
|
||||
"Mod"
|
||||
],
|
||||
"key": "k"
|
||||
},
|
||||
{
|
||||
"modifiers": [
|
||||
"Mod"
|
||||
],
|
||||
"key": "G"
|
||||
}
|
||||
],
|
||||
"showSplashscreen": true
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"id": "obsidian-excalidraw-plugin",
|
||||
"name": "Excalidraw",
|
||||
"version": "2.7.2",
|
||||
"minAppVersion": "1.1.6",
|
||||
"description": "An Obsidian plugin to edit and view Excalidraw drawings",
|
||||
"author": "Zsolt Viczian",
|
||||
"authorUrl": "https://www.zsolt.blog",
|
||||
"fundingUrl": "https://ko-fi.com/zsolt",
|
||||
"helpUrl": "https://github.com/zsviczian/obsidian-excalidraw-plugin#readme",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
153
DOCS/.obsidian/plugins/obsidian-kanban/main.js
vendored
153
DOCS/.obsidian/plugins/obsidian-kanban/main.js
vendored
File diff suppressed because one or more lines are too long
@@ -1,11 +0,0 @@
|
||||
{
|
||||
"id": "obsidian-kanban",
|
||||
"name": "Kanban",
|
||||
"version": "2.0.51",
|
||||
"minAppVersion": "1.0.0",
|
||||
"description": "Create markdown-backed Kanban boards in Obsidian.",
|
||||
"author": "mgmeyers",
|
||||
"authorUrl": "https://github.com/mgmeyers/obsidian-kanban",
|
||||
"helpUrl": "https://publish.obsidian.md/kanban/Obsidian+Kanban+Plugin",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
27
DOCS/.obsidian/types.json
vendored
27
DOCS/.obsidian/types.json
vendored
@@ -1,27 +0,0 @@
|
||||
{
|
||||
"types": {
|
||||
"aliases": "aliases",
|
||||
"cssclasses": "multitext",
|
||||
"tags": "tags",
|
||||
"excalidraw-plugin": "text",
|
||||
"excalidraw-export-transparent": "checkbox",
|
||||
"excalidraw-mask": "checkbox",
|
||||
"excalidraw-export-dark": "checkbox",
|
||||
"excalidraw-export-padding": "number",
|
||||
"excalidraw-export-pngscale": "number",
|
||||
"excalidraw-export-embed-scene": "checkbox",
|
||||
"excalidraw-link-prefix": "text",
|
||||
"excalidraw-url-prefix": "text",
|
||||
"excalidraw-link-brackets": "checkbox",
|
||||
"excalidraw-onload-script": "text",
|
||||
"excalidraw-linkbutton-opacity": "number",
|
||||
"excalidraw-default-mode": "text",
|
||||
"excalidraw-font": "text",
|
||||
"excalidraw-font-color": "text",
|
||||
"excalidraw-border-color": "text",
|
||||
"excalidraw-css": "text",
|
||||
"excalidraw-autoexport": "text",
|
||||
"excalidraw-embeddable-theme": "text",
|
||||
"excalidraw-open-md": "checkbox"
|
||||
}
|
||||
}
|
||||
189
DOCS/.obsidian/workspace.json
vendored
189
DOCS/.obsidian/workspace.json
vendored
@@ -1,189 +0,0 @@
|
||||
{
|
||||
"main": {
|
||||
"id": "2bcc0b3e75f7575e",
|
||||
"type": "split",
|
||||
"children": [
|
||||
{
|
||||
"id": "51d991affac8b07b",
|
||||
"type": "tabs",
|
||||
"children": [
|
||||
{
|
||||
"id": "24c44b1390af655a",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "excalidraw",
|
||||
"state": {
|
||||
"file": "Алексей/AssetManagerScheme.md"
|
||||
},
|
||||
"icon": "excalidraw-icon",
|
||||
"title": "AssetManagerScheme"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"direction": "vertical"
|
||||
},
|
||||
"left": {
|
||||
"id": "ac7f336a6202856b",
|
||||
"type": "split",
|
||||
"children": [
|
||||
{
|
||||
"id": "9bcdb493bda7d4b1",
|
||||
"type": "tabs",
|
||||
"children": [
|
||||
{
|
||||
"id": "710da5cd9b9c6da7",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "file-explorer",
|
||||
"state": {
|
||||
"sortOrder": "alphabetical"
|
||||
},
|
||||
"icon": "lucide-folder-closed",
|
||||
"title": "Файловый менеджер"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "6b3a8b453eded4a9",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "search",
|
||||
"state": {
|
||||
"query": "",
|
||||
"matchingCase": false,
|
||||
"explainSearch": false,
|
||||
"collapseAll": false,
|
||||
"extraContext": false,
|
||||
"sortOrder": "alphabetical"
|
||||
},
|
||||
"icon": "lucide-search",
|
||||
"title": "Поиск"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "b1330fa7504e55d9",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "bookmarks",
|
||||
"state": {},
|
||||
"icon": "lucide-bookmark",
|
||||
"title": "Закладки"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"direction": "horizontal",
|
||||
"width": 300
|
||||
},
|
||||
"right": {
|
||||
"id": "da6a1edbadae6a43",
|
||||
"type": "split",
|
||||
"children": [
|
||||
{
|
||||
"id": "804a606248e1bbe6",
|
||||
"type": "tabs",
|
||||
"children": [
|
||||
{
|
||||
"id": "6eaf72fa6d034365",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "backlink",
|
||||
"state": {
|
||||
"file": "Алексей/Board.md",
|
||||
"collapseAll": false,
|
||||
"extraContext": false,
|
||||
"sortOrder": "alphabetical",
|
||||
"showSearch": false,
|
||||
"searchQuery": "",
|
||||
"backlinkCollapsed": false,
|
||||
"unlinkedCollapsed": true
|
||||
},
|
||||
"icon": "links-coming-in",
|
||||
"title": "Обратные ссылки для Board"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "61df288018d9d754",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "outgoing-link",
|
||||
"state": {
|
||||
"file": "Алексей/Board.md",
|
||||
"linksCollapsed": false,
|
||||
"unlinkedCollapsed": true
|
||||
},
|
||||
"icon": "links-going-out",
|
||||
"title": "Исходящие ссылки из Board"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "598cff9d83309fea",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "tag",
|
||||
"state": {
|
||||
"sortOrder": "frequency",
|
||||
"useHierarchy": true
|
||||
},
|
||||
"icon": "lucide-tags",
|
||||
"title": "Теги"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "248a38793bf1232e",
|
||||
"type": "leaf",
|
||||
"state": {
|
||||
"type": "outline",
|
||||
"state": {
|
||||
"file": "Алексей/Board.md"
|
||||
},
|
||||
"icon": "lucide-list",
|
||||
"title": "Структура Board"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"direction": "horizontal",
|
||||
"width": 300,
|
||||
"collapsed": true
|
||||
},
|
||||
"left-ribbon": {
|
||||
"hiddenItems": {
|
||||
"switcher:Меню быстрого перехода": false,
|
||||
"graph:Граф": false,
|
||||
"canvas:Создать новый холст": false,
|
||||
"daily-notes:Сегодняшняя заметка": false,
|
||||
"templates:Вставить шаблон": false,
|
||||
"command-palette:Открыть палитру команд": false,
|
||||
"obsidian-excalidraw-plugin:Создать новый чертеж": false,
|
||||
"obsidian-kanban:Создать новую доску": false
|
||||
}
|
||||
},
|
||||
"active": "24c44b1390af655a",
|
||||
"lastOpenFiles": [
|
||||
"Алексей/Board.md",
|
||||
"Алексей/AssetManagerScheme.md",
|
||||
"Desk.md",
|
||||
"CLIENT SERVER.canvas",
|
||||
"Андрей/Безымянная Kanban-доска.md",
|
||||
"Андрей/ВАЖНАЯ ЗАМЕТКА.md",
|
||||
"Образец отправки сообщения с маркером.md",
|
||||
"Порядок сборки Unity билда под сервер.md",
|
||||
"Алексей/ТЕСТ-КЕЙСЫ.md",
|
||||
"Алексей",
|
||||
"AssetManagerScheme.md",
|
||||
"SERVER/UpdateController.md",
|
||||
"SERVER/Tools.md",
|
||||
"SERVER/SendSystem.md",
|
||||
"SERVER/RecognizeSystem.md",
|
||||
"SERVER/ProcessingSystem.md",
|
||||
"SERVER/DataParser.md",
|
||||
"Добро пожаловать.md",
|
||||
"SERVER",
|
||||
"Новая папка",
|
||||
"Андрей"
|
||||
]
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"nodes":[
|
||||
{"id":"8b67634c475d7606","type":"text","text":"ОК\n\n* калькуляция хэша\n* запрос на обновление\n* активация кнопки обновить, если есть что\n","x":-2720,"y":-864,"width":250,"height":320},
|
||||
{"id":"8f45eeec193f5a05","type":"text","text":"Запуск","x":-2470,"y":-1238,"width":250,"height":60},
|
||||
{"id":"6e47f3d441f9bae2","type":"text","text":"Логин","x":-2470,"y":-1059,"width":250,"height":60},
|
||||
{"id":"d8ca6a5b5652434c","type":"text","text":"НЕ ОК\n\n* проверка на наличие исполняемого файла, если есть, активируем кнопку запустить","x":-2259,"y":-871,"width":250,"height":327}
|
||||
],
|
||||
"edges":[
|
||||
{"id":"7108bb686df97a61","fromNode":"8f45eeec193f5a05","fromSide":"bottom","toNode":"6e47f3d441f9bae2","toSide":"top"},
|
||||
{"id":"8a4d686d8b1f45ee","fromNode":"6e47f3d441f9bae2","fromSide":"bottom","toNode":"8b67634c475d7606","toSide":"top"},
|
||||
{"id":"058d58d7b07be9a0","fromNode":"6e47f3d441f9bae2","fromSide":"bottom","toNode":"d8ca6a5b5652434c","toSide":"top"}
|
||||
]
|
||||
}
|
||||
451
DOCS/Desk.md
451
DOCS/Desk.md
@@ -1,451 +0,0 @@
|
||||
---
|
||||
|
||||
excalidraw-plugin: parsed
|
||||
tags: [excalidraw]
|
||||
|
||||
---
|
||||
==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠== You can decompress Drawing data with the command palette: 'Decompress current Excalidraw file'. For more info check in plugin settings under 'Saving'
|
||||
|
||||
|
||||
# Excalidraw Data
|
||||
## Text Elements
|
||||
Инструктор ^UbO1uGDK
|
||||
|
||||
Сервер ^Ng7jOhKt
|
||||
|
||||
Хэш разный? ^myJh9kKL
|
||||
|
||||
только Streaming assets ^lG2t8Jy9
|
||||
|
||||
ДА ^LKeOnhlV
|
||||
|
||||
НЕТ ^2OwBgcpY
|
||||
|
||||
Показываем список файлов для обновления и кнопку обновить ^PFZ7UV97
|
||||
|
||||
Запуск ^UUon7eVm
|
||||
|
||||
Обновить ^7OENnVSS
|
||||
|
||||
1. Делаем отправку по хэшу как на сервере
|
||||
2.Отправляем команду на пересчет хэша на сервере ^A6DtzE7K
|
||||
|
||||
Запуск ^N5WW0rpi
|
||||
|
||||
игнор ^MtsjAaDF
|
||||
|
||||
Unity ^GiWyCxvg
|
||||
|
||||
Инструктор ^0OsBsFWy
|
||||
|
||||
Изменил один объект ^Meo9byj1
|
||||
|
||||
Изменял объекты не отправляя ^Z6lEawmt
|
||||
|
||||
Показываем кнопки отправить и сохранить ^0S20oqau
|
||||
|
||||
Сlient Update ^C9fJAlri
|
||||
|
||||
Отправить ^7xaCVWgs
|
||||
|
||||
Если объект сохранен:
|
||||
1. Удаляем из списка файлов для обновления
|
||||
2. Отправляем средствами Unity.
|
||||
|
||||
Если объект не сохранен:
|
||||
1.Сохраняем, отправляем ^3KDkfwbf
|
||||
|
||||
Сохранить ^KxsTafUf
|
||||
|
||||
Если объект не был сохранен:
|
||||
1. Добавляем в список файлов для отправки
|
||||
|
||||
Если раннее уже был сохранен, сохраняем и обновляем хэш в списке
|
||||
^feBPTVyX
|
||||
|
||||
Кнопка отправить ^RHz6SvIt
|
||||
|
||||
1.Пробегаемся по ранее сформированному списку
|
||||
2.Отправляем файлы через XMLAnswer
|
||||
3.Отправляем команду на пересчет хэша
|
||||
|
||||
^wEGenkuD
|
||||
|
||||
ServerLMS ^EJX4eIpX
|
||||
|
||||
Mainthread:
|
||||
*serverLMS
|
||||
*processingSystem
|
||||
*dataParser
|
||||
*MultiThreadServer
|
||||
|
||||
^ite9vjus
|
||||
|
||||
|
||||
ClientHandler: Thread
|
||||
*sendSystem
|
||||
*recognizeSystem
|
||||
*socket ^hEBOsWWl
|
||||
|
||||
LoggerThread:
|
||||
*Logger ^BKJiGpRs
|
||||
|
||||
UpdateThread:
|
||||
*updateController
|
||||
*assetsManager ^ZvWgIkFz
|
||||
|
||||
Client QT ^sWMT4y6l
|
||||
|
||||
MainThread:
|
||||
*MainWindow
|
||||
*UpdateNotifyWidget
|
||||
*screenChecker
|
||||
*extrnalExecuter
|
||||
*allWidgets
|
||||
^NEUKUPV3
|
||||
|
||||
WorkerThread:
|
||||
*sendSystem
|
||||
*updateController
|
||||
*recognizeSystem
|
||||
*TCPClient
|
||||
*socket
|
||||
*dataParser
|
||||
*hashComparer
|
||||
|
||||
^8BGt5wjC
|
||||
|
||||
Порядок обмена при соединении QT-QT ^vVekpzl8
|
||||
|
||||
Server ^vCiXe90o
|
||||
|
||||
Клиент ^NxeRvK3b
|
||||
|
||||
connect ^9pnMpFqa
|
||||
|
||||
потдверждение ^DifxXHXu
|
||||
|
||||
Логин ^xcJKS4BO
|
||||
|
||||
подтверждение захода ^LcNUC6DJ
|
||||
|
||||
Тип клиента ^fHhFW5dd
|
||||
|
||||
Отправка версии streamings ^j8y5I09L
|
||||
|
||||
Отправка локального хэша ^WbkyDR4m
|
||||
|
||||
Отправка расхождений ^WvPnPDNp
|
||||
|
||||
Если инструктор ^m7Rgi4y8
|
||||
|
||||
FACT ^QIsaPO46
|
||||
|
||||
Server ^57kJSOBv
|
||||
|
||||
Клиент ^Iao6ua8K
|
||||
|
||||
Login/Pass ^FgztXDxQ
|
||||
|
||||
XML Authorization ^FAEhzlqj
|
||||
|
||||
Send version ^Wsgy80Do
|
||||
|
||||
GetServerDataList ^mlJDR4kA
|
||||
|
||||
Send Hash ^uj7L179t
|
||||
|
||||
ERROR ^t7LNKLEC
|
||||
|
||||
%%
|
||||
## Drawing
|
||||
```compressed-json
|
||||
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
|
||||
|
||||
jVRQtBAAA===
|
||||
```
|
||||
%%
|
||||
458
DOCS/MainScheme.md
Normal file
458
DOCS/MainScheme.md
Normal file
@@ -0,0 +1,458 @@
|
||||
---
|
||||
|
||||
excalidraw-plugin: parsed
|
||||
tags: [excalidraw]
|
||||
|
||||
---
|
||||
==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠== You can decompress Drawing data with the command palette: 'Decompress current Excalidraw file'. For more info check in plugin settings under 'Saving'
|
||||
|
||||
|
||||
# Excalidraw Data
|
||||
|
||||
## Text Elements
|
||||
Инструктор ^UbO1uGDK
|
||||
|
||||
Сервер ^Ng7jOhKt
|
||||
|
||||
Хэш разный? ^myJh9kKL
|
||||
|
||||
только Streaming assets ^lG2t8Jy9
|
||||
|
||||
ДА ^LKeOnhlV
|
||||
|
||||
НЕТ ^2OwBgcpY
|
||||
|
||||
Показываем список файлов для обновления и кнопку обновить ^PFZ7UV97
|
||||
|
||||
Запуск ^UUon7eVm
|
||||
|
||||
Обновить ^7OENnVSS
|
||||
|
||||
1. Делаем отправку по хэшу как на сервере
|
||||
2.Отправляем команду на пересчет хэша на сервере ^A6DtzE7K
|
||||
|
||||
Запуск ^N5WW0rpi
|
||||
|
||||
игнор ^MtsjAaDF
|
||||
|
||||
UnityClient
|
||||
^GiWyCxvg
|
||||
|
||||
Инструктор ^0OsBsFWy
|
||||
|
||||
Изменил один объект ^Meo9byj1
|
||||
|
||||
Изменял объекты не отправляя ^Z6lEawmt
|
||||
|
||||
Показываем кнопки отправить и сохранить ^0S20oqau
|
||||
|
||||
QTClient ^C9fJAlri
|
||||
|
||||
Отправить ^7xaCVWgs
|
||||
|
||||
Если объект сохранен:
|
||||
1. Удаляем из списка файлов для обновления
|
||||
2. Отправляем средствами Unity.
|
||||
|
||||
Если объект не сохранен:
|
||||
1.Сохраняем, отправляем ^3KDkfwbf
|
||||
|
||||
Сохранить ^KxsTafUf
|
||||
|
||||
Если объект не был сохранен:
|
||||
1. Добавляем в список файлов для отправки
|
||||
|
||||
Если раннее уже был сохранен, сохраняем и обновляем хэш в списке
|
||||
^feBPTVyX
|
||||
|
||||
Кнопка отправить ^RHz6SvIt
|
||||
|
||||
1.Пробегаемся по ранее сформированному списку
|
||||
2.Отправляем файлы через XMLAnswer
|
||||
3.Отправляем команду на пересчет хэша
|
||||
|
||||
^wEGenkuD
|
||||
|
||||
ServerLMS ^EJX4eIpX
|
||||
|
||||
Mainthread:
|
||||
*serverLMS
|
||||
*processingSystem
|
||||
*dataParser
|
||||
*MultiThreadServer
|
||||
* commonClientHandler
|
||||
|
||||
^ite9vjus
|
||||
|
||||
|
||||
ClientHandler: Thread
|
||||
*sendSystem
|
||||
*recognizeSystem
|
||||
*socket ^hEBOsWWl
|
||||
|
||||
LoggerThread:
|
||||
*Logger ^BKJiGpRs
|
||||
|
||||
UpdateThread:
|
||||
*updateController
|
||||
*assetsManager ^ZvWgIkFz
|
||||
|
||||
Client QT ^sWMT4y6l
|
||||
|
||||
MainThread:
|
||||
*MainWindow
|
||||
*UpdateNotifyWidget
|
||||
*screenChecker
|
||||
*extrnalExecuter
|
||||
*allWidgets
|
||||
^NEUKUPV3
|
||||
|
||||
WorkerThread:
|
||||
*sendSystem
|
||||
*updateController
|
||||
*recognizeSystem
|
||||
*TCPClient
|
||||
*socket
|
||||
*dataParser
|
||||
*hashComparer
|
||||
|
||||
^8BGt5wjC
|
||||
|
||||
Порядок обмена при соединении QT-QT ^vVekpzl8
|
||||
|
||||
Server ^vCiXe90o
|
||||
|
||||
Клиент ^NxeRvK3b
|
||||
|
||||
connect ^9pnMpFqa
|
||||
|
||||
потдверждение ^DifxXHXu
|
||||
|
||||
Логин ^xcJKS4BO
|
||||
|
||||
подтверждение захода ^LcNUC6DJ
|
||||
|
||||
Тип клиента ^fHhFW5dd
|
||||
|
||||
Отправка версии streamings ^j8y5I09L
|
||||
|
||||
Отправка локального хэша ^WbkyDR4m
|
||||
|
||||
Отправка расхождений ^WvPnPDNp
|
||||
|
||||
Если инструктор ^m7Rgi4y8
|
||||
|
||||
FACT ^QIsaPO46
|
||||
|
||||
Server ^57kJSOBv
|
||||
|
||||
Клиент ^Iao6ua8K
|
||||
|
||||
Login/Pass ^FgztXDxQ
|
||||
|
||||
XML Authorization ^FAEhzlqj
|
||||
|
||||
Send version ^Wsgy80Do
|
||||
|
||||
GetServerDataList ^mlJDR4kA
|
||||
|
||||
Send Hash ^uj7L179t
|
||||
|
||||
ERROR ^t7LNKLEC
|
||||
|
||||
%%
|
||||
## Drawing
|
||||
```compressed-json
|
||||
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
|
||||
|
||||
PXX44AEfoFN0uozHE6ilaCAAA===
|
||||
```
|
||||
%%
|
||||
@@ -6,6 +6,8 @@ kanban-plugin: board
|
||||
|
||||
## backLog
|
||||
|
||||
- [ ] выписать все варианты взаимодействия между всеми клиентами и сервером
|
||||
- [ ] sendSystem::sendXmlAnswer новый вариант отпарвки XML пакетов
|
||||
|
||||
|
||||
## bugs
|
||||
@@ -15,6 +17,7 @@ kanban-plugin: board
|
||||
## feature client Unity
|
||||
|
||||
- [ ] отправлять сигнал на пересчет хэша с саб частью
|
||||
- [ ] Добавить обновление инструктора, если он перелогинился
|
||||
|
||||
|
||||
## feature client QT
|
||||
@@ -29,6 +32,7 @@ kanban-plugin: board
|
||||
|
||||
- [ ] Прибраться в Server
|
||||
- [ ] рефакторинг
|
||||
- [ ] добавить генерацию пустых файлов, если shared не найден
|
||||
|
||||
|
||||
## NOW
|
||||
|
||||
598
DOCS/Алексей/DataParser scheme.md
Normal file
598
DOCS/Алексей/DataParser scheme.md
Normal file
@@ -0,0 +1,598 @@
|
||||
---
|
||||
|
||||
excalidraw-plugin: parsed
|
||||
tags: [excalidraw]
|
||||
|
||||
---
|
||||
==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠== You can decompress Drawing data with the command palette: 'Decompress current Excalidraw file'. For more info check in plugin settings under 'Saving'
|
||||
|
||||
|
||||
# Excalidraw Data
|
||||
|
||||
## Text Elements
|
||||
ClientAutorization ^VP4aCm8p
|
||||
|
||||
processing ^XJHW1025
|
||||
|
||||
ClientDeAutorization ^dBwEqoCb
|
||||
|
||||
processing ^W3ieXrfA
|
||||
|
||||
ToCLientMessage ^v5aqMTXe
|
||||
|
||||
processing ^dIWpvau8
|
||||
|
||||
QueryToDB ^Ro4wHLcF
|
||||
|
||||
processing ^tuNDziyy
|
||||
|
||||
ClientMessage ^pEoup1w5
|
||||
|
||||
processing ^fVYO6Em7
|
||||
|
||||
данные от клиента ^E2CD89aJ
|
||||
|
||||
в базу данных ^olioYzgA
|
||||
|
||||
данные от клиента ^ZEwq2uVu
|
||||
|
||||
данные от клиента ^zj1G56iU
|
||||
|
||||
XMLParser ^ZWT5PNQ5
|
||||
|
||||
данные к клиенту ^XxzS7VZe
|
||||
|
||||
ClientNotify ^iY8WShfV
|
||||
|
||||
данные от клиента ^AZWoh3Ia
|
||||
|
||||
processing ^sfpZYChL
|
||||
|
||||
XMLFileDataParse ^rET3swBI
|
||||
|
||||
формирует список файлов который приходит от клиента,
|
||||
По идее должен просто возвращать список файлов
|
||||
^rvQai49h
|
||||
|
||||
данные от клиента ^bC0PoVR9
|
||||
|
||||
только чтение ^EaenlE5W
|
||||
|
||||
XMLAnswer ^xmqRa6Fi
|
||||
|
||||
в TempFile возврат в байтах ^Py9za7Dg
|
||||
|
||||
только чтение ^k4AV3S0f
|
||||
|
||||
только запись ^S9N6oXDR
|
||||
|
||||
xmlAnswer_authorization ^5GyrdxnT
|
||||
|
||||
только запись ^jK6PP8XP
|
||||
|
||||
ClientServerGUI ^2lyG7rdH
|
||||
|
||||
Client ^rGTmYWLU
|
||||
|
||||
ClientServerGUI ^xQWPHEVF
|
||||
|
||||
Client ^rWsmQE2w
|
||||
|
||||
Client ^kGFe01ri
|
||||
|
||||
DB ^RoTCuGzo
|
||||
|
||||
Client ^w55vspaF
|
||||
|
||||
Client ^Lzkq8TfG
|
||||
|
||||
ClientServerGUI ^6Nu6FkAI
|
||||
|
||||
Client ^qYxPhLRc
|
||||
|
||||
Unity ^X0KjhPzB
|
||||
|
||||
DB ^w8JAyq9g
|
||||
|
||||
Client ^ZoRAG9Ib
|
||||
|
||||
ClientServerGUI ^k645SyJr
|
||||
|
||||
Client ^2vva3Bd0
|
||||
|
||||
xmlAnswer_deAuthorization ^UXR9CfWY
|
||||
|
||||
только запись ^CnjXQlAm
|
||||
|
||||
ClientServerGUI ^8BUAeFwB
|
||||
|
||||
Client ^BmbWvpya
|
||||
|
||||
чтение ^69aP2rix
|
||||
|
||||
Запись ^U9GYdGmN
|
||||
|
||||
xmlAnswer_ClientQueryToDB_ListInstructors ^LLp3lgIT
|
||||
|
||||
только запись ^ThqH7jSe
|
||||
|
||||
ClientServerGUI ^rjgnwLFX
|
||||
|
||||
DB ^DakCgRQD
|
||||
|
||||
xmlAnswer_ClientQueryToDB_ListGroups ^Mrvm1TqY
|
||||
|
||||
только запись ^8P9TNJF5
|
||||
|
||||
ClientServerGUI ^Mq26fjrs
|
||||
|
||||
DB ^7wWmNCfa
|
||||
|
||||
xmlAnswer_ClientQueryToDB_ListTrainees ^zuumjGQc
|
||||
|
||||
только запись ^pWK0CMZ6
|
||||
|
||||
ClientServerGUI ^6yfoQphQ
|
||||
|
||||
DB ^jnYmT7cC
|
||||
|
||||
xmlAnswer_ClientQueryToDB_ListComputers ^obEhnJ4C
|
||||
|
||||
только запись ^ciJWK6tY
|
||||
|
||||
ClientServerGUI ^KBD3ykLr
|
||||
|
||||
DB ^v9mcSZea
|
||||
|
||||
xmlAnswer_ClientQueryToDB_ListClassrooms ^xIiqWq6d
|
||||
|
||||
только запись ^yCQnUSL4
|
||||
|
||||
ClientServerGUI ^VUdvthq0
|
||||
|
||||
DB ^0itCdiQZ
|
||||
|
||||
xmlAnswer_ClientQueryToDB_ListTasks ^6kSPB3Su
|
||||
|
||||
только запись ^bZorPy2Q
|
||||
|
||||
ClientServerGUI ^cr87o4PC
|
||||
|
||||
DB ^wSDyWoUo
|
||||
|
||||
xmlAnswer_message ^m1sAU72o
|
||||
|
||||
только запись ^Zi14EIuF
|
||||
|
||||
Client ^xwvVrDeC
|
||||
|
||||
ClientServerGUI ^kNHbDI28
|
||||
|
||||
xmlAnswer_task ^HAZn7zFg
|
||||
|
||||
только запись ^yF3lVLJF
|
||||
|
||||
Client ^5Fpoud1O
|
||||
|
||||
ClientServerGUI ^AVh7Q5Nz
|
||||
|
||||
xmlAnswer_notify ^TP1o3ZrS
|
||||
|
||||
только запись ^70wIsPDi
|
||||
|
||||
Client ^vfZLTL8C
|
||||
|
||||
ClientServerGUI ^IMueNsMc
|
||||
|
||||
xmlAnswer_currentVersion ^RCnaFXqy
|
||||
|
||||
только запись в файл ^upDqfirT
|
||||
|
||||
Client ^ZcSZuU8l
|
||||
|
||||
универсальный конструктор для ответов в XML
|
||||
^RcsoPGsH
|
||||
|
||||
ReadTempFile ^UpOMxS5S
|
||||
|
||||
createVersionListXmlAnswer ^uRIhHTin
|
||||
|
||||
НЕ НА МЕСТЕ ^3uyWjgxI
|
||||
|
||||
saveVersionToFile ^DEH45jEC
|
||||
|
||||
DataParser ^KfdeayYP
|
||||
|
||||
DBAnswer ^6rX77Wwj
|
||||
|
||||
ClientAnswer ^56vhFlyh
|
||||
|
||||
Reader ^RQ7AS3nW
|
||||
|
||||
dataParser->DBAnswer->ListGroups ^ZpoysGi9
|
||||
|
||||
dataParser->Reader->ClientAuth
|
||||
^LSRSjfYq
|
||||
|
||||
dataParser->Answer-> ^vSQuWpXz
|
||||
|
||||
%%
|
||||
## Drawing
|
||||
```compressed-json
|
||||
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=
|
||||
```
|
||||
%%
|
||||
130
DOCS/Алексей/ProcessingSystem scheme.md
Normal file
130
DOCS/Алексей/ProcessingSystem scheme.md
Normal file
@@ -0,0 +1,130 @@
|
||||
---
|
||||
|
||||
excalidraw-plugin: parsed
|
||||
tags: [excalidraw]
|
||||
|
||||
---
|
||||
==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠== You can decompress Drawing data with the command palette: 'Decompress current Excalidraw file'. For more info check in plugin settings under 'Saving'
|
||||
|
||||
|
||||
# Excalidraw Data
|
||||
|
||||
## Text Elements
|
||||
ClientServerGUI ^6Nu6FkAI
|
||||
|
||||
Client ^qYxPhLRc
|
||||
|
||||
Unity ^X0KjhPzB
|
||||
|
||||
DB ^w8JAyq9g
|
||||
|
||||
processingClientAutorization ^m0XWBAAZ
|
||||
|
||||
clientHandler ^V9sV6vZu
|
||||
|
||||
providerDB ^tql9O4gb
|
||||
|
||||
dataParser ^I5cKWcDb
|
||||
|
||||
processingClientDeAutorization ^cRGk1reW
|
||||
|
||||
clientHandler ^JtKDGDuT
|
||||
|
||||
providerDB ^XRyhU4Ir
|
||||
|
||||
dataParser ^TJscfbbe
|
||||
|
||||
processingClientDeAutorization ^IovF8Dv8
|
||||
|
||||
gHBDT ^tGwlEMh4
|
||||
|
||||
%%
|
||||
## Drawing
|
||||
```compressed-json
|
||||
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
|
||||
```
|
||||
%%
|
||||
2
DOCS/Алексей/Рефакторинг.md
Normal file
2
DOCS/Алексей/Рефакторинг.md
Normal file
@@ -0,0 +1,2 @@
|
||||
1. DataParser разделить на подклассы, придумать как скомпоновать. Возможно разделить на формирование ответов и парсинг входящих данных.
|
||||
2. xmlAnswer_message посредник между ГУИ лежит в processingSystem
|
||||
11
DOCS/Алексей/Чек лист по переносу.md
Normal file
11
DOCS/Алексей/Чек лист по переносу.md
Normal file
@@ -0,0 +1,11 @@
|
||||
- [x] AssetManager
|
||||
- [x] DataParser
|
||||
- [x] Logger
|
||||
- [x] ProcessingSystem
|
||||
- [x] RecognizeSystem
|
||||
- [x] SendSystem
|
||||
- [x] Tools
|
||||
- [x] UpdateController
|
||||
- [x] ClientHandler
|
||||
- [x] MultiThreadServer
|
||||
- [x] ServerLMSWidget
|
||||
40
DOCS/Андрей/Drawing 2025-01-14 09.44.53.excalidraw.md
Normal file
40
DOCS/Андрей/Drawing 2025-01-14 09.44.53.excalidraw.md
Normal file
@@ -0,0 +1,40 @@
|
||||
---
|
||||
|
||||
excalidraw-plugin: parsed
|
||||
tags: [excalidraw]
|
||||
|
||||
---
|
||||
==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠== You can decompress Drawing data with the command palette: 'Decompress current Excalidraw file'. For more info check in plugin settings under 'Saving'
|
||||
|
||||
|
||||
# Excalidraw Data
|
||||
|
||||
## Text Elements
|
||||
Блок ^8Cl4uc6G
|
||||
|
||||
%%
|
||||
## Drawing
|
||||
```compressed-json
|
||||
N4KAkARALgngDgUwgLgAQQQDwMYEMA2AlgCYBOuA7hADTgQBuCpAzoQPYB2KqATLZMzYBXUtiRoIACyhQ4zZAHoFAc0JRJQgEYA6bGwC2CgF7N6hbEcK4OCtptbErHALRY8RMpWdx8Q1TdIEfARcZgRmBShcZQUebQB2bR4aOiCEfQQOKGZuAG1wMFAwYogSbggAdQBOACEKgDEAFmUK3AAtAGsAVgAFAH12ACV6eoAzHP4S2ERywOwojmVglOLI
|
||||
|
||||
TG5neIBmKsnIGA2duMbGrq2ARh4uvYgKEnVuHkatm8kEQmVpbkvGm+sl8SoAAMN2YUFIbA6CAAwmx8GxSOUAMTnBCo1ErEqaXDYDrKCFCDjEWHwxEScHWZhwXCBLKYyCjQj4fAAZVgywkgg89IgYIhUIq90kj1B4MhCDZMA56C5ZRuBM+HHCOTQ5xubGp2DUB1VQJBBUg+OEcAAksQVah8qtICyAHIcFksgBWMAA0lVmBVBqNGhCAPL4IEATQAih
|
||||
|
||||
ADQBdG6jcgZM3cDhCZk3QhErDlXBAnkEolK5gWoqraDwQFbA0AX1BCAQxG+W1OjXO8Xi531RcYLHYXFVVWuBoYTFYnFtnDE3Cq51O53OAA4ujOU8wACJpKA17ijAhhG6aYREgCiwQyWQtVtWhaLZQkM6MQkIADZ9yHOH6Kiz4oNMM5MEGaia2vSUwlhmpAQlQBpgOWkY3EIcDELga61qq2z3jOWwtveQKzi8/ZEBwHQJkm+A3PCuLrmgm74GEBSV
|
||||
|
||||
gUF6lEh6AztC+CNEI2D3gA4jy0yAtAWBQDy6xoM496NPeNw6qgzj1kC2gnGclx9kWdzEA8aCNIk95VDpM7nKhVSnBcVyvO8nyCWgJn9v80ptiUfLiiSCLIuiaJIDuOJ4jmxJws55LkBwVI0pkgnRkyrLsnxsq1qK/IIIKanCpZsXipK0q8nCcr9gqkh5haar9hqOLat8eo3EasFmqeEEQHaDrOm6Hpej6/qBqG4arFG/YxrgcaMYmyb9qmxDphIu
|
||||
|
||||
DnNme7EHlhGDUWYTkaglz3l0PA8HpjR8P2HZDt2qCNLs22Dl2I4cGOaDxOtQI8FUPBbHZkCEMuq6LZR279ruhLEIe6QhRaA3Ef2sHwYh3woWhGFYWhJGpgRaAAyRbBkYxb0IDca6YBZ6CAIgggDcIIAfCCAFwg2aUAAKgJ5R40TPKjJwUAsoQRiAjwD0QLTWT1L1TJScpUwCQAgkQyh7RAwSjKFR2kFA5gEILHwi1AGo8noWS4KmTDxvDRHqqQHy
|
||||
|
||||
pgQ5OY5TBPE38QiK4M4SM4C4JCGjuHqwAEmZXyqkkXQ0ZM9FXkxt4Pk+L5vh+X4/n+AHo8BY2gWwVA3MJ0kHbz+yHGtCTxF097rWtXSNBtNyqep+3xL8/ZvB8ru8NoWz3RcXSXTnek7Au1mLLZKVQk5ZLoCibkYh5uIVUSnflBSgXUrSEtFoyzJpVFmUxf2DkCkKIqL2KUKz+U0WTX4uXKt86qaiVuqsxVprmnkXVT7GCCa6gCNDWm8cQLgyTylN
|
||||
|
||||
M1oBekC8Y8FZVotRoQILiThnJnG4O0uyPDuhA46w5RyAi6HqNa94tjN0vM9YIoMKJbntkWT6B4jx/VmoDIswMEKLSbFsVC6FzhnCBFUdBJQ8Jw3vtrXCSMoQo1wTcOAbBUzZDyBBM8qwHrFCBBBK+qwRHFE0iXa0YA4jV2AXQ+uudzhN0kdBXCoQoCwn0PoNQiEej8LpFrOa9kohSxqMNVMyhuDfwwEQrId9Ki1AaM0VonRegDDYMMMYEwaq02wE
|
||||
|
||||
IC0clpw3WAdnGcQIxJdH0lta0EBlC4DgAfIJhBMA1hMQIkh/9+yZGIDYokdiSGihpFAfm0cKBvFwP1dhRZClVLArUxiL9qk8iCLuCgr1cE0XAFfF+cA4BsgoQ4go0A3gZHKELL4kwGCEAQBQGonlB4+VJMiUYWztmYggCE0CIUTRrn0GyOKw8JA91crs/ZE8jnpBWQPby5z0CjyChPa5IhbnHPqOFTenJ54fIOS445pzxQJULokyANzDkgvXhKSK
|
||||
|
||||
W8AXzOhcC9IgxhCKn3qqZFnyYXpD9EfWApU7J7Nxai/Q9Q6ac0MfgHmOKgVQDuRSumDMmaPBJSixlxzDaVKFiLMWk8oVkq5ekUZUtmkx1aWUiZnKmX7iJBKmpIQ2k0jAoCr56RFWk0jugbyuzmDYAhMyAAGt8Vs8R5kGqNfgIM3B7yYW0F0HOqF07zKMGwAw4z2wEDtt8T2MrhVMvRV9T+uqpq7PxCQVlzMSWRuIGyBAaS0C82SbrYgABZNgI15W
|
||||
|
||||
4E0MEbhVE8GGjTc8+iNQ4RtNIMobEAAKHgTZqC8AbU2i1wJHUAEoeSW2UEmGksxq24DrfdRtd0QS8GHW2ronb/UlE5aCqEBLpacH+g0hkN9LZpl1osL1JRMi5vzdwW2RaoVECTagI9NwOC9RtqQO26pzZ4RvXbGdkA7BOgQPMZgLIr1wEzdmq9ebemFvmTiaWjBSYevwDun+OreRpHmFAm4ISwQGG1TMcxpDmGcKA+9Is+BdH8wQ+ByDeTihQUgv
|
||||
|
||||
wNmTJwgOKguWIAA=
|
||||
```
|
||||
%%
|
||||
8
DOCS/Как умеем принимать, как умеем отправлять!.md
Normal file
8
DOCS/Как умеем принимать, как умеем отправлять!.md
Normal file
@@ -0,0 +1,8 @@
|
||||
|
||||
Сервер -> Принимаем
|
||||
- XML файлы с поиском по тегу (DataParser::xmlParser)
|
||||
|
||||
Участники
|
||||
RecognizeSystem - система распознавания типа пакета, экземпляр у каждого клиента
|
||||
ProcessingSystem - система активации процессов (создает результат после распознания действия) 1 штука на всех
|
||||
|
||||
0
DOCS/Что умеем отправлять Server - Client QT.md
Normal file
0
DOCS/Что умеем отправлять Server - Client QT.md
Normal file
@@ -51,7 +51,7 @@ target_include_directories(GUIdataBaseLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../
|
||||
if(PROJECT_TYPE_DEBUG)
|
||||
target_link_directories(GUIdataBaseLMS PUBLIC ${REPO_PATH}/BUILDS/DB_IaT/Debug64)
|
||||
elseif()
|
||||
target_link_directories(GUIdataBaseLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../../QT/BUILDS/LMS/DB_IaT/Release64)
|
||||
target_link_directories(GUIdataBaseLMS PUBLIC ${REPO_PATH}/BUILDS/DB_IaT/Release64)
|
||||
endif()
|
||||
target_link_libraries(GUIdataBaseLMS PRIVATE libInstructorsAndTrainees.dll)
|
||||
|
||||
@@ -60,6 +60,6 @@ target_include_directories(GUIdataBaseLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../
|
||||
if(PROJECT_TYPE_DEBUG)
|
||||
target_link_directories(GUIdataBaseLMS PUBLIC ${REPO_PATH}/BUILDS/DB_LMS/Debug64)
|
||||
elseif()
|
||||
target_link_directories(GUIdataBaseLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../../QT/BUILDS/LMS/DB_LMS/Release64)
|
||||
target_link_directories(GUIdataBaseLMS PUBLIC ${REPO_PATH}/BUILDS/DB_LMS/Release64)
|
||||
endif()
|
||||
target_link_libraries(GUIdataBaseLMS PRIVATE libDataBaseLMS.dll)
|
||||
|
||||
@@ -33,20 +33,32 @@ add_library(ServerLMS SHARED
|
||||
serverlmswidget.cpp
|
||||
serverlmswidget.h
|
||||
serverlmswidget.ui
|
||||
typesDataServerClient.h
|
||||
Client.h
|
||||
clienthandler.cpp
|
||||
clienthandler.h
|
||||
multithreadserver.cpp
|
||||
multithreadserver.h
|
||||
Data/typesDataServerClient.h
|
||||
Data/Client.h
|
||||
Data/PacketType.h
|
||||
Data/StreamingVersionData.h
|
||||
Systems/assetsmanager.cpp
|
||||
Systems/assetsmanager.h
|
||||
Systems/recognizesystem.cpp
|
||||
Systems/recognizesystem.h
|
||||
Systems/updatecontroller.cpp
|
||||
Systems/updatecontroller.h
|
||||
Systems/commonclienthandler.cpp
|
||||
Systems/commonclienthandler.h
|
||||
Systems/logger.cpp
|
||||
Systems/logger.h
|
||||
Systems/dataparser.cpp
|
||||
Systems/dataparser.h
|
||||
Systems/Parsers/dataparser.cpp
|
||||
Systems/Parsers/dataparser.h
|
||||
Systems/Parsers/clientanswerparser.cpp
|
||||
Systems/Parsers/clientanswerparser.h
|
||||
Systems/Parsers/dbanswerparser.cpp
|
||||
Systems/Parsers/dbanswerparser.h
|
||||
Systems/Parsers/processparser.cpp
|
||||
Systems/Parsers/processparser.h
|
||||
Systems/processingsystem.cpp
|
||||
Systems/processingsystem.h
|
||||
Systems/sendsystem.cpp
|
||||
@@ -69,7 +81,7 @@ target_include_directories(ServerLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../DB
|
||||
if(PROJECT_TYPE_DEBUG)
|
||||
target_link_directories(ServerLMS PUBLIC ${REPO_PATH}/BUILDS/DB_LMS/Debug64)
|
||||
elseif()
|
||||
target_link_directories(ServerLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../../BUILDS/LMS/DB_LMS/Release64)
|
||||
target_link_directories(ServerLMS PUBLIC ${REPO_PATH}/BUILDS/DB_LMS/Release64)
|
||||
endif()
|
||||
target_link_libraries(ServerLMS PRIVATE libDataBaseLMS.dll)
|
||||
|
||||
@@ -77,8 +89,16 @@ target_link_libraries(ServerLMS PRIVATE libDataBaseLMS.dll)
|
||||
target_compile_definitions(ServerLMS PRIVATE SERVERLMS_LIBRARY)
|
||||
|
||||
|
||||
add_custom_command(TARGET ServerLMS
|
||||
POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
||||
${REPO_PATH}/BUILDS/ServerLMS/Debug64/libServerLMS.dll
|
||||
${REPO_PATH}/BUILDS/TestServerLMS/Debug64)
|
||||
if(PROJECT_TYPE_DEBUG)
|
||||
add_custom_command(TARGET ServerLMS
|
||||
POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
||||
${REPO_PATH}/BUILDS/ServerLMS/Debug64/libServerLMS.dll
|
||||
${REPO_PATH}/BUILDS/TestServerLMS/Debug64)
|
||||
elseif()
|
||||
add_custom_command(TARGET ServerLMS
|
||||
POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
||||
${REPO_PATH}/BUILDS/ServerLMS/Release64/libServerLMS.dll
|
||||
${REPO_PATH}/BUILDS/TestServerLMS/Release64)
|
||||
endif()
|
||||
|
||||
@@ -30,6 +30,7 @@ public:
|
||||
void setLogin(QString login)
|
||||
{
|
||||
this->login = login;
|
||||
isLoggedIn = true;
|
||||
fullName = "Name: " + name + " IP: " + address + " port : " + port + " login: " + login;
|
||||
}
|
||||
QString getLogin()
|
||||
@@ -50,13 +51,17 @@ public:
|
||||
{
|
||||
return ready;
|
||||
}
|
||||
|
||||
void setReady(bool ready)
|
||||
{
|
||||
this->ready = ready;
|
||||
}
|
||||
void setUnity(bool flag){
|
||||
|
||||
void setUnity(bool flag)
|
||||
{
|
||||
isUnity = flag;
|
||||
}
|
||||
|
||||
bool getIsUnity()
|
||||
{
|
||||
return isUnity;
|
||||
@@ -75,10 +80,22 @@ public:
|
||||
{
|
||||
isUnity = !isUnity;
|
||||
}
|
||||
bool operator == (Client* right){
|
||||
|
||||
bool operator == (Client* right)
|
||||
{
|
||||
return this->address == right->address;
|
||||
}
|
||||
|
||||
bool getIsLoggedIn()
|
||||
{
|
||||
return isLoggedIn;
|
||||
}
|
||||
|
||||
void setIsLoggedIn(bool value)
|
||||
{
|
||||
isLoggedIn = value;
|
||||
}
|
||||
|
||||
|
||||
private:
|
||||
QString name;
|
||||
@@ -88,6 +105,7 @@ private:
|
||||
|
||||
QString login;
|
||||
bool ready;
|
||||
bool isLoggedIn;
|
||||
bool isUnity = false;
|
||||
|
||||
TypeClientAutorization TypeClient;
|
||||
39
ServerLMS/ServerLMS/Data/PacketType.h
Normal file
39
ServerLMS/ServerLMS/Data/PacketType.h
Normal file
@@ -0,0 +1,39 @@
|
||||
#ifndef PACKETTYPE_H
|
||||
#define PACKETTYPE_H
|
||||
|
||||
enum PacketType
|
||||
{
|
||||
TYPE_NONE = 0,
|
||||
TYPE_UNITY = 1,
|
||||
TYPE_FILE = 2,
|
||||
TYPE_COMMAND =3,
|
||||
TYPE_FOLDER = 4,
|
||||
TYPE_DELETE = 5,
|
||||
TYPE_FINISH = 6,
|
||||
TYPE_NEEDUPDATE = 7,
|
||||
TYPE_XMLANSWER = 8,
|
||||
TYPE_QT = 9,
|
||||
TYPE_DISABLE = 11,
|
||||
TYPE_FILESIZE = 20,
|
||||
|
||||
TYPE_XMLANSWER_MESSAGE_FOR_GUI = 90,
|
||||
|
||||
//xml-ответы на запросы к БД
|
||||
TYPE_XMLANSWER_QUERY_DB__LIST_INSTRUCTORS = 100,
|
||||
TYPE_XMLANSWER_QUERY_DB__LIST_GROUPS = 101,
|
||||
TYPE_XMLANSWER_QUERY_DB__LIST_TRAINEES = 102,
|
||||
TYPE_XMLANSWER_QUERY_DB__LIST_COMPUTERS = 103,
|
||||
TYPE_XMLANSWER_QUERY_DB__LIST_CLASSROOMS = 104,
|
||||
TYPE_XMLANSWER_QUERY_DB__LIST_TASKS = 105,
|
||||
|
||||
//ответы по обновлениям
|
||||
HASH_READY = 150,
|
||||
CHANGE_DATA_VERSION = 151,
|
||||
COPY_VERSION = 152,
|
||||
DELETE_DATA_VERSION = 153,
|
||||
BUSY = 154,
|
||||
FREE = 155
|
||||
};
|
||||
|
||||
|
||||
#endif // PACKETTYPE_H
|
||||
46
ServerLMS/ServerLMS/Data/StreamingVersionData.h
Normal file
46
ServerLMS/ServerLMS/Data/StreamingVersionData.h
Normal file
@@ -0,0 +1,46 @@
|
||||
#ifndef STREAMINGVERSIONDATA_H
|
||||
#define STREAMINGVERSIONDATA_H
|
||||
|
||||
#include <QTime>
|
||||
#include <QString>
|
||||
|
||||
class StreamingVersionData
|
||||
{
|
||||
public:
|
||||
StreamingVersionData(QString absoltePath,QString viewName,QDateTime data,qint32 size)
|
||||
{
|
||||
this->absolutePath = absoltePath;
|
||||
this->viewName = viewName;
|
||||
this->createData = data;
|
||||
this->size = size;
|
||||
}
|
||||
~StreamingVersionData();
|
||||
|
||||
QString getAbsolutPath() const
|
||||
{
|
||||
return absolutePath;
|
||||
}
|
||||
|
||||
QString getViewName() const
|
||||
{
|
||||
return viewName;
|
||||
}
|
||||
|
||||
QDateTime getCreateData() const
|
||||
{
|
||||
return createData;
|
||||
}
|
||||
|
||||
qint32 getSize() const
|
||||
{
|
||||
return size;
|
||||
}
|
||||
|
||||
private:
|
||||
QString absolutePath;
|
||||
QString viewName;
|
||||
QDateTime createData;
|
||||
qint32 size;
|
||||
};
|
||||
|
||||
#endif // STREAMINGVERSIONDATA_H
|
||||
@@ -22,6 +22,11 @@ struct FileData
|
||||
return false;
|
||||
}
|
||||
|
||||
bool operator<(const FileData& data2) const
|
||||
{
|
||||
return this->hash == "FOLDER" && data2.hash !="FOLDER";
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
struct SAttribute
|
||||
126
ServerLMS/ServerLMS/Systems/Parsers/clientanswerparser.cpp
Normal file
126
ServerLMS/ServerLMS/Systems/Parsers/clientanswerparser.cpp
Normal file
@@ -0,0 +1,126 @@
|
||||
#include "clientanswerparser.h"
|
||||
|
||||
ClientAnswerParser::ClientAnswerParser(QObject *parent) : QObject(parent)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void ClientAnswerParser::initialize(DataParser *dataParser)
|
||||
{
|
||||
this->dataParser = dataParser;
|
||||
}
|
||||
|
||||
QByteArray ClientAnswerParser::authorization(bool result, QString instructorName,QString clientName, QString accessType, QString login)
|
||||
{
|
||||
|
||||
QList<SXmlAnswerTag> listTag;
|
||||
|
||||
SAttribute attribute1 = {"Result", result? "true" : "false"};
|
||||
SAttribute attribute2 = {"InstructorName", instructorName};
|
||||
SAttribute attribute3 = {"ClientName", clientName};
|
||||
SAttribute attribute4 = {"AccessType", accessType};
|
||||
SAttribute attribute5 = {"Login", login};
|
||||
QList<SAttribute> listAttr = {attribute1, attribute2, attribute3, attribute4, attribute5};
|
||||
SXmlAnswerTag tag = {"ServerAuthorization", listAttr};
|
||||
|
||||
listTag.append(tag);
|
||||
|
||||
return dataParser->xmlAnswer(listTag);
|
||||
}
|
||||
|
||||
QByteArray ClientAnswerParser::deAuthorization(bool result, QString login)
|
||||
{
|
||||
QList<SXmlAnswerTag> listTag;
|
||||
|
||||
SAttribute attribute1 = {"Result", result? "true" : "false"};
|
||||
SAttribute attribute2 = {"Login", login};
|
||||
QList<SAttribute> listAttr = {attribute1, attribute2};
|
||||
SXmlAnswerTag tag = {"ServerDeAuthorization", listAttr};
|
||||
|
||||
listTag.append(tag);
|
||||
|
||||
return dataParser->xmlAnswer(listTag);
|
||||
}
|
||||
|
||||
QByteArray ClientAnswerParser::message(QString text, QString login)
|
||||
{
|
||||
QList<SXmlAnswerTag> listTag;
|
||||
SAttribute attribute2;
|
||||
|
||||
SAttribute attribute1 = {"Text", text};
|
||||
QList<SAttribute> listAttr = {attribute1};
|
||||
if(login != "")
|
||||
{
|
||||
attribute2 = {"Login", login};
|
||||
listAttr.append(attribute2);
|
||||
}
|
||||
SXmlAnswerTag tag = {"ServerMessage", listAttr};
|
||||
|
||||
listTag.append(tag);
|
||||
|
||||
return dataParser->xmlAnswer(listTag);
|
||||
}
|
||||
|
||||
QByteArray ClientAnswerParser::task(QString text)
|
||||
{
|
||||
QList<SXmlAnswerTag> listTag;
|
||||
|
||||
SAttribute attribute1 = {"Text", text};
|
||||
QList<SAttribute> listAttr = {attribute1};
|
||||
SXmlAnswerTag tag = {"ServerTask", listAttr};
|
||||
|
||||
listTag.append(tag);
|
||||
|
||||
return dataParser->xmlAnswer(listTag);
|
||||
}
|
||||
|
||||
QByteArray ClientAnswerParser::notify(QString code)
|
||||
{
|
||||
QList<SXmlAnswerTag> listTag;
|
||||
|
||||
SAttribute attribute1 = {"Code", code};
|
||||
QList<SAttribute> listAttr = {attribute1};
|
||||
SXmlAnswerTag tag = {"ServerNotify", listAttr};
|
||||
|
||||
listTag.append(tag);
|
||||
|
||||
return dataParser->xmlAnswer(listTag);
|
||||
}
|
||||
|
||||
QByteArray ClientAnswerParser::tasks(QStringList listTasks)
|
||||
{
|
||||
QList<SXmlAnswerTag> listTag;
|
||||
|
||||
foreach(QString task, listTasks)
|
||||
{
|
||||
QList<SAttribute> listAttr;
|
||||
|
||||
SAttribute attribute1 = {"Head", task};
|
||||
SAttribute attribute2 = {"IsComplete", "false"};
|
||||
listAttr.append(attribute1);
|
||||
listAttr.append(attribute2);
|
||||
|
||||
SXmlAnswerTag tag = {"ServerTask", listAttr};
|
||||
listTag.append(tag);
|
||||
}
|
||||
|
||||
return dataParser->xmlAnswer(listTag, "TaskArray", "Tasks");
|
||||
}
|
||||
|
||||
QByteArray ClientAnswerParser::currentVersion()
|
||||
{
|
||||
QByteArray array;
|
||||
QFile fileR(version);
|
||||
if (!fileR.open(QFile::ReadOnly | QFile::Text))
|
||||
{
|
||||
QString str = "Не удалось открыть файл";
|
||||
qDebug() << "xmlAnswer: " << str;
|
||||
}
|
||||
else
|
||||
{
|
||||
array = fileR.readAll();
|
||||
fileR.close(); // Закрываем файл
|
||||
}
|
||||
|
||||
return array;
|
||||
}
|
||||
30
ServerLMS/ServerLMS/Systems/Parsers/clientanswerparser.h
Normal file
30
ServerLMS/ServerLMS/Systems/Parsers/clientanswerparser.h
Normal file
@@ -0,0 +1,30 @@
|
||||
#ifndef CLIENTANSWERPARSER_H
|
||||
#define CLIENTANSWERPARSER_H
|
||||
|
||||
#include <QObject>
|
||||
|
||||
#include <Systems/Parsers/dataparser.h>
|
||||
#include <Data/typesDataServerClient.h>
|
||||
|
||||
|
||||
class ClientAnswerParser : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit ClientAnswerParser(QObject *parent = nullptr);
|
||||
void initialize(DataParser *dataParser);
|
||||
|
||||
QByteArray authorization(bool result, QString instructorName, QString clientName, QString accessType, QString login);
|
||||
QByteArray deAuthorization(bool result, QString login);
|
||||
QByteArray message(QString text, QString login = "");
|
||||
QByteArray task(QString text);
|
||||
QByteArray notify(QString code);
|
||||
QByteArray tasks(QStringList listTasks);
|
||||
QByteArray currentVersion();
|
||||
signals:
|
||||
|
||||
private:
|
||||
DataParser *dataParser;
|
||||
};
|
||||
|
||||
#endif // CLIENTANSWERPARSER_H
|
||||
163
ServerLMS/ServerLMS/Systems/Parsers/dataparser.cpp
Normal file
163
ServerLMS/ServerLMS/Systems/Parsers/dataparser.cpp
Normal file
@@ -0,0 +1,163 @@
|
||||
#include "dataparser.h"
|
||||
|
||||
#include <QFile>
|
||||
#include <QDomDocument>
|
||||
|
||||
DataParser::DataParser(AssetsManager *assetManager,ProcessingSystem *processingSystem,QObject *parent) :
|
||||
QObject(parent)
|
||||
{
|
||||
this->processingSystem = processingSystem;
|
||||
this->assetsManager = assetManager;
|
||||
|
||||
clientAnswer = new ClientAnswerParser;
|
||||
clientAnswer->initialize(this);
|
||||
|
||||
dbAnswer = new DBAnswerParser;
|
||||
dbAnswer->initialize(this);
|
||||
|
||||
processParser = new ProcessParser;
|
||||
processParser->initialize(processingSystem);
|
||||
|
||||
mutex = new QMutex;
|
||||
|
||||
if (!QDir(staticDataFolderName).exists()){
|
||||
QDir().mkdir(staticDataFolderName);
|
||||
}
|
||||
qDebug() << "ParserThread: " << QThread::currentThreadId();
|
||||
}
|
||||
|
||||
|
||||
|
||||
QByteArray DataParser::xmlAnswer(QList<SXmlAnswerTag> listTag, QString elemUp1, QString elemUp2)
|
||||
{
|
||||
try {
|
||||
|
||||
mutex->lock();
|
||||
/* Открываем файл для Записи*/
|
||||
QFile file(tempFile);
|
||||
file.open(QIODevice::WriteOnly);
|
||||
|
||||
/* Создаем объект, с помощью которого осуществляется запись в файл */
|
||||
QXmlStreamWriter xmlWriter(&file);
|
||||
|
||||
xmlWriter.setAutoFormatting(true); // Устанавливаем автоформатирование текста
|
||||
|
||||
xmlWriter.writeStartDocument(); // Запускаем запись в документ
|
||||
|
||||
if(elemUp1 != "")
|
||||
xmlWriter.writeStartElement(elemUp1); // Записываем тег
|
||||
|
||||
if(elemUp2 != "")
|
||||
xmlWriter.writeStartElement(elemUp2); // Записываем тег
|
||||
|
||||
//Записываем все элементы
|
||||
foreach(SXmlAnswerTag tag, listTag)
|
||||
{
|
||||
xmlWriter.writeStartElement(tag.elementName); // Записываем тег
|
||||
|
||||
// Записываем атрибуты
|
||||
foreach(SAttribute attr, tag.attr)
|
||||
xmlWriter.writeAttribute(attr.name, attr.value);
|
||||
|
||||
xmlWriter.writeEndElement(); // Закрываем тег
|
||||
}
|
||||
|
||||
if(elemUp1 != "")
|
||||
xmlWriter.writeEndElement(); // Закрываем тег
|
||||
|
||||
if(elemUp1 != "")
|
||||
xmlWriter.writeEndElement(); // Закрываем тег
|
||||
|
||||
/* Завершаем запись в документ*/
|
||||
xmlWriter.writeEndDocument();
|
||||
|
||||
file.close(); // Закрываем файл
|
||||
|
||||
QByteArray array;
|
||||
|
||||
array = readTempFile();
|
||||
mutex->unlock();
|
||||
|
||||
return array;
|
||||
}
|
||||
catch(const std::exception& e)
|
||||
|
||||
{
|
||||
qDebug() << e.what();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
bool DataParser::loadBlankXML(QString nameFile, QDomDocument *commonDOM)
|
||||
{
|
||||
QFile blankFile(nameFile);
|
||||
|
||||
if (! blankFile.open(QFile::ReadOnly | QFile::Text)) {
|
||||
qDebug() << "loadBlankXML: Couldn't read the file: " + nameFile;
|
||||
return false;
|
||||
}
|
||||
|
||||
commonDOM->setContent(blankFile.readAll());
|
||||
blankFile.close();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool DataParser::saveDOMtoXML(QString nameFile, QDomDocument *commonDOM)
|
||||
{
|
||||
QFile xmlOutFile(nameFile);
|
||||
if (!xmlOutFile.open(QFile::WriteOnly | QFile::Text))
|
||||
{
|
||||
qDebug() << "saveDOMtoXML: Failed to write a file: " + nameFile;
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
QTextStream outFile(&xmlOutFile);
|
||||
commonDOM->save(outFile, 4);
|
||||
xmlOutFile.close();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
QByteArray DataParser::readTempFile()
|
||||
{
|
||||
QByteArray array;
|
||||
QFile fileR(tempFile);
|
||||
if (!fileR.open(QFile::ReadOnly | QFile::Text))
|
||||
{
|
||||
QString str = "Не удалось открыть файл";
|
||||
qDebug() << "xmlAnswer: " << str;
|
||||
}
|
||||
else
|
||||
{
|
||||
array = fileR.readAll();
|
||||
fileR.close();
|
||||
}
|
||||
|
||||
return array;
|
||||
}
|
||||
|
||||
ClientAnswerParser *DataParser::ClientAnswer() const
|
||||
{
|
||||
return clientAnswer;
|
||||
}
|
||||
|
||||
DBAnswerParser *DataParser::DbAnswer() const
|
||||
{
|
||||
return dbAnswer;
|
||||
}
|
||||
|
||||
ProcessParser *DataParser::getProcessParser() const
|
||||
{
|
||||
return processParser;
|
||||
}
|
||||
|
||||
DataParser::~DataParser()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
62
ServerLMS/ServerLMS/Systems/Parsers/dataparser.h
Normal file
62
ServerLMS/ServerLMS/Systems/Parsers/dataparser.h
Normal file
@@ -0,0 +1,62 @@
|
||||
#ifndef DATAPARSER_H
|
||||
#define DATAPARSER_H
|
||||
|
||||
#include "Systems/processingsystem.h"
|
||||
#include "Systems/tools.h"
|
||||
#include "Systems/assetsmanager.h"
|
||||
#include "Systems/logger.h"
|
||||
#include "Systems/Parsers/clientanswerparser.h"
|
||||
#include "dbanswerparser.h"
|
||||
#include "processparser.h"
|
||||
#include "serverlmswidget.h"
|
||||
|
||||
#include <QByteArray>
|
||||
#include <QXmlStreamReader>
|
||||
#include <QDebug>
|
||||
#include <QDomDocument>
|
||||
|
||||
#include <Data/typesDataServerClient.h>
|
||||
#include <Data/StreamingVersionData.h>
|
||||
|
||||
class ProcessingSystem;
|
||||
class ClientHandler;
|
||||
class AssetsManager;
|
||||
class ClientAnswerParser;
|
||||
class DBAnswerParser;
|
||||
class ProcessParser;
|
||||
|
||||
class DataParser : public QObject
|
||||
{
|
||||
|
||||
Q_OBJECT
|
||||
public:
|
||||
DataParser(AssetsManager *assetManager,ProcessingSystem *processingSystem,QObject* parent = nullptr);
|
||||
void xmlParser(ClientHandler *client, QByteArray array);
|
||||
void xmlFileDataParse(QByteArray array);
|
||||
|
||||
QByteArray xmlAnswer(QList<SXmlAnswerTag> listTag,QString elemUp1 = "", QString elemUp2 = "");
|
||||
|
||||
bool loadBlankXML(QString nameFile, QDomDocument* commonDOM);
|
||||
bool saveDOMtoXML(QString nameFile, QDomDocument* commonDOM);
|
||||
~DataParser();
|
||||
|
||||
ClientAnswerParser *ClientAnswer() const;
|
||||
DBAnswerParser *DbAnswer() const;
|
||||
ProcessParser *getProcessParser() const;
|
||||
|
||||
signals:
|
||||
void sigLogMessage(QString log);
|
||||
|
||||
|
||||
private:
|
||||
QMutex *mutex;
|
||||
|
||||
ProcessingSystem *processingSystem;
|
||||
AssetsManager *assetsManager;
|
||||
ClientAnswerParser *clientAnswer;
|
||||
DBAnswerParser *dbAnswer;
|
||||
ProcessParser *processParser;
|
||||
QByteArray readTempFile();
|
||||
};
|
||||
|
||||
#endif // DATAPARSER_H
|
||||
109
ServerLMS/ServerLMS/Systems/Parsers/dbanswerparser.cpp
Normal file
109
ServerLMS/ServerLMS/Systems/Parsers/dbanswerparser.cpp
Normal file
@@ -0,0 +1,109 @@
|
||||
#include "dbanswerparser.h"
|
||||
|
||||
|
||||
|
||||
DBAnswerParser::DBAnswerParser(QObject *parent) : QObject(parent)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void DBAnswerParser::initialize(DataParser *dataParser)
|
||||
{
|
||||
this->dataParser = dataParser;
|
||||
}
|
||||
|
||||
QByteArray DBAnswerParser::listInstructors(bool result, QList<Instructor> *listInstructors)
|
||||
{
|
||||
QDomDocument commonDOM;
|
||||
if(! dataParser->loadBlankXML(":/resources/blankXML/ListInstructors.xml", &commonDOM))
|
||||
return QByteArray();
|
||||
|
||||
QDomNode listNode = commonDOM.namedItem("ListInstructors");
|
||||
|
||||
for(Instructor instructor : *listInstructors)
|
||||
{
|
||||
//Инструктор
|
||||
QDomNode instructorNode = commonDOM.createElement("Instructor");
|
||||
listNode.appendChild(instructorNode);
|
||||
instructorNode.toElement().setAttribute("instructor_id", QString::number(instructor.getID()));
|
||||
instructorNode.toElement().setAttribute("name", instructor.getName());
|
||||
instructorNode.toElement().setAttribute("login", instructor.getLogin());
|
||||
instructorNode.toElement().setAttribute("password", instructor.getPassword());
|
||||
instructorNode.toElement().setAttribute("is_admin", instructor.getIsAdmin());
|
||||
instructorNode.toElement().setAttribute("archived", instructor.getArchived());
|
||||
instructorNode.toElement().setAttribute("logged_in", instructor.getLoggedIn());
|
||||
}
|
||||
|
||||
dataParser->saveDOMtoXML("ListInstructors.xml", &commonDOM);
|
||||
|
||||
return commonDOM.toByteArray();
|
||||
}
|
||||
|
||||
QByteArray DBAnswerParser::listGroups(bool result, QList<Group> *listGroups)
|
||||
{
|
||||
QDomDocument commonDOM;
|
||||
if(! dataParser->loadBlankXML(":/resources/blankXML/ListGroups.xml", &commonDOM))
|
||||
return QByteArray();
|
||||
|
||||
QDomNode listNode = commonDOM.namedItem("ListGroups");
|
||||
|
||||
for(Group group : *listGroups)
|
||||
{
|
||||
//Группа
|
||||
QDomNode groupNode = commonDOM.createElement("Group");
|
||||
listNode.appendChild(groupNode);
|
||||
groupNode.toElement().setAttribute("group_id", QString::number(group.getID()));
|
||||
groupNode.toElement().setAttribute("name", group.getName());
|
||||
}
|
||||
|
||||
dataParser->saveDOMtoXML("ListGroups.xml", &commonDOM);
|
||||
|
||||
return commonDOM.toByteArray();
|
||||
}
|
||||
|
||||
QByteArray DBAnswerParser::listTrainees(bool result, QList<Trainee> *listTrainees)
|
||||
{
|
||||
QDomDocument commonDOM;
|
||||
if(! dataParser->loadBlankXML(":/resources/blankXML/ListTrainees.xml", &commonDOM))
|
||||
return QByteArray();
|
||||
|
||||
QDomNode listNode = commonDOM.namedItem("ListTrainees");
|
||||
|
||||
for(Trainee trainee : *listTrainees)
|
||||
{
|
||||
//Обучаемый
|
||||
QDomNode traineeNode = commonDOM.createElement("Trainee");
|
||||
listNode.appendChild(traineeNode);
|
||||
traineeNode.toElement().setAttribute("trainee_id", trainee.getID());
|
||||
traineeNode.toElement().setAttribute("name", trainee.getName());
|
||||
traineeNode.toElement().setAttribute("login", trainee.getLogin());
|
||||
traineeNode.toElement().setAttribute("password", trainee.getPassword());
|
||||
traineeNode.toElement().setAttribute("archived", trainee.getArchived());
|
||||
traineeNode.toElement().setAttribute("logged_in", trainee.getLoggedIn());
|
||||
traineeNode.toElement().setAttribute("group_trainee", trainee.getGroup().getID());
|
||||
traineeNode.toElement().setAttribute("computer_trainee", trainee.getComputer().getID());
|
||||
//trainee.setTasks()
|
||||
}
|
||||
|
||||
dataParser->saveDOMtoXML("ListTrainees.xml", &commonDOM);
|
||||
|
||||
return commonDOM.toByteArray();
|
||||
}
|
||||
|
||||
QByteArray DBAnswerParser::listComputers(bool result, QList<Computer> *listComputers)
|
||||
{
|
||||
//TODO
|
||||
return QByteArray();
|
||||
}
|
||||
|
||||
QByteArray DBAnswerParser::listClassrooms(bool result, QList<Classroom> *listClassrooms)
|
||||
{
|
||||
//TODO
|
||||
return QByteArray();
|
||||
}
|
||||
|
||||
QByteArray DBAnswerParser::listTasks(bool result, QList<Task> *listTasks)
|
||||
{
|
||||
//TODO
|
||||
return QByteArray();
|
||||
}
|
||||
29
ServerLMS/ServerLMS/Systems/Parsers/dbanswerparser.h
Normal file
29
ServerLMS/ServerLMS/Systems/Parsers/dbanswerparser.h
Normal file
@@ -0,0 +1,29 @@
|
||||
#ifndef DBANSWERPARSER_H
|
||||
#define DBANSWERPARSER_H
|
||||
|
||||
#include "dataparser.h"
|
||||
#include "serverlmswidget.h"
|
||||
|
||||
#include <QObject>
|
||||
#include <QDomDocument>
|
||||
|
||||
class DBAnswerParser : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit DBAnswerParser(QObject *parent = nullptr);
|
||||
void initialize(DataParser *dataParser);
|
||||
QByteArray listInstructors(bool result, QList<Instructor> *listInstructors);
|
||||
QByteArray listGroups(bool result, QList<Group> *listGroups);
|
||||
QByteArray listTrainees(bool result, QList<Trainee> *listTrainees);
|
||||
QByteArray listComputers(bool result, QList<Computer> *listComputers);
|
||||
QByteArray listClassrooms(bool result, QList<Classroom> *listClassrooms);
|
||||
QByteArray listTasks(bool result, QList<Task> *listTasks);
|
||||
signals:
|
||||
|
||||
private:
|
||||
DataParser *dataParser;
|
||||
|
||||
};
|
||||
|
||||
#endif // DBANSWERPARSER_H
|
||||
261
ServerLMS/ServerLMS/Systems/Parsers/processparser.cpp
Normal file
261
ServerLMS/ServerLMS/Systems/Parsers/processparser.cpp
Normal file
@@ -0,0 +1,261 @@
|
||||
#include "processparser.h"
|
||||
|
||||
ProcessParser::ProcessParser(QObject *parent) : QObject(parent)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void ProcessParser::initialize(ProcessingSystem *processingSystem)
|
||||
{
|
||||
this->processingSystem = processingSystem;
|
||||
}
|
||||
|
||||
void ProcessParser::read(ClientHandler *client, QByteArray array)
|
||||
{
|
||||
QXmlStreamReader xmlReader(array);
|
||||
|
||||
xmlReader.readNext(); // Переходим к первому элементу в файле
|
||||
|
||||
//Крутимся в цикле до тех пор, пока не достигнем конца документа
|
||||
while(!xmlReader.atEnd())
|
||||
{
|
||||
//Проверяем, является ли элемент началом тега
|
||||
if(xmlReader.isStartElement())
|
||||
{
|
||||
//Анализируем теги
|
||||
if(xmlReader.name() == "ClientAutorization")
|
||||
{//Запрос авторизации от клиента
|
||||
|
||||
clientAuth(xmlReader,client);
|
||||
}
|
||||
else if(xmlReader.name() == "ClientDeAutorization")
|
||||
{//Запрос ДеАвторизации от клиента
|
||||
|
||||
clientDeAuth(xmlReader,client);
|
||||
}
|
||||
else if(xmlReader.name() == "ToClientMessage")
|
||||
{//Отправка сообщения Клиенту
|
||||
|
||||
toClientMessage(xmlReader,client);
|
||||
}
|
||||
else if(xmlReader.name() == "QueryToDB")
|
||||
{//Запрос к базе данных от клиента
|
||||
|
||||
queryToDb(xmlReader,client);
|
||||
}
|
||||
else if(xmlReader.name() == "ClientMessage")
|
||||
{//Сообщение от клиента
|
||||
|
||||
clientMessage(xmlReader,client);
|
||||
}
|
||||
else if(xmlReader.name() == "ClientNotify")
|
||||
{//Уведомление от клиента
|
||||
|
||||
clientNotify(xmlReader,client);
|
||||
}
|
||||
else
|
||||
{
|
||||
emit sigLogMessage("XmlParser: unrecognized tag");
|
||||
}
|
||||
|
||||
}
|
||||
xmlReader.readNext(); // Переходим к следующему элементу файла
|
||||
}//while(!xmlReader.atEnd())
|
||||
}
|
||||
|
||||
void ProcessParser::clientAuth(QXmlStreamReader &xmlReader,ClientHandler *client)
|
||||
{
|
||||
ClientAutorization clientAutorization;
|
||||
|
||||
/*Перебираем все атрибуты тега*/
|
||||
foreach(const QXmlStreamAttribute &attr, xmlReader.attributes())
|
||||
{
|
||||
QString name = attr.name().toString();
|
||||
QString value = attr.value().toString();
|
||||
//addTextToLogger(name + ": " + value);
|
||||
|
||||
if(name == "Login")
|
||||
clientAutorization.Login = value;
|
||||
else if(name == "Password")
|
||||
clientAutorization.Password = value;
|
||||
else if(name == "NumberOfScreen")
|
||||
clientAutorization.NumberOfScreen = value.toInt();
|
||||
else if(name == "TypeClient")
|
||||
clientAutorization.TypeClient = (TypeClientAutorization)value.toInt();
|
||||
}
|
||||
|
||||
processingSystem->processingClientAutorization(client, clientAutorization);
|
||||
}
|
||||
|
||||
void ProcessParser::clientDeAuth(QXmlStreamReader &xmlReader,ClientHandler *client)
|
||||
{
|
||||
ClientDeAutorization clientDeAutorization;
|
||||
|
||||
/*Перебираем все атрибуты тега*/
|
||||
foreach(const QXmlStreamAttribute &attr, xmlReader.attributes())
|
||||
{
|
||||
QString name = attr.name().toString();
|
||||
QString value = attr.value().toString();
|
||||
//addTextToLogger(name + ": " + value);
|
||||
|
||||
if(name == "Login")
|
||||
clientDeAutorization.Login = value;
|
||||
}
|
||||
|
||||
processingSystem->processingClientDeAutorization(client, clientDeAutorization);
|
||||
}
|
||||
|
||||
void ProcessParser::toClientMessage(QXmlStreamReader &xmlReader,ClientHandler *client)
|
||||
{
|
||||
ToClientMessage toClientMessage;
|
||||
|
||||
/*Перебираем все атрибуты тега*/
|
||||
foreach(const QXmlStreamAttribute &attr, xmlReader.attributes())
|
||||
{
|
||||
QString name = attr.name().toString();
|
||||
QString value = attr.value().toString();
|
||||
//addTextToLogger(name + ": " + value);
|
||||
|
||||
if(name == "id")
|
||||
toClientMessage.id = value.toInt();
|
||||
else if(name == "Text")
|
||||
toClientMessage.Text = value;
|
||||
else if(name == "Login")
|
||||
toClientMessage.Login = value;
|
||||
}
|
||||
|
||||
processingSystem->processingToClientMessage(client, toClientMessage);
|
||||
}
|
||||
|
||||
void ProcessParser::queryToDb(QXmlStreamReader &xmlReader,ClientHandler *client)
|
||||
{
|
||||
ClientQueryToDB queryToDB;
|
||||
int id = 0;
|
||||
Instructor instructor;
|
||||
Trainee trainee;
|
||||
Group group;
|
||||
void* data = nullptr;
|
||||
|
||||
/*Перебираем все атрибуты тега*/
|
||||
foreach(const QXmlStreamAttribute &attr, xmlReader.attributes())
|
||||
{
|
||||
QString name = attr.name().toString();
|
||||
QString value = attr.value().toString();
|
||||
//addTextToLogger(name + ": " + value);
|
||||
|
||||
if(name == "TypeQuery")
|
||||
queryToDB.typeQuery = (TypeQueryToDB)value.toInt();
|
||||
else if(name == "id")
|
||||
id = value.toInt();
|
||||
else
|
||||
{
|
||||
switch (queryToDB.typeQuery)
|
||||
{
|
||||
case TypeQueryToDB::TYPE_QUERY_NEW_INSTRUCTOR:
|
||||
case TypeQueryToDB::TYPE_QUERY_EDIT_INSTRUCTOR:
|
||||
if(name == "instructor_id")
|
||||
instructor.setID(value.toInt());
|
||||
else if(name == "name")
|
||||
instructor.setName(value);
|
||||
else if(name == "login")
|
||||
instructor.setLogin(value);
|
||||
else if(name == "password")
|
||||
instructor.setPassword(value);
|
||||
else if(name == "is_admin")
|
||||
instructor.setIsAdmin(value.toInt());
|
||||
else if(name == "archived")
|
||||
instructor.setArchived(value.toInt());
|
||||
else if(name == "logged_in")
|
||||
instructor.setLoggedIn(value.toInt());
|
||||
break;
|
||||
case TypeQueryToDB::TYPE_QUERY_NEW_TRAINEE:
|
||||
case TypeQueryToDB::TYPE_QUERY_EDIT_TRAINEE:
|
||||
if(name == "trainee_id")
|
||||
trainee.setID(value.toInt());
|
||||
else if(name == "name")
|
||||
trainee.setName(value);
|
||||
else if(name == "login")
|
||||
trainee.setLogin(value);
|
||||
else if(name == "password")
|
||||
trainee.setPassword(value);
|
||||
else if(name == "archived")
|
||||
trainee.setArchived(value.toInt());
|
||||
else if(name == "logged_in")
|
||||
trainee.setLoggedIn(value.toInt());
|
||||
else if(name == "group_trainee")
|
||||
{
|
||||
Group group(value.toInt(), "");
|
||||
trainee.setGroup(group);
|
||||
}
|
||||
else if(name == "computer_trainee")
|
||||
{
|
||||
Computer computer(value.toInt(), "", "", Classroom());
|
||||
trainee.setComputer(computer);
|
||||
}
|
||||
break;
|
||||
case TypeQueryToDB::TYPE_QUERY_NEW_GROUP:
|
||||
case TypeQueryToDB::TYPE_QUERY_EDIT_GROUP:
|
||||
if(name == "group_id")
|
||||
group.setID(value.toInt());
|
||||
else if(name == "name")
|
||||
group.setName(value);
|
||||
break;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
switch (queryToDB.typeQuery)
|
||||
{
|
||||
case TypeQueryToDB::TYPE_QUERY_NEW_INSTRUCTOR:
|
||||
case TypeQueryToDB::TYPE_QUERY_EDIT_INSTRUCTOR:
|
||||
data = &instructor;
|
||||
break;
|
||||
case TypeQueryToDB::TYPE_QUERY_NEW_TRAINEE:
|
||||
case TypeQueryToDB::TYPE_QUERY_EDIT_TRAINEE:
|
||||
data = &trainee;
|
||||
break;
|
||||
case TypeQueryToDB::TYPE_QUERY_NEW_GROUP:
|
||||
case TypeQueryToDB::TYPE_QUERY_EDIT_GROUP:
|
||||
data = &group;
|
||||
break;
|
||||
};
|
||||
|
||||
processingSystem->processingClientQueryToDB(client, queryToDB, id, data);
|
||||
}
|
||||
|
||||
void ProcessParser::clientMessage(QXmlStreamReader &xmlReader,ClientHandler *client)
|
||||
{
|
||||
ClientMessage clientMessage;
|
||||
|
||||
/*Перебираем все атрибуты тега*/
|
||||
foreach(const QXmlStreamAttribute &attr, xmlReader.attributes())
|
||||
{
|
||||
QString name = attr.name().toString();
|
||||
QString value = attr.value().toString();
|
||||
//addTextToLogger(name + ": " + value);
|
||||
|
||||
if(name == "Text")
|
||||
clientMessage.Text = value;
|
||||
}
|
||||
|
||||
processingSystem->processingFromClientMessage(client, clientMessage);
|
||||
}
|
||||
|
||||
void ProcessParser::clientNotify(QXmlStreamReader &xmlReader,ClientHandler *client)
|
||||
{
|
||||
ClientNotify clientNotify;
|
||||
|
||||
/*Перебираем все атрибуты тега*/
|
||||
foreach(const QXmlStreamAttribute &attr, xmlReader.attributes())
|
||||
{
|
||||
QString name = attr.name().toString();
|
||||
QString value = attr.value().toString();
|
||||
|
||||
if(name == "Code")
|
||||
clientNotify.Code = value;
|
||||
}
|
||||
|
||||
processingSystem->processingClientNotify(client, clientNotify);
|
||||
}
|
||||
|
||||
|
||||
30
ServerLMS/ServerLMS/Systems/Parsers/processparser.h
Normal file
30
ServerLMS/ServerLMS/Systems/Parsers/processparser.h
Normal file
@@ -0,0 +1,30 @@
|
||||
#ifndef PROCESSPARSER_H
|
||||
#define PROCESSPARSER_H
|
||||
|
||||
#include <QObject>
|
||||
#include <Data/typesDataServerClient.h>
|
||||
#include <qxmlstream.h>
|
||||
#include <clienthandler.h>
|
||||
|
||||
class ProcessParser : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit ProcessParser(QObject *parent = nullptr);
|
||||
void initialize(ProcessingSystem *processingSystem);
|
||||
void read(ClientHandler *client, QByteArray array);
|
||||
|
||||
|
||||
signals:
|
||||
void sigLogMessage(QString text);
|
||||
private:
|
||||
ProcessingSystem *processingSystem;
|
||||
void clientAuth(QXmlStreamReader &xmlReader,ClientHandler *client);
|
||||
void clientDeAuth(QXmlStreamReader &xmlReader,ClientHandler *client);
|
||||
void toClientMessage(QXmlStreamReader &xmlReader,ClientHandler *client);
|
||||
void queryToDb(QXmlStreamReader &xmlReader,ClientHandler *client);
|
||||
void clientMessage(QXmlStreamReader &xmlReader,ClientHandler *client);
|
||||
void clientNotify(QXmlStreamReader &xmlReader,ClientHandler *client);
|
||||
};
|
||||
|
||||
#endif // PROCESSPARSER_H
|
||||
220
ServerLMS/ServerLMS/Systems/assetsmanager.cpp
Normal file
220
ServerLMS/ServerLMS/Systems/assetsmanager.cpp
Normal file
@@ -0,0 +1,220 @@
|
||||
#include "assetsmanager.h"
|
||||
|
||||
AssetsManager::AssetsManager(QObject *parent) : QObject(parent)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void AssetsManager::initialize(UpdateController* updateContoller,DataParser *dataParser)
|
||||
{
|
||||
this->updateController = updateContoller;
|
||||
connect(this,&AssetsManager::sigSaveVersion,updateContoller,&UpdateController::saveVersionToFile);
|
||||
datas = new QList<StreamingVersionData*>;
|
||||
}
|
||||
|
||||
void AssetsManager::setVersionList(QList<StreamingVersionData*> *streamingVersion)
|
||||
{
|
||||
datas->clear();
|
||||
datas = streamingVersion;
|
||||
}
|
||||
|
||||
bool AssetsManager::findDuplicate(QString name)
|
||||
{
|
||||
QListIterator<StreamingVersionData*> iterator(*datas);
|
||||
|
||||
while (iterator.hasNext())
|
||||
{
|
||||
if (iterator.next()->getViewName() == name) return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
QString AssetsManager::setVersion(QString versionName)
|
||||
{
|
||||
QListIterator<StreamingVersionData*> iterator(*datas);
|
||||
|
||||
while (iterator.hasNext())
|
||||
{
|
||||
StreamingVersionData *version = iterator.next();
|
||||
|
||||
if (version->getViewName() == versionName)
|
||||
{
|
||||
currentVersionData = version;
|
||||
emit sigSaveVersion(currentVersionData);
|
||||
|
||||
return version->getAbsolutPath();
|
||||
}
|
||||
}
|
||||
|
||||
return "none";
|
||||
}
|
||||
|
||||
QList<FileData> *AssetsManager::prepareLocalPathList(QList<FileData> *fileData)
|
||||
{
|
||||
QList<FileData> *completeList = fileData;
|
||||
|
||||
for(int i = 0; i < completeList->count();i++)
|
||||
{
|
||||
FileData fileData = completeList->at(i);
|
||||
|
||||
int index = fileData.path.indexOf(currentVersionData->getViewName());
|
||||
if(index != -1)
|
||||
{
|
||||
fileData.path = Tools::createRealPath(fileData.path,currentVersionData); //делаем в полный путь
|
||||
completeList->replace(i,fileData);
|
||||
}
|
||||
else
|
||||
{
|
||||
fileData.path = Tools::createRootPath(fileData.path);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return completeList;
|
||||
}
|
||||
|
||||
QList<FileData> *AssetsManager::prepareRealPathList(QList<FileData> *fileData)
|
||||
{
|
||||
QList<FileData> *completeList = fileData;
|
||||
|
||||
for(int i = 0; i < completeList->count();i++)
|
||||
{
|
||||
FileData fileData = completeList->at(i);
|
||||
if(fileData.path.contains(streamingAssetsFolderName))
|
||||
{
|
||||
fileData.path = Tools::createStreamingToRealPath(fileData.path,currentVersionData);
|
||||
}
|
||||
else
|
||||
{
|
||||
fileData.path = Tools::createRealPath(fileData.path,currentVersionData); //делаем в полный путь
|
||||
}
|
||||
|
||||
completeList->replace(i,fileData);
|
||||
}
|
||||
|
||||
return completeList;
|
||||
}
|
||||
|
||||
void AssetsManager::addVersion(StreamingVersionData *data)
|
||||
{
|
||||
datas->push_back(data);
|
||||
}
|
||||
|
||||
void AssetsManager::createCopyVersion(QString versionName,QString newVersionName)
|
||||
{
|
||||
qDebug() << "assetManager thread ID " << QThread::currentThreadId();
|
||||
QListIterator<StreamingVersionData*> iterator(*datas);
|
||||
StreamingVersionData* data;
|
||||
|
||||
while (iterator.hasNext())
|
||||
{
|
||||
StreamingVersionData *version = iterator.next();
|
||||
|
||||
if (version->getViewName() == versionName)
|
||||
{
|
||||
data = version;
|
||||
}
|
||||
}
|
||||
|
||||
qDebug() << "Version for copy " << versionName;
|
||||
qDebug() << "New version name " << newVersionName;
|
||||
|
||||
//берем путь до копии
|
||||
//преобразуем в реальный путь
|
||||
QString sourcePath = QDir::currentPath() + "/" + sharedDataFolderName + "/" + versionName;
|
||||
QString destinationPath = QDir::currentPath() + "/" + sharedDataFolderName + "/" + newVersionName;
|
||||
|
||||
QDir sourceDir(sourcePath);
|
||||
|
||||
if(!sourceDir.exists())
|
||||
{
|
||||
qDebug() << "Версии нет в SharedData";
|
||||
return;
|
||||
}
|
||||
|
||||
QDir destinationDir(destinationPath);
|
||||
if(destinationDir.exists())
|
||||
{
|
||||
qDebug() << "Папка уже существует";
|
||||
return;
|
||||
}
|
||||
|
||||
//Создаем папку в Shared с новым именем
|
||||
QDir().mkdir(destinationPath);
|
||||
copyAllRecurse(sourcePath,destinationPath);
|
||||
//добавляем в список текущих ассетов
|
||||
updateController->calculateFullHash();
|
||||
updateController->changeAssetVersion(newVersionName);
|
||||
updateController->sendNewVersionList();
|
||||
//повторно отправляем список версий из папки shared
|
||||
|
||||
}
|
||||
|
||||
void AssetsManager::deleteVersion(QString versionName)
|
||||
{
|
||||
QMutableListIterator<StreamingVersionData*> iterator(*datas);
|
||||
|
||||
//если версия равна текущей - игнор
|
||||
if (currentVersionData->getViewName() == versionName)
|
||||
return;
|
||||
|
||||
while (iterator.hasNext())
|
||||
{
|
||||
StreamingVersionData *version = iterator.next();
|
||||
|
||||
//проверка на наличие указанной версии
|
||||
if (version->getViewName() == versionName)
|
||||
{
|
||||
//удаление папки
|
||||
QString verFolderPath = QDir::currentPath() + "/" + sharedDataFolderName + "/" + versionName;
|
||||
QDir dir(verFolderPath);
|
||||
dir.removeRecursively();
|
||||
|
||||
//удаление хэша
|
||||
QString hashPath = QDir::currentPath() + "/" + staticDataFolderName + "/" + versionName + "Hash.xml";
|
||||
QFile file(hashPath);
|
||||
|
||||
if(file.exists()){
|
||||
file.remove();
|
||||
}
|
||||
|
||||
//удаление
|
||||
datas->removeOne(version);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
updateController->calculateSharedHash();
|
||||
updateController->sendNewVersionList();
|
||||
}
|
||||
|
||||
void AssetsManager::copyAllRecurse(QString source,QString destination)
|
||||
{
|
||||
|
||||
//Копируем все объекты туда
|
||||
QDir sourceDir(source);
|
||||
|
||||
foreach(QString folder,sourceDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot))
|
||||
{
|
||||
QString destPath = destination + QDir::separator() + folder;
|
||||
sourceDir.mkpath(destPath);
|
||||
copyAllRecurse(source + QDir::separator() + folder,destPath);
|
||||
}
|
||||
|
||||
foreach(QString file,sourceDir.entryList(QDir::Files))
|
||||
{
|
||||
QFile::copy(source + QDir::separator() + file,destination + QDir::separator() + file);
|
||||
}
|
||||
}
|
||||
|
||||
AssetsManager::~AssetsManager()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
StreamingVersionData *AssetsManager::getCurrentVersionData() const
|
||||
{
|
||||
return currentVersionData;
|
||||
}
|
||||
|
||||
41
ServerLMS/ServerLMS/Systems/assetsmanager.h
Normal file
41
ServerLMS/ServerLMS/Systems/assetsmanager.h
Normal file
@@ -0,0 +1,41 @@
|
||||
#ifndef ASSETSMANAGER_H
|
||||
#define ASSETSMANAGER_H
|
||||
|
||||
#include <QObject>
|
||||
#include <Systems/updatecontroller.h>
|
||||
#include <Data/StreamingVersionData.h>
|
||||
|
||||
|
||||
class AssetsManager : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit AssetsManager(QObject *parent = nullptr);
|
||||
void initialize(UpdateController* updateContoller,DataParser *dataParser);
|
||||
void addVersion(StreamingVersionData *data);
|
||||
void createCopyVersion(QString versionName,QString newName);
|
||||
void deleteVersion(QString version);
|
||||
void setVersionList(QList<StreamingVersionData *> *streamingVersion);
|
||||
bool findDuplicate(QString name);
|
||||
QString setVersion(QString versionName);
|
||||
|
||||
QList<FileData> *prepareLocalPathList(QList<FileData>*fileData);
|
||||
QList<FileData> *prepareRealPathList(QList<FileData> *fileData);
|
||||
QList<FileData> *getRealPathList();
|
||||
|
||||
~AssetsManager();
|
||||
|
||||
StreamingVersionData *getCurrentVersionData() const;
|
||||
|
||||
signals:
|
||||
void sigSaveVersion(StreamingVersionData *versionData);
|
||||
|
||||
private:
|
||||
UpdateController *updateController;
|
||||
QList<StreamingVersionData*> *datas;
|
||||
StreamingVersionData* currentVersionData;
|
||||
|
||||
void copyAllRecurse(QString source, QString destination);
|
||||
};
|
||||
|
||||
#endif // ASSETSMANAGER_H
|
||||
141
ServerLMS/ServerLMS/Systems/commonclienthandler.cpp
Normal file
141
ServerLMS/ServerLMS/Systems/commonclienthandler.cpp
Normal file
@@ -0,0 +1,141 @@
|
||||
#include "commonclienthandler.h"
|
||||
|
||||
CommonClientHandler::CommonClientHandler(QObject *parent) : QObject(parent)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void CommonClientHandler::initialize(QMap<int, ClientHandler *> *clientsMap, ProcessingSystem *processingSystem, DataParser *dataParser, Logger *logger)
|
||||
{
|
||||
this->clientsMap = clientsMap;
|
||||
this->processingSystem = processingSystem;
|
||||
this->dataParser = dataParser;
|
||||
this->logger = logger;
|
||||
}
|
||||
|
||||
void CommonClientHandler::sendNewVersionListToAllClient()
|
||||
{
|
||||
foreach(int idSocket,clientsMap->keys())
|
||||
{
|
||||
ClientHandler *handler = clientsMap->value(idSocket);
|
||||
|
||||
if (!handler->getClient()->getIsLoggedIn()) continue;
|
||||
|
||||
handler->sendVersionList();
|
||||
}
|
||||
}
|
||||
|
||||
void CommonClientHandler::sendCurrentVersionToAllClient()
|
||||
{
|
||||
foreach(int idSocket,clientsMap->keys())
|
||||
{
|
||||
ClientHandler *handler = clientsMap->value(idSocket);
|
||||
|
||||
if (!handler->getClient()->getIsLoggedIn()) continue;
|
||||
handler->sendVersion();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void CommonClientHandler::slot_AuthChanged()
|
||||
{
|
||||
//Проходим все открытые сокеты
|
||||
foreach(int idSocket, clientsMap->keys())
|
||||
{
|
||||
ClientHandler *handler = clientsMap->value(idSocket);
|
||||
//Проверяем, есть ли клиенты TYPE_GUI
|
||||
if(handler->getClient()->getTypeClient() == TypeClientAutorization::TYPE_GUI)
|
||||
{//Отправляем этому клиенту обновление списков
|
||||
ClientQueryToDB queryToDB;
|
||||
queryToDB.typeQuery = TypeQueryToDB::TYPE_QUERY_GET_ALL_LISTS;
|
||||
processingSystem->processingClientQueryToDB(handler, queryToDB);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CommonClientHandler::slot_sendPacketToAllClients(PacketType packetType)
|
||||
{
|
||||
foreach(int idSocket, clientsMap->keys())
|
||||
{
|
||||
ClientHandler *handler = clientsMap->value(idSocket);
|
||||
|
||||
if (!handler->getClient()->getIsLoggedIn()) continue;
|
||||
|
||||
handler->sendPacketType(packetType);
|
||||
}
|
||||
}
|
||||
|
||||
void CommonClientHandler::slot_msgToClientFromGUI(QString login, QString text)
|
||||
{
|
||||
QString textMsg = text;
|
||||
|
||||
QByteArray byteArrayMsg = dataParser->ClientAnswer()->message(textMsg);
|
||||
|
||||
//Проходим все открытые сокеты, ищем нужный
|
||||
foreach(int idSocket, clientsMap->keys())
|
||||
{
|
||||
ClientHandler *handler = clientsMap->value(idSocket);
|
||||
if(handler->getClient()->getLogin() == login)
|
||||
{//Отправляем ему
|
||||
|
||||
handler->sendXmlAnswer(byteArrayMsg);
|
||||
|
||||
QString peerAddress = handler->getSocket()->peerAddress().toString();
|
||||
QString peerPort = QString::number(handler->getSocket()->peerPort());
|
||||
|
||||
QString str = "Msg To Client [" + peerAddress + ":" + peerPort + "] : " + textMsg;
|
||||
|
||||
logger->addTextToLogger(str);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CommonClientHandler::slot_msgToGUIfromClient(QString login, QString text)
|
||||
{
|
||||
QString textMsg = text;
|
||||
|
||||
QByteArray byteArrayMsg = dataParser->ClientAnswer()->message(textMsg, login);
|
||||
|
||||
//Проходим все открытые сокеты, ищем нужный
|
||||
foreach(int idSocket, clientsMap->keys())
|
||||
{
|
||||
ClientHandler *handler = clientsMap->value(idSocket);;
|
||||
if(handler->getClient()->getTypeClient() == TypeClientAutorization::TYPE_GUI)
|
||||
{//Отправляем GUI-клиенту для отображения в Мессенджере
|
||||
|
||||
handler->sendXmlAnswer(byteArrayMsg, PacketType::TYPE_XMLANSWER);
|
||||
|
||||
QString peerAddress = handler->getSocket()->peerAddress().toString();
|
||||
QString peerPort = QString::number(handler->getSocket()->peerPort());
|
||||
|
||||
QString str = "Msg From Client [" + peerAddress + ":" + peerPort + "] : " + textMsg;
|
||||
|
||||
logger->addTextToLogger(str);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CommonClientHandler::slot_sendTaskToClient(QString fullNameClient,QString textTask)
|
||||
{
|
||||
QByteArray byteArrayTask = dataParser->ClientAnswer()->task(textTask);
|
||||
|
||||
//Проходим все открытые сокеты
|
||||
foreach(int idSocket, clientsMap->keys())
|
||||
{
|
||||
ClientHandler *handler = clientsMap->value(idSocket);
|
||||
|
||||
if(handler->getClient()->getFullName() == fullNameClient)
|
||||
{//Отправляем ему
|
||||
handler->getSocket()->write(byteArrayTask);
|
||||
|
||||
QString peerAddress = handler->getSocket()->peerAddress().toString();
|
||||
QString peerPort = QString::number(handler->getSocket()->peerPort());
|
||||
|
||||
QString str = "Task To Client [" + peerAddress + ":" + peerPort + "] : " + textTask;
|
||||
logger->addTextToLogger(str);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
39
ServerLMS/ServerLMS/Systems/commonclienthandler.h
Normal file
39
ServerLMS/ServerLMS/Systems/commonclienthandler.h
Normal file
@@ -0,0 +1,39 @@
|
||||
#ifndef COMMONCLIENTHANDLER_H
|
||||
#define COMMONCLIENTHANDLER_H
|
||||
|
||||
#include <QObject>
|
||||
#include "clienthandler.h"
|
||||
|
||||
class ProcessingSystem;
|
||||
class DataParser;
|
||||
class Logger;
|
||||
|
||||
class CommonClientHandler : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit CommonClientHandler(QObject *parent = nullptr);
|
||||
void initialize(QMap<int, ClientHandler*> *clientsMap,
|
||||
ProcessingSystem *processingSystem,
|
||||
DataParser *dataParser,
|
||||
Logger *logger);
|
||||
|
||||
void sendNewVersionListToAllClient();
|
||||
void sendCurrentVersionToAllClient();
|
||||
void slot_AuthChanged();
|
||||
void slot_sendPacketToAllClients(PacketType packetType);
|
||||
//слот обработки сигнала о готовности нового сообщения на отправку клиенту от мессенджера
|
||||
void slot_msgToClientFromGUI(QString login, QString text);
|
||||
void slot_msgToGUIfromClient(QString login, QString text);
|
||||
void slot_sendTaskToClient(QString fullNameClient, QString textTask);
|
||||
signals:
|
||||
|
||||
private:
|
||||
QMap<int, ClientHandler*> *clientsMap;
|
||||
ProcessingSystem *processingSystem;
|
||||
DataParser *dataParser;
|
||||
Logger *logger;
|
||||
|
||||
};
|
||||
|
||||
#endif // COMMONCLIENTHANDLER_H
|
||||
@@ -1,605 +0,0 @@
|
||||
#include "dataparser.h"
|
||||
|
||||
#include <QFile>
|
||||
#include <QDomDocument>
|
||||
|
||||
DataParser::DataParser(ProcessingSystem *processingSystem,QObject *parent) :
|
||||
QObject(parent)
|
||||
{
|
||||
this->processingSystem = processingSystem;
|
||||
mutex = new QMutex;
|
||||
|
||||
if (!QDir(staticDataFolderName).exists()){
|
||||
QDir().mkdir(staticDataFolderName);
|
||||
}
|
||||
qDebug() << "ParserThread: " << QThread::currentThreadId();
|
||||
}
|
||||
|
||||
void DataParser::xmlParser(ClientHandler *client, QByteArray array)
|
||||
{
|
||||
QXmlStreamReader xmlReader(array);
|
||||
|
||||
xmlReader.readNext(); // Переходим к первому элементу в файле
|
||||
|
||||
//Крутимся в цикле до тех пор, пока не достигнем конца документа
|
||||
while(!xmlReader.atEnd())
|
||||
{
|
||||
//Проверяем, является ли элемент началом тега
|
||||
if(xmlReader.isStartElement())
|
||||
{
|
||||
//Анализируем теги
|
||||
if(xmlReader.name() == "ClientAutorization")
|
||||
{//Запрос авторизации от клиента
|
||||
|
||||
ClientAutorization clientAutorization;
|
||||
|
||||
/*Перебираем все атрибуты тега*/
|
||||
foreach(const QXmlStreamAttribute &attr, xmlReader.attributes())
|
||||
{
|
||||
QString name = attr.name().toString();
|
||||
QString value = attr.value().toString();
|
||||
//addTextToLogger(name + ": " + value);
|
||||
|
||||
if(name == "Login")
|
||||
clientAutorization.Login = value;
|
||||
else if(name == "Password")
|
||||
clientAutorization.Password = value;
|
||||
else if(name == "NumberOfScreen")
|
||||
clientAutorization.NumberOfScreen = value.toInt();
|
||||
else if(name == "TypeClient")
|
||||
clientAutorization.TypeClient = (TypeClientAutorization)value.toInt();
|
||||
}
|
||||
|
||||
processingSystem->processingClientAutorization(client, clientAutorization);
|
||||
}
|
||||
else if(xmlReader.name() == "ClientDeAutorization")
|
||||
{//Запрос ДеАвторизации от клиента
|
||||
|
||||
ClientDeAutorization clientDeAutorization;
|
||||
|
||||
/*Перебираем все атрибуты тега*/
|
||||
foreach(const QXmlStreamAttribute &attr, xmlReader.attributes())
|
||||
{
|
||||
QString name = attr.name().toString();
|
||||
QString value = attr.value().toString();
|
||||
//addTextToLogger(name + ": " + value);
|
||||
|
||||
if(name == "Login")
|
||||
clientDeAutorization.Login = value;
|
||||
}
|
||||
|
||||
processingSystem->processingClientDeAutorization(client, clientDeAutorization);
|
||||
}
|
||||
else if(xmlReader.name() == "ToClientMessage")
|
||||
{//Отправка сообщения Клиенту
|
||||
|
||||
ToClientMessage toClientMessage;
|
||||
|
||||
/*Перебираем все атрибуты тега*/
|
||||
foreach(const QXmlStreamAttribute &attr, xmlReader.attributes())
|
||||
{
|
||||
QString name = attr.name().toString();
|
||||
QString value = attr.value().toString();
|
||||
//addTextToLogger(name + ": " + value);
|
||||
|
||||
if(name == "id")
|
||||
toClientMessage.id = value.toInt();
|
||||
else if(name == "Text")
|
||||
toClientMessage.Text = value;
|
||||
else if(name == "Login")
|
||||
toClientMessage.Login = value;
|
||||
}
|
||||
|
||||
processingSystem->processingToClientMessage(client, toClientMessage);
|
||||
}
|
||||
else if(xmlReader.name() == "QueryToDB")
|
||||
{//Запрос к базе данных от клиента
|
||||
|
||||
ClientQueryToDB queryToDB;
|
||||
int id = 0;
|
||||
Instructor instructor;
|
||||
Trainee trainee;
|
||||
Group group;
|
||||
void* data = nullptr;
|
||||
|
||||
/*Перебираем все атрибуты тега*/
|
||||
foreach(const QXmlStreamAttribute &attr, xmlReader.attributes())
|
||||
{
|
||||
QString name = attr.name().toString();
|
||||
QString value = attr.value().toString();
|
||||
//addTextToLogger(name + ": " + value);
|
||||
|
||||
if(name == "TypeQuery")
|
||||
queryToDB.typeQuery = (TypeQueryToDB)value.toInt();
|
||||
else if(name == "id")
|
||||
id = value.toInt();
|
||||
else
|
||||
{
|
||||
switch (queryToDB.typeQuery)
|
||||
{
|
||||
case TypeQueryToDB::TYPE_QUERY_NEW_INSTRUCTOR:
|
||||
case TypeQueryToDB::TYPE_QUERY_EDIT_INSTRUCTOR:
|
||||
if(name == "instructor_id")
|
||||
instructor.setID(value.toInt());
|
||||
else if(name == "name")
|
||||
instructor.setName(value);
|
||||
else if(name == "login")
|
||||
instructor.setLogin(value);
|
||||
else if(name == "password")
|
||||
instructor.setPassword(value);
|
||||
else if(name == "is_admin")
|
||||
instructor.setIsAdmin(value.toInt());
|
||||
else if(name == "archived")
|
||||
instructor.setArchived(value.toInt());
|
||||
else if(name == "logged_in")
|
||||
instructor.setLoggedIn(value.toInt());
|
||||
break;
|
||||
case TypeQueryToDB::TYPE_QUERY_NEW_TRAINEE:
|
||||
case TypeQueryToDB::TYPE_QUERY_EDIT_TRAINEE:
|
||||
if(name == "trainee_id")
|
||||
trainee.setID(value.toInt());
|
||||
else if(name == "name")
|
||||
trainee.setName(value);
|
||||
else if(name == "login")
|
||||
trainee.setLogin(value);
|
||||
else if(name == "password")
|
||||
trainee.setPassword(value);
|
||||
else if(name == "archived")
|
||||
trainee.setArchived(value.toInt());
|
||||
else if(name == "logged_in")
|
||||
trainee.setLoggedIn(value.toInt());
|
||||
else if(name == "group_trainee")
|
||||
{
|
||||
Group group(value.toInt(), "");
|
||||
trainee.setGroup(group);
|
||||
}
|
||||
else if(name == "computer_trainee")
|
||||
{
|
||||
Computer computer(value.toInt(), "", "", Classroom());
|
||||
trainee.setComputer(computer);
|
||||
}
|
||||
break;
|
||||
case TypeQueryToDB::TYPE_QUERY_NEW_GROUP:
|
||||
case TypeQueryToDB::TYPE_QUERY_EDIT_GROUP:
|
||||
if(name == "group_id")
|
||||
group.setID(value.toInt());
|
||||
else if(name == "name")
|
||||
group.setName(value);
|
||||
break;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
switch (queryToDB.typeQuery)
|
||||
{
|
||||
case TypeQueryToDB::TYPE_QUERY_NEW_INSTRUCTOR:
|
||||
case TypeQueryToDB::TYPE_QUERY_EDIT_INSTRUCTOR:
|
||||
data = &instructor;
|
||||
break;
|
||||
case TypeQueryToDB::TYPE_QUERY_NEW_TRAINEE:
|
||||
case TypeQueryToDB::TYPE_QUERY_EDIT_TRAINEE:
|
||||
data = &trainee;
|
||||
break;
|
||||
case TypeQueryToDB::TYPE_QUERY_NEW_GROUP:
|
||||
case TypeQueryToDB::TYPE_QUERY_EDIT_GROUP:
|
||||
data = &group;
|
||||
break;
|
||||
};
|
||||
|
||||
processingSystem->processingClientQueryToDB(client, queryToDB, id, data);
|
||||
}
|
||||
else if(xmlReader.name() == "ClientMessage")
|
||||
{//Сообщение от клиента
|
||||
|
||||
ClientMessage clientMessage;
|
||||
|
||||
/*Перебираем все атрибуты тега*/
|
||||
foreach(const QXmlStreamAttribute &attr, xmlReader.attributes())
|
||||
{
|
||||
QString name = attr.name().toString();
|
||||
QString value = attr.value().toString();
|
||||
//addTextToLogger(name + ": " + value);
|
||||
|
||||
if(name == "Text")
|
||||
clientMessage.Text = value;
|
||||
}
|
||||
|
||||
processingSystem->processingFromClientMessage(client, clientMessage);
|
||||
}
|
||||
else if(xmlReader.name() == "ClientNotify")
|
||||
{//Уведомление от клиента
|
||||
|
||||
ClientNotify clientNotify;
|
||||
|
||||
/*Перебираем все атрибуты тега*/
|
||||
foreach(const QXmlStreamAttribute &attr, xmlReader.attributes())
|
||||
{
|
||||
QString name = attr.name().toString();
|
||||
QString value = attr.value().toString();
|
||||
|
||||
if(name == "Code")
|
||||
clientNotify.Code = value;
|
||||
}
|
||||
|
||||
processingSystem->processingClientNotify(client, clientNotify);
|
||||
}
|
||||
else if(xmlReader.name() == "DataInfo")
|
||||
{
|
||||
dataInfo = new DataInfo;
|
||||
|
||||
foreach(const QXmlStreamAttribute &attr, xmlReader.attributes())
|
||||
{
|
||||
QString name = attr.name().toString();
|
||||
QString value = attr.value().toString();
|
||||
|
||||
if(name == "path")
|
||||
dataInfo->path= value.toUtf8();
|
||||
|
||||
if(name == "size")
|
||||
dataInfo->size = value.toLong();
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
emit sigLogMessage("XmlParser: unrecognized tag");
|
||||
}
|
||||
|
||||
}
|
||||
xmlReader.readNext(); // Переходим к следующему элементу файла
|
||||
}//while(!xmlReader.atEnd())
|
||||
}
|
||||
|
||||
void DataParser::xmlFileDataParse(QByteArray array)
|
||||
{
|
||||
QXmlStreamReader xmlReader(array);
|
||||
datas = new QList<FileData>;
|
||||
xmlReader.readNext(); // Переходим к первому элементу в файле
|
||||
|
||||
//Крутимся в цикле до тех пор, пока не достигнем конца документа
|
||||
while(!xmlReader.atEnd())
|
||||
{
|
||||
//Проверяем, является ли элемент началом тега
|
||||
if(xmlReader.isStartElement())
|
||||
{
|
||||
if(xmlReader.name() == "FileData")
|
||||
{
|
||||
FileData data;
|
||||
|
||||
foreach(const QXmlStreamAttribute &attr,xmlReader.attributes())
|
||||
{
|
||||
QString name = attr.name().toString();
|
||||
QString value = attr.value().toString();
|
||||
|
||||
if(name == "Path")
|
||||
data.path = value;
|
||||
else if(name == "Hash")
|
||||
data.hash = value;
|
||||
}
|
||||
|
||||
datas->append(data);
|
||||
}
|
||||
}
|
||||
|
||||
xmlReader.readNext();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
QByteArray DataParser::xmlAnswer(QList<SXmlAnswerTag> listTag, QString elemUp1, QString elemUp2)
|
||||
{
|
||||
try {
|
||||
|
||||
mutex->lock();
|
||||
/* Открываем файл для Записи*/
|
||||
QFile file(tempFile);
|
||||
file.open(QIODevice::WriteOnly);
|
||||
|
||||
/* Создаем объект, с помощью которого осуществляется запись в файл */
|
||||
QXmlStreamWriter xmlWriter(&file);
|
||||
|
||||
xmlWriter.setAutoFormatting(true); // Устанавливаем автоформатирование текста
|
||||
|
||||
xmlWriter.writeStartDocument(); // Запускаем запись в документ
|
||||
|
||||
if(elemUp1 != "")
|
||||
xmlWriter.writeStartElement(elemUp1); // Записываем тег
|
||||
|
||||
if(elemUp2 != "")
|
||||
xmlWriter.writeStartElement(elemUp2); // Записываем тег
|
||||
|
||||
//Записываем все элементы
|
||||
foreach(SXmlAnswerTag tag, listTag)
|
||||
{
|
||||
xmlWriter.writeStartElement(tag.elementName); // Записываем тег
|
||||
|
||||
// Записываем атрибуты
|
||||
foreach(SAttribute attr, tag.attr)
|
||||
xmlWriter.writeAttribute(attr.name, attr.value);
|
||||
|
||||
xmlWriter.writeEndElement(); // Закрываем тег
|
||||
}
|
||||
|
||||
if(elemUp1 != "")
|
||||
xmlWriter.writeEndElement(); // Закрываем тег
|
||||
|
||||
if(elemUp1 != "")
|
||||
xmlWriter.writeEndElement(); // Закрываем тег
|
||||
|
||||
/* Завершаем запись в документ*/
|
||||
xmlWriter.writeEndDocument();
|
||||
|
||||
file.close(); // Закрываем файл
|
||||
|
||||
QByteArray array;
|
||||
|
||||
/* Открываем файл для Чтения*/
|
||||
QFile fileR(tempFile);
|
||||
if (!fileR.open(QFile::ReadOnly | QFile::Text))
|
||||
{
|
||||
QString str = "Не удалось открыть файл";
|
||||
qDebug() << "xmlAnswer: " << str;
|
||||
}
|
||||
else
|
||||
{
|
||||
array = fileR.readAll();
|
||||
fileR.close(); // Закрываем файл
|
||||
}
|
||||
mutex->unlock();
|
||||
|
||||
return array;
|
||||
}
|
||||
catch(const std::exception& e)
|
||||
|
||||
{
|
||||
qDebug() << e.what();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
QByteArray DataParser::xmlAnswer_authorization(bool result, QString instructorName,QString clientName, QString accessType, QString login)
|
||||
{
|
||||
|
||||
QList<SXmlAnswerTag> listTag;
|
||||
|
||||
SAttribute attribute1 = {"Result", result? "true" : "false"};
|
||||
SAttribute attribute2 = {"InstructorName", instructorName};
|
||||
SAttribute attribute3 = {"ClientName", clientName};
|
||||
SAttribute attribute4 = {"AccessType", accessType};
|
||||
SAttribute attribute5 = {"Login", login};
|
||||
QList<SAttribute> listAttr = {attribute1, attribute2, attribute3, attribute4, attribute5};
|
||||
SXmlAnswerTag tag = {"ServerAuthorization", listAttr};
|
||||
|
||||
listTag.append(tag);
|
||||
|
||||
return xmlAnswer(listTag);
|
||||
}
|
||||
|
||||
QByteArray DataParser::xmlAnswer_deAuthorization(bool result, QString login)
|
||||
{
|
||||
QList<SXmlAnswerTag> listTag;
|
||||
|
||||
SAttribute attribute1 = {"Result", result? "true" : "false"};
|
||||
SAttribute attribute2 = {"Login", login};
|
||||
QList<SAttribute> listAttr = {attribute1, attribute2};
|
||||
SXmlAnswerTag tag = {"ServerDeAuthorization", listAttr};
|
||||
|
||||
listTag.append(tag);
|
||||
|
||||
return xmlAnswer(listTag);
|
||||
}
|
||||
|
||||
bool DataParser::loadBlankXML(QString nameFile, QDomDocument *commonDOM)
|
||||
{
|
||||
QFile blankFile(nameFile);
|
||||
|
||||
if (! blankFile.open(QFile::ReadOnly | QFile::Text)) {
|
||||
qDebug() << "loadBlankXML: Couldn't read the file: " + nameFile;
|
||||
return false;
|
||||
}
|
||||
|
||||
commonDOM->setContent(blankFile.readAll());
|
||||
blankFile.close();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool DataParser::saveDOMtoXML(QString nameFile, QDomDocument *commonDOM)
|
||||
{
|
||||
QFile xmlOutFile(nameFile);
|
||||
if (!xmlOutFile.open(QFile::WriteOnly | QFile::Text))
|
||||
{
|
||||
qDebug() << "saveDOMtoXML: Failed to write a file: " + nameFile;
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
QTextStream outFile(&xmlOutFile);
|
||||
commonDOM->save(outFile, 4);
|
||||
xmlOutFile.close();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
QByteArray DataParser::xmlAnswer_ClientQueryToDB_ListInstructors(bool result, QList<Instructor> *listInstructors)
|
||||
{
|
||||
QDomDocument commonDOM;
|
||||
if(! loadBlankXML(":/resources/blankXML/ListInstructors.xml", &commonDOM))
|
||||
return QByteArray();
|
||||
|
||||
QDomNode listNode = commonDOM.namedItem("ListInstructors");
|
||||
|
||||
for(Instructor instructor : *listInstructors)
|
||||
{
|
||||
//Инструктор
|
||||
QDomNode instructorNode = commonDOM.createElement("Instructor");
|
||||
listNode.appendChild(instructorNode);
|
||||
instructorNode.toElement().setAttribute("instructor_id", QString::number(instructor.getID()));
|
||||
instructorNode.toElement().setAttribute("name", instructor.getName());
|
||||
instructorNode.toElement().setAttribute("login", instructor.getLogin());
|
||||
instructorNode.toElement().setAttribute("password", instructor.getPassword());
|
||||
instructorNode.toElement().setAttribute("is_admin", instructor.getIsAdmin());
|
||||
instructorNode.toElement().setAttribute("archived", instructor.getArchived());
|
||||
instructorNode.toElement().setAttribute("logged_in", instructor.getLoggedIn());
|
||||
}
|
||||
|
||||
saveDOMtoXML("ListInstructors.xml", &commonDOM);
|
||||
|
||||
return commonDOM.toByteArray();
|
||||
}
|
||||
|
||||
QByteArray DataParser::xmlAnswer_ClientQueryToDB_ListGroups(bool result, QList<Group> *listGroups)
|
||||
{
|
||||
QDomDocument commonDOM;
|
||||
if(! loadBlankXML(":/resources/blankXML/ListGroups.xml", &commonDOM))
|
||||
return QByteArray();
|
||||
|
||||
QDomNode listNode = commonDOM.namedItem("ListGroups");
|
||||
|
||||
for(Group group : *listGroups)
|
||||
{
|
||||
//Группа
|
||||
QDomNode groupNode = commonDOM.createElement("Group");
|
||||
listNode.appendChild(groupNode);
|
||||
groupNode.toElement().setAttribute("group_id", QString::number(group.getID()));
|
||||
groupNode.toElement().setAttribute("name", group.getName());
|
||||
}
|
||||
|
||||
saveDOMtoXML("ListGroups.xml", &commonDOM);
|
||||
|
||||
return commonDOM.toByteArray();
|
||||
}
|
||||
|
||||
QByteArray DataParser::xmlAnswer_ClientQueryToDB_ListTrainees(bool result, QList<Trainee> *listTrainees)
|
||||
{
|
||||
QDomDocument commonDOM;
|
||||
if(! loadBlankXML(":/resources/blankXML/ListTrainees.xml", &commonDOM))
|
||||
return QByteArray();
|
||||
|
||||
QDomNode listNode = commonDOM.namedItem("ListTrainees");
|
||||
|
||||
for(Trainee trainee : *listTrainees)
|
||||
{
|
||||
//Обучаемый
|
||||
QDomNode traineeNode = commonDOM.createElement("Trainee");
|
||||
listNode.appendChild(traineeNode);
|
||||
traineeNode.toElement().setAttribute("trainee_id", trainee.getID());
|
||||
traineeNode.toElement().setAttribute("name", trainee.getName());
|
||||
traineeNode.toElement().setAttribute("login", trainee.getLogin());
|
||||
traineeNode.toElement().setAttribute("password", trainee.getPassword());
|
||||
traineeNode.toElement().setAttribute("archived", trainee.getArchived());
|
||||
traineeNode.toElement().setAttribute("logged_in", trainee.getLoggedIn());
|
||||
traineeNode.toElement().setAttribute("group_trainee", trainee.getGroup().getID());
|
||||
traineeNode.toElement().setAttribute("computer_trainee", trainee.getComputer().getID());
|
||||
//trainee.setTasks()
|
||||
}
|
||||
|
||||
saveDOMtoXML("ListTrainees.xml", &commonDOM);
|
||||
|
||||
return commonDOM.toByteArray();
|
||||
}
|
||||
|
||||
QByteArray DataParser::xmlAnswer_ClientQueryToDB_ListComputers(bool result, QList<Computer> *listComputers)
|
||||
{
|
||||
//TODO
|
||||
return QByteArray();
|
||||
}
|
||||
|
||||
QByteArray DataParser::xmlAnswer_ClientQueryToDB_ListClassrooms(bool result, QList<Classroom> *listClassrooms)
|
||||
{
|
||||
//TODO
|
||||
return QByteArray();
|
||||
}
|
||||
|
||||
QByteArray DataParser::xmlAnswer_ClientQueryToDB_ListTasks(bool result, QList<Task> *listTasks)
|
||||
{
|
||||
//TODO
|
||||
return QByteArray();
|
||||
}
|
||||
|
||||
QByteArray DataParser::xmlAnswer_message(QString text, QString login)
|
||||
{
|
||||
QList<SXmlAnswerTag> listTag;
|
||||
SAttribute attribute2;
|
||||
|
||||
SAttribute attribute1 = {"Text", text};
|
||||
QList<SAttribute> listAttr = {attribute1};
|
||||
if(login != "")
|
||||
{
|
||||
attribute2 = {"Login", login};
|
||||
listAttr.append(attribute2);
|
||||
}
|
||||
SXmlAnswerTag tag = {"ServerMessage", listAttr};
|
||||
|
||||
listTag.append(tag);
|
||||
|
||||
return xmlAnswer(listTag);
|
||||
}
|
||||
|
||||
QByteArray DataParser::xmlAnswer_task(QString text)
|
||||
{
|
||||
QList<SXmlAnswerTag> listTag;
|
||||
|
||||
SAttribute attribute1 = {"Text", text};
|
||||
QList<SAttribute> listAttr = {attribute1};
|
||||
SXmlAnswerTag tag = {"ServerTask", listAttr};
|
||||
|
||||
listTag.append(tag);
|
||||
|
||||
return xmlAnswer(listTag);
|
||||
}
|
||||
|
||||
QByteArray DataParser::xmlAnswer_notify(QString code)
|
||||
{
|
||||
QList<SXmlAnswerTag> listTag;
|
||||
|
||||
SAttribute attribute1 = {"Code", code};
|
||||
QList<SAttribute> listAttr = {attribute1};
|
||||
SXmlAnswerTag tag = {"ServerNotify", listAttr};
|
||||
|
||||
listTag.append(tag);
|
||||
|
||||
return xmlAnswer(listTag);
|
||||
}
|
||||
|
||||
QByteArray DataParser::xmlAnswer_tasks(QStringList listTasks)
|
||||
{
|
||||
QList<SXmlAnswerTag> listTag;
|
||||
|
||||
foreach(QString task, listTasks)
|
||||
{
|
||||
QList<SAttribute> listAttr;
|
||||
|
||||
SAttribute attribute1 = {"Head", task};
|
||||
SAttribute attribute2 = {"IsComplete", "false"};
|
||||
listAttr.append(attribute1);
|
||||
listAttr.append(attribute2);
|
||||
|
||||
SXmlAnswerTag tag = {"ServerTask", listAttr};
|
||||
listTag.append(tag);
|
||||
}
|
||||
|
||||
return xmlAnswer(listTag, "TaskArray", "Tasks");
|
||||
}
|
||||
|
||||
DataInfo *DataParser::getCurrentDataInfo()
|
||||
{
|
||||
return dataInfo;
|
||||
}
|
||||
|
||||
void DataParser::clearCurrentDataInfo()
|
||||
{
|
||||
delete dataInfo;
|
||||
}
|
||||
|
||||
QList<FileData> *DataParser::getDatas() const
|
||||
{
|
||||
return datas;
|
||||
}
|
||||
|
||||
DataParser::~DataParser()
|
||||
{
|
||||
|
||||
}
|
||||
@@ -1,62 +0,0 @@
|
||||
#ifndef DATAPARSER_H
|
||||
#define DATAPARSER_H
|
||||
|
||||
|
||||
#include "Systems/processingsystem.h"
|
||||
#include "Systems/tools.h"
|
||||
#include "logger.h"
|
||||
#include "serverlmswidget.h"
|
||||
#include "typesDataServerClient.h"
|
||||
|
||||
#include <QByteArray>
|
||||
#include <QXmlStreamReader>
|
||||
#include <QDebug>
|
||||
#include <QDomDocument>
|
||||
|
||||
class ProcessingSystem;
|
||||
class ClientHandler;
|
||||
|
||||
class DataParser : public QObject
|
||||
{
|
||||
|
||||
Q_OBJECT
|
||||
public:
|
||||
DataParser(ProcessingSystem *processingSystem,QObject* parent = nullptr);
|
||||
void xmlParser(ClientHandler *client, QByteArray array);
|
||||
void xmlFileDataParse(QByteArray array);
|
||||
|
||||
QByteArray xmlAnswer(QList<SXmlAnswerTag> listTag,QString elemUp1 = "", QString elemUp2 = "");
|
||||
QByteArray xmlAnswer_authorization(bool result, QString instructorName, QString clientName, QString accessType, QString login);
|
||||
QByteArray xmlAnswer_deAuthorization(bool result, QString login);
|
||||
|
||||
bool loadBlankXML(QString nameFile, QDomDocument* commonDOM);
|
||||
bool saveDOMtoXML(QString nameFile, QDomDocument* commonDOM);
|
||||
QByteArray xmlAnswer_ClientQueryToDB_ListInstructors(bool result, QList<Instructor>* listInstructors);
|
||||
QByteArray xmlAnswer_ClientQueryToDB_ListGroups(bool result, QList<Group> *listGroups);
|
||||
QByteArray xmlAnswer_ClientQueryToDB_ListTrainees(bool result, QList<Trainee> *listTrainees);
|
||||
QByteArray xmlAnswer_ClientQueryToDB_ListComputers(bool result, QList<Computer> *listComputers);
|
||||
QByteArray xmlAnswer_ClientQueryToDB_ListClassrooms(bool result, QList<Classroom> *listClassrooms);
|
||||
QByteArray xmlAnswer_ClientQueryToDB_ListTasks(bool result, QList<Task> *listTasks);
|
||||
|
||||
QByteArray xmlAnswer_message(QString text, QString login = "");
|
||||
QByteArray xmlAnswer_task(QString text);
|
||||
QByteArray xmlAnswer_notify(QString code);
|
||||
QByteArray xmlAnswer_tasks(QStringList listTasks);
|
||||
DataInfo *getCurrentDataInfo();
|
||||
void clearCurrentDataInfo();
|
||||
~DataParser();
|
||||
|
||||
QList<FileData> *getDatas() const;
|
||||
|
||||
|
||||
signals:
|
||||
void sigLogMessage(QString log);
|
||||
|
||||
private:
|
||||
QMutex *mutex;
|
||||
QList<FileData> *datas;
|
||||
ProcessingSystem *processingSystem;
|
||||
DataInfo *dataInfo;
|
||||
};
|
||||
|
||||
#endif // DATAPARSER_H
|
||||
@@ -8,17 +8,24 @@ ProcessingSystem::ProcessingSystem(ProviderDBLMS* providerDBLMS, QObject *parent
|
||||
this->providerDBLMS = providerDBLMS;
|
||||
}
|
||||
|
||||
void ProcessingSystem::initialize(DataParser *dataParser, ServerLMSWidget *server)
|
||||
void ProcessingSystem::initialize(ServerLMSWidget *server, DataParser *dataParser, CommonClientHandler *commonClientHandler,Logger *logger)
|
||||
{
|
||||
this->server = server;
|
||||
this->commonClientServer = commonClientHandler;
|
||||
this->dataParser = dataParser;
|
||||
this->server = server;
|
||||
|
||||
connect(this,&ProcessingSystem::sigAuthChanged,commonClientHandler, &CommonClientHandler::slot_AuthChanged,Qt::AutoConnection);
|
||||
connect(this,&ProcessingSystem::sigUpdateListClients,server, &ServerLMSWidget::slotUpdateListClients,Qt::AutoConnection);
|
||||
connect(this,&ProcessingSystem::signal_msgToClientReady,commonClientHandler, &CommonClientHandler::slot_msgToClientFromGUI);
|
||||
connect(this,&ProcessingSystem::signal_msgFromClientReady,commonClientHandler, &CommonClientHandler::slot_msgToGUIfromClient);
|
||||
connect(this,&ProcessingSystem::sigLogMessage,logger,&Logger::addTextToLogger,Qt::QueuedConnection);
|
||||
}
|
||||
|
||||
void ProcessingSystem::processingClientAutorization(ClientHandler *client, ClientAutorization clientAutorization)
|
||||
{
|
||||
if(server->getStateBlockAutorization() == blocked)
|
||||
{
|
||||
QByteArray arrayAnswer = dataParser->xmlAnswer_notify(NOTIFY_SERVER_BLOCKED);
|
||||
QByteArray arrayAnswer = dataParser->ClientAnswer()->notify(NOTIFY_SERVER_BLOCKED);
|
||||
client->sendXmlAnswer(arrayAnswer);
|
||||
|
||||
QString str = QString(arrayAnswer);
|
||||
@@ -42,7 +49,7 @@ void ProcessingSystem::processingClientAutorization(ClientHandler *client, Clien
|
||||
instructorName = providerDBLMS->getMainInstructorName();
|
||||
traineeName = providerDBLMS->getNameTraineeByLogin(clientAutorization.Login);
|
||||
|
||||
arrayAnswer = dataParser->xmlAnswer_authorization(true, instructorName, traineeName, "trainee", clientAutorization.Login);
|
||||
arrayAnswer = dataParser->ClientAnswer()->authorization(true, instructorName, traineeName, "trainee", clientAutorization.Login);
|
||||
}
|
||||
else if(providerDBLMS->authorizationInstructor(clientAutorization.Login, clientAutorization.Password))
|
||||
{//Авторизуется инструктор
|
||||
@@ -53,13 +60,14 @@ void ProcessingSystem::processingClientAutorization(ClientHandler *client, Clien
|
||||
|
||||
instructorName = providerDBLMS->getNameInstructorByLogin(clientAutorization.Login);
|
||||
|
||||
arrayAnswer = dataParser->xmlAnswer_authorization(true, instructorName, instructorName, "instructor", clientAutorization.Login);
|
||||
arrayAnswer = dataParser->ClientAnswer()->authorization(true, instructorName, instructorName, "instructor", clientAutorization.Login);
|
||||
}
|
||||
else
|
||||
{//Никто не авторизовался
|
||||
arrayAnswer = dataParser->xmlAnswer_authorization(false, "", "", "", "");
|
||||
arrayAnswer = dataParser->ClientAnswer()->authorization(false, "", "", "", "");
|
||||
}
|
||||
client->sendXmlAnswer(arrayAnswer);
|
||||
client->sendVersion();
|
||||
|
||||
QString str = QString(arrayAnswer);
|
||||
//logger->addTextToLogger("To Client: " + str);
|
||||
@@ -72,7 +80,7 @@ void ProcessingSystem::processingClientDeAutorization(ClientHandler *client, Cli
|
||||
{
|
||||
if(server->getStateBlockAutorization() == blocked)
|
||||
{
|
||||
QByteArray arrayAnswer = dataParser->xmlAnswer_notify(NOTIFY_SERVER_BLOCKED);
|
||||
QByteArray arrayAnswer = dataParser->ClientAnswer()->notify(NOTIFY_SERVER_BLOCKED);
|
||||
client->sendXmlAnswer(arrayAnswer);
|
||||
|
||||
QString str = QString(arrayAnswer);
|
||||
@@ -90,7 +98,7 @@ void ProcessingSystem::processingClientDeAutorization(ClientHandler *client, Cli
|
||||
client->getClient()->setLogin("");
|
||||
emit sigUpdateListClients();
|
||||
|
||||
arrayAnswer = dataParser->xmlAnswer_deAuthorization(true, clientDeAutorization.Login);
|
||||
arrayAnswer = dataParser->ClientAnswer()->deAuthorization(true, clientDeAutorization.Login);
|
||||
}
|
||||
else if(providerDBLMS->deAuthorizationInstructor(clientDeAutorization.Login))
|
||||
{//ДеАвторизуется инструктор
|
||||
@@ -98,11 +106,11 @@ void ProcessingSystem::processingClientDeAutorization(ClientHandler *client, Cli
|
||||
client->getClient()->setLogin("");
|
||||
emit sigUpdateListClients();
|
||||
|
||||
arrayAnswer = dataParser->xmlAnswer_deAuthorization(true, clientDeAutorization.Login);
|
||||
arrayAnswer = dataParser->ClientAnswer()->deAuthorization(true, clientDeAutorization.Login);
|
||||
}
|
||||
else
|
||||
{//Никто не ДеАвторизовался
|
||||
arrayAnswer = dataParser->xmlAnswer_deAuthorization(false, "");
|
||||
arrayAnswer = dataParser->ClientAnswer()->deAuthorization(false, "");
|
||||
}
|
||||
client->sendXmlAnswer(arrayAnswer);
|
||||
|
||||
@@ -117,6 +125,7 @@ void ProcessingSystem::processingClientQueryToDB(ClientHandler *client, ClientQu
|
||||
{
|
||||
QByteArray arrayAnswer;
|
||||
|
||||
qDebug() << "ProcessingQueryThread " << QThread::currentThreadId();
|
||||
switch (clientQueryToDB.typeQuery)
|
||||
{
|
||||
case TypeQueryToDB::TYPE_QUERY_GET_ALL_LISTS:
|
||||
@@ -125,13 +134,13 @@ void ProcessingSystem::processingClientQueryToDB(ClientHandler *client, ClientQu
|
||||
QList<Trainee> listTrainees = providerDBLMS->GetListAllTrainees();
|
||||
QList<Group> listGroups = providerDBLMS->GetListAllGroups();
|
||||
|
||||
arrayAnswer = dataParser->xmlAnswer_ClientQueryToDB_ListInstructors(true, &listInstructors);
|
||||
arrayAnswer = dataParser->DbAnswer()->listInstructors(true, &listInstructors);
|
||||
client->sendXmlAnswer(arrayAnswer, PacketType::TYPE_XMLANSWER_QUERY_DB__LIST_INSTRUCTORS);
|
||||
|
||||
arrayAnswer = dataParser->xmlAnswer_ClientQueryToDB_ListGroups(true, &listGroups);
|
||||
arrayAnswer = dataParser->DbAnswer()->listGroups(true, &listGroups);
|
||||
client->sendXmlAnswer(arrayAnswer, PacketType::TYPE_XMLANSWER_QUERY_DB__LIST_GROUPS);
|
||||
|
||||
arrayAnswer = dataParser->xmlAnswer_ClientQueryToDB_ListTrainees(true, &listTrainees);
|
||||
arrayAnswer = dataParser->DbAnswer()->listTrainees(true, &listTrainees);
|
||||
client->sendXmlAnswer(arrayAnswer, PacketType::TYPE_XMLANSWER_QUERY_DB__LIST_TRAINEES);
|
||||
break;
|
||||
}
|
||||
@@ -238,7 +247,7 @@ void ProcessingSystem::processingFromClientMessage(ClientHandler *client, Client
|
||||
|
||||
void ProcessingSystem::processingClientNotify(ClientHandler *client, ClientNotify clientNotify)
|
||||
{
|
||||
if(clientNotify.Code == "READY")
|
||||
if(clientNotify.Code == commandReadyClient)
|
||||
{//Клиент готов принять задания
|
||||
client->getClient()->setReady(true); //скорее всего функции будут внутри хэндлера
|
||||
|
||||
@@ -250,21 +259,25 @@ void ProcessingSystem::processingClientNotify(ClientHandler *client, ClientNotif
|
||||
//TODO KAV redact
|
||||
//listTasks = pInstructorsAndTrainees->getDbLMS()->getWhatItDoes(client->getClient()->getLogin());
|
||||
|
||||
QByteArray arrayAnswer = dataParser->xmlAnswer_tasks(listTasks);
|
||||
QByteArray arrayAnswer = dataParser->ClientAnswer()->tasks(listTasks);
|
||||
client->sendXmlAnswer(arrayAnswer);
|
||||
|
||||
QString str = QString(arrayAnswer);
|
||||
emit sigLogMessage("To Client: " + str);
|
||||
}
|
||||
else if(clientNotify.Code == "DISABLE")
|
||||
else if(clientNotify.Code == commandDisableClient)
|
||||
{
|
||||
qDebug() << "processing thread: " << QThread::currentThreadId();
|
||||
client->sendDisable();
|
||||
//server->slotDisconnectClient(client->getClient()->getAddress(),client->getClient()->getPort());
|
||||
}
|
||||
else if(clientNotify.Code == "GETSERVERDATALIST")
|
||||
else if(clientNotify.Code == commandGetServerDataList)
|
||||
{
|
||||
client->sendHash();
|
||||
}
|
||||
else if(clientNotify.Code == commandCheckVersionList)
|
||||
{
|
||||
client->sendVersionList();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
#ifndef PROCESSINGSYSTEM_H
|
||||
#define PROCESSINGSYSTEM_H
|
||||
|
||||
#include "sendsystem.h"
|
||||
#include "typesDataServerClient.h"
|
||||
#include <Systems/sendsystem.h>
|
||||
#include <Data/typesDataServerClient.h>
|
||||
|
||||
#include <clienthandler.h>
|
||||
#include <serverlmswidget.h>
|
||||
@@ -15,6 +15,7 @@ class InstructorsAndTrainees;
|
||||
class Logger;
|
||||
class DataParser;
|
||||
class ClientHandler;
|
||||
class CommonClientHandler;
|
||||
|
||||
class ProcessingSystem : public QObject
|
||||
{
|
||||
@@ -22,7 +23,7 @@ class ProcessingSystem : public QObject
|
||||
public:
|
||||
explicit ProcessingSystem(ProviderDBLMS* providerDBLMS, QObject *parent = nullptr);
|
||||
|
||||
void initialize(DataParser* dataParser,ServerLMSWidget *server);
|
||||
void initialize(ServerLMSWidget *server,DataParser* dataParser,CommonClientHandler *commonClientServer,Logger *logger);
|
||||
void processingClientAutorization(ClientHandler *client, ClientAutorization clientAutorization);
|
||||
void processingClientDeAutorization(ClientHandler *client, ClientDeAutorization clientDeAutorization);
|
||||
void processingClientQueryToDB(ClientHandler *client, ClientQueryToDB clientQueryToDB, int id = 0, void* data = nullptr);
|
||||
@@ -40,6 +41,7 @@ signals:
|
||||
void signal_msgFromClientReady(QString login, QString text);
|
||||
|
||||
private:
|
||||
CommonClientHandler *commonClientServer;
|
||||
ServerLMSWidget *server;
|
||||
DataParser *dataParser;
|
||||
//InstructorsAndTraineesWidget *pInstructorsAndTrainees;
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
#include "Client.h"
|
||||
#include "recognizesystem.h"
|
||||
|
||||
RecognizeSystem::RecognizeSystem(QObject *parent):
|
||||
@@ -24,8 +23,13 @@ void RecognizeSystem::initialize(UpdateController *updateController,DataParser*
|
||||
this->sendSystem = sendSystem;
|
||||
socket = handler->getSocket();
|
||||
|
||||
connect(this,&RecognizeSystem::sigCalculateHash,updateController,&UpdateController::calculateHash,Qt::DirectConnection);
|
||||
connect(this,&RecognizeSystem::sigXmlParser,dataParser,&DataParser::xmlParser,Qt::DirectConnection);
|
||||
connect(this,&RecognizeSystem::sigCalculateHash,updateController,&UpdateController::calculateFullHash,Qt::AutoConnection);
|
||||
connect(this,&RecognizeSystem::sigCalculateHash,updateController,&UpdateController::setUpCurrentServerHash,Qt::AutoConnection);
|
||||
connect(this,&RecognizeSystem::sigChangeVersion,updateController,&UpdateController::changeAssetVersion,Qt::AutoConnection);
|
||||
connect(this,&RecognizeSystem::sigDeleteVersion,updateController,&UpdateController::deleteAssetVersion,Qt::AutoConnection);
|
||||
connect(this,&RecognizeSystem::sigCopyVersion,updateController,&UpdateController::createCopyVersion,Qt::AutoConnection);
|
||||
connect(this,&RecognizeSystem::sigXmlParser,dataParser->getProcessParser(),&ProcessParser::read,Qt::DirectConnection);
|
||||
|
||||
qDebug() << "Recognize init thread ID " << QThread::currentThreadId();
|
||||
}
|
||||
|
||||
@@ -75,7 +79,7 @@ void RecognizeSystem::recognize()
|
||||
|
||||
}
|
||||
|
||||
if (packetType == PacketType::TYPE_COMMAND)
|
||||
if (packetType == PacketType::TYPE_COMMAND) //TODO: надо переделать под какой то нормальный тип, который уже существует
|
||||
{
|
||||
stream.startTransaction();
|
||||
stream >> command;
|
||||
@@ -83,7 +87,7 @@ void RecognizeSystem::recognize()
|
||||
if (!stream.commitTransaction()) continue;
|
||||
}
|
||||
|
||||
if (command == "update") //запускает процесс оновления
|
||||
if (command == commandUpdateFilesClient) //запускает процесс оновления
|
||||
{
|
||||
sendSystem->updateFiles(updateController->getFileSendList(),
|
||||
updateController->getClientDataList());
|
||||
@@ -110,18 +114,16 @@ void RecognizeSystem::recognize()
|
||||
|
||||
qDebug() << data;
|
||||
emit sigXmlParser(clientHandler,data);
|
||||
//dataParser->xmlParser(clientHandler,data);
|
||||
packetType = PacketType::TYPE_NONE;
|
||||
continue;
|
||||
}
|
||||
|
||||
if(packetType == PacketType::TYPE_FOLDER) //создание папок
|
||||
|
||||
{
|
||||
if(client->getIsUnity())
|
||||
{
|
||||
filePath = socket->readAll();
|
||||
filePath = Tools::createRootScenario(filePath);
|
||||
filePath = Tools::createSharedPath(filePath);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -152,14 +154,9 @@ void RecognizeSystem::recognize()
|
||||
|
||||
if(client->getIsUnity())
|
||||
{
|
||||
DataInfo *currentFileData = dataParser->getCurrentDataInfo();
|
||||
DataInfo *currentFileData = updateController->getCurrentDataInfo();
|
||||
filePath = currentFileData->path;
|
||||
|
||||
filePath = Tools::createLocalPath(filePath);
|
||||
|
||||
filePath = Tools::createUpdateFilePath(filePath);
|
||||
|
||||
filePath = Tools::createRootScenario(filePath);
|
||||
filePath = Tools::createSharedPath(filePath);
|
||||
|
||||
QFile file(filePath);
|
||||
|
||||
@@ -212,7 +209,7 @@ void RecognizeSystem::recognize()
|
||||
|
||||
file.close();
|
||||
filePath.clear();
|
||||
dataParser->clearCurrentDataInfo();
|
||||
updateController->clearCurrentDataInfo();
|
||||
|
||||
socket->waitForReadyRead(100);
|
||||
|
||||
@@ -315,6 +312,69 @@ void RecognizeSystem::recognize()
|
||||
packetType = PacketType::TYPE_NONE;
|
||||
}
|
||||
|
||||
if(packetType == PacketType::CHANGE_DATA_VERSION)
|
||||
{
|
||||
stream.startTransaction();
|
||||
QString versionName;
|
||||
stream >> versionName;
|
||||
|
||||
if(!stream.commitTransaction()) continue;
|
||||
|
||||
qDebug() << "For change " + versionName;
|
||||
|
||||
emit sigChangeVersion(versionName);
|
||||
|
||||
}
|
||||
|
||||
if(packetType == PacketType::COPY_VERSION)
|
||||
{
|
||||
QString source;
|
||||
QStringList result;
|
||||
|
||||
stream.startTransaction();
|
||||
stream >> source;
|
||||
|
||||
if(!stream.commitTransaction()) continue;
|
||||
|
||||
result = source.split(";");
|
||||
|
||||
if (updateController->checkDuplicate(result[1]))
|
||||
{
|
||||
sendSystem->sendNotify(commandDuplicateVerName);
|
||||
packetType = PacketType::TYPE_NONE;
|
||||
break;
|
||||
}
|
||||
|
||||
emit sigCopyVersion(result[0],result[1]);
|
||||
sendSystem->sendPacketType(PacketType::BUSY);
|
||||
}
|
||||
|
||||
if(packetType == PacketType::DELETE_DATA_VERSION)
|
||||
{
|
||||
stream.startTransaction();
|
||||
QString versionName;
|
||||
stream >> versionName;
|
||||
|
||||
if(!stream.commitTransaction()) continue;
|
||||
|
||||
qDebug() << "For delete " + versionName;
|
||||
|
||||
|
||||
if (versionName == baseNameVersion)
|
||||
{
|
||||
sendSystem->sendNotify(commandTryBaseDelete);
|
||||
}
|
||||
else if (versionName == updateController->getCurrentVersionName())
|
||||
{
|
||||
sendSystem->sendNotify(commandTryActiveDelete);
|
||||
}
|
||||
else
|
||||
{
|
||||
emit sigDeleteVersion(versionName);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
packetType = PacketType::TYPE_NONE;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,16 +1,19 @@
|
||||
#ifndef RECOGNIZESYSTEM_H
|
||||
#define RECOGNIZESYSTEM_H
|
||||
|
||||
#include "client.h"
|
||||
#include "updatecontroller.h"
|
||||
|
||||
#include <QDataStream>
|
||||
#include <QTcpSocket>
|
||||
#include "Systems/tools.h"
|
||||
#include "Systems/dataparser.h"
|
||||
#include "serverlmswidget.h"
|
||||
#include <QMutex>
|
||||
|
||||
#include <Systems/updatecontroller.h>
|
||||
#include <Systems/tools.h>
|
||||
#include <Systems/Parsers/dataparser.h>
|
||||
|
||||
#include <Data/Client.h>
|
||||
#include <Data/PacketType.h>
|
||||
|
||||
#include "serverlmswidget.h"
|
||||
|
||||
class UpdateController;
|
||||
class ServerLMSWidget;
|
||||
class ClientHandler;
|
||||
@@ -31,6 +34,9 @@ signals:
|
||||
void sigCalculateHash();
|
||||
void sigSendToLogger(QString string);
|
||||
void sigXmlParser(ClientHandler *clientHandler,QByteArray data);
|
||||
void sigChangeVersion(QString versionName);
|
||||
void sigDeleteVersion(QString versionName);
|
||||
void sigCopyVersion(QString versionName,QString newVersionName);
|
||||
|
||||
private:
|
||||
UpdateController *updateController;
|
||||
|
||||
@@ -11,9 +11,10 @@ void SendSystem::initialize(DataParser *dataParser,Logger *logger)
|
||||
this->dataParser = dataParser;
|
||||
this->logger = logger;
|
||||
|
||||
connect(this,&SendSystem::sigSendToLogger,logger,&Logger::addTextToLogger);
|
||||
connect(this,&SendSystem::sigSendXMLmessage,dataParser,&DataParser::xmlAnswer_message,Qt::BlockingQueuedConnection);
|
||||
connect(this,&SendSystem::sigSendNotify,dataParser,&DataParser::xmlAnswer_notify,Qt::BlockingQueuedConnection);
|
||||
connect(this,&SendSystem::sigSendToLogger,logger,&Logger::addTextToLogger,Qt::AutoConnection);
|
||||
connect(this,&SendSystem::sigSendXMLmessage,dataParser->ClientAnswer(),&ClientAnswerParser::message,Qt::AutoConnection);
|
||||
connect(this,&SendSystem::sigSendNotify,dataParser->ClientAnswer(),&ClientAnswerParser::notify,Qt::DirectConnection); //потому что возвращает значение
|
||||
connect(this,&SendSystem::sigSendVersion,dataParser->ClientAnswer(),&ClientAnswerParser::currentVersion,Qt::AutoConnection);
|
||||
|
||||
qDebug() << "SendSystem thread: " << QThread::currentThreadId();
|
||||
}
|
||||
@@ -26,7 +27,6 @@ void SendSystem::setClient(Client *client,QTcpSocket *socket)
|
||||
isSendStopped = false;
|
||||
}
|
||||
|
||||
|
||||
void SendSystem::sendMessageBlock(QString message)
|
||||
{
|
||||
auto messageBlock = emit sigSendXMLmessage(message);
|
||||
@@ -41,7 +41,7 @@ void SendSystem::sendFileBlock(QString path)
|
||||
QDataStream stream(socket);
|
||||
stream.setVersion(QDataStream::Qt_DefaultCompiledVersion);
|
||||
|
||||
QFile file(Tools::createRootPath(path));
|
||||
QFile file(path);
|
||||
QFileInfo fileInfo(file);
|
||||
fileSize = fileInfo.size();
|
||||
|
||||
@@ -81,15 +81,10 @@ void SendSystem::sendFileBlock(QString path)
|
||||
socket->waitForReadyRead(100);
|
||||
}
|
||||
|
||||
void SendSystem::socketWrite(QByteArray array)
|
||||
void SendSystem::sendVersion()
|
||||
{
|
||||
socket->write(array);
|
||||
socket->waitForBytesWritten(100);
|
||||
}
|
||||
|
||||
void SendSystem::socketClose()
|
||||
{
|
||||
socket->close();
|
||||
QByteArray data = dataParser->ClientAnswer()->currentVersion();
|
||||
sendXmlAnswer(data);
|
||||
}
|
||||
|
||||
void SendSystem::sendFileBlockWithRename(QString path, QString newName)
|
||||
@@ -139,7 +134,7 @@ void SendSystem::sendFileBlockWithRename(QString path, QString newName)
|
||||
socket->waitForBytesWritten();
|
||||
socket->waitForReadyRead(100);
|
||||
|
||||
sendNotify("HASHSENDCOMPLETE");
|
||||
sendNotify(commandHashCompleteClient);
|
||||
}
|
||||
|
||||
void SendSystem::sendFolderBlock(QString path)
|
||||
@@ -162,19 +157,19 @@ void SendSystem::sendDeleteBlock(QString path)
|
||||
socket->waitForReadyRead(100);
|
||||
}
|
||||
|
||||
void SendSystem::sendHello()
|
||||
{
|
||||
socket->write(SERVER_HELLO);
|
||||
}
|
||||
|
||||
void SendSystem::sendFinish()
|
||||
void SendSystem::sendPacketType(PacketType packetType)
|
||||
{
|
||||
QDataStream stream(socket);
|
||||
stream.setVersion(QDataStream::Qt_DefaultCompiledVersion);
|
||||
stream << PacketType::TYPE_FINISH;
|
||||
stream << packetType;
|
||||
socket->waitForReadyRead(100);
|
||||
}
|
||||
|
||||
void SendSystem::sendHello()
|
||||
{
|
||||
socket->write(SERVER_HELLO);
|
||||
}
|
||||
|
||||
void SendSystem::sendNotify(QString notify)
|
||||
{
|
||||
qDebug() << "SendNotify thread: " << QThread::currentThreadId();
|
||||
@@ -202,7 +197,7 @@ void SendSystem::sendXmlAnswer(QByteArray array, PacketType packetType)
|
||||
socket->waitForReadyRead(1000);
|
||||
}
|
||||
|
||||
void SendSystem::sendNeedUpdate(bool flag,quint64 size,quint64 fileCount)
|
||||
void SendSystem::sendNeedUpdate(bool flag,quint64 size,quint64 fileCount,quint64 deleteCount)
|
||||
{
|
||||
QDataStream stream(socket);
|
||||
stream.setVersion(QDataStream::Qt_DefaultCompiledVersion);
|
||||
@@ -210,9 +205,20 @@ void SendSystem::sendNeedUpdate(bool flag,quint64 size,quint64 fileCount)
|
||||
stream << flag;
|
||||
stream << size;
|
||||
stream << fileCount;
|
||||
stream << deleteCount;
|
||||
}
|
||||
|
||||
void SendSystem::updateFiles(QList<FileData> fileSendList, QList<FileData> clientDataList){
|
||||
void SendSystem::updateFiles(QList<FileData> fileSendList, QList<FileData> deleteList){
|
||||
|
||||
QListIterator<FileData> clientIterator(deleteList);
|
||||
|
||||
while(clientIterator.hasNext())
|
||||
{
|
||||
FileData data = clientIterator.next();
|
||||
|
||||
sendDeleteBlock(data.path);
|
||||
if(getIsSendStopped()) return;
|
||||
}
|
||||
|
||||
QListIterator<FileData> serverIterator(fileSendList);
|
||||
|
||||
@@ -234,21 +240,28 @@ void SendSystem::updateFiles(QList<FileData> fileSendList, QList<FileData> clien
|
||||
if(getIsSendStopped()) return;
|
||||
}
|
||||
|
||||
QListIterator<FileData> clientIterator(clientDataList);
|
||||
|
||||
while(clientIterator.hasNext()){
|
||||
FileData data = clientIterator.next();
|
||||
|
||||
sendDeleteBlock(data.path);
|
||||
if(getIsSendStopped()) return;
|
||||
}
|
||||
|
||||
emit sigLoadHash();
|
||||
|
||||
sendFinish();
|
||||
sendPacketType(PacketType::TYPE_FINISH);
|
||||
}
|
||||
|
||||
void SendSystem::socketWrite(QByteArray array)
|
||||
{
|
||||
socket->write(array);
|
||||
socket->waitForBytesWritten(100);
|
||||
}
|
||||
|
||||
void SendSystem::socketClose()
|
||||
{
|
||||
socket->close();
|
||||
}
|
||||
|
||||
bool SendSystem::socketFlush() //TODO: проверить использование
|
||||
{
|
||||
return socket->flush();
|
||||
}
|
||||
|
||||
void SendSystem::sendStop()
|
||||
{
|
||||
|
||||
@@ -1,15 +1,18 @@
|
||||
#ifndef SENDSYSTEM_H
|
||||
#define SENDSYSTEM_H
|
||||
|
||||
#include "dataparser.h"
|
||||
#include "Systems/Tools.h"
|
||||
#include "Client.h"
|
||||
#include <QObject>
|
||||
#include <QString>
|
||||
#include <QtNetwork>
|
||||
|
||||
#include <Systems/Parsers/dataparser.h>
|
||||
#include <Systems/tools.h>
|
||||
#include <Data/Client.h>
|
||||
#include <Data/PacketType.h>
|
||||
|
||||
class DataParser;
|
||||
class FileData;
|
||||
|
||||
class SendSystem : public QObject
|
||||
{
|
||||
|
||||
@@ -24,13 +27,15 @@ public:
|
||||
void sendFileBlockWithRename(QString path,QString newName);
|
||||
void sendFolderBlock(QString path);
|
||||
void sendDeleteBlock(QString path);
|
||||
void sendPacketType(PacketType packet);
|
||||
void sendHello();
|
||||
void sendFinish();
|
||||
void sendNotify(QString notify);
|
||||
void sendStop();
|
||||
void sendXmlAnswer(QByteArray array, PacketType packetType = PacketType::TYPE_XMLANSWER);
|
||||
void sendNeedUpdate(bool flag,quint64 size,quint64 fileCount);
|
||||
void updateFiles(QList<FileData> fileSendList, QList<FileData> clientDataList);
|
||||
void sendNeedUpdate(bool flag,quint64 size,quint64 fileCount,quint64 deleteCount);
|
||||
void updateFiles(QList<FileData> fileSendList, QList<FileData> deleteList);
|
||||
bool socketFlush();
|
||||
|
||||
bool getIsSendStopped() const;
|
||||
|
||||
~SendSystem();
|
||||
@@ -39,11 +44,14 @@ public:
|
||||
public slots:
|
||||
void socketWrite(QByteArray array);
|
||||
void socketClose();
|
||||
void sendVersion();
|
||||
|
||||
signals:
|
||||
void sigLoadHash();
|
||||
void sigSendToLogger(QString message);
|
||||
QByteArray sigSendXMLmessage(QString message, QString login = "");
|
||||
QByteArray sigSendNotify(QString message);
|
||||
QByteArray sigSendVersion();
|
||||
|
||||
private:
|
||||
Client *client;
|
||||
|
||||
@@ -15,7 +15,6 @@ QString Tools::getTime()
|
||||
|
||||
QString Tools::createLocalPath(QString path)
|
||||
{
|
||||
//qDebug() << "Full path: " << path;
|
||||
qint8 pos = path.indexOf(applicationFolderName);
|
||||
|
||||
QString localPath = path.remove(0,--pos);
|
||||
@@ -29,10 +28,43 @@ QString Tools::createRootPath(QString path)
|
||||
return QDir::currentPath() + path;
|
||||
}
|
||||
|
||||
QString Tools::createRootScenario(QString path){
|
||||
return QDir::currentPath() + scenarioRootPath + path;
|
||||
QString Tools::createSharedPath(QString path){
|
||||
return QDir::currentPath()+ "/" + sharedDataFolderName + path;
|
||||
}
|
||||
|
||||
QString Tools::createRealPath(QString path,StreamingVersionData* currentVersionData)
|
||||
{
|
||||
QString resultPath;
|
||||
int index = path.indexOf(currentVersionData->getViewName());
|
||||
|
||||
if(index != -1)
|
||||
{
|
||||
resultPath = path.remove(0,index + currentVersionData->getViewName().length());
|
||||
resultPath.prepend(buildDataPath + streamingAssetsFolderName);
|
||||
}
|
||||
else
|
||||
{
|
||||
resultPath = Tools::createRootPath(path);
|
||||
}
|
||||
|
||||
return resultPath;
|
||||
}
|
||||
|
||||
QString Tools::createStreamingToRealPath(QString path,StreamingVersionData* streamingVersionData)
|
||||
{
|
||||
QString resultPath = path;
|
||||
int index = path.indexOf(streamingAssetsFolderName);
|
||||
|
||||
if(index != -1)
|
||||
{
|
||||
resultPath = path.remove(0,index + streamingAssetsFolderName.length());
|
||||
resultPath.prepend(QDir::currentPath() + "/" + sharedDataFolderName + "/" + streamingVersionData->getViewName());
|
||||
}
|
||||
|
||||
return resultPath;
|
||||
|
||||
|
||||
}
|
||||
|
||||
QString Tools::createUpdateFilePath(QString path)
|
||||
{
|
||||
@@ -53,3 +85,5 @@ QString Tools::createFolderPath(QString path)
|
||||
|
||||
return folderPath;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -8,42 +8,33 @@
|
||||
#include <QTime>
|
||||
#include <QDir>
|
||||
|
||||
#include <Data/StreamingVersionData.h>
|
||||
|
||||
#define TCP_READ_TIMEOUT 5000
|
||||
|
||||
static QString staticDataFolderName = "StaticData";
|
||||
static QString applicationFolderName = "Application";
|
||||
static QString streamingAssetsFolderName = "StreamingAssets";
|
||||
static QString tempFile = staticDataFolderName + "/save.xml";
|
||||
static QString hashFileName = staticDataFolderName + "/serverHash.xml";
|
||||
static QString scenarioRootPath = "\\Application\\RRJLoader\\RRJ_Data";
|
||||
static const QString staticDataFolderName = "StaticData";
|
||||
static const QString applicationFolderName = "Application";
|
||||
static const QString sharedDataFolderName = "SharedData";
|
||||
static const QString streamingAssetsFolderName = "StreamingAssets";
|
||||
static const QString tempFile = staticDataFolderName + "/save.xml";
|
||||
static const QString version = staticDataFolderName + "/version.xml";
|
||||
static const QString versionListFile = staticDataFolderName + "/versionList.xml";
|
||||
static const QString hashFileName = staticDataFolderName + "/serverHash.xml";
|
||||
static const QString buildHashName = staticDataFolderName + "/buildHash.xml";
|
||||
static const QString buildDataPath = "/Application/RRJLoader/RRJ_Data/";
|
||||
|
||||
enum PacketType
|
||||
{
|
||||
TYPE_NONE = 0,
|
||||
TYPE_UNITY = 1,
|
||||
TYPE_FILE = 2,
|
||||
TYPE_COMMAND =3,
|
||||
TYPE_FOLDER = 4,
|
||||
TYPE_DELETE = 5,
|
||||
TYPE_FINISH = 6,
|
||||
TYPE_NEEDUPDATE = 7,
|
||||
TYPE_XMLANSWER = 8,
|
||||
TYPE_QT = 9,
|
||||
TYPE_DISABLE = 11,
|
||||
TYPE_FILESIZE = 20,
|
||||
static const QString baseNameVersion = "base";//может вынести комманды куда нибудь?
|
||||
|
||||
TYPE_XMLANSWER_MESSAGE_FOR_GUI = 90,
|
||||
|
||||
//xml-ответы на запросы к БД
|
||||
TYPE_XMLANSWER_QUERY_DB__LIST_INSTRUCTORS = 100,
|
||||
TYPE_XMLANSWER_QUERY_DB__LIST_GROUPS = 101,
|
||||
TYPE_XMLANSWER_QUERY_DB__LIST_TRAINEES = 102,
|
||||
TYPE_XMLANSWER_QUERY_DB__LIST_COMPUTERS = 103,
|
||||
TYPE_XMLANSWER_QUERY_DB__LIST_CLASSROOMS = 104,
|
||||
TYPE_XMLANSWER_QUERY_DB__LIST_TASKS = 105
|
||||
};
|
||||
|
||||
Q_DECLARE_METATYPE(PacketType)
|
||||
static const QString commandTryBaseDelete = "BASEDELETETRY";
|
||||
static const QString commandTryActiveDelete = "TRYACTIVEDELETE";
|
||||
static const QString commandTryCopyWithSameNames = "SAMENAMES";
|
||||
static const QString commandGetServerDataList = "GETSERVERDATALIST";
|
||||
static const QString commandCheckVersionList = "CHECKVERSIONLIST";
|
||||
static const QString commandReadyClient = "READY";
|
||||
static const QString commandDisableClient = "DISABLE";
|
||||
static const QString commandDuplicateVerName = "DUPLICATEVERNAME";
|
||||
static const QString commandHashCompleteClient = "HASHSENDCOMPLETE";
|
||||
static const QString commandUpdateFilesClient = "update";
|
||||
|
||||
class Tools {
|
||||
public:
|
||||
@@ -53,7 +44,9 @@ public:
|
||||
static QString createRootPath(QString path);
|
||||
static QString createUpdateFilePath(QString path);
|
||||
static QString createFolderPath(QString path);
|
||||
static QString createRootScenario(QString path);
|
||||
static QString createSharedPath(QString path);
|
||||
static QString createRealPath(QString path,StreamingVersionData* currentVersionData);
|
||||
static QString createStreamingToRealPath(QString path, StreamingVersionData *streamingVersionData);
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -1,25 +1,56 @@
|
||||
#include "updatecontroller.h"
|
||||
|
||||
void UpdateController::initialize(TCPServer *server,DataParser *dataParser)
|
||||
UpdateController::UpdateController(QObject *parent) :
|
||||
QObject(parent),
|
||||
commonClientHandler(nullptr)
|
||||
{
|
||||
this->server = server;
|
||||
this->dataParser = dataParser;
|
||||
sizeToSend = 0;
|
||||
mutex = new QMutex;
|
||||
buildPath = QDir::currentPath() + "/" + applicationFolderName;
|
||||
sharedDataPath = QDir::currentPath() + "/" + sharedDataFolderName;
|
||||
emit sigLogMessage(buildPath);
|
||||
qDebug() << hashFileName;
|
||||
}
|
||||
|
||||
UpdateController::UpdateController(QObject *parent) : QObject(parent)
|
||||
void UpdateController::initialize(CommonClientHandler *commonClientHandler,DataParser *dataParser,AssetsManager *assetManager,Logger *logger)
|
||||
{
|
||||
sourcePath = QDir::currentPath() + "/" + applicationFolderName;
|
||||
emit sigLogMessage(sourcePath);
|
||||
qDebug() << hashFileName;
|
||||
this->commonClientHandler = commonClientHandler;
|
||||
this->dataParser = dataParser;
|
||||
this->assetManager = assetManager;
|
||||
|
||||
if(!QFile::exists(hashFileName)){
|
||||
calculateHash();
|
||||
}else{
|
||||
loadHash();
|
||||
}
|
||||
sizeToSend = 0;
|
||||
assetManager->initialize(this,dataParser);
|
||||
|
||||
connect(this,&UpdateController::sigLogMessage,logger,&Logger::addTextToLogger,Qt::AutoConnection);
|
||||
|
||||
calculateFullHash();
|
||||
currentStreamingPath = assetManager->setVersion("base");
|
||||
setUpCurrentServerHash();
|
||||
|
||||
mutex = new QMutex;
|
||||
qDebug() << "UpdateController init thread ID " << QThread::currentThreadId();
|
||||
}
|
||||
|
||||
void UpdateController::changeAssetVersion(QString versionName)
|
||||
{
|
||||
commonClientHandler->slot_sendPacketToAllClients(PacketType::BUSY);
|
||||
qDebug() << "UpdateController thread ID " << QThread::currentThreadId();
|
||||
currentStreamingPath = assetManager->setVersion(versionName);
|
||||
setUpCurrentServerHash();
|
||||
commonClientHandler->slot_sendPacketToAllClients(PacketType::HASH_READY);
|
||||
commonClientHandler->sendCurrentVersionToAllClient();
|
||||
|
||||
commonClientHandler->slot_sendPacketToAllClients(PacketType::FREE);
|
||||
}
|
||||
|
||||
void UpdateController::createCopyVersion(QString versionName,QString newVersionName)
|
||||
{
|
||||
commonClientHandler->slot_sendPacketToAllClients(PacketType::BUSY);
|
||||
assetManager->createCopyVersion(versionName,newVersionName);
|
||||
commonClientHandler->slot_sendPacketToAllClients(PacketType::FREE);
|
||||
}
|
||||
|
||||
void UpdateController::deleteAssetVersion(QString versionName)
|
||||
{
|
||||
assetManager->deleteVersion(versionName);
|
||||
}
|
||||
|
||||
void UpdateController::compareFiles(ClientHandler* handler, QByteArray array)
|
||||
@@ -27,18 +58,8 @@ void UpdateController::compareFiles(ClientHandler* handler, QByteArray array)
|
||||
mutex->lock();
|
||||
loadHash();
|
||||
clientDataList.clear();
|
||||
dataParser->xmlFileDataParse(array);
|
||||
clientDataList.append(*dataParser->getDatas());
|
||||
|
||||
//Вывод информации о доступных файлов/*
|
||||
// QListIterator<FileData> iterator(clientDataList);
|
||||
// while(iterator.hasNext()){
|
||||
// auto data = iterator.next();
|
||||
// emit sigLogMessage(data.path);
|
||||
// emit sigLogMessage(data.hash);
|
||||
// emit sigLogMessage("____________");
|
||||
// }*/
|
||||
|
||||
xmlFileDataParse(array);
|
||||
clientDataList.append(*datas);
|
||||
checkNeedUpdate(handler);
|
||||
mutex->unlock();
|
||||
}
|
||||
@@ -51,18 +72,30 @@ void UpdateController::showHash()
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateController::saveHash()
|
||||
void UpdateController::calculateFullHash()
|
||||
{
|
||||
QFile hashFile(hashFileName);
|
||||
commonClientHandler->slot_sendPacketToAllClients(PacketType::BUSY);
|
||||
auto *list = calculateHash(buildPath);
|
||||
saveHash(buildHashName,list);
|
||||
calculateSharedHash();
|
||||
emit sigLogMessage("Calculate hash complete");
|
||||
commonClientHandler->slot_sendPacketToAllClients(PacketType::FREE);
|
||||
}
|
||||
|
||||
void UpdateController::saveHash(QString fileName,QList<FileData> *fileList)
|
||||
{
|
||||
QFile hashFile(fileName);
|
||||
hashFile.open(QIODevice::WriteOnly);
|
||||
QXmlStreamWriter xmlWriter(&hashFile);
|
||||
QListIterator<FileData> fileDataIterator(*fileList);
|
||||
|
||||
xmlWriter.setAutoFormatting(true);
|
||||
xmlWriter.writeStartDocument();
|
||||
xmlWriter.writeStartElement("FileDataList");
|
||||
|
||||
foreach (FileData data,serverDataList)
|
||||
while (fileDataIterator.hasNext())
|
||||
{
|
||||
FileData data = fileDataIterator.next();
|
||||
xmlWriter.writeStartElement("FileData");
|
||||
|
||||
xmlWriter.writeAttribute("Path",data.path);
|
||||
@@ -124,7 +157,7 @@ void UpdateController::loadHash()
|
||||
|
||||
void UpdateController::calculateSize()
|
||||
{
|
||||
QDirIterator iterator(sourcePath);
|
||||
QDirIterator iterator(buildPath);
|
||||
quint64 total = 0;
|
||||
|
||||
while(iterator.hasNext()){
|
||||
@@ -149,6 +182,23 @@ QString UpdateController::getCommands()
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void UpdateController::setUpCurrentServerHash()
|
||||
{
|
||||
QList<FileData> *fileList = new QList<FileData>;
|
||||
fileList->append(*calculateHash(buildPath));
|
||||
fileList->append(*calculateHash(currentStreamingPath));
|
||||
assetManager->prepareLocalPathList(fileList);
|
||||
|
||||
saveHash(hashFileName,fileList);
|
||||
}
|
||||
|
||||
QString UpdateController::getCurrentStreamingPath() const
|
||||
{
|
||||
return currentStreamingPath;
|
||||
}
|
||||
|
||||
void UpdateController::setLocalFileData(QList<FileData> dataList)
|
||||
{
|
||||
serverDataList.append(dataList);
|
||||
@@ -184,32 +234,6 @@ bool UpdateController::checkNeedUpdate(ClientHandler *handler)
|
||||
forSend->append(item);
|
||||
}
|
||||
}
|
||||
// for (auto &item:clientDataList) //проверка на недостающие файлы по адресам
|
||||
// {
|
||||
// if (!serverDataList.contains(item))
|
||||
// {
|
||||
// serverDataList.removeOne(item);
|
||||
// clientDataList.removeOne(item);
|
||||
// }
|
||||
// }
|
||||
|
||||
// for (auto &item:clientDataList) //проверка на недостающие файлы по адресам
|
||||
// {
|
||||
// if(item.path.contains("Temp")){
|
||||
// clientDataList.removeOne(item);
|
||||
// }
|
||||
// }
|
||||
|
||||
// QListIterator<FileData> serverDiffIterator(serverDataList);
|
||||
|
||||
// while (serverDiffIterator.hasNext()) //добавление недостающих файлов в список для отправки
|
||||
// {
|
||||
// auto fileForUpdate = serverDiffIterator.next();
|
||||
|
||||
// if(fileForUpdate.path.contains("Temp")) continue;
|
||||
|
||||
// fileSendList.append(fileForUpdate);
|
||||
// }
|
||||
|
||||
if(forSend->length() > 0) //формирование сообщения об обновлении
|
||||
{
|
||||
@@ -220,7 +244,10 @@ bool UpdateController::checkNeedUpdate(ClientHandler *handler)
|
||||
log.append(QString::number(forSend->length()));
|
||||
log.append(" objects");
|
||||
fileSendList = *forSend;
|
||||
|
||||
emit sigLogMessage(log);
|
||||
//printFileList(*forSend);
|
||||
|
||||
handler->sendMessageBlock(log);
|
||||
needUpdate = true;
|
||||
}
|
||||
@@ -242,10 +269,10 @@ bool UpdateController::checkNeedUpdate(ClientHandler *handler)
|
||||
log.append(" Need delete: ");
|
||||
log.append(QString::number(forDelete->length()));
|
||||
log.append(" objects");
|
||||
//ОПАСНОСТЬ С РУКИ! УДАЛИТЬ И ПРИВЕСТИ В ПОРЯДОК
|
||||
clientDataList = *forDelete;
|
||||
//
|
||||
fileDeleteList = *forDelete;
|
||||
|
||||
emit sigLogMessage(log);
|
||||
//printFileList(*forDelete);
|
||||
handler->sendMessageBlock(log);
|
||||
needUpdate = true;
|
||||
}
|
||||
@@ -255,33 +282,27 @@ bool UpdateController::checkNeedUpdate(ClientHandler *handler)
|
||||
log.append(Tools::getTime());
|
||||
log.append(" Client: " + handler->getClient()->getLogin());
|
||||
log.append(" no delete required");
|
||||
|
||||
emit sigLogMessage(log);
|
||||
handler->sendMessageBlock(log);
|
||||
}
|
||||
|
||||
CalculateSizeToSend(*forSend);
|
||||
handler->sendNeedUpdate(needUpdate,sizeToSend,forSend->length());
|
||||
|
||||
handler->sendNeedUpdate(needUpdate,sizeToSend,forSend->length(),forDelete->length());
|
||||
return needUpdate;
|
||||
}
|
||||
|
||||
void UpdateController::calculateHash()
|
||||
QList<FileData>* UpdateController::calculateHash(QString path)
|
||||
{
|
||||
|
||||
QFile file(hashFileName);
|
||||
serverDataList.clear();
|
||||
|
||||
if(file.exists()){
|
||||
file.remove();
|
||||
QDirIterator iterator(path,QDirIterator::Subdirectories);
|
||||
if(!QDir(path).exists()){
|
||||
QDir().mkdir(path);
|
||||
}
|
||||
|
||||
QDirIterator iterator(sourcePath,QDirIterator::Subdirectories);
|
||||
|
||||
if(!QDir(applicationFolderName).exists()){
|
||||
QDir().mkdir(applicationFolderName);
|
||||
}
|
||||
|
||||
QDir dir(sourcePath);
|
||||
QDir dir(path);
|
||||
dir.setFilter(QDir::NoDotAndDotDot);
|
||||
QString hashString;
|
||||
QList<FileData> *files = new QList<FileData>;
|
||||
|
||||
@@ -323,21 +344,15 @@ void UpdateController::calculateHash()
|
||||
currentFile.hash = "FOLDER";
|
||||
currentFile.path = Tools::createLocalPath(fileInfo.path());
|
||||
|
||||
if(!folderDataList.contains(currentFile)){
|
||||
folderDataList.push_back(currentFile);
|
||||
if(!files->contains(currentFile)){
|
||||
files->push_back(currentFile);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
emit sigLogMessage("Calculate hash complete");
|
||||
serverDataList.append(folderDataList);
|
||||
std::sort(files->begin(),files->end());
|
||||
serverDataList.append(*files);
|
||||
|
||||
saveHash();
|
||||
|
||||
qDebug() << "Recalculate complete";
|
||||
delete files;
|
||||
return files;
|
||||
}
|
||||
|
||||
QByteArray UpdateController::getLocalHash()
|
||||
@@ -352,28 +367,191 @@ QByteArray UpdateController::getLocalHash()
|
||||
return array;
|
||||
}
|
||||
|
||||
QString UpdateController::getCurrentVersionName()
|
||||
{
|
||||
return assetManager->getCurrentVersionData()->getViewName();
|
||||
}
|
||||
|
||||
void UpdateController::CalculateSizeToSend(QList<FileData> diffList)
|
||||
{
|
||||
QListIterator<FileData> serverDiffIterator(diffList);
|
||||
|
||||
while (serverDiffIterator.hasNext()) //добавление недостающих файлов в список для отправки
|
||||
while (serverDiffIterator.hasNext())
|
||||
{
|
||||
auto pathForUpdate = serverDiffIterator.next();
|
||||
QString path = Tools::createRootPath(pathForUpdate.path);
|
||||
QString path;
|
||||
FileData pathForUpdate = serverDiffIterator.next();
|
||||
if(pathForUpdate.path.contains(streamingAssetsFolderName))
|
||||
{
|
||||
path = Tools::createStreamingToRealPath(pathForUpdate.path,assetManager->getCurrentVersionData());
|
||||
}
|
||||
else
|
||||
{
|
||||
path = Tools::createRootPath(pathForUpdate.path);
|
||||
}
|
||||
|
||||
QFile file(path);
|
||||
|
||||
sizeToSend += file.size();
|
||||
}
|
||||
}
|
||||
|
||||
UpdateController::~UpdateController()
|
||||
void UpdateController::calculateSharedHash()
|
||||
{
|
||||
QDir sharedDir(sharedDataPath);
|
||||
QDirIterator dirIterator(sharedDir);
|
||||
QList<FileData> *fileList = new QList<FileData>;
|
||||
QList<StreamingVersionData*> *versionList = new QList<StreamingVersionData*>;
|
||||
|
||||
while (dirIterator.hasNext())
|
||||
{
|
||||
dirIterator.next();
|
||||
QFileInfo fileInfo = dirIterator.fileInfo();
|
||||
if (fileInfo.fileName() == "." || fileInfo.fileName() == "..")
|
||||
continue;
|
||||
|
||||
QString fileName = staticDataFolderName + "/" + fileInfo.fileName() + "Hash.xml";
|
||||
|
||||
fileList = calculateHash(fileInfo.absoluteFilePath());
|
||||
saveHash(fileName,fileList);
|
||||
|
||||
StreamingVersionData *version = new StreamingVersionData(
|
||||
fileInfo.absoluteFilePath(),fileInfo.fileName(),
|
||||
fileInfo.birthTime(),fileInfo.size());
|
||||
|
||||
versionList->append(version);
|
||||
|
||||
}
|
||||
|
||||
createVersionListXmlAnswer(*versionList);
|
||||
assetManager->setVersionList(versionList);
|
||||
}
|
||||
|
||||
QList<FileData> UpdateController::getFileSendList() const
|
||||
void UpdateController::createVersionListXmlAnswer(QList<StreamingVersionData *> version) //TODO: переименовать и перебросить в AssetManager
|
||||
{
|
||||
return fileSendList;
|
||||
QList<SXmlAnswerTag> listTag;
|
||||
|
||||
foreach(StreamingVersionData* ver,version)
|
||||
{
|
||||
SAttribute attribute1 = {"Version", ver->getViewName()};
|
||||
SAttribute attribute2 = {"Created", ver->getCreateData().toString()};
|
||||
|
||||
QList<SAttribute> listAttr = {attribute1, attribute2};
|
||||
SXmlAnswerTag tag = {"VersionData", listAttr};
|
||||
|
||||
listTag.append(tag);
|
||||
}
|
||||
|
||||
|
||||
QFile file(versionListFile);
|
||||
file.open(QIODevice::WriteOnly);
|
||||
|
||||
QXmlStreamWriter xmlWriter(&file);
|
||||
xmlWriter.setAutoFormatting(true);
|
||||
xmlWriter.writeStartDocument();
|
||||
xmlWriter.writeStartElement("VersionList");
|
||||
|
||||
foreach(SXmlAnswerTag tag,listTag)
|
||||
{
|
||||
xmlWriter.writeStartElement(tag.elementName);
|
||||
|
||||
foreach(SAttribute attribute,tag.attr)
|
||||
{
|
||||
xmlWriter.writeAttribute(attribute.name,attribute.value);
|
||||
}
|
||||
|
||||
xmlWriter.writeEndElement();
|
||||
}
|
||||
|
||||
xmlWriter.writeEndElement();
|
||||
xmlWriter.writeEndDocument();
|
||||
file.close();
|
||||
}
|
||||
void UpdateController::saveVersionToFile(StreamingVersionData *streamingVersion) //TODO: переименовать и перебросить в AssetManager
|
||||
{
|
||||
QFile file(version);
|
||||
file.open(QFile::WriteOnly);
|
||||
|
||||
QXmlStreamWriter xmlWriter(&file);
|
||||
xmlWriter.setAutoFormatting(true);
|
||||
xmlWriter.writeStartDocument();
|
||||
|
||||
xmlWriter.writeStartElement("VersionData");
|
||||
xmlWriter.writeAttribute("Version",streamingVersion->getViewName());
|
||||
xmlWriter.writeAttribute("Created",streamingVersion->getCreateData().toString());
|
||||
|
||||
xmlWriter.writeEndElement();
|
||||
xmlWriter.writeEndDocument();
|
||||
|
||||
file.close();
|
||||
}
|
||||
|
||||
|
||||
void UpdateController::sendNewVersionList()
|
||||
{
|
||||
commonClientHandler->sendNewVersionListToAllClient();
|
||||
}
|
||||
|
||||
bool UpdateController::checkDuplicate(QString versionName)
|
||||
{
|
||||
return assetManager->findDuplicate(versionName);
|
||||
}
|
||||
|
||||
void UpdateController::xmlFileDataParse(QByteArray array)
|
||||
{
|
||||
QXmlStreamReader xmlReader(array);
|
||||
datas = new QList<FileData>;
|
||||
xmlReader.readNext();
|
||||
|
||||
//Крутимся в цикле до тех пор, пока не достигнем конца документа
|
||||
while(!xmlReader.atEnd())
|
||||
{
|
||||
//Проверяем, является ли элемент началом тега
|
||||
if(xmlReader.isStartElement())
|
||||
{
|
||||
if(xmlReader.name() == "FileData")
|
||||
{
|
||||
FileData data;
|
||||
|
||||
foreach(const QXmlStreamAttribute &attr,xmlReader.attributes())
|
||||
{
|
||||
QString name = attr.name().toString();
|
||||
QString value = attr.value().toString();
|
||||
|
||||
if(name == "Path")
|
||||
data.path = value;
|
||||
else if(name == "Hash")
|
||||
data.hash = value;
|
||||
}
|
||||
|
||||
datas->append(data);
|
||||
}
|
||||
}
|
||||
|
||||
xmlReader.readNext();
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateController::printFileList(QList<FileData> fileData)
|
||||
{
|
||||
QListIterator<FileData> iterator(fileData);
|
||||
|
||||
while (iterator.hasNext())
|
||||
{
|
||||
auto next = iterator.next();
|
||||
emit sigLogMessage(next.path);
|
||||
}
|
||||
}
|
||||
|
||||
QList<FileData> UpdateController::getFileDeleteList() const
|
||||
{
|
||||
return fileDeleteList;
|
||||
}
|
||||
|
||||
QList<FileData> UpdateController::getFileSendList()
|
||||
{
|
||||
|
||||
QList<FileData> sendList = *assetManager->prepareRealPathList(&fileSendList);
|
||||
return sendList;
|
||||
}
|
||||
|
||||
|
||||
@@ -382,3 +560,23 @@ QList<FileData> UpdateController::getClientDataList() const
|
||||
return clientDataList;
|
||||
}
|
||||
|
||||
DataInfo *UpdateController::getCurrentDataInfo()
|
||||
{
|
||||
return dataInfo;
|
||||
}
|
||||
|
||||
QList<FileData> *UpdateController::getDatas() const
|
||||
{
|
||||
return datas;
|
||||
}
|
||||
|
||||
void UpdateController::clearCurrentDataInfo()
|
||||
{
|
||||
delete dataInfo;
|
||||
}
|
||||
|
||||
UpdateController::~UpdateController()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -9,13 +9,19 @@
|
||||
#include <QDebug>
|
||||
#include <QDataStream>
|
||||
#include <QMutex>
|
||||
#include "Systems/dataparser.h"
|
||||
#include "typesDataServerClient.h"
|
||||
|
||||
#include <Systems/Parsers/dataparser.h>
|
||||
#include <Data/typesDataServerClient.h>
|
||||
#include <Data/StreamingVersionData.h>
|
||||
|
||||
class TCPServer;
|
||||
class SendSystem;
|
||||
class DataParser;
|
||||
class ClientHandler;
|
||||
class AssetsManager;
|
||||
class ServerLMSWidget;
|
||||
class CommonClientHandler;
|
||||
class Logger;
|
||||
|
||||
class UpdateController : public QObject
|
||||
{
|
||||
@@ -24,39 +30,66 @@ class UpdateController : public QObject
|
||||
public:
|
||||
|
||||
explicit UpdateController(QObject *parent = 0);
|
||||
void initialize(TCPServer* server,DataParser *dataParser);
|
||||
void initialize(CommonClientHandler* commonClientHandler,DataParser *dataParser,AssetsManager *assetManager,Logger *logger);
|
||||
void compareFiles(ClientHandler* handler, QByteArray array);
|
||||
void showHash();
|
||||
void calculateHash();
|
||||
void calculateFullHash();
|
||||
void calculateSharedHash();
|
||||
void sendNewVersionList();
|
||||
void setCurrentStreamingPath(QString path);
|
||||
bool checkDuplicate(QString versionName);
|
||||
QList<FileData>* calculateHash(QString path);
|
||||
QByteArray getLocalHash();
|
||||
|
||||
QList<FileData> getFileSendList() const;
|
||||
QString getCurrentVersionName();
|
||||
QList<FileData> getFileSendList();
|
||||
QList<FileData> getClientDataList() const;
|
||||
QList<FileData> getFileDeleteList() const;
|
||||
QString getCurrentStreamingPath() const;
|
||||
|
||||
~UpdateController();
|
||||
|
||||
DataInfo *getCurrentDataInfo();
|
||||
void clearCurrentDataInfo();
|
||||
QList<FileData> *getDatas() const;
|
||||
void createVersionListXmlAnswer(QList<StreamingVersionData *> version);
|
||||
void saveVersionToFile(StreamingVersionData *streamingVersion);
|
||||
void xmlFileDataParse(QByteArray array);
|
||||
public slots:
|
||||
void changeAssetVersion(QString versionName);
|
||||
void createCopyVersion(QString versionName,QString newVersionName);
|
||||
void deleteAssetVersion(QString versionName);
|
||||
void setUpCurrentServerHash();
|
||||
|
||||
signals:
|
||||
void sigLogMessage(QString message);
|
||||
|
||||
private:
|
||||
QList<FileData> clientDataList;
|
||||
QList<FileData> serverDataList;
|
||||
QList<FileData> folderDataList;
|
||||
|
||||
QList<FileData> fileSendList;
|
||||
QList<FileData> fileDeleteList;
|
||||
|
||||
QString sourcePath;
|
||||
TCPServer *server;
|
||||
QList<FileData> *datas;
|
||||
DataInfo *dataInfo;
|
||||
|
||||
QString buildPath;
|
||||
QString currentStreamingPath;
|
||||
QString sharedDataPath;
|
||||
CommonClientHandler *commonClientHandler;
|
||||
DataParser *dataParser;
|
||||
AssetsManager *assetManager;
|
||||
quint64 sizeToSend;
|
||||
QMutex *mutex;
|
||||
|
||||
QString getCommands();
|
||||
void printFileList(QList<FileData> fileData);
|
||||
|
||||
bool checkNeedUpdate(ClientHandler* handler);
|
||||
void setLocalFileData(QList<FileData> dataList);
|
||||
void calculateSize();
|
||||
void saveHash();
|
||||
void saveHash(QString fileName,QList<FileData> *fileList);
|
||||
void loadHash();
|
||||
void CalculateSizeToSend(QList<FileData> diffList);
|
||||
};
|
||||
|
||||
@@ -44,16 +44,19 @@ void ClientHandler::initialize(int descriptor,ServerLMSWidget *serverWidget,
|
||||
connect(this,&ClientHandler::sigFolderBlock,sendSystem,&SendSystem::sendFolderBlock,Qt::AutoConnection);
|
||||
connect(this,&ClientHandler::sigGetIsSendStopped,sendSystem,&SendSystem::getIsSendStopped,Qt::AutoConnection);
|
||||
connect(this,&ClientHandler::sigSendDeleteBlock,sendSystem,&SendSystem::sendDeleteBlock,Qt::AutoConnection);
|
||||
connect(this,&ClientHandler::sigSendFinish,sendSystem,&SendSystem::sendFinish,Qt::AutoConnection);
|
||||
connect(this,&ClientHandler::sigSendFinish,sendSystem,&SendSystem::sendPacketType,Qt::AutoConnection);
|
||||
connect(this,&ClientHandler::sigSendMessageBlock,sendSystem,&SendSystem::sendMessageBlock,Qt::AutoConnection);
|
||||
connect(this,&ClientHandler::sigNeedUpdate,sendSystem,&SendSystem::sendNeedUpdate,Qt::AutoConnection);
|
||||
connect(this,&ClientHandler::sigSendNotify,sendSystem,&SendSystem::sendNotify,Qt::AutoConnection);
|
||||
connect(this,&ClientHandler::sigSendFileBlockWithRename,sendSystem,&SendSystem::sendFileBlockWithRename,Qt::AutoConnection);
|
||||
connect(socket,&QTcpSocket::readyRead,recognizeSystem,&RecognizeSystem::recognize,Qt::AutoConnection);
|
||||
connect(socket, &QTcpSocket::disconnected, this, &ClientHandler::sendDisable,Qt::AutoConnection);
|
||||
connect(this,&ClientHandler::sigSendVersion,sendSystem,&SendSystem::sendVersion,Qt::AutoConnection);
|
||||
connect(this,&ClientHandler::sigSocketWrite,sendSystem,&SendSystem::socketWrite,Qt::AutoConnection);
|
||||
connect(this,&ClientHandler::sigSocketClose,sendSystem,&SendSystem::socketClose,Qt::AutoConnection);
|
||||
connect(this,&ClientHandler::sigSocketFlush,sendSystem,&SendSystem::socketFlush,Qt::AutoConnection);
|
||||
connect(this,&ClientHandler::sigSendPacketType,sendSystem,&SendSystem::sendPacketType,Qt::AutoConnection);
|
||||
|
||||
connect(socket,&QTcpSocket::readyRead,recognizeSystem,&RecognizeSystem::recognize,Qt::AutoConnection);
|
||||
connect(socket, &QTcpSocket::disconnected, this, &ClientHandler::sendDisable,Qt::AutoConnection);
|
||||
|
||||
recognizeSystem->initialize(updateController,dataParser,serverWidget,sendSystem, this);
|
||||
sendSystem->setClient(client,socket);
|
||||
@@ -62,6 +65,11 @@ void ClientHandler::initialize(int descriptor,ServerLMSWidget *serverWidget,
|
||||
emit sigInitSender(dataParser,logger);
|
||||
}
|
||||
|
||||
void ClientHandler::setClient(Client *value)
|
||||
{
|
||||
client = value;
|
||||
}
|
||||
|
||||
void ClientHandler::sendHash()
|
||||
{
|
||||
QString path = "\\" + hashFileName;
|
||||
@@ -69,21 +77,31 @@ void ClientHandler::sendHash()
|
||||
//emit sigSendNotify("HASHSENDCOMPLETE");
|
||||
}
|
||||
|
||||
void ClientHandler::sendVersion()
|
||||
{
|
||||
emit sigSendVersion();
|
||||
}
|
||||
|
||||
void ClientHandler::sendVersionList()
|
||||
{
|
||||
QFile file(versionListFile);
|
||||
file.open(QFile::ReadOnly);
|
||||
|
||||
QByteArray array = file.readAll();
|
||||
file.close();
|
||||
emit sendXmlAnswer(array);
|
||||
}
|
||||
|
||||
void ClientHandler::sendPacketType(PacketType packetType)
|
||||
{
|
||||
emit sigSendPacketType(packetType);
|
||||
}
|
||||
|
||||
void ClientHandler::sendXmlAnswer(QByteArray array, PacketType packetType)
|
||||
{
|
||||
emit sigSendXmlAnswer(array, packetType);
|
||||
}
|
||||
|
||||
void ClientHandler::sendFolderBlock(QString path)
|
||||
{
|
||||
emit sigFolderBlock(path);
|
||||
}
|
||||
|
||||
void ClientHandler::sendFileBlock(QString path)
|
||||
{
|
||||
emit sigFileBlock(path);
|
||||
}
|
||||
|
||||
bool ClientHandler::getIsSendStopped()
|
||||
{
|
||||
return emit sigGetIsSendStopped();
|
||||
@@ -96,7 +114,7 @@ void ClientHandler::sendDeleteBlock(QString path)
|
||||
|
||||
void ClientHandler::sendFinish()
|
||||
{
|
||||
emit sigSendFinish();
|
||||
emit sigSendFinish(PacketType::TYPE_FINISH);
|
||||
}
|
||||
|
||||
void ClientHandler::sendMessageBlock(QString text)
|
||||
@@ -104,9 +122,9 @@ void ClientHandler::sendMessageBlock(QString text)
|
||||
emit sigSendMessageBlock(text);
|
||||
}
|
||||
|
||||
void ClientHandler::sendNeedUpdate(bool flag, quint64 size, quint64 fileCount)
|
||||
void ClientHandler::sendNeedUpdate(bool flag, quint64 size, quint64 fileCount,quint64 deleteCount)
|
||||
{
|
||||
emit sigNeedUpdate(flag,size,fileCount);
|
||||
emit sigNeedUpdate(flag,size,fileCount,deleteCount);
|
||||
}
|
||||
|
||||
void ClientHandler::sendDisable()
|
||||
|
||||
@@ -2,11 +2,13 @@
|
||||
#define CLIENTHANDLER_H
|
||||
|
||||
#include <QObject>
|
||||
#include <Systems/sendsystem.h>
|
||||
#include "Client.h"
|
||||
#include <QTcpSocket>
|
||||
#include <QThread>
|
||||
#include "Systems/tools.h"
|
||||
|
||||
#include <Systems/sendsystem.h>
|
||||
#include <Systems/tools.h>
|
||||
#include <Data/Client.h>
|
||||
#include <Data/PacketType.h>
|
||||
|
||||
class SendSystem;
|
||||
class DataParser;
|
||||
@@ -14,6 +16,7 @@ class Logger;
|
||||
class ServerLMSWidget;
|
||||
class UpdateController;
|
||||
class RecognizeSystem;
|
||||
class ClientAnswerParser;
|
||||
|
||||
class ClientHandler : public QObject
|
||||
{
|
||||
@@ -29,10 +32,13 @@ public:
|
||||
void sendDeleteBlock(QString path);
|
||||
void sendFinish();
|
||||
void sendMessageBlock(QString text);
|
||||
void sendNeedUpdate(bool flag, quint64 size,quint64 fileCount);
|
||||
void sendNeedUpdate(bool flag, quint64 size,quint64 fileCount,quint64 deleteCount);
|
||||
void sendDisable();
|
||||
void recognize();
|
||||
void sendHash();
|
||||
void sendVersionList();
|
||||
void sendPacketType(PacketType packetType);
|
||||
void sendVersion();
|
||||
|
||||
~ClientHandler();
|
||||
|
||||
@@ -48,9 +54,9 @@ signals:
|
||||
void sigFileBlock(QString path);
|
||||
bool sigGetIsSendStopped();
|
||||
void sigSendDeleteBlock(QString path);
|
||||
void sigSendFinish();
|
||||
void sigSendFinish(PacketType packetType);
|
||||
void sigSendMessageBlock(QString text);
|
||||
void sigNeedUpdate(bool flag,quint64 size,quint64 fileCount);
|
||||
void sigNeedUpdate(bool flag,quint64 size,quint64 fileCount,quint64 deleteCount);
|
||||
void sigClientDisconnected(QString address,QString port);
|
||||
void sigSendHash();
|
||||
void sigRecognize(ClientHandler *handler);
|
||||
@@ -59,13 +65,16 @@ signals:
|
||||
void sigSocketWrite(QByteArray array);
|
||||
void sigSocketClose();
|
||||
bool sigSocketFlush();
|
||||
void sigSendVersion();
|
||||
void sigSendPacketType(PacketType packetType);
|
||||
|
||||
public :
|
||||
QThread *thread;
|
||||
QTcpSocket *socket;
|
||||
|
||||
void initialize(int descriptor, ServerLMSWidget *serverWidget,
|
||||
UpdateController *updateController, DataParser *dataParser,Logger *logger);
|
||||
UpdateController *updateController, DataParser *dataParser,Logger *logger);
|
||||
void setClient(Client *value);
|
||||
private:
|
||||
UpdateController *updateController;
|
||||
RecognizeSystem *recognizeSystem;
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
#include "providerdblms.h"
|
||||
|
||||
#include <QThread>
|
||||
|
||||
ProviderDBLMS::ProviderDBLMS(QWidget *parentWidget, QObject *parent) :
|
||||
QObject(parent),
|
||||
dbLMS(nullptr)
|
||||
@@ -202,7 +204,7 @@ QString ProviderDBLMS::getNameInstructorByLogin(QString login)
|
||||
QList<Instructor> ProviderDBLMS::GetListAllInstructors()
|
||||
{
|
||||
QList<Instructor> listInstructors;
|
||||
|
||||
qDebug() << "ProviderDBLMS " << QThread::currentThreadId();
|
||||
mtxAccess.lock();
|
||||
|
||||
if(! dbLMS->DBisConnected())
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#define PROVIDERDBLMS_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QDebug>
|
||||
#include "interfacedatabaselms.h"
|
||||
|
||||
class ProviderDBLMS : public QObject
|
||||
|
||||
@@ -51,34 +51,39 @@ ServerLMSWidget::ServerLMSWidget(QWidget *parent) :
|
||||
connect(logger,&Logger::sigSendTextToLogger,this,&ServerLMSWidget::slotAddToLog,Qt::QueuedConnection);
|
||||
logger->moveToThread(loggerThread);
|
||||
|
||||
assetsManager = new AssetsManager;
|
||||
assetsManager->moveToThread(updateThread);
|
||||
|
||||
processingSystem = new ProcessingSystem(providerDBLMS);
|
||||
dataParser = new DataParser(processingSystem);
|
||||
processingSystem->moveToThread(updateThread);
|
||||
|
||||
dataParser = new DataParser(assetsManager,processingSystem);
|
||||
|
||||
updateController = new UpdateController;
|
||||
updateController->moveToThread(updateThread);
|
||||
|
||||
commonClientHandler = new CommonClientHandler;
|
||||
|
||||
loggerThread->start();
|
||||
updateThread->start();
|
||||
|
||||
updateController->initialize(nullptr,dataParser);
|
||||
processingSystem->initialize(dataParser,this);
|
||||
commonClientHandler->initialize(&clientsMap,processingSystem,dataParser,logger);
|
||||
processingSystem->initialize(this,dataParser,commonClientHandler,logger);
|
||||
|
||||
logger->setTypeLog("widget");
|
||||
|
||||
connect(processingSystem,&ProcessingSystem::sigUpdateListClients,this, &ServerLMSWidget::slotUpdateListClients);
|
||||
connect(updateController,&UpdateController::sigLogMessage,logger,&Logger::addTextToLogger);
|
||||
|
||||
connect(dataParser,&DataParser::sigLogMessage,logger,&Logger::addTextToLogger);
|
||||
connect(processingSystem,&ProcessingSystem::sigLogMessage,logger,&Logger::addTextToLogger);
|
||||
connect(this,&ServerLMSWidget::sigLog,logger,&Logger::addTextToLogger);
|
||||
|
||||
connect(processingSystem,&ProcessingSystem::sigAuthChanged,this, &ServerLMSWidget::slot_AuthChanged);
|
||||
connect(processingSystem,&ProcessingSystem::signal_msgToClientReady,this, &ServerLMSWidget::slot_msgToClientFromGUI);
|
||||
connect(processingSystem,&ProcessingSystem::signal_msgFromClientReady,this, &ServerLMSWidget::slot_msgToGUIfromClient);
|
||||
connect(this,&ServerLMSWidget::sigUpdateController,updateController,&UpdateController::initialize,Qt::DirectConnection);
|
||||
connect(this,&ServerLMSWidget::sigLog,logger,&Logger::addTextToLogger,Qt::AutoConnection);
|
||||
connect(this,&ServerLMSWidget::sigCalculateFullHash,updateController,&UpdateController::calculateFullHash,Qt::AutoConnection);
|
||||
|
||||
emit sigUpdateController(commonClientHandler,dataParser,assetsManager,logger);
|
||||
on_btnStartServer_clicked();
|
||||
|
||||
first = true;
|
||||
qDebug() << "WidgetThread: " << QThread::currentThreadId();
|
||||
qDebug() << "MAIN THREAD: " << QThread::currentThreadId();
|
||||
}
|
||||
|
||||
void ServerLMSWidget::autorizationHandler(QString login)
|
||||
@@ -132,7 +137,7 @@ bool ServerLMSWidget::stopServer()
|
||||
{
|
||||
if(stateServer == started)
|
||||
{
|
||||
QByteArray arrayAnswer = dataParser->xmlAnswer_notify(NOTIFY_SERVER_END);
|
||||
QByteArray arrayAnswer = dataParser->ClientAnswer()->notify(NOTIFY_SERVER_END);
|
||||
|
||||
//Закрываем все открытые сокеты
|
||||
foreach(int idSocket, clientsMap.keys())
|
||||
@@ -162,6 +167,11 @@ bool ServerLMSWidget::stopServer()
|
||||
return false;
|
||||
}
|
||||
|
||||
Logger *ServerLMSWidget::getLogger() const
|
||||
{
|
||||
return logger;
|
||||
}
|
||||
|
||||
QMap<int, ClientHandler *> ServerLMSWidget::getClientsMap() const
|
||||
{
|
||||
return clientsMap;
|
||||
@@ -195,21 +205,6 @@ void ServerLMSWidget::slot_BlockAutorization(bool block)
|
||||
unBlockAutorization();
|
||||
}
|
||||
|
||||
void ServerLMSWidget::slot_AuthChanged()
|
||||
{
|
||||
//Проходим все открытые сокеты
|
||||
foreach(int idSocket, clientsMap.keys())
|
||||
{
|
||||
//Проверяем, есть ли клиенты TYPE_GUI
|
||||
if(clientsMap[idSocket]->getClient()->getTypeClient() == TypeClientAutorization::TYPE_GUI)
|
||||
{//Отправляем этому клиенту обновление списков
|
||||
ClientQueryToDB queryToDB;
|
||||
queryToDB.typeQuery = TypeQueryToDB::TYPE_QUERY_GET_ALL_LISTS;
|
||||
processingSystem->processingClientQueryToDB(clientsMap[idSocket], queryToDB);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ServerLMSWidget::removeClient(int idSocket)
|
||||
{
|
||||
clientsMap.remove(idSocket);
|
||||
@@ -229,56 +224,12 @@ void ServerLMSWidget::slot_LanguageChanged(QString language)
|
||||
}
|
||||
|
||||
|
||||
void ServerLMSWidget::slot_msgToClientFromGUI(QString login, QString text)
|
||||
void ServerLMSWidget::on_btnTaskSet_clicked()
|
||||
{
|
||||
QString textMsg = text;
|
||||
QString fullNameClient = ui->listWidget_Clients->currentItem()->text();
|
||||
QString textTask = ui->comboTasks->currentText();
|
||||
|
||||
QByteArray byteArrayMsg = dataParser->xmlAnswer_message(textMsg);
|
||||
|
||||
//Проходим все открытые сокеты, ищем нужный
|
||||
foreach(int idSocket, clientsMap.keys())
|
||||
{
|
||||
ClientHandler *handler = clientsMap[idSocket];
|
||||
if(handler->getClient()->getLogin() == login)
|
||||
{//Отправляем ему
|
||||
|
||||
handler->sendXmlAnswer(byteArrayMsg);
|
||||
|
||||
QString peerAddress = clientsMap[idSocket]->getSocket()->peerAddress().toString();
|
||||
QString peerPort = QString::number(clientsMap[idSocket]->getSocket()->peerPort());
|
||||
|
||||
QString str = "Msg To Client [" + peerAddress + ":" + peerPort + "] : " + textMsg;
|
||||
|
||||
logger->addTextToLogger(str);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ServerLMSWidget::slot_msgToGUIfromClient(QString login, QString text)
|
||||
{
|
||||
QString textMsg = text;
|
||||
|
||||
QByteArray byteArrayMsg = dataParser->xmlAnswer_message(textMsg, login);
|
||||
|
||||
//Проходим все открытые сокеты, ищем нужный
|
||||
foreach(int idSocket, clientsMap.keys())
|
||||
{
|
||||
ClientHandler *handler = clientsMap[idSocket];
|
||||
if(handler->getClient()->getTypeClient() == TypeClientAutorization::TYPE_GUI)
|
||||
{//Отправляем GUI-клиенту для отображения в Мессенджере
|
||||
|
||||
handler->sendXmlAnswer(byteArrayMsg, PacketType::TYPE_XMLANSWER);
|
||||
|
||||
QString peerAddress = clientsMap[idSocket]->getSocket()->peerAddress().toString();
|
||||
QString peerPort = QString::number(clientsMap[idSocket]->getSocket()->peerPort());
|
||||
|
||||
QString str = "Msg From Client [" + peerAddress + ":" + peerPort + "] : " + textMsg;
|
||||
|
||||
logger->addTextToLogger(str);
|
||||
break;
|
||||
}
|
||||
}
|
||||
commonClientHandler->slot_sendTaskToClient(fullNameClient,textTask);
|
||||
}
|
||||
|
||||
void ServerLMSWidget::slotAddToLog(QString msg)
|
||||
@@ -293,7 +244,7 @@ void ServerLMSWidget::on_btnStartServer_clicked()
|
||||
if(startServer())
|
||||
{
|
||||
QApplication::setOverrideCursor(Qt::WaitCursor);
|
||||
updateController->calculateHash();
|
||||
emit sigCalculateFullHash();
|
||||
QApplication::restoreOverrideCursor();
|
||||
|
||||
ui->btnStartServer->setEnabled(false);
|
||||
@@ -312,30 +263,6 @@ void ServerLMSWidget::on_btnStopServer_clicked()
|
||||
}
|
||||
}
|
||||
|
||||
void ServerLMSWidget::on_btnTaskSet_clicked()
|
||||
{
|
||||
QString fullNameClient = ui->listWidget_Clients->currentItem()->text();
|
||||
|
||||
QString textTask = ui->comboTasks->currentText();
|
||||
|
||||
QByteArray byteArrayTask = dataParser->xmlAnswer_task(textTask);
|
||||
|
||||
//Проходим все открытые сокеты
|
||||
foreach(int idSocket, clientsMap.keys())
|
||||
{
|
||||
if(clientsMap[idSocket]->getClient()->getFullName() == fullNameClient)
|
||||
{//Отправляем ему
|
||||
clientsMap[idSocket]->getSocket()->write(byteArrayTask);
|
||||
|
||||
QString peerAddress = clientsMap[idSocket]->getSocket()->peerAddress().toString();
|
||||
QString peerPort = QString::number(clientsMap[idSocket]->getSocket()->peerPort());
|
||||
|
||||
QString str = "Task To Client [" + peerAddress + ":" + peerPort + "] : " + textTask;
|
||||
logger->addTextToLogger(str);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ServerLMSWidget::changeEvent(QEvent *event)
|
||||
{
|
||||
// В случае получения события изменения языка приложения
|
||||
|
||||
@@ -1,23 +1,27 @@
|
||||
#ifndef SERVERLMSWIDGET_H
|
||||
#define SERVERLMSWIDGET_H
|
||||
|
||||
#include "ServerLMS_global.h"
|
||||
|
||||
#include <QWidget>
|
||||
#include <QTcpServer>
|
||||
#include <QTcpSocket>
|
||||
#include <QXmlStreamWriter>
|
||||
#include <QMap>
|
||||
#include <QTranslator>
|
||||
#include <Systems/dataparser.h>
|
||||
#include <QMutex>
|
||||
|
||||
#include <Systems/Parsers/dataparser.h>
|
||||
#include <Systems/sendsystem.h>
|
||||
#include <Systems/processingsystem.h>
|
||||
#include <Systems/updatecontroller.h>
|
||||
#include <Systems/assetsmanager.h>
|
||||
#include <Systems/recognizesystem.h>
|
||||
#include <Systems/logger.h>
|
||||
#include <QMutex>
|
||||
#include <Systems/commonclienthandler.h>
|
||||
|
||||
#include "ServerLMS_global.h"
|
||||
#include "typesDataServerClient.h"
|
||||
#include "Client.h"
|
||||
#include <Data/typesDataServerClient.h>
|
||||
#include <Data/Client.h>
|
||||
#include "multithreadserver.h"
|
||||
#include "providerdblms.h"
|
||||
|
||||
@@ -33,6 +37,7 @@ class UpdateController;
|
||||
class RecognizeSystem;
|
||||
class ClientHandler;
|
||||
class MultiThreadServer;
|
||||
class AssetsManager;
|
||||
|
||||
class SERVERLMS_EXPORT ServerLMSWidget : public QWidget
|
||||
{
|
||||
@@ -44,6 +49,7 @@ public:
|
||||
|
||||
void autorizationHandler(QString login);
|
||||
|
||||
|
||||
protected:
|
||||
// Метод получения событий
|
||||
// В нём будет производиться проверка события смены перевода приложения
|
||||
@@ -51,20 +57,17 @@ protected:
|
||||
|
||||
signals:
|
||||
void sigRecognize();
|
||||
QTcpSocket* sigGetSocket();
|
||||
void sigLog(QString log);
|
||||
void sigCalculateFullHash();
|
||||
void sigUpdateController(CommonClientHandler* commonClientHandler,DataParser *dataParser,AssetsManager *assetManager,Logger *logger);
|
||||
|
||||
QTcpSocket* sigGetSocket();
|
||||
|
||||
public slots:
|
||||
void slot_LanguageChanged(QString language);
|
||||
void addClient(qintptr descriptor, ClientHandler *client);
|
||||
void slotUpdateListClients();
|
||||
void slot_BlockAutorization(bool block);
|
||||
void slot_AuthChanged();
|
||||
|
||||
private slots:
|
||||
//слот обработки сигнала о готовности нового сообщения на отправку клиенту от мессенджера
|
||||
void slot_msgToClientFromGUI(QString login, QString text);
|
||||
void slot_msgToGUIfromClient(QString login, QString text);
|
||||
void slotAddToLog(QString msg);
|
||||
|
||||
public:
|
||||
@@ -90,6 +93,8 @@ public:
|
||||
|
||||
QMap<int, ClientHandler *> getClientsMap() const;
|
||||
|
||||
Logger *getLogger() const;
|
||||
|
||||
private slots:
|
||||
void on_btnStartServer_clicked();
|
||||
void on_btnStopServer_clicked();
|
||||
@@ -115,7 +120,9 @@ private:
|
||||
DataParser *dataParser;
|
||||
ProcessingSystem *processingSystem;
|
||||
UpdateController *updateController;
|
||||
AssetsManager *assetsManager;
|
||||
Logger *logger;
|
||||
CommonClientHandler *commonClientHandler;
|
||||
|
||||
ProviderDBLMS* providerDBLMS;
|
||||
|
||||
|
||||
@@ -46,7 +46,7 @@ target_include_directories(TestServerLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../.
|
||||
if(PROJECT_TYPE_DEBUG)
|
||||
target_link_directories(TestServerLMS PUBLIC ${REPO_PATH}/BUILDS/DB_LMS/Debug64)
|
||||
elseif()
|
||||
target_link_directories(TestServerLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../../QT/BUILDS/LMS/DB_LMS/Release64)
|
||||
target_link_directories(TestServerLMS PUBLIC ${REPO_PATH}/BUILDS/DB_LMS/Release64)
|
||||
endif()
|
||||
target_link_libraries(TestServerLMS PRIVATE libDataBaseLMS.dll)
|
||||
|
||||
@@ -54,6 +54,6 @@ target_include_directories(TestServerLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../.
|
||||
if(PROJECT_TYPE_DEBUG)
|
||||
target_link_directories(TestServerLMS PUBLIC ${REPO_PATH}/BUILDS/ServerLMS/Debug64)
|
||||
elseif()
|
||||
target_link_directories(TestServerLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../../QT/BUILDS/LMS/ServerLMS/Release64)
|
||||
target_link_directories(TestServerLMS PUBLIC ${REPO_PATH}/BUILDS/ServerLMS/Release64)
|
||||
endif()
|
||||
target_link_libraries(TestServerLMS PRIVATE libServerLMS.dll)
|
||||
|
||||
Reference in New Issue
Block a user