25 Commits

Author SHA1 Message Date
semenov
38dda10685 fix: instructor update 2026-03-18 10:47:43 +03:00
semenov
eb70ed9a6e feat: add scenario conflict resolver 2026-03-11 15:53:08 +03:00
semenov
4edfae5740 feat: choosing complete 2026-03-10 14:35:05 +03:00
semenov
1d76e9785b feat: add files time 2026-03-10 09:36:49 +03:00
715d29a1ec убрал мусор 2026-02-27 10:52:13 +03:00
6bde215bbe Работает сокет стрим 2026-02-26 17:58:05 +03:00
eb95db696a Попытка оптимизации 2026-02-24 10:10:59 +03:00
a3651496b7 gitignore add BUILDS 2026-02-19 12:27:32 +03:00
52d077fe6b sendFileBlock_V3 2026-02-18 17:22:38 +03:00
semenov
918d391a68 fix: update from instructor 2026-01-12 10:26:29 +03:00
semenov
775f5cd0a4 fix: position 2025-12-17 16:39:23 +03:00
semenov
75a93e346b fix: blocked behaviour 2025-12-17 16:33:12 +03:00
semenov
4e15a439ee feat: add new states 2025-12-17 16:18:14 +03:00
semenov
9e202f8e5d fix: version name after download 2025-12-12 12:58:31 +03:00
semenov
c23f3d519b fix: server changable version 2025-12-12 11:34:02 +03:00
semenov
14c1ffb66f quickfix: offline start 2025-12-09 09:29:15 +03:00
semenov
5b63141ddf bugfix: links 2025-11-28 16:51:38 +03:00
semenov
6665f417c9 feat: add client information 2025-11-20 17:20:52 +03:00
semenov
633881847b bugfix: ui behaviour 2025-11-20 15:58:19 +03:00
semenov
a2e64ecb68 bugfix: update without hot update 2025-11-20 12:14:34 +03:00
semenov
4829647e98 feat: add send scenario 2025-11-18 12:04:31 +03:00
semenov
b706de2961 fix: hex 2025-10-29 11:26:03 +03:00
semenov
a4d4709118 fix: reconnect with old connection 2025-09-23 10:20:17 +03:00
semenov
60c3d6244e feat: fast hash checker 2025-09-23 09:23:04 +03:00
semenov
c9c62d22c0 bugfix: auto-start init 2025-09-19 09:23:35 +03:00
62 changed files with 44210 additions and 537 deletions

2
.gitignore vendored
View File

@@ -60,3 +60,5 @@ debug/
release/
saves/
build/
BUILDS/

37
ClientMPS_resource.rc Normal file
View File

@@ -0,0 +1,37 @@
#include <windows.h>
IDI_ICON1 ICON DISCARDABLE "D:\\QT\\Projects\\RRJClient\\resource\\Icons\\planeCustomIco.ico"
VS_VERSION_INFO VERSIONINFO
FILEVERSION 0,0,0,0
PRODUCTVERSION 0,0,0,0
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS VS_FF_DEBUG
#else
FILEFLAGS 0x0L
#endif
FILEOS VOS__WINDOWS32
FILETYPE VFT_DLL
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904b0"
BEGIN
VALUE "CompanyName", "\0"
VALUE "FileDescription", "\0"
VALUE "FileVersion", "0.0.0.0\0"
VALUE "LegalCopyright", "\0"
VALUE "OriginalFilename", "ClientMPS.exe\0"
VALUE "ProductName", "ClientMPS\0"
VALUE "ProductVersion", "0.0.0.0\0"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x0409, 1200
END
END
/* End of Version info */

View File

@@ -1,6 +1,7 @@
#include "UpdateController.h"
#include <QElapsedTimer>
#include <QThread>
UpdateController::UpdateController(QObject *parent) :
@@ -8,6 +9,7 @@ UpdateController::UpdateController(QObject *parent) :
versionContainer(nullptr)
{
applicationFolderPath = QDir::currentPath() + applicationFolderName;
hashCalculator = new FastHashCalculator;
}
void UpdateController::initialize(VersionContainer *versionContainer,DataParserOutput *dataParserOut, SendSystem *sendSystem)
@@ -20,18 +22,26 @@ void UpdateController::initialize(VersionContainer *versionContainer,DataParserO
void UpdateController::calculateCommonHash()
{
appDataList.clear();
appDataList = calculateHash(applicationFolderPath,"StreamingAssets");
QElapsedTimer timer;
timer.start();
qDebug() << "Start calculate... ";
hashCalculator->calculateHashes(applicationFolderPath,"StreamingAssets");
appDataList = *hashCalculator->getHashList();
calculateStreamingHash();
appDataList.append(streamingDataList);
qDebug() << "Hash count: " << appDataList.count() ;
dataParserOut->createFileDataList(appDataList,fullStaticDataFolderName + hashFilename);
qDebug() << "UpdateController threadID " << QThread::currentThreadId();
qDebug() <<"Calculate time " << timer.elapsed();
}
void UpdateController::calculateStreamingHash()
{
streamingDataList.clear();
streamingDataList = calculateHash(QDir::currentPath() + streamingAssetsPath,"");
std::sort(streamingDataList.begin(),streamingDataList.end());
hashCalculator->calculateHashes(QDir::currentPath() + streamingAssetsPath,"");
streamingDataList = *hashCalculator->getHashList();
dataParserOut->createFileDataList(streamingDataList,streamingHashFilename);
}
@@ -45,7 +55,6 @@ QList<FileData> UpdateController::calculateHash(const QString& path,const QStrin
}
QList<FileData> *hashes = new QList<FileData>;
QString fullSize = Tools::convertFileSize(getDirectorySize(path),false);
quint64 currentSize = 0;
QStringList filter;
@@ -82,9 +91,9 @@ QList<FileData> UpdateController::calculateHash(const QString& path,const QStrin
currentSize += fileInfo.size();
emit sigSendHashInfo(fullSize,Tools::convertFileSize(currentSize,false));
quint64 fileSize = file.size(); //буффер для хэширования крупных файлов
const quint64 bufferSize = 10240;
const quint64 bufferSize = 1024;
if(fileInfo.isHidden()) continue;
if(ignoreName != "" && fileInfo.path().contains(ignoreName)) continue;
@@ -115,26 +124,8 @@ QList<FileData> UpdateController::calculateHash(const QString& path,const QStrin
return *hashes;
}
quint64 UpdateController::getDirectorySize(const QString& path)
void UpdateController::updateFilesOnServer(QList<FileData> *fileSendList)
{
quint64 totalSize = 0;
QDirIterator iterator(path, QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot, QDirIterator::Subdirectories);
while (iterator.hasNext())
{
iterator.next();
QFileInfo fileInfo = iterator.fileInfo();
if (fileInfo.isFile())
{
totalSize += fileInfo.size();
}
}
return totalSize;
}
void UpdateController::updateFilesOnServer(QList<FileData> *fileSendList){
QListIterator<FileData> serverIterator(*fileSendList);
try {
@@ -155,8 +146,7 @@ void UpdateController::updateFilesOnServer(QList<FileData> *fileSendList){
}
calculateCommonHash();
sendSystem->sendFinish();
sendSystem->sendPacketType(PacketType::RECALCULATE_DOCS);
emit sigUpdateComplete(true);
}
catch (...)
@@ -166,6 +156,11 @@ void UpdateController::updateFilesOnServer(QList<FileData> *fileSendList){
}
FastHashCalculator *UpdateController::getHashCalculator() const
{
return hashCalculator;
}
UpdateController::~UpdateController()
{

View File

@@ -3,6 +3,7 @@
#include "Core/sendsystem.h"
#include "Core/versioncontainer.h"
#include "fasthashcalculator.h"
#include <QXmlStreamWriter>
#include <QXmlStreamReader>
#include <QXmlStreamAttribute>
@@ -34,19 +35,21 @@ public:
void updateFilesOnServer(QList<FileData> *fileSendList);
void checkCanUpdate();
FastHashCalculator *getHashCalculator() const;
signals:
void sigUpdateComplete(bool flag);
void sigSendHashInfo(QString fullSize,QString current);
private:
SendSystem *sendSystem;
DataParserOutput * dataParserOut;
FastHashCalculator* hashCalculator;
QString applicationFolderPath;
VersionContainer *versionContainer;
QList<FileData> appDataList;
QList<FileData> streamingDataList;
QList<FileData> calculateHash(const QString& path,const QString& ignoreName);
quint64 getDirectorySize(const QString &path);
};

View File

@@ -15,9 +15,9 @@ void DataParser::initialize(PostProcessorSystem *postProcessSystem)
}
ServerSettings *DataParser::getClientSettings()
Settings *DataParser::getSettings()
{
ServerSettings *settings = new ServerSettings;
Settings *settings = new Settings;
QFile file(settingsName);
file.open(QIODevice::ReadOnly);
QXmlStreamReader xmlReader(&file);
@@ -95,9 +95,10 @@ ServerSettings *DataParser::getClientSettings()
return settings;
}
void DataParser::xmlParser(const QByteArray& array)
bool DataParser::xmlParser(const QByteArray& array)
{
QXmlStreamReader xmlReader(array);
bool result = false;
xmlReader.readNext();
@@ -134,14 +135,29 @@ void DataParser::xmlParser(const QByteArray& array)
if (value == "UNCHANGEABLE")
{
//версию нельзя изменять
result = true;
}
if (value == "CHANGEABLE")
{
postProcessSystem->compareFiles();
//emit sigUpdateFilesOnServer(hashComparer->getFilesForUpdate());
}
if (value == "ERROR_AUTH_ARCHIVED")
{
postProcessSystem->userArchived();
}
if (value == "ERROR_AUTH_LOGINORPASSWORD")
{
postProcessSystem->wrongLoginOrPass();
}
if (value == "ERROR_AUTH_ALREADYLOGIN")
{
postProcessSystem->alreadyLogin();
}
}
}
}
@@ -173,13 +189,10 @@ void DataParser::xmlParser(const QByteArray& array)
if (name == "AccessType")
{
serverAuth->AccessType = value;
postProcessSystem->checkAccessType(value);
//recognizeSystem->checkAccessType(value);
}
}
postProcessSystem->saveLoginData(serverAuth);
//emit recognizeSystem->sigSaveLoginData(serverAuth);
}
if(xmlReader.name() == "VersionData")
@@ -227,7 +240,7 @@ void DataParser::xmlParser(const QByteArray& array)
QString name = attr.name().toString();
QString value = attr.value().toString();
if(name == "Version")
if (name == "Version")
data->setName(value);
else if(name == "Created")
data->setCreateData(QDateTime::fromString(value));
@@ -243,8 +256,10 @@ void DataParser::xmlParser(const QByteArray& array)
xmlReader.readNext();
}
emit postProcessSystem->sigCallUpdateList();
}
xmlReader.readNext();
}
return result;
}

View File

@@ -6,7 +6,6 @@
#include <QObject>
#include <QDomDocument>
#include <QXmlStreamWriter>
#include <Data/FileData.h>
#include <Data/Datas.h>
#include <Data/FileData.h>
#include <Core/tools.h>
@@ -21,8 +20,8 @@ public:
~DataParser() = default;
void initialize(PostProcessorSystem *postProcessSystem);
ServerSettings* getClientSettings();
void xmlParser(const QByteArray& array);
Settings* getSettings();
bool xmlParser(const QByteArray& array);
private:
PostProcessorSystem *postProcessSystem;
};

View File

@@ -77,7 +77,6 @@ QByteArray DataParserOutput::xmlAnswer(const QList<SXmlAnswerTag>& listTag, cons
return array;
}
void DataParserOutput::createFileDataList(const QList<FileData>& fileDataList,const QString& filename)
{
QFile file(filename);
@@ -94,6 +93,7 @@ void DataParserOutput::createFileDataList(const QList<FileData>& fileDataList,co
xmlWriter.writeAttribute("Path",data.path);
xmlWriter.writeAttribute("Hash",data.hash);
xmlWriter.writeAttribute("LastUpdate",data.lastUpdate);
xmlWriter.writeEndElement();
}
@@ -126,9 +126,10 @@ void DataParserOutput::createAuthMessage(ClientAutorization *auth)
file.close();
}
void DataParserOutput::createServerSettings(ServerSettings* serverSettings)
void DataParserOutput::createServerSettings()
{
QFile file(settingsName);
if (file.exists()) return;
file.open(QIODevice::WriteOnly);
@@ -140,13 +141,43 @@ void DataParserOutput::createServerSettings(ServerSettings* serverSettings)
xmlWriter.writeStartElement("ServerSettingsContainer");
xmlWriter.writeStartElement("ServerSettings");
xmlWriter.writeAttribute("Address","");
xmlWriter.writeAttribute("Port","");
xmlWriter.writeAttribute("Language","RUS");
xmlWriter.writeAttribute("AutoStart",QString::number(false));
xmlWriter.writeEndElement();
xmlWriter.writeStartElement("VersionData");
xmlWriter.writeAttribute("Version","-----");
xmlWriter.writeAttribute("isChangable","0");
xmlWriter.writeEndElement();
xmlWriter.writeEndElement();
xmlWriter.writeEndDocument();
file.close();
}
void DataParserOutput::updateServerSettings(Settings* serverSettings)
{
QFile file(settingsName);
file.open(QIODevice::WriteOnly);
QXmlStreamWriter xmlWriter(&file);
xmlWriter.setAutoFormatting(true);
xmlWriter.writeStartDocument();
xmlWriter.writeStartElement("ServerSettingsContainer");
xmlWriter.writeStartElement("ServerSettings");
xmlWriter.writeAttribute("Address",serverSettings->Address);
xmlWriter.writeAttribute("Port",serverSettings->Port);
xmlWriter.writeAttribute("Language","RUS");
xmlWriter.writeAttribute("AutoStart",QString::number(false));
xmlWriter.writeAttribute("DestPortMath","18003");
xmlWriter.writeAttribute("LocalPortMath","18004");
xmlWriter.writeAttribute("UseMathModel",QString::number(serverSettings->mathModelUse));
xmlWriter.writeEndElement();
@@ -303,6 +334,8 @@ QList<FileData>* DataParserOutput::xmlFileDataParse(const QByteArray& array,cons
data.path = value;
else if(name == "Hash")
data.hash = value;
else if(name == "LastUpdate")
data.lastUpdate = value;
}
if(data.path.contains(filter))

View File

@@ -17,7 +17,8 @@ public:
explicit DataParserOutput(QObject *parent = 0);
void createFileDataList(const QList<FileData>& fileDataList,const QString& filename);
void createAuthMessage(ClientAutorization *auth);
void createServerSettings(ServerSettings *serverSettings);
void createServerSettings();
void updateServerSettings(Settings *serverSettings);
void changeVersion(StreamingVersionData *versionData);
void createAuthData(ServerAuthorization *serverAuth);
void createAuthDataOffline(const QString& username,const QString& pass);

View File

@@ -3,8 +3,8 @@
void ExternalExecuter::callApp()
{
QProcess *myProcess = new QProcess(this);
QStringList args;
args << "1";
QStringList args = QCoreApplication::arguments();
args.removeFirst();
myProcess->start(programPath,args);
myProcess->waitForStarted();
@@ -21,10 +21,11 @@ bool ExternalExecuter::findApp()
if(iterator.fileInfo().fileName() == applicationEXEName){
programPath = iterator.fileInfo().absoluteFilePath();
isAvailable = true;
return true;
}
}
isAvailable = false;
return false;
}
@@ -37,3 +38,8 @@ void ExternalExecuter::setIsAutoStart(bool value)
{
isAutoStart = value;
}
bool ExternalExecuter::getIsAvailable() const
{
return isAvailable;
}

View File

@@ -23,9 +23,12 @@ public:
bool getIsAutoStart() const;
void setIsAutoStart(bool value);
bool getIsAvailable() const;
private:
QString programPath;
bool isAutoStart;
bool isAvailable;
};
#endif // EXTERNALEXECUTER_H

128
Core/fasthashcalculator.cpp Normal file
View File

@@ -0,0 +1,128 @@
#include "fasthashcalculator.h"
#include <QtConcurrent>
FastHashCalculator::FastHashCalculator(QObject *parent) : QObject(parent)
{
hashList = new QList<FileData>();
}
void FastHashCalculator::calculateHashes(const QString& path, const QString& ignoreName)
{
hashList->clear();
currentSize = 0;
if(!QDir(path).exists()){
QDir().mkdir(path);
}
QString hashString;
QStringList filter;
filter << "*";
QList<FileData> *folders = new QList<FileData>;
fullSize = Tools::convertFileSize(getDirectorySize(path),false);
//только папки
QDirIterator dirIterator(path,filter, QDir::AllEntries, QDirIterator::Subdirectories);
while (dirIterator.hasNext())
{
QFileInfo fileInfo(dirIterator.next());
FileData currentFolder;
if(fileInfo.isDir() && !fileInfo.fileName().startsWith(".") && fileInfo.fileName() != "RRJLoader")
{
currentFolder.path = Tools::createLocalPath(fileInfo.absoluteFilePath());
currentFolder.hash = "FOLDER";
if(!folders->contains(currentFolder))
{
folders->push_back(currentFolder);
}
}
}
//только файлы
QDirIterator fileIterator(path,filter,QDir::Files | QDir::NoDotAndDotDot,QDirIterator::Subdirectories);
QList<QString> files;
files.clear();
while(fileIterator.hasNext())
{
fileIterator.next();
QFileInfo fileInfo = fileIterator.fileInfo();
QString path = fileInfo.absoluteFilePath();
if (fileInfo.isHidden()) continue;
if (!fileInfo.isFile()) continue;
if (fileInfo.fileName().contains(".meta")) continue;
if (ignoreName != "" && fileInfo.path().contains(ignoreName)) continue;
files.append(path);
}
QtConcurrent::map(files, [this](const QString &filePath)
{
QFileInfo fileInfo(filePath);
QByteArray hash = calculateFileHashOptimized(filePath);
QMutexLocker locker(&_mutex);
FileData currentFile;
QString hashName;
currentFile.path = Tools::createLocalPath(filePath);
currentFile.hash = hash.toHex();
currentFile.lastUpdate = fileInfo.fileTime(QFileDevice::FileModificationTime).toString("dd.MM.yyyy hh:mm:ss");
hashList->append(currentFile);
}).waitForFinished();
hashList->append(*folders);
emit finished();
}
QByteArray FastHashCalculator::calculateFileHashOptimized(const QString &filePath)
{
QFile file(filePath);
if (!file.open(QIODevice::ReadOnly)) return QByteArray();
QCryptographicHash hash(QCryptographicHash::Md5);
const qint64 bufferSize = 2048; // 2MB
quint64 completeBytes = 0;
QByteArray buffer;
buffer.resize(bufferSize);
while (!file.atEnd()) {
qint64 bytesRead = file.read(buffer.data(), bufferSize);
hash.addData(buffer.constData(), bytesRead);
completeBytes += bytesRead;
}
hashCounterDisplay(completeBytes);
return hash.result();
}
void FastHashCalculator::hashCounterDisplay(quint64 size)
{
currentSize += size;
emit sigSendHashInfo(fullSize,Tools::convertFileSize(currentSize,false));
}
quint64 FastHashCalculator::getDirectorySize(const QString& path)
{
quint64 totalSize = 0;
QDirIterator iterator(path, QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot, QDirIterator::Subdirectories);
while (iterator.hasNext())
{
iterator.next();
QFileInfo fileInfo = iterator.fileInfo();
if (fileInfo.isFile())
{
totalSize += fileInfo.size();
}
}
return totalSize;
}
QList<FileData> *FastHashCalculator::getHashList() const
{
return hashList;
}

38
Core/fasthashcalculator.h Normal file
View File

@@ -0,0 +1,38 @@
#ifndef FASTHASHCALCULATOR_H
#define FASTHASHCALCULATOR_H
#include <QHash>
#include <QMutex>
#include <QObject>
#include <QFile>
#include <QDirIterator>
#include <Data/FileData.h>
#include "tools.h"
class FastHashCalculator : public QObject
{
Q_OBJECT
public:
explicit FastHashCalculator(QObject *parent = nullptr);
void calculateHashes(const QString& path, const QString& ignoreName);
QList<FileData> *getHashList() const;
signals:
void sigSendHashInfo(QString fullSize,QString current);
void finished();
private:
QByteArray calculateFileHashOptimized(const QString &filePath);
void calculateSingleHash(const QString &filePath);
QList<FileData>* hashList;
QMutex _mutex;
QString fullSize;
quint64 currentSize;
quint64 getDirectorySize(const QString &path);
void hashCounterDisplay(quint64 size);
};
#endif // FASTHASHCALCULATOR_H

View File

@@ -13,18 +13,29 @@ void HashComparer::initialize(VersionContainer *versionContainer,UpdateNotifyWid
this->versionContainer = versionContainer;
this->updateWidget = updateWidget;
filesForUpdate = new QList<FileData>;
connect(this,&HashComparer::sigAddToList,updateWidget,&UpdateNotifyWidget::addToList,Qt::QueuedConnection);
connect(this,&HashComparer::sigGetUpdateList,updateWidget,&UpdateNotifyWidget::getUpdateList,Qt::DirectConnection);
}
void HashComparer::CompareDeltas(QList<FileData> *serverStreamingHash, QList<FileData> localStreamingHash)
{
QList<FileData> *files = new QList<FileData>;
serverFiles = new QList<FileData>;
QMutableListIterator<FileData> iterator(localStreamingHash);
for (auto &item:localStreamingHash)
{
if(!serverStreamingHash->contains(item))
{
if (item.path.contains("docs.xml")) continue; //фильтр на docs
if (item.path.contains("CfiList.xml")) continue;
qint32 fileDataIndex = findIndexByPath(*serverStreamingHash, item.path);
if (fileDataIndex != -1)
{
serverFiles->append(serverStreamingHash->at(fileDataIndex));
}
files->append(item);
}
}
@@ -33,6 +44,17 @@ void HashComparer::CompareDeltas(QList<FileData> *serverStreamingHash, QList<Fil
showDeltas();
}
quint32 HashComparer::findIndexByPath(const QList<FileData> &serverStreamingHash,QString path)
{
for(int i = 0; i < serverStreamingHash.size(); i++)
{
if(serverStreamingHash.at(i).path == path)
return i;
}
return -1;
}
void HashComparer::showDeltas()
{
@@ -41,9 +63,19 @@ void HashComparer::showDeltas()
emit sigCallCheck();
return;
}
for (auto &item:*filesForUpdate)
for (int i = 0; i < filesForUpdate->size(); i++)
{
updateWidget->addToList(item);
FileData local = filesForUpdate->at(i);
FileData server = FileData();
server.lastUpdate = "нет";
if (serverFiles->size() > i)
{
server = serverFiles->at(i);
}
emit sigAddToList(local,server);
}
emit sigHaveDelta();
@@ -56,7 +88,7 @@ quint16 HashComparer::getFileUpdateCount() const
QList<FileData> *HashComparer::getFilesForUpdate() const
{
QList<FileData> *completeList = filesForUpdate;
QList<FileData> *completeList = emit sigGetUpdateList();
for (int i = 0; i < completeList->count();i++)
{
@@ -69,5 +101,5 @@ QList<FileData> *HashComparer::getFilesForUpdate() const
completeList->replace(i,data);
}
return filesForUpdate;
return completeList;
}

View File

@@ -23,10 +23,15 @@ public:
signals:
void sigCallCheck();
void sigHaveDelta();
void sigAddToList(FileData local, FileData server);
QList<FileData> *sigGetUpdateList() const;
private:
UpdateNotifyWidget* updateWidget;
QList<FileData> *filesForUpdate;
QList<FileData> *serverFiles;
VersionContainer *versionContainer;
quint32 findIndexByPath(const QList<FileData> &serverStreamingHash, QString path);
};
#endif // HASHCOMPARER_H

View File

@@ -19,14 +19,29 @@ void PostProcessorSystem::initialize(DataParserOutput *dataParserOutput,
}
void PostProcessorSystem::userArchived()
{
emit sigShowError(ErrorsEnum::ARCHIVED);
}
void PostProcessorSystem::wrongLoginOrPass()
{
emit sigShowError(ErrorsEnum::LOGIN_OR_PASS);
}
void PostProcessorSystem::alreadyLogin()
{
emit sigShowError(ErrorsEnum::ALREADYLOGIN);
}
void PostProcessorSystem::socketDisable()
{
emit sigSocketDisabled();
emit sigShowError(ErrorsEnum::DISABLE);
}
void PostProcessorSystem::serverBlocked()
{
emit sigServerBlocked();
emit sigShowError(ErrorsEnum::BLOCKED);
}
void PostProcessorSystem::startCompare()
@@ -54,14 +69,6 @@ void PostProcessorSystem::compareFiles()
updateController->updateFilesOnServer(hashComparer->getFilesForUpdate());
}
void PostProcessorSystem::checkAccessType(const QString& type)
{
if(type == "instructor")
{
emit sigCallUpdateList();
}
}
void PostProcessorSystem::saveLoginData(ServerAuthorization *auth)
{
emit sigSaveLoginData(auth);

View File

@@ -5,6 +5,7 @@
#include "UpdateController.h"
#include <QObject>
#include <Data/Datas.h>
#include <Data/ErrorsEnum.h>
class PostProcessorSystem : public QObject
{
@@ -20,13 +21,14 @@ public:
void serverBlocked();
void startCompare();
void compareFiles();
void checkAccessType(const QString& type);
void saveLoginData(ServerAuthorization *auth);
void setServerVersion(StreamingVersionData *serverVersion);
void calculateCommonHash();
void userArchived();
void wrongLoginOrPass();
void alreadyLogin();
signals:
void sigSocketDisabled();
void sigServerBlocked();
void sigShowError(ErrorsEnum error);
void sigStartCompare(QList<FileData> *serverStreamingHash, QList<FileData> localStreamingHash);
void sigCallUpdateList();
void sigSaveLoginData(ServerAuthorization *serverAuth);

View File

@@ -1,273 +1,325 @@
#include "Core/recognizesystem.h"
#include <QMessageBox>
RecognizeSystem::RecognizeSystem(QObject *parent):
QObject(parent),
versionContainer(nullptr),
dataParser(nullptr),
postProcessorSystem(nullptr)
postProcessorSystem(nullptr),
client(nullptr)
{
packetType = PacketType::TYPE_NONE;
filePath.clear();
filePath = "";
fileSize = 0;
sizeReceiveData = 0;
tmpBlock.clear();
countSend = 0;
}
void RecognizeSystem::initialize(DataParser *dataParser, VersionContainer *versionContainer,PostProcessorSystem *postProcessorSystem)
void RecognizeSystem::initialize(DataParser *dataParser, VersionContainer *versionContainer,PostProcessorSystem *postProcessorSystem,Client *client)
{
this->versionContainer = versionContainer;
this->postProcessorSystem = postProcessorSystem;
this->versionContainer = versionContainer;
this->dataParser = dataParser;
this->postProcessorSystem = postProcessorSystem;
this->client = client;
}
void RecognizeSystem::recognize(QTcpSocket *socket)
{
qDebug() << "RecognizeThreadId " << QThread::currentThreadId();
//qDebug() << "RecognizeThreadId " << QThread::currentThreadId();
QDataStream stream(socket);
stream.setVersion(QDataStream::Qt_DefaultCompiledVersion);
while(socket->bytesAvailable())
int cntBytesAvl = 0;
while((cntBytesAvl = socket->bytesAvailable()) > 0)
{
if (socket->state() != QTcpSocket::ConnectedState)
{
qDebug() << "RecognizeSystem::recognize socket->state() != QTcpSocket::ConnectedState";
return;
}
if (socket->state() != QTcpSocket::ConnectedState) return;
if(packetType == PacketType::TYPE_NONE){ //определение первичного пакета
if(packetType == PacketType::TYPE_NONE) //определение первичного пакета
{
stream.startTransaction();
stream >> packetType;
if(!stream.commitTransaction()){
emit sigSendDebugLog(Tools::getTime() + " CLIENT: packetType - FAIL commitTransaction");
if(socket->waitForReadyRead(TCP_READ_TIMEOUT)){
emit sigSendDebugLog("ERROR: PACKET TYPE READ TIMEOUT");
return;
}
if(!stream.commitTransaction())
{
socket->waitForReadyRead(TCP_READ_TIMEOUT);
continue;
}
//qDebug() << Tools::GetTime() << "CLIENT: type: " << packetType;
if(packetType == PacketType::TYPE_FILE)
socket->waitForReadyRead(10);
else
socket->waitForReadyRead(100);
}
if(packetType == PacketType::TYPE_FOLDER){ //создание папок
stream.startTransaction();
stream >> filePath;
if(!stream.commitTransaction()){
continue;
}
filePath = Tools::createReceiveFullPath(filePath,versionContainer->getServerVersionData());
QDir dir(filePath);
if(!dir.exists()){
if(dir.mkpath(filePath)){
qDebug() << "Dir Created";
}
}
packetType = PacketType::TYPE_NONE;
emit sigUpdateBytesAvailable();
continue;
}
if(packetType == PacketType::TYPE_FILE) //загрузка файлов
switch ((int)packetType)
{
//ПОЛУЧЕНИЕ ПУТИ
//ПОЛУЧЕНИЕ РАЗМЕРА ФАЙЛА
forever
case PacketType::TYPE_FOLDER: //создание папок
{
stream.startTransaction();
stream >> filePath;
stream >> fileSize;
if(!stream.commitTransaction()){
emit sigSendDebugLog(Tools::getTime() + "CLIENT: filePath, fileSize - FAIL commitTransaction");
if (!socket->waitForReadyRead(TCP_READ_TIMEOUT)) {
emit sigSendDebugLog(Tools::getTime() + "CLIENT: ERROR! readyRead timeout - filePath, fileSize!!!");
return;
}
if(!stream.commitTransaction())
{
socket->waitForReadyRead(TCP_READ_TIMEOUT);
continue;
}
filePath = Tools::createReceiveFullPath(filePath,versionContainer->getServerVersionData());
emit sigSendDebugLog("CLIENT: filesize: " + QString::number(fileSize));
emit sigSendDebugLog("CLIENT: filePath: " + filePath);
socket->waitForReadyRead(100);
break;
}
//ПОЛУЧЕНИЕ САМОГО ФАЙЛА
emit sigSendDebugLog(Tools::getTime() + "AfterRead size and path BytesAvailable: " + socket->bytesAvailable());
//УКАЗАНИЕ ПУТИ ФАЙЛА
QFile file(filePath);
if (file.exists())
{
file.remove(); //удаление файла, если он уже есть, но необходимо обновить
emit sigSendDebugLog(Tools::getTime() + "Delete exist file: " + filePath);
socket->waitForReadyRead(100);
}
file.open(QFile::Append);
forever
{
stream.startTransaction();
stream >> tmpBlock;
if(!stream.commitTransaction()){
if(socket->state() == QAbstractSocket::UnconnectedState){
postProcessorSystem->socketDisable();
//emit sigSocketDisabled();
return;
QDir dir(filePath);
if(!dir.exists())
{
if(dir.mkpath(filePath))
{
qDebug() << "Dir Created: " << filePath;
}
if(socket->waitForReadyRead(TCP_READ_TIMEOUT)){
}
emit sigUpdateBytesAvailable();
}
break;
case PacketType::TYPE_FILE: //загрузка файлов
{
//ПОЛУЧЕНИЕ ПУТИ
//ПОЛУЧЕНИЕ РАЗМЕРА ФАЙЛА
forever
{
stream.startTransaction();
stream >> filePath;
stream >> fileSize;
if(!stream.commitTransaction())
{
emit sigSendDebugLog(Tools::getTime() + "CLIENT: filePath, fileSize - FAIL commitTransaction");
socket->waitForReadyRead(TCP_READ_TIMEOUT);
continue;
}
filePath = Tools::createReceiveFullPath(filePath,versionContainer->getServerVersionData());
emit sigSendDebugLog("CLIENT: filesize: " + QString::number(fileSize));
emit sigSendDebugLog("CLIENT: filePath: " + filePath);
socket->waitForReadyRead(10);
break;
}
//ПОЛУЧЕНИЕ САМОГО ФАЙЛА
emit sigSendDebugLog(Tools::getTime() + "AfterRead size and path BytesAvailable: " + socket->bytesAvailable());
//УКАЗАНИЕ ПУТИ ФАЙЛА
QFile file(filePath);
if (file.exists())
{
file.remove(); //удаление файла, если он уже есть, но необходимо обновить
emit sigSendDebugLog(Tools::getTime() + "Delete exist file: " + filePath);
//socket->waitForReadyRead(10);
}
tmpBlock.clear();
sizeReceiveData = 0;
countSend = 0;
file.open(QFile::WriteOnly);
if(! file.isOpen())
QMessageBox::critical(nullptr, "P1", "isOpen false. File: " + file.fileName());
if(! file.isWritable())
QMessageBox::critical(nullptr, "P2", "isWritable false. File: " + file.fileName());
while(true)
{
if(socket->bytesAvailable() <= 0)
{
socket->waitForReadyRead(10);
continue;
}
if(fileSize - sizeReceiveData >= BLOCK_SIZE)
tmpBlock = socket->read(BLOCK_SIZE);
else
tmpBlock = socket->read(fileSize - sizeReceiveData);
qint64 bytesReceived = tmpBlock.length();
if(bytesReceived <= 0)
{
//QMessageBox::critical(nullptr, "P3", "bytesReceived <= 0. File: " + file.fileName());
continue;
}
sizeReceiveData += bytesReceived;
countSend++;
qint64 toFile = file.write(tmpBlock);
if(toFile <= 0)
{
//emit sigUpdateBytesAvailable();
QMessageBox::critical(nullptr, "P4", "write toFile <= 0. File: " + file.fileName());
continue;
}
tmpBlock.clear();
if(sizeReceiveData == fileSize)
{
emit sigSendDebugLog(Tools::getTime() + "FINAL Count send: " + QString::number(countSend));
emit sigSendDebugLog(Tools::getTime() + "FINAL Size received: " + QString::number(sizeReceiveData));
emit sigSendDebugLog(Tools::getTime() + "FINAL File size" + QString::number(fileSize));
emit sigUpdateBytesAvailable();
break;
}
else if(sizeReceiveData > fileSize)
{
QMessageBox::critical(nullptr, "P5", "sizeReceiveData > fileSize");
}
}
file.close();
emit sigSendDebugLog(Tools::getTime() + "File loaded");
//ОЧИСТКА ПОСЛЕ ПЕРЕДАЧИ
filePath.clear();
fileSize = 0;
tmpBlock.clear();
sizeReceiveData = 0;
countSend = 0;
}
break;
case PacketType::TYPE_DELETE: //удаление лишних файлов (рекурсивно удаляет все содежимое)
{
stream.startTransaction();
stream >> filePath;
if(!stream.commitTransaction())
{
socket->waitForReadyRead(TCP_READ_TIMEOUT);
continue;
}
quint64 toFile = file.write(tmpBlock);
emit sigSendDebugLog(Tools::getTime() + "CLIENT: toFile :" + toFile);
filePath = Tools::createReceiveFullPath(filePath,versionContainer->getServerVersionData());
sizeReceiveData += toFile;
countSend++;
QFileInfo fileInfo(filePath);
tmpBlock.clear();
if(sizeReceiveData == fileSize){
emit sigSendDebugLog(Tools::getTime() + "FINAL Count send: " + QString::number(countSend));
emit sigSendDebugLog(Tools::getTime() + "FINAL Size received: " + QString::number(sizeReceiveData));
emit sigSendDebugLog(Tools::getTime() + "FINAL File size" + QString::number(fileSize));
emit sigUpdateBytesAvailable();
break;
}
}
file.close();
emit sigSendDebugLog(Tools::getTime() + "File loaded");
//ОЧИСТКА ПОСЛЕ ПЕРЕДАЧИ
filePath.clear();
fileSize = 0;
tmpBlock.clear();
sizeReceiveData = 0;
countSend = 0;
}
if(packetType == PacketType::TYPE_DELETE) //удаление лишних файлов (рекурсивно удаляет все содежимое)
{
stream.startTransaction();
stream >> filePath;
if(!stream.commitTransaction()){
continue;
}
filePath = Tools::createReceiveFullPath(filePath,versionContainer->getServerVersionData());
QFileInfo fileInfo(filePath);
if(fileInfo.exists())
{
if(fileInfo.isFile())
if(fileInfo.exists())
{
QFile file(filePath);
file.remove();
if(fileInfo.isFile())
{
QFile file(filePath);
file.remove();
}
if(fileInfo.isDir())
{
QDir dir(filePath);
dir.removeRecursively();
}
qDebug() << Tools::getTime() << "Deleted: " << filePath;
}
}
break;
case PacketType::TYPE_NEEDUPDATE: //нужно обновление
{
bool flag = false;
quint64 size = 0;
quint64 fileCount = 0;
quint64 fileDelete = 0;
stream.startTransaction();
stream >> flag;
stream >> size;
stream >> fileCount;
stream >> fileDelete;
if(!stream.commitTransaction())
{
socket->waitForReadyRead(TCP_READ_TIMEOUT);
continue;
}
if(fileInfo.isDir()){
QDir dir(filePath);
dir.removeRecursively();
emit sigNeedUpdate(flag,size,fileCount,fileDelete);
}
break;
case PacketType::TYPE_XMLANSWER: //ответы формата XML
{
QByteArray array;
stream.startTransaction();
stream >> array;
if(!stream.commitTransaction())
{
socket->waitForReadyRead(TCP_READ_TIMEOUT);
continue;
}
qDebug() << Tools::getTime() << "Deleted: " << filePath;
dataParser->xmlParser(array);
}
break;
packetType = PacketType::TYPE_NONE;
continue;
}
if (packetType ==PacketType::TYPE_FINISH) //для повторного создания хэша после загрузки
{
postProcessorSystem->calculateCommonHash();
emit sigLoadComplete();
packetType = PacketType::TYPE_NONE;
}
if(packetType == PacketType::TYPE_NEEDUPDATE){ //нужно обновление
bool flag = false;
quint64 size = 0;
quint64 fileCount = 0;
quint64 fileDelete = 0;
stream.startTransaction();
stream >> flag;
stream >> size;
stream >> fileCount;
stream >> fileDelete;
if(!stream.commitTransaction()){
continue;
case PacketType::HASH_READY:
{
emit sigCheckUpdate();
}
break;
emit sigNeedUpdate(flag,size,fileCount,fileDelete);
packetType = PacketType::TYPE_NONE;
}
if(packetType == PacketType::TYPE_XMLANSWER){ //ответы формата XML
QByteArray array;
stream.startTransaction();
stream >> array;
if(!stream.commitTransaction()){
continue;
case PacketType::RECALCULATE_HASH:
{
emit sigdRecalculateHashOnServerState();
}
break;
dataParser->xmlParser(array);
case PacketType::BUSY:
{
emit sigAnimationActivated(true);
}
break;
packetType = PacketType::TYPE_NONE;
case PacketType::FREE:
{
emit sigAnimationActivated(false);
}
break;
case PacketType::TYPE_XMLANSWER_DOCS_CHANGED: //на случай общего обновления
{
if (client->getIsLoggedIn())
{
emit sigSendPacketType(PacketType::GET_DOCS);
}
}
break;
case PacketType::UPDATE_FILE_COMPLETE:
{
postProcessorSystem->calculateCommonHash();
emit sigLoadComplete();
emit sigSendPacketType(PacketType::GET_DOCS);
}
break;
default:
qCritical() << "RecognizeSystem::recognize packetType unknown!";
}
if(packetType == PacketType::HASH_READY)
{
emit sigCheckUpdate();
//mainWindow->checkUpdate();
}
if(packetType == PacketType::HASH_CALCULATE_START)
{
emit sigdRecalculateHashOnServerState();
}
if(packetType == PacketType::BUSY)
{
emit sigAnimationActivated(true);
}
if(packetType == PacketType::FREE)
{
emit sigAnimationActivated(false);
}
//socket->waitForReadyRead(10);
packetType = PacketType::TYPE_NONE;
}

View File

@@ -10,9 +10,12 @@
#include <QThread>
#include <Core\tools.h>
#include <Core\versioncontainer.h>
#include <Data/Client.h>
#include <Data\streamingversiondata.h>
#include <Core\hashcomparer.h>
const int BLOCK_SIZE = 1024 * 1024; // Размер блока
class RecognizeSystem : public QObject
{
Q_OBJECT
@@ -20,8 +23,10 @@ class RecognizeSystem : public QObject
public:
explicit RecognizeSystem(QObject *parent = 0);
~RecognizeSystem(){};
void initialize(DataParser *dataParser, VersionContainer* versionContainer,PostProcessorSystem *postProcessorSystem);
void initialize(DataParser *dataParser, VersionContainer* versionContainer,PostProcessorSystem *postProcessorSystem,Client *client);
void recognize(QTcpSocket *socket);
signals:
void sigUpdateBytesAvailable();
void sigLoadComplete();
@@ -30,17 +35,22 @@ signals:
void sigAnimationActivated(bool flag);
void sigCheckUpdate();
void sigdRecalculateHashOnServerState();
void sigSendPacketType(PacketType packetType);
void sigSendPacketTypeWithDelay(PacketType packetType,int delay);
void sigSendToInlineLog(QString message);
//void sigCallUpdateList();
private:
VersionContainer *versionContainer;
DataParser *dataParser;
PostProcessorSystem *postProcessorSystem;
Client *client;
PacketType packetType;
QString filePath;
QByteArray tmpBlock;
qint64 sizeReceiveData;
qint64 fileSize;
qint64 sizeReceiveData;
QByteArray tmpBlock;
int countSend;
};

View File

@@ -157,16 +157,6 @@ void SendSystem::sendXMLAnswer(const QByteArray& array)
qDebug() << "Send XML answer in byte";
}
void SendSystem::sendFinish()
{
socket->waitForReadyRead(100);
QDataStream stream(socket);
stream.setVersion(QDataStream::Qt_DefaultCompiledVersion);
stream << PacketType::TYPE_FINISH;
socket->waitForReadyRead(100);
}
void SendSystem::sendPacketType(PacketType packetType)
{
QDataStream stream(socket);
@@ -175,12 +165,47 @@ void SendSystem::sendPacketType(PacketType packetType)
stream << packetType;
}
void SendSystem::sendPacketTypeWithDelay(PacketType packetType,int delay)
{
QDataStream stream(socket);
stream.setVersion(QDataStream::Qt_DefaultCompiledVersion);
socket->waitForReadyRead(delay);
stream << packetType;
}
void SendSystem::sendCheckHash()
{
QDataStream stream(socket);
stream.setVersion(QDataStream::Qt_DefaultCompiledVersion);
QString fullPath = Tools::createSendFullPath(staticDataFolderName + hashFilename);
sendFileBlock(staticDataFolderName + hashFilename);
quint64 fileSize = 0;
int countSend = 0;
QFile file(fullPath); //Открываем файл для чтения
QFileInfo fileInfo(file);
fileSize = fileInfo.size();
stream << PacketType::SEND_HASH; //Отправляем тип блока
stream << fileSize;
socket->waitForReadyRead(20);
//socket->waitForBytesWritten();
if(file.open(QFile::ReadOnly)){
while(!file.atEnd()){
QByteArray data = file.read(readSize);
stream << data;
socket->waitForBytesWritten(20);
countSend++;
}
qDebug() << Tools::getTime() << "count end Final: " << countSend;
}
file.close();
countSend = 0;
socket->waitForReadyRead(2000);
stream << PacketType::TYPE_CHECK_VERSION;

View File

@@ -25,6 +25,7 @@ public:
void sendCheckHash();
void sendPacketType(PacketType packetType);
~SendSystem(){};
void sendPacketTypeWithDelay(PacketType packetType, int delay);
signals:
void sigSend();
QByteArray sigGetXmlAnswer(QString);

View File

@@ -17,7 +17,7 @@ void TCPClient::initialize(RecognizeSystem *recognize,SendSystem *sendSystem)
emit sigSendDebugLog(Tools::getTime() + " Client started");
}
void TCPClient::setConnect(ServerSettings *serverSettings)
void TCPClient::setConnect(Settings *serverSettings)
{
socket = new QTcpSocket();
qDebug() << "TCPCLient thread: " << thread();
@@ -47,7 +47,6 @@ void TCPClient::setConnect(ServerSettings *serverSettings)
}
}
void TCPClient::setDisconnect()
{
socket->disconnect();

View File

@@ -21,9 +21,9 @@ class TCPClient : public QObject
public:
explicit TCPClient(QObject *parent = 0);
void initialize(RecognizeSystem *recognize,SendSystem *sendSystem);
void setConnect(ServerSettings *serverSettings);
void setConnect(Settings *serverSettings);
~TCPClient(){};
void setDisconnect();
bool getIsConnected() const;
signals:
@@ -43,8 +43,6 @@ private:
QTcpSocket *socket;
RecognizeSystem *recognizeSystem;
bool isConnected;
void setDisconnect();
};
#endif // TCPCLIENT_H

View File

@@ -12,12 +12,12 @@ QString Tools::getTime()
QString Tools::createLocalPath(QString path)
{
qDebug() << "Full path: " << path;
//qDebug() << "Full path: " << path;
qint8 pos = path.indexOf("Application");
QString localPath = path.remove(0,--pos);
qDebug() << "Local path: " << localPath;
//qDebug() << "Local path: " << localPath;
return localPath;
}

View File

@@ -39,13 +39,16 @@ enum PacketType{
TYPE_COMMAND = 3,
TYPE_FOLDER = 4,
TYPE_DELETE = 5,
TYPE_FINISH = 6,
UPDATE_FILE_COMPLETE = 6,
TYPE_NEEDUPDATE = 7,
TYPE_XMLANSWER = 8,
TYPE_QT = 9,
TYPE_DISABLE = 11,
TYPE_UPDATE = 12,
TYPE_CHECK_VERSION = 13,
UPDATE_DOCS_COMPLETE = 22,
TYPE_XMLANSWER_DOCS_CHANGED = 132,
HASH_READY = 150,
CHANGE_DATA_VERSION = 151,
@@ -53,7 +56,10 @@ enum PacketType{
DELETE_DATA_VERSION = 153,
BUSY = 154,
FREE = 155,
HASH_CALCULATE_START = 156
RECALCULATE_HASH = 156,
RECALCULATE_DOCS = 157,
GET_DOCS = 158,
SEND_HASH = 159
};

105
Data/Client.h Normal file
View File

@@ -0,0 +1,105 @@
#ifndef CLIENT_H
#define CLIENT_H
#include <QString>
#include <QTcpSocket>
class Client
{
public:
Client():
login(""),
ready(false)
{ };
~Client(){};
public:
QString getFullName()
{
return fullName;
};
void setLogin(QString login)
{
this->login = login;
isLoggedIn = true;
fullName = "Name: " + name + " IP: " + address + " port : " + port + " login: " + login;
}
QString getLogin()
{
return login;
}
QString getAddress()
{
return address;
}
QString getPort()
{
return port;
}
bool getReady()
{
return ready;
}
void setReady(bool ready)
{
this->ready = ready;
}
bool operator == (Client* right)
{
return this->address == right->address;
}
bool getIsLoggedIn()
{
return isLoggedIn;
}
void setIsLoggedIn(bool value)
{
isLoggedIn = value;
}
QString getId()
{
return id;
}
void setId(QString value)
{
id = value;
}
QByteArray getClientHash()
{
return clientHash;
}
void setClientHash(const QByteArray &value)
{
clientHash = value;
}
private:
QString name;
QString address;
QString port;
QString fullName;
QString id;
QString login;
bool ready;
bool isLoggedIn;
QByteArray clientHash;
};
#endif // CLIENT_H

View File

@@ -5,14 +5,14 @@
#include <QString>
class ServerSettings{
class Settings{
public:
QString Address;
QString Port;
QString Language;
QString LocalVersionName;
StreamingVersionData versionData;
bool isAutoStart;
bool isAutoStart = false;
bool mathModelUse;
};

13
Data/ErrorsEnum.h Normal file
View File

@@ -0,0 +1,13 @@
#ifndef ERRORSENUM_H
#define ERRORSENUM_H
enum ErrorsEnum
{
BLOCKED,
ARCHIVED,
LOGIN_OR_PASS,
ALREADYLOGIN,
DISABLE
};
#endif // ERRORSENUM_H

View File

@@ -8,6 +8,7 @@ struct FileData
{
QString path;
QString hash;
QString lastUpdate;
bool operator==(const FileData& other)const
{

View File

@@ -1,11 +1,10 @@
QT += core gui
QT += network
QT += xml
QT += concurrent
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++11
# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
@@ -19,6 +18,7 @@ DEFINES += QT_DEPRECATED_WARNINGS
SOURCES += \
Core/dataparseroutput.cpp \
Core/fasthashcalculator.cpp \
Core/notifycontroller.cpp \
Core/postprocessorsystem.cpp \
Core/sendsystem.cpp \
@@ -32,6 +32,7 @@ SOURCES += \
Core\tools.cpp\
Core\hashcomparer.cpp \
UI/resourcemanager.cpp \
Widgets/updatefileslot.cpp \
Widgets/waitanimationwidget.cpp \
Widgets\commonbuttongroupwidget.cpp \
Widgets\entrywidget.cpp \
@@ -46,6 +47,7 @@ SOURCES += \
HEADERS += \
Core/dataparseroutput.h \
Core/fasthashcalculator.h \
Core/notifycontroller.h \
Core/postprocessorsystem.h \
Core/versioncontainer.h \
@@ -58,11 +60,14 @@ HEADERS += \
Core\tcpclient.h\
Core\tools.h\
Core\hashcomparer.h \
Data/Client.h \
Data/ErrorsEnum.h \
Data/monitorInfo.h \
Data/streamingversiondata.h \
Data\FileData.h\
Data\Datas.h \
UI/resourcemanager.h \
Widgets/updatefileslot.h \
Widgets/waitanimationwidget.h \
Widgets\commonbuttongroupwidget.h \
Widgets\entrywidget.h \
@@ -75,6 +80,7 @@ HEADERS += \
widgetmanager.h
FORMS += \
Widgets/updatefileslot.ui \
Widgets/waitanimationwidget.ui \
Widgets\commonbuttongroupwidget.ui \
Widgets\entrywidget.ui \
@@ -85,11 +91,15 @@ FORMS += \
TRANSLATIONS = QtLanguage_ru.ts\
QtLanguage_eng.ts
#TEMPLATE = subdirs
#SUBDIRS += Unit-tests\
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
TARGET = ClientMPS
RESOURCES += \
resources.qrc

2
StaticData/authData.xml Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<AuthData Login="I3" Password="2be9bd7a3434f7038ca27d1918de58bd" InstructorName="Моськин В.М." ClientName="Моськин В.М." AccessType="instructor"/>

14328
StaticData/clientHash.xml Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,2 @@
<DisplayInfo DisplaysID="0;"/>

14305
StaticData/serverHash.xml Normal file

File diff suppressed because it is too large Load Diff

5
StaticData/settings.xml Normal file
View File

@@ -0,0 +1,5 @@
<?xml version='1.0' encoding='UTF-8'?>
<ServerSettingsContainer>
<ServerSettings Port="6000" Address="192.168.100.83" Language="RUS" AutoStart="0"/>
<VersionData Version="customND" isChangable="1" Created="Пт мар 6 10:49:55 2026"/>
</ServerSettingsContainer>

14117
StaticData/streamingHash.xml Normal file

File diff suppressed because it is too large Load Diff

2
StaticData/temp.xml Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<ClientNotify Code="GETSERVERDATALIST"/>

View File

@@ -14,8 +14,10 @@ void CommonButtonGroupWidget::initialize()
ui->loadingProgressBar->hide();
ui->updateButton->hide();
ui->startButton->hide();
ui->startButton->setEnabled(false);
ui->startButton->setEnabled(false);
ui->offlineStartButton->hide();
show();
down = ui->downlayout;
}
void CommonButtonGroupWidget::updateProgressBar(float value)
@@ -23,13 +25,19 @@ void CommonButtonGroupWidget::updateProgressBar(float value)
ui->loadingProgressBar->setValue(value);
}
QHBoxLayout *CommonButtonGroupWidget::getDown() const
{
return down;
}
void CommonButtonGroupWidget::loadCompleteState()
{
show();
ui->updateButton->setEnabled(false);
ui->updateButton->hide();
ui->startButton->setEnabled(true);
ui->loadingProgressBar->setValue(100);
ui->startButton->show();
ui->offlineStartButton->show();
ui->loadingProgressBar->setValue(100);
ui->loadingProgressBar->hide();
}
@@ -39,7 +47,9 @@ void CommonButtonGroupWidget::lastVerInstalledState()
ui->updateButton->hide();
ui->loadingProgressBar->hide();
ui->startButton->setEnabled(true);
hideSpacer(true);
ui->startButton->show();
ui->offlineStartButton->show();
}
void CommonButtonGroupWidget::disconnectState()
@@ -48,16 +58,32 @@ void CommonButtonGroupWidget::disconnectState()
ui->loadingProgressBar->hide();
ui->updateButton->hide();
ui->updateButton->setEnabled(false);
ui->offlineStartButton->hide();
hideSpacer(false);
}
void CommonButtonGroupWidget::startUpdateState()
{
ui->updateButton->hide();
ui->startButton->hide();
ui->offlineStartButton->hide();
ui->loadingProgressBar->setValue(0);
ui->loadingProgressBar->show();
}
void CommonButtonGroupWidget::loginState()
{
bool isAvailable = emit sigAppAvailable();
if (isAvailable)
{
ui->offlineStartButton->show();
}
else
{
ui->offlineStartButton->hide();
}
}
void CommonButtonGroupWidget::showProgressBar(bool flag)
{
if (flag) ui->loadingProgressBar->show();
@@ -66,6 +92,9 @@ void CommonButtonGroupWidget::showProgressBar(bool flag)
void CommonButtonGroupWidget::needUpdateState(bool flag)
{
show();
hideSpacer(true);
ui->loadingProgressBar->hide();
ui->startButton->hide();
ui->updateButton->setEnabled(flag);
ui->updateButton->show();
@@ -73,6 +102,9 @@ void CommonButtonGroupWidget::needUpdateState(bool flag)
void CommonButtonGroupWidget::startButtonActive(bool flag)
{
if(flag) ui->offlineStartButton->show();
else ui->offlineStartButton->hide();
ui->startButton->setEnabled(flag);
}
@@ -94,6 +126,13 @@ CommonButtonGroupWidget::~CommonButtonGroupWidget()
delete ui;
}
void CommonButtonGroupWidget::hideSpacer(bool flag)
{
if(flag) ui->horizontalSpacer->changeSize(0,0,QSizePolicy::Fixed,QSizePolicy::Fixed);
else ui->horizontalSpacer->changeSize(40,20,QSizePolicy::Expanding,QSizePolicy::Minimum);
}
void CommonButtonGroupWidget::on_offlineStartButton_clicked()
{
emit sigStartOfflineUnityClient();
}

View File

@@ -1,6 +1,7 @@
#ifndef COMMONBUTTONGROUPWIDGET_H
#define COMMONBUTTONGROUPWIDGET_H
#include <QHBoxLayout>
#include <QWidget>
#include <Core/tcpclient.h>
@@ -20,6 +21,7 @@ public:
void lastVerInstalledState();
void disconnectState();
void startUpdateState();
void loginState();
void showProgressBar(bool flag);
void needUpdateState(bool flag);
void startButtonActive(bool flag);
@@ -28,16 +30,22 @@ signals:
void sigSendPacket(PacketType packet);
void sigUpdateCommonWidget();
void sigStartUnityClient();
void sigStartOfflineUnityClient();
bool sigAppAvailable();
private slots:
void on_updateButton_clicked();
void on_startButton_clicked();
void on_offlineStartButton_clicked();
public:
void updateProgressBar(float value);
QHBoxLayout *getDown() const;
private:
Ui::CommonButtonGroupWidget *ui;
QHBoxLayout *down;
void hideSpacer(bool flag);
};
#endif // COMMONBUTTONGROUPWIDGET_H

View File

@@ -6,12 +6,12 @@
<rect>
<x>0</x>
<y>0</y>
<width>520</width>
<width>763</width>
<height>45</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
@@ -30,12 +30,12 @@
<rect>
<x>0</x>
<y>0</y>
<width>520</width>
<width>761</width>
<height>45</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
@@ -99,14 +99,14 @@
<bool>true</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<sizepolicy hsizetype="Expanding" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>100</width>
<width>500</width>
<height>35</height>
</size>
</property>
@@ -143,7 +143,7 @@
</property>
<property name="minimumSize">
<size>
<width>100</width>
<width>500</width>
<height>35</height>
</size>
</property>
@@ -158,6 +158,47 @@
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Expanding</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="offlineStartButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>250</width>
<height>0</height>
</size>
</property>
<property name="sizeIncrement">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>Запуск в автономном режиме</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget>

View File

@@ -1,9 +1,14 @@
#include "entrywidget.h"
#include "ui_entrywidget.h"
#include <bits/functional_hash.h>
#include <QCryptographicHash>
EntryWidget::EntryWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::EntryWidget)
ui(new Ui::EntryWidget),
isAppAvailable(false)
{
ui->setupUi(this);
}
@@ -18,6 +23,7 @@ void EntryWidget::initialize()
void EntryWidget::disconnectState()
{
show();
setAppAvailable(emit sigAppAvalable());
ui->offlineWidget->show();
ui->loginWidget->hide();
}
@@ -34,7 +40,9 @@ ClientAutorization* EntryWidget::getAuthData()
QString username = ui->loginInputField->text();
QString password = ui->passwordInputField->text();
data->Login = username;
data->Password = password;
QByteArray md5Hash = QCryptographicHash::hash(password.toUtf8(), QCryptographicHash::Md5).toHex();
data->Password = QString(md5Hash);
return data;
}
@@ -59,25 +67,10 @@ void EntryWidget::on_saveServerButton_clicked()
emit sigSaveServerSettings();
}
ServerSettings *EntryWidget::getServerSettings()
{
ServerSettings *data = new ServerSettings;
QString server = ui->serverInputField->text();
QString port = ui->portInputField->text();
//bool checked = ui->mathModelUsecheckBox->isChecked();
data->Address = server;
data->Port = port;
data->mathModelUse = true;
return data;
}
void EntryWidget::fillSettings(ServerSettings *settings)
void EntryWidget::fillSettings(Settings *settings)
{
ui->serverInputField->setText(settings->Address);
ui->portInputField->setText(settings->Port);
//ui->mathModelUsecheckBox->setChecked(settings->mathModelUse);
}
void EntryWidget::isActive(bool flag)
@@ -91,6 +84,30 @@ bool EntryWidget::getLoginWidgetIsHidden()
return ui->loginWidget->isHidden();
}
void EntryWidget::setAppAvailable(bool flag)
{
isAppAvailable = flag;
if (flag)
{
QString text = tr("Связь с сервером не установлена! Проверьте настройки или запустите в автономном режиме");
ui->offlineNotifyLabel->setText(text);
}
else
{
QString text = tr("Связь с сервером не установлена! Проверьте настройки подключения и загрузите клиент с сервера");
ui->offlineNotifyLabel->setText(text);
}
}
QString EntryWidget::getAddress(){
return ui->serverInputField->text();
}
QString EntryWidget::getPort(){
return ui->portInputField->text();
}
EntryWidget::~EntryWidget()
{

View File

@@ -20,16 +20,18 @@ public:
void showLoginWidget(bool flag);
void disconnectState();
void fillSettings(ServerSettings *settings);
void fillSettings(Settings *settings);
void isActive(bool flag);
bool getLoginWidgetIsHidden();
ServerSettings *getServerSettings();
void setAppAvailable(bool flag);
ClientAutorization* getAuthData();
QString getAddress();
QString getPort();
signals:
void sigTryLogin();
void sigSaveServerSettings();
bool sigAppAvalable();
private slots:
void on_loginButton_clicked();
@@ -37,6 +39,7 @@ private slots:
private:
Ui::EntryWidget *ui;
bool isAppAvailable;
};
#endif // ENTRYWIDGET_H

View File

@@ -351,7 +351,7 @@
<string notr="true"/>
</property>
<property name="text">
<string>Связь с сервером не установлена! Проверьте настройки или запустите в автономном режиме</string>
<string>тест</string>
</property>
<property name="scaledContents">
<bool>true</bool>

View File

@@ -0,0 +1,87 @@
#include "updatefileslot.h"
#include "ui_updatefileslot.h"
#include <QDateTime>
UpdateFileSlot::UpdateFileSlot(QWidget *parent) :
QWidget(parent),
ui(new Ui::UpdateFileSlot),
needUpdate(false)
{
ui->setupUi(this);
}
void UpdateFileSlot::fill(QString itemName, FileData serverData, FileData localData)
{
ui->Path->setText(itemName);
local = localData;
bool haveData = serverData.lastUpdate != "нет";
QString result = " Сервер: ";
QDateTime serverFileTime;
if (haveData)
{
serverFileTime = QDateTime::fromString(serverData.lastUpdate,"dd.MM.yyyy hh:mm:ss");
result.append(serverFileTime.toString("dd.MM.yyyy"));
}
else
{
result.append("НЕТ");
}
QDateTime localFileTime = QDateTime::fromString(localData.lastUpdate,"dd.MM.yyyy hh:mm:ss");
result.append(" Локально: ");
result.append(localFileTime.toString("dd.MM.yyyy"));
ui->Dates->setText(result);
bool newest = localFileTime > serverFileTime;
ui->UpdateCheckBox->setChecked(newest);
QPixmap pixmap;
if (newest)
{
pixmap.load(":/resource/Icons/new.png");
}
else
{
pixmap.load(nullptr);
}
QPixmap scaled = pixmap.scaled(ui->Image->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
ui->Image->setPixmap(scaled);
}
UpdateFileSlot::~UpdateFileSlot()
{
delete ui;
}
FileData UpdateFileSlot::getLocal() const
{
return local;
}
bool UpdateFileSlot::getNeedUpdate() const
{
return needUpdate;
}
void UpdateFileSlot::setNeedUpdate(bool value)
{
needUpdate = value;
}
void UpdateFileSlot::on_UpdateCheckBox_stateChanged(int arg1)
{
if (ui->UpdateCheckBox->checkState() == Qt::Checked)
{
needUpdate = true;
}
else if (ui->UpdateCheckBox->checkState() == Qt::Unchecked)
{
needUpdate = false;
}
}

36
Widgets/updatefileslot.h Normal file
View File

@@ -0,0 +1,36 @@
#ifndef UPDATEFILESLOT_H
#define UPDATEFILESLOT_H
#include <QWidget>
#include <Data/FileData.h>
namespace Ui {
class UpdateFileSlot;
}
class UpdateFileSlot : public QWidget
{
Q_OBJECT
public:
explicit UpdateFileSlot(QWidget *parent = nullptr);
void fill(QString itemName, FileData serverData, FileData localData);
bool getNeedUpdate() const;
void setNeedUpdate(bool value);
FileData getLocal() const;
~UpdateFileSlot();
private slots:
void on_UpdateCheckBox_stateChanged(int arg1);
private:
Ui::UpdateFileSlot *ui;
FileData local;
bool needUpdate;
};
#endif // UPDATEFILESLOT_H

79
Widgets/updatefileslot.ui Normal file
View File

@@ -0,0 +1,79 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>UpdateFileSlot</class>
<widget class="QWidget" name="UpdateFileSlot">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>789</width>
<height>40</height>
</rect>
</property>
<property name="windowTitle">
<string>Frame</string>
</property>
<widget class="QWidget" name="horizontalLayoutWidget">
<property name="geometry">
<rect>
<x>30</x>
<y>0</y>
<width>701</width>
<height>41</height>
</rect>
</property>
<layout class="QHBoxLayout" name="mainLayout">
<item>
<widget class="QLabel" name="Path">
<property name="text">
<string>/RUS/Scens/XXX-X-XX-XX-XX-XXXXXX-XXXX-X</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="Dates">
<property name="text">
<string>XXXXXXX XXxXXxXXX XXXXXXXXx XXxXXxXXXX</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QLabel" name="Image">
<property name="geometry">
<rect>
<x>735</x>
<y>-4</y>
<width>51</width>
<height>51</height>
</rect>
</property>
<property name="text">
<string/>
</property>
<property name="pixmap">
<pixmap resource="../resources.qrc">:/resource/Icons/new.png</pixmap>
</property>
<property name="scaledContents">
<bool>true</bool>
</property>
</widget>
<widget class="QCheckBox" name="UpdateCheckBox">
<property name="geometry">
<rect>
<x>6</x>
<y>10</y>
<width>21</width>
<height>22</height>
</rect>
</property>
<property name="text">
<string/>
</property>
</widget>
</widget>
<resources>
<include location="../resources.qrc"/>
</resources>
<connections/>
</ui>

View File

@@ -3,6 +3,7 @@
#include "Core/tools.h"
#include <QMessageBox>
#include <QTextDocumentFragment>
UpdateNotifyWidget::UpdateNotifyWidget(QWidget *) :
ui(new Ui::UpdateNotifyWidget)
@@ -27,25 +28,35 @@ void UpdateNotifyWidget::setVersionContainer(VersionContainer *versionContainer)
this->versionContainer = versionContainer;
}
void UpdateNotifyWidget::addToList(FileData fileData)
void UpdateNotifyWidget::addToList(FileData localFileData,FileData serverFileData)
{
QString itemName = fileData.path;
QString itemName = localFileData.path;
itemName = itemName.remove(streamingAssetsPath);
ui->updateListWidget->addItem(itemName);
UpdateFileSlot *slot = new UpdateFileSlot();
QListWidgetItem *widgetItem = new QListWidgetItem();
widgetItem->setSizeHint(QSize(slot->width(),slot->height()));
ui->updateListWidget->addItem(widgetItem);
ui->updateListWidget->setItemWidget(widgetItem,slot);
slot->fill(itemName,serverFileData,localFileData);
}
void UpdateNotifyWidget::showTryChangeBase()
{
QString path = QDir::currentPath() + streamingAssetsPath;
QString link = "<a href=\""+ path + "\"style=\"color:white;\">папку</a>";
QString link = "<a href=\""+ path + "\"style=\"color:lightblue; text-decoration: underline;\">папку</a>";
ui->labelsLayout->addWidget(createLabel(tr("Данные изменения нельзя выгрузить на сервер, так как версия сервера не изменяема \n")));
ui->labelsLayout->addWidget(createLabel(tr("Чтобы выгрузить на сервер нужно:")));
ui->labelsLayout->addWidget(createLabel(tr("1. Скопировать измененные или созданные файлы в временную папку")));
QLabel *labelStorage = new QLabel;
QString link2 = "<a href=\""+ path + "\"style=\"color:white;\">тут</a>";
labelStorage->setText(tr("Файлы можно найти в ") + link2 );
QString link2 = "<a href=\""+ path + "\"style=\"color:lightblue; text-decoration: underline;\">тут</a>";
labelStorage->setText(tr("Файлы можно найти в ") + link2);
labelStorage->setTextFormat(Qt::RichText);
labelStorage->setTextInteractionFlags(Qt::TextBrowserInteraction);
labelStorage->setOpenExternalLinks(true);
ui->labelsLayout->addWidget(labelStorage);
ui->labelsLayout->addWidget(createLabel(tr("2. Нажать Отменить изменения и дождатся окончания операции")));
ui->labelsLayout->addWidget(createLabel(tr("3. Изменить версию сервера на изменяемую")));
@@ -55,6 +66,8 @@ void UpdateNotifyWidget::showTryChangeBase()
QLabel *linkLabel = new QLabel;
linkLabel->setText(tr("5. Скопировать файлы из временной папки в эту ") + link);
linkLabel->setOpenExternalLinks(true);
linkLabel->setTextFormat(Qt::RichText);
linkLabel->setTextInteractionFlags(Qt::TextBrowserInteraction);
ui->labelsLayout->addWidget(linkLabel);
ui->labelsLayout->addWidget(createLabel(tr("6.Перезапустить клиент и выгрузить изменения на сервер")));
@@ -66,11 +79,7 @@ void UpdateNotifyWidget::showWithFill()
{
clearList();
if(!versionContainer->getLocalVersionData()->getIsChangeable())
{
showTryChangeBase();
}
else if(!versionContainer->getServerVersionData()->getIsChangeable())
if(!versionContainer->getServerVersionData()->getIsChangeable())
{
showTryChangeBase();
}
@@ -117,6 +126,29 @@ void UpdateNotifyWidget::on_startWithCurrentChangesButton_clicked()
emit sigStartUnityClient();
}
void UpdateNotifyWidget::closeWindow()
{
on_closeButton_clicked();
}
QList<FileData> *UpdateNotifyWidget::getUpdateList()
{
QList<FileData> *realUpdateList = new QList<FileData>();
for (int i = 0; i < ui->updateListWidget->count(); i++) {
QListWidgetItem *item = ui->updateListWidget->item(i);
UpdateFileSlot *slot = qobject_cast<UpdateFileSlot*>(ui->updateListWidget->itemWidget(item));
if (slot && slot->getNeedUpdate())
{
realUpdateList->append(slot->getLocal());
}
}
return realUpdateList;
}
void UpdateNotifyWidget::setUpdateState()
{
ui->undoChangesButton->show();

View File

@@ -7,6 +7,7 @@
#include <Data/FileData.h>
#include <Core/versioncontainer.h>
#include <Widgets/updatefileslot.h>
namespace Ui {
class UpdateNotifyWidget;
@@ -21,10 +22,12 @@ public:
explicit UpdateNotifyWidget(QWidget *parent = nullptr);
~UpdateNotifyWidget();
void initialize(QPoint startPos);
void addToList(FileData fileData);
void addToList(FileData localFileData,FileData serverFileData);
void showWithFill();
void showTryChangeBase();
void setVersionContainer(VersionContainer *versionContainer);
void closeWindow();
QList<FileData> *getUpdateList();
signals:
void sigLoadToServerBehaviour();
void sigUndoCurrentChanges();

View File

@@ -70,7 +70,7 @@
</sizepolicy>
</property>
<property name="text">
<string>Обнаружены новые файлы:</string>
<string>Обнаружены новые или измененные файлы:</string>
</property>
<property name="openExternalLinks">
<bool>false</bool>

View File

@@ -11,6 +11,8 @@ Bootstrap::Bootstrap(QObject *parent) : QObject(parent)
void Bootstrap::initialize()
{
qRegisterMetaType<PacketType>("PacketType");
qRegisterMetaType<ErrorsEnum>("ErrorsEnum");
qRegisterMetaType<FileData>("FileData");
widgetManager->initialize();
coreManager->initialize(widgetManager, workerThread);

View File

@@ -4,7 +4,7 @@ CoreManager::CoreManager(QObject *parent) :
QObject(parent),
isRecovery(false)
{
client = new TCPClient;
tcpClient = new TCPClient;
dataParser = new DataParser;
dataParserOutput = new DataParserOutput;
updateController = new UpdateController;
@@ -16,14 +16,18 @@ CoreManager::CoreManager(QObject *parent) :
versionContainer = new VersionContainer;
resourceManager = new ResourceManager;
postProcessorSystem = new PostProcessorSystem;
client = new Client;
settings = new Settings;
}
void CoreManager::initialize(WidgetManager *widgetManager,QThread *workerThread)
{
createNewServerSettings();
this->workerThread = workerThread;
this->widgetManager = widgetManager;
client->moveToThread(workerThread);
tcpClient->moveToThread(workerThread);
dataParser->moveToThread(workerThread);
dataParserOutput->moveToThread(workerThread);
sendSystem->moveToThread(workerThread);
@@ -31,11 +35,8 @@ void CoreManager::initialize(WidgetManager *widgetManager,QThread *workerThread)
recognizeSystem->moveToThread(workerThread);
postProcessorSystem->moveToThread(workerThread);
hashComparer->moveToThread(workerThread);
// versionContainer->moveToThread(workerThread); //проверить работоспособность
// resourceManager->moveToThread(workerThread); //проверить работоспособность
workerThread->start();
//workerThread->setPriority(QThread::HighestPriority);
binding();
initializeSystems();
@@ -46,40 +47,39 @@ void CoreManager::initialize(WidgetManager *widgetManager,QThread *workerThread)
void CoreManager::start()
{
checkAppAvailable();
//checkAppAvailable();
}
void CoreManager::loadStaticData()
{
ServerSettings *currentSettings = dataParser->getClientSettings();
setLanguage(currentSettings->Language);
settings = dataParser->getSettings();
setLanguage(settings->Language);
setLocalVersion();
externalExecuter->setIsAutoStart(currentSettings->isAutoStart);
bool appAvailable = externalExecuter->findApp();
widgetManager->setAppAvailable(appAvailable);
emit sigSetLoadSettings(currentSettings);
externalExecuter->setIsAutoStart(settings->isAutoStart);
emit sigSetLoadSettings(settings);
}
void CoreManager::binding()
{
connect(recognizeSystem,&RecognizeSystem::sigAnimationActivated,widgetManager,&WidgetManager::slotActivateLoadAnimation,Qt::AutoConnection);
connect(this,&CoreManager::sigInitializeClient,client,&TCPClient::initialize,Qt::AutoConnection);
connect(this,&CoreManager::sigSetConnect,client,&TCPClient::setConnect,Qt::AutoConnection);
connect(this,&CoreManager::sigSendCommand,sendSystem,&SendSystem::sendPacketType,Qt::AutoConnection);
connect(this,&CoreManager::sigInitializeClient,tcpClient,&TCPClient::initialize,Qt::AutoConnection);
connect(this,&CoreManager::sigSetConnect,tcpClient,&TCPClient::setConnect,Qt::AutoConnection);
connect(this,&CoreManager::sigSendPacketType,sendSystem,&SendSystem::sendPacketType,Qt::AutoConnection);
connect(this,&CoreManager::sigSendCheckUpdate,sendSystem,&SendSystem::sendCheckHash,Qt::AutoConnection);
connect(this,&CoreManager::sigSendXMLAnswer,sendSystem,&SendSystem::xmlAnswer,Qt::AutoConnection);
connect(this,&CoreManager::sigSendAutorization,sendSystem,&SendSystem::sendClientAutorization);
connect(this,&CoreManager::sigSendAutorization,sendSystem,&SendSystem::sendClientAutorization,Qt::AutoConnection);
connect(this,&CoreManager::sigGetClientSettings,dataParser,&DataParser::getSettings,Qt::DirectConnection);
connect(this,&CoreManager::sigSendUpdateToServer,updateController,&UpdateController::checkCanUpdate,Qt::AutoConnection);
connect(this,&CoreManager::sigGetConnected,client,&TCPClient::getIsConnected);
connect(this,&CoreManager::sigGetConnected,tcpClient,&TCPClient::getIsConnected);
connect(this,&CoreManager::sigCalculateHash,updateController,&UpdateController::calculateCommonHash);
connect(this,&CoreManager::sigSetLoadSettings,widgetManager,&WidgetManager::slotSetLoadSettings,Qt::AutoConnection);
connect(postProcessorSystem,&PostProcessorSystem::sigCallUpdateList,this,&CoreManager::callUpdateList,Qt::AutoConnection);
connect(postProcessorSystem,&PostProcessorSystem::sigSocketDisabled,this,&CoreManager::lostConnection,Qt::AutoConnection);
connect(postProcessorSystem,&PostProcessorSystem::sigServerBlocked,this,&CoreManager::serverBlocked,Qt::AutoConnection);
connect(postProcessorSystem,&PostProcessorSystem::sigStartCompare,hashComparer,&HashComparer::CompareDeltas,Qt::AutoConnection); // ОПАСНОСТЬ
connect(postProcessorSystem,&PostProcessorSystem::sigShowError,this,&CoreManager::showError,Qt::AutoConnection);
connect(postProcessorSystem,&PostProcessorSystem::sigStartCompare,hashComparer,&HashComparer::CompareDeltas,Qt::AutoConnection);
connect(postProcessorSystem,&PostProcessorSystem::sigSaveLoginData,this,&CoreManager::checkLoginResult,Qt::AutoConnection);
connect(versionContainer,&VersionContainer::sigSetServerVersion,this,&CoreManager::setServerVersion,Qt::AutoConnection);
@@ -89,19 +89,26 @@ void CoreManager::binding()
connect(recognizeSystem,&RecognizeSystem::sigNeedUpdate,this,&CoreManager::checkNeedUpdate,Qt::AutoConnection);
connect(recognizeSystem,&RecognizeSystem::sigCheckUpdate,this,&CoreManager::checkUpdate,Qt::AutoConnection);
connect(recognizeSystem,&RecognizeSystem::sigdRecalculateHashOnServerState,this,&CoreManager::recalculateState,Qt::AutoConnection);
connect(recognizeSystem,&RecognizeSystem::sigSendPacketType,this,&CoreManager::sendPacketType,Qt::AutoConnection);
connect(recognizeSystem,&RecognizeSystem::sigSendPacketTypeWithDelay,sendSystem,&SendSystem::sendPacketTypeWithDelay,Qt::AutoConnection);
connect(recognizeSystem,&RecognizeSystem::sigSendToInlineLog,this,&CoreManager::setInlineDebug,Qt::AutoConnection);
connect(hashComparer,&HashComparer::sigCallCheck,this,&CoreManager::checkUpdate);
connect(hashComparer,&HashComparer::sigHaveDelta,this,&CoreManager::checkUpdateInfo);
connect(updateController,&UpdateController::sigUpdateComplete,widgetManager,&WidgetManager::setCompeteState,Qt::AutoConnection);//ОПАСНОСТЬ
connect(updateController,&UpdateController::sigSendHashInfo,widgetManager->getMainWindow(),&MainWindow::updateInitInformation,Qt::AutoConnection);
connect(updateController,&UpdateController::sigUpdateComplete,widgetManager,&WidgetManager::setCompeteState,Qt::AutoConnection);
connect(updateController->getHashCalculator(),&FastHashCalculator::sigSendHashInfo,widgetManager->getMainWindow(),&MainWindow::updateInitInformation,Qt::AutoConnection);
connect(client,&TCPClient::sigConnectionState,widgetManager,&WidgetManager::setConnectionState,Qt::AutoConnection);//ОПАСНОСТЬ
connect(client,&TCPClient::sigServerDisconnect,widgetManager,&WidgetManager::setServerDisconnectState,Qt::AutoConnection);//ОПАСНОСТЬ
connect(tcpClient,&TCPClient::sigConnectionState,widgetManager,&WidgetManager::setConnectionState,Qt::AutoConnection);
connect(tcpClient,&TCPClient::sigServerDisconnect,widgetManager,&WidgetManager::setServerDisconnectState,Qt::AutoConnection);
connect(sendSystem,&SendSystem::sigSend,this,&CoreManager::calcUpdateProgress,Qt::AutoConnection);
connect(sendSystem,&SendSystem::sigGetXmlAnswer,dataParserOutput,&DataParserOutput::xmlAnswer_notify,Qt::DirectConnection);
connect(sendSystem,&SendSystem::sigGetXmlAnswer,dataParserOutput,&DataParserOutput::xmlAnswer_notify,Qt::DirectConnection);//ОПАСНОСТЬ
connect(widgetManager->getEntryWidget(),&EntryWidget::sigAppAvalable,externalExecuter,&ExternalExecuter::findApp,Qt::DirectConnection);
connect(widgetManager->getMainWindow(),&MainWindow::sigAppAvailable,externalExecuter,&ExternalExecuter::findApp,Qt::DirectConnection);
connect(widgetManager->getCommonButtonGroupWidget(),&CommonButtonGroupWidget::sigAppAvailable,externalExecuter,&ExternalExecuter::findApp,Qt::DirectConnection);
connect(widgetManager,&WidgetManager::sigAppAvailable,externalExecuter,&ExternalExecuter::findApp,Qt::DirectConnection);
}
void CoreManager::initializeSystems()
@@ -111,7 +118,7 @@ void CoreManager::initializeSystems()
hashComparer->initialize(versionContainer,widgetManager->getUpdateWidget());
postProcessorSystem->initialize(dataParserOutput,hashComparer,versionContainer,updateController);
dataParser->initialize(postProcessorSystem);
recognizeSystem->initialize(dataParser,versionContainer,postProcessorSystem);
recognizeSystem->initialize(dataParser,versionContainer,postProcessorSystem,client);
resourceManager->painting();
emit sigCalculateHash();
@@ -119,7 +126,7 @@ void CoreManager::initializeSystems()
screenChecker->check();
emit sigSetConnect(dataParser->getClientSettings());
emit sigSetConnect(dataParser->getSettings());
}
void CoreManager::initializeWidgets()
@@ -144,9 +151,10 @@ void CoreManager::initializeWidgets()
connect(widgetManager->getMainWindow(),&MainWindow::sigChangeLanguage,this,&CoreManager::setLanguage,Qt::AutoConnection);
connect(widgetManager->getMainWindow(),&MainWindow::sigShowUpdateInfo,this,&CoreManager::checkUpdateInfo,Qt::AutoConnection);
connect(widgetManager->getMainWindow(),&MainWindow::sigExit,this,&CoreManager::exit,Qt::AutoConnection);
connect(widgetManager->getMainWindow(),&MainWindow::sigExit,this,&CoreManager::exit,Qt::DirectConnection);
connect(widgetManager->getMainWindow(),&MainWindow::sigTryLogin,this,&CoreManager::tryLogin,Qt::AutoConnection);
connect(widgetManager->getMainWindow(),&MainWindow::sigStartOffline,this,&CoreManager::startOffline,Qt::AutoConnection);
connect(widgetManager->getCommonButtonGroupWidget(),&CommonButtonGroupWidget::sigStartOfflineUnityClient,this,&CoreManager::startOffline,Qt::AutoConnection);
}
@@ -160,29 +168,37 @@ void CoreManager::callUpdateList()
emit sigSendXMLAnswer(cmd_GetServerHash);
}
void CoreManager::lostConnection()
void CoreManager::showError(ErrorsEnum errorEnum)
{
widgetManager->setLostConnectionState();
widgetManager->getMainWindow()->showError(errorEnum);
if (errorEnum == ErrorsEnum::BLOCKED)
{
widgetManager->getEntryWidget()->showLoginWidget(true);
}
}
void CoreManager::serverBlocked()
{
widgetManager->getMainWindow()->serverBlocked();
}
void CoreManager::setServerVersion(StreamingVersionData *version)
{
widgetManager->getMainWindow()->setServerVersion(version);
if (version->getViewName() == settings->versionData.getViewName())
{
settings->versionData.setIsChangeable(version->getIsChangeable());
versionContainer->getLocalVersionData()->setIsChangeable(version->getIsChangeable());
dataParserOutput->updateServerSettings(settings);
}
}
void CoreManager::setLocalVersion()
{
ServerSettings *currentSettings = dataParser->getClientSettings();
StreamingVersionData *version = new StreamingVersionData;
version->setName(currentSettings->LocalVersionName);
version->setIsChangeable(currentSettings->versionData.getIsChangeable());
version->setName(settings->LocalVersionName);
version->setIsChangeable(settings->versionData.getIsChangeable());
versionContainer->setLocalVersionData(version);
widgetManager->getMainWindow()->setClientVersionName(versionContainer->getLocalVersion());
}
void CoreManager::checkLoginResult(ServerAuthorization *auth)
@@ -192,19 +208,22 @@ void CoreManager::checkLoginResult(ServerAuthorization *auth)
widgetManager->activateLoadingAnimation(true);
checkAccessType(auth->AccessType);
dataParserOutput->createAuthData(auth);
setLocalVersion();
//setLocalVersion();
widgetManager->setLoginSuccess();
widgetManager->getMainWindow()->setClientVersionName(versionContainer->getLocalVersion());
client->setLogin(auth->ClientName);
client->setIsLoggedIn(true);
}
else
{
widgetManager->setLoginFailed();
client->setIsLoggedIn(false);
}
}
void CoreManager::tryLogin()
{
if (!client->getIsConnected())
if (!tcpClient->getIsConnected())
{
widgetManager->getMainWindow()->showConnectionEmpty();
return;
@@ -220,22 +239,27 @@ void CoreManager::checkUpdate()
{
widgetManager->activateLoadingAnimation(true);
emit sigSendCheckUpdate();
widgetManager->getMainWindow()->setInlineDebug(tr("Проверка обновлений..."));
setInlineDebug(tr("Проверка обновлений..."));
}
void CoreManager::recalculateState()
{
widgetManager->activateLoadingAnimation(true);
widgetManager->getMainWindow()->setInlineDebug(tr("Пересчет хэша на сервере..."));
setInlineDebug(tr("Пересчет хэша на сервере..."));
}
void CoreManager::setInlineDebug(QString text)
{
widgetManager->getMainWindow()->setInlineDebug(text);
}
void CoreManager::checkAccessType(const QString& accessType)
{
if (accessType == traineeTypeName)
if (accessType == traineeTypeName)//если обучаемый вызываем обновление
{
checkUpdate();
}
else
else //если инструктор запрашивание версионирование
{
emit sigSendXMLAnswer(cmd_CheckVersionList);
}
@@ -307,7 +331,7 @@ void CoreManager::loadComplete()
dataParserOutput->changeVersion(versionContainer->getServerVersionData());
setLocalVersion();
checkAutoStart();
widgetManager->getMainWindow()->setClientVersionName(versionContainer->getLocalVersion());
widgetManager->getMainWindow()->setClientVersionName(versionContainer->getServerVersionData()->getViewName());
}
void CoreManager::loadToServer()
@@ -322,11 +346,7 @@ void CoreManager::undoCurrentChanges()
isRecovery = true;
widgetManager->setUndoCurrentChangesState();
emit sigSendCheckUpdate();
emit sigSendCommand(PacketType::TYPE_UPDATE);
//тут был таймер
isRecovery = false;
widgetManager->activateLoadingAnimation(false);
}
void CoreManager::startOffline()
@@ -338,32 +358,36 @@ void CoreManager::startOffline()
startUnityClient();
}
void CoreManager::sendPacketType(PacketType packetType)
{
emit sigSendPacketType(packetType);
}
void CoreManager::saveServerSettingsWithConnect()
{
widgetManager->activateLoadingAnimation(true);
EntryWidget *entryWidget = widgetManager->getEntryWidget();
entryWidget->isActive(false);
ServerSettings *settings = entryWidget->getServerSettings();
settings->LocalVersionName = dataParser->getClientSettings()->LocalVersionName;
dataParserOutput->createServerSettings(settings);
settings->LocalVersionName = dataParser->getSettings()->LocalVersionName;
settings->Address = entryWidget->getAddress();
settings->Port = entryWidget->getPort();
dataParserOutput->updateServerSettings(settings);
if(client->getIsConnected())
if(tcpClient->getIsConnected())
{
emit sigSendXMLAnswer(cmd_Disable);
tcpClient->setDisconnect();
entryWidget->showLoginWidget(true);
widgetManager->getMainWindow()->showOfflineButton(true);
widgetManager->activateLoadingAnimation(false);
}
else
{
emit sigSetConnect(settings);
}
emit sigSetConnect(settings);
}
void CoreManager::checkAppAvailable()
void CoreManager::createNewServerSettings()
{
bool isAvailable = externalExecuter->findApp();
widgetManager->setAppAvailable(isAvailable);
dataParserOutput->createServerSettings();
}
void CoreManager::setLanguage(const QString& language)
@@ -384,7 +408,7 @@ void CoreManager::setLanguage(const QString& language)
void CoreManager::exit()
{
emit sigSendXMLAnswer(cmd_Disable);
client->disconnect();
tcpClient->disconnect();
workerThread->quit();
workerThread->wait();

View File

@@ -14,6 +14,7 @@
#include <Core/hashcomparer.h>
#include <Core/versioncontainer.h>
#include <widgetmanager.h>
#include <Data/Client.h>
#include <UI/resourcemanager.h>
@@ -39,31 +40,31 @@ public:
void startUnityClient();
void tryLogin();
void startOffline();
void sendPacketType(PacketType packetType);
void saveServerSettingsWithConnect();
void checkAppAvailable();
void exit();
void initializeWidgets();
void recalculateState();
signals:
void sigInitializeClient(RecognizeSystem *recognize,SendSystem *sendSystem);
void sigSendCommand(PacketType packetType);
void sigSendPacketType(PacketType packetType);
void sigSendXMLAnswer(QString answer);
void sigSetConnect(ServerSettings* serverSettings);
void sigSetConnect(Settings* serverSettings);
void sigCalculateHash();
void sigSendAutorization();
void sigSendCheckUpdate();
bool sigGetConnected();
void sigSendUpdateToServer();
Settings *sigGetClientSettings();
void sigSetLoadSettings(ServerSettings *serverSettings);
void sigSetLoadSettings(Settings *serverSettings);
private:
QTranslator translator;
TCPClient *client;
TCPClient *tcpClient;
DataParser *dataParser;
DataParserOutput *dataParserOutput;
UpdateController *updateController;
@@ -75,6 +76,8 @@ private:
VersionContainer *versionContainer;
ResourceManager *resourceManager;
PostProcessorSystem *postProcessorSystem;
Client *client;
Settings *settings;
WidgetManager *widgetManager;
@@ -90,8 +93,7 @@ private:
void binding();
void initializeSystems();
void callUpdateList();
void lostConnection();
void serverBlocked();
void showError(ErrorsEnum errorEnum);
void checkLoginResult(ServerAuthorization *auth);
void checkAccessType(const QString &accessType);
void setServerVersion(StreamingVersionData *version);
@@ -101,6 +103,8 @@ private:
void checkNeedUpdate(bool flag, quint64 size, quint64 fileCount, quint64 deleteCount);
void checkUpdate();
void setInlineDebug(QString text);
void createNewServerSettings();
};
#endif // COREMANAGER_H

View File

@@ -12,8 +12,8 @@
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent),
ui(new Ui::MainWindow),
bottomRightPosition(QRect(530,505,250,40)),
offlinePosition(240,340,300,40)
bottomRightPosition(QRect(530,506,250,40)),
offlinePosition(240,350,300,40)
{
ui->setupUi(this);
setAttribute(Qt::WA_TranslucentBackground);
@@ -44,7 +44,8 @@ void MainWindow::initialize(ResourceManager *resourceManager)
bindConnection();
this->resourceManager = resourceManager;
ui->LanguageWidget->hide();
ui->offlineStartButton->setGeometry(offlinePosition);
ui->offlineStartButton->hide();
}
void MainWindow::setStartState()
@@ -74,9 +75,7 @@ void MainWindow::bindConnection()
void MainWindow::loadCompleteState()
{
ui->inlineTextDebug->setText(tr("Обновление завершено"));
ui->offlineStartButton->setEnabled(true);
ui->autostartCheckBox->hide();
ui->offlineStartButton->show();
}
bool MainWindow::getIsAutoStart()
@@ -97,43 +96,45 @@ void MainWindow::setNeedUpdateState(const QString& notifyText)
ui->autostartCheckBox->show();
}
void MainWindow::serverBlocked()
{
ui->notificationLabel->show();
QPalette palette = ui->notificationLabel->palette();
QColor orangeColor(255,165,0);
palette.setColor(ui->notificationLabel->foregroundRole(),orangeColor);
ui->notificationLabel->setText(tr("Сервер заблокирован"));
ui->notificationLabel->setPalette(palette);
timer->start(3000);
void MainWindow::showError(ErrorsEnum errorNum)
{
if (errorNum == ErrorsEnum::BLOCKED)
{
serverNotifyShow(tr("Сервер заблокирован"));
}
else if (errorNum == ErrorsEnum::DISABLE)
{
showConnectionEmpty();
}
else if (errorNum == ErrorsEnum::LOGIN_OR_PASS)
{
serverNotifyShow(tr("Неверный логин/пароль"));
}
else if (errorNum == ErrorsEnum::ARCHIVED)
{
serverNotifyShow(tr("Пользователь в архиве"));
}
else if (errorNum == ErrorsEnum::ALREADYLOGIN)
{
serverNotifyShow(tr("Пользователь уже в сети"));
}
}
void MainWindow::serverNotifyShow(QString text, int durationMS)
{
ui->notificationLabel->setText(text);
ui->notificationLabel->show();
timer->start(durationMS);
}
void MainWindow::setLoginSuccessState()
{
ui->settingsButton->hide();
ui->offlineStartButton->show();
ui->versionLayoutWidget->show();
}
void MainWindow::setLoginFailedState()
{
ui->notificationLabel->setText(tr("Неверный логин/пароль"));
timer->setInterval(3000);
timer->start();
QPalette palette = ui->notificationLabel->palette();
palette.setColor(ui->notificationLabel->foregroundRole(), Qt::red);
ui->notificationLabel->setPalette(palette);
ui->notificationLabel->show();
}
void MainWindow::setStartOfflineButton(bool isAvailable)
{
ui->offlineStartButton->setEnabled(isAvailable);
}
void MainWindow::setClientVersionName(const QString& versionName)
{
ui->valueClientVersion->setText(versionName);
@@ -145,9 +146,7 @@ void MainWindow::showConnectionEmpty()
QPalette palette = ui->notificationLabel->palette();
palette.setColor(ui->notificationLabel->foregroundRole(),Qt::red);
ui->notificationLabel->setText(tr("Соединение отсутсвует"));
ui->offlineStartButton->show();
ui->offlineStartButton->setGeometry(offlinePosition);
ui->offlineStartButton->raise();
ui->settingsButton->show();
ui->unsafeChangingButton->hide();
}
@@ -170,9 +169,6 @@ void MainWindow::slotConnectionState(bool flag)
{
palette.setColor(ui->notificationLabel->foregroundRole(),Qt::green);
ui->notificationLabel->setText(tr("Соединение установлено"));
ui->offlineStartButton->show();
ui->offlineStartButton->setGeometry(bottomRightPosition);
}
else
{
@@ -185,11 +181,19 @@ void MainWindow::slotConnectionState(bool flag)
void MainWindow::slotServerDisconnect()
{
checkApp();
ui->autostartCheckBox->hide();
ui->inlineTextDebug->setText("");
slotConnectionState(false);
}
void MainWindow::checkApp()
{
bool isAvailable = emit sigAppAvailable();
if (isAvailable) ui->offlineStartButton->show();
else ui->offlineStartButton->hide();
}
void MainWindow::slotDisableNotify()
{
ui->notificationLabel->hide();
@@ -201,14 +205,6 @@ void MainWindow::slotDisableNotify()
timer->stop();
}
void MainWindow::showOfflineButton(bool flag)
{
if (flag)
ui->offlineStartButton->show();
else
ui->offlineStartButton->hide();
}
void MainWindow::on_settingsButton_clicked()
{
emit sigShowSettings(true);
@@ -225,14 +221,14 @@ void MainWindow::loadToServer()
{
ui->mainFrame->show();
ui->inlineTextDebug->setText(tr("Отправка файлов..."));
ui->offlineStartButton->setEnabled(false);
//ui->offlineStartButton->setEnabled(false);
ui->unsafeChangingButton->hide();
}
void MainWindow::undoCurrentChanges()
{
ui->mainFrame->show();
ui->offlineStartButton->setEnabled(false);
//ui->offlineStartButton->setEnabled(false);
ui->unsafeChangingButton->hide();
}
@@ -252,7 +248,8 @@ void MainWindow::on_exitButton_clicked()
void MainWindow::slotShowUpdateInfo()
{
ui->unsafeChangingButton->show();
ui->offlineStartButton->setGeometry(bottomRightPosition);
//ui->offlineStartButton->setGeometry(bottomRightPosition);
//ui->offlineStartButton->setParent(ui->changeButtonGroup->widget());
}
void MainWindow::setUpUi()
@@ -260,9 +257,10 @@ void MainWindow::setUpUi()
ui->notificationLabel->hide();
ui->unsafeChangingButton->hide();
ui->offlineStartButton->show();
ui->offlineStartButton->setEnabled(false);
ui->offlineStartButton->setGeometry(bottomRightPosition);
//ui->offlineStartButton->show();
//ui->offlineStartButton->setEnabled(false);
//ui->offlineStartButton->setGeometry(bottomRightPosition);
//ui->offlineStartButton->setParent(ui->changeButtonGroup->widget());
ui->settingsButton->setIcon(*resourceManager->getSettingsIcon());
@@ -316,9 +314,14 @@ QHBoxLayout *MainWindow::getDisplayLayout() const
return ui->displayLayout;
}
QPushButton *MainWindow::getStartOfflineButton() const
{
return ui->offlineStartButton;
}
void MainWindow::addWidgetToChangeGroup(CommonButtonGroupWidget *commonWidgetGroup)
{
ui->changButtonGroup->addWidget(commonWidgetGroup);
ui->changeButtonGroup->addWidget(commonWidgetGroup);
}
void MainWindow::addWidgetToInteractiveGroup(EntryWidget *entryWidget)
@@ -327,7 +330,7 @@ void MainWindow::addWidgetToInteractiveGroup(EntryWidget *entryWidget)
this->entryWidget = entryWidget;
}
void MainWindow::setLoadSettings(ServerSettings *serverSettings)
void MainWindow::setLoadSettings(Settings *serverSettings)
{
ui->retranslateUi(this);

View File

@@ -4,6 +4,7 @@
#include <QMainWindow>
#include <QDebug>
#include <QHBoxLayout>
#include <QPushButton>
#include <Widgets/commonbuttongroupwidget.h>
#include <Widgets/updatenotifywidget.h>
@@ -29,9 +30,8 @@ public:
void initialize(ResourceManager *resourceManager);
void addWidgetToChangeGroup(CommonButtonGroupWidget *commonWidgetGroup);
void addWidgetToInteractiveGroup(EntryWidget *entryWidget);
void setLoadSettings(ServerSettings *serverSettings);
void setLoadSettings(Settings *serverSettings);
void setLoginSuccessState();
void setLoginFailedState();
void setClientVersionName(const QString &versionName);
void loadToServer();
@@ -44,12 +44,13 @@ public:
void setNeedUpdateState(const QString &notifyText);
void setLastVersionState();
void showConnectionEmpty();
void showOfflineButton(bool flag);
void setStartOfflineButton(bool isAvailable);
void setStartState();
void serverBlocked();
void serverNotifyShow(QString text, int durationMS = 3000);
void showError(ErrorsEnum errorNum);
QHBoxLayout *getDisplayLayout() const;
void serverBlockedState();
QPushButton *getStartOfflineButton() const;
public slots:
void slotShowUpdateInfo();
void slotConnectionState(bool flag);
@@ -65,6 +66,8 @@ signals:
void sigExit();
void sigTryLogin();
void sigStartOffline();
bool sigAppAvailable();
private slots:
void on_settingsButton_clicked();
@@ -83,11 +86,13 @@ private:
QPixmap background;
QRect bottomRightPosition;
QRect offlinePosition;
QPushButton startOfflineButton;
void bindClient();
void bindConnection();
void setUpUi();
void paintEvent(QPaintEvent *event);
void checkApp();
protected:
virtual void keyPressEvent(QKeyEvent *event);
};

View File

@@ -249,9 +249,9 @@
<widget class="QWidget" name="versionLayoutWidget" native="true">
<property name="geometry">
<rect>
<x>529</x>
<x>540</x>
<y>450</y>
<width>250</width>
<width>241</width>
<height>60</height>
</rect>
</property>
@@ -420,46 +420,6 @@
</item>
</layout>
</widget>
<widget class="QPushButton" name="offlineStartButton">
<property name="enabled">
<bool>true</bool>
</property>
<property name="geometry">
<rect>
<x>530</x>
<y>510</y>
<width>250</width>
<height>40</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>250</width>
<height>40</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>1500</width>
<height>40</height>
</size>
</property>
<property name="text">
<string>Запуск в автономном режиме</string>
</property>
<property name="checkable">
<bool>false</bool>
</property>
<property name="checked">
<bool>false</bool>
</property>
</widget>
<widget class="QWidget" name="verticalLayoutWidget_2">
<property name="geometry">
<rect>
@@ -478,9 +438,9 @@
<widget class="QWidget" name="verticalLayoutWidget_3">
<property name="geometry">
<rect>
<x>0</x>
<x>10</x>
<y>440</y>
<width>511</width>
<width>501</width>
<height>61</height>
</rect>
</property>
@@ -520,6 +480,46 @@
</item>
</layout>
</widget>
<widget class="QPushButton" name="offlineStartButton">
<property name="enabled">
<bool>true</bool>
</property>
<property name="geometry">
<rect>
<x>240</x>
<y>350</y>
<width>300</width>
<height>40</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>250</width>
<height>40</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>1500</width>
<height>40</height>
</size>
</property>
<property name="text">
<string>Запуск в автономном режиме</string>
</property>
<property name="checkable">
<bool>false</bool>
</property>
<property name="checked">
<bool>false</bool>
</property>
</widget>
</widget>
<widget class="QWidget" name="headerWidget" native="true">
<property name="geometry">
@@ -617,13 +617,13 @@
<widget class="QWidget" name="verticalLayoutWidget">
<property name="geometry">
<rect>
<x>10</x>
<x>20</x>
<y>550</y>
<width>531</width>
<height>41</height>
<width>761</width>
<height>42</height>
</rect>
</property>
<layout class="QVBoxLayout" name="changButtonGroup">
<layout class="QHBoxLayout" name="changeButtonGroup">
<property name="spacing">
<number>0</number>
</property>

2
mathModelConfig.xml Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<MathModelSettings SendIP="10.100.7.255" SendPortMath="18004" ListenIP="10.100.7.9" LocalPortMath="18003" />

2
path.txt Normal file
View File

@@ -0,0 +1,2 @@
D:/QT/Projects/RRJClient/path.txt
D:/QT/Projects/RRJClient/Application/RRJLoader/RRJ_Data/StreamingAssets

BIN
resource/Icons/new.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1017 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -17,5 +17,6 @@
<file>resource/Icons/caution.png</file>
<file>resource/Icons/close.png</file>
<file>resource/Icons/planeCustom.png</file>
<file>resource/Icons/new.png</file>
</qresource>
</RCC>

View File

@@ -35,7 +35,7 @@ void WidgetManager::binding()
connect(commonButtonGroupWidget,&CommonButtonGroupWidget::sigUpdateCommonWidget,mainWindow,&MainWindow::slotCommonWidgetState);
connect(mainWindow,&MainWindow::sigShowSettings,this,&WidgetManager::showSettings,Qt::AutoConnection);
}
void WidgetManager::slotSetLoadSettings(ServerSettings *settings)
void WidgetManager::slotSetLoadSettings(Settings *settings)
{
mainWindow->setLoadSettings(settings);
entryWidget->fillSettings(settings);
@@ -60,7 +60,6 @@ void WidgetManager::setLoginSuccess()
void WidgetManager::setLoginFailed()
{
entryWidget->showLoginWidget(true);
mainWindow->setLoginFailedState();
activateLoadingAnimation(false);
}
@@ -106,6 +105,7 @@ void WidgetManager::setNeedUpdateState(quint64 size, quint64 fileCount,quint64 d
result = tr("Файлов к удалению: ") + QString::number(deleteCount);
}
updateWidget->closeWindow();
mainWindow->setNeedUpdateState(result);
commonButtonGroupWidget->needUpdateState(true);
waitAnimationWidget->hideWithStop();
@@ -129,7 +129,9 @@ void WidgetManager::setConnectionState(bool isConnected)
mainWindow->slotConnectionState(isConnected);
if (isConnected)
{
mainWindow->getStartOfflineButton()->hide();
entryWidget->showLoginWidget(true);
commonButtonGroupWidget->loginState();
}
waitAnimationWidget->hideWithStop();
}
@@ -157,10 +159,11 @@ void WidgetManager::setServerDisconnectState()
void WidgetManager::setUndoCurrentChangesState()
{
waitAnimationWidget->showWithPlay();
mainWindow->undoCurrentChanges();
updateWidget->hide();
commonButtonGroupWidget->showProgressBar(false);
waitAnimationWidget->showWithPlay();
commonButtonGroupWidget->showProgressBar(true);
//waitAnimationWidget->hideWithStop();
}
void WidgetManager::showMainFrame(bool flag)
@@ -168,12 +171,6 @@ void WidgetManager::showMainFrame(bool flag)
mainWindow->showMainFrame(flag);
}
void WidgetManager::setAppAvailable(bool isAvailable)
{
commonButtonGroupWidget->startButtonActive(isAvailable);
mainWindow->setStartOfflineButton(isAvailable);
}
void WidgetManager::showSettings(bool isActive)
{
entryWidget->settingsState();

View File

@@ -45,13 +45,14 @@ public:
void setUndoCurrentChangesState();
void showMainFrame(bool flag);
void setAppAvailable(bool isAvailable);
void slotInlineDebug(const QString &text);
public slots:
void showSettings(bool isActive);
void slotSetLoadSettings(ServerSettings *settings);
void slotSetLoadSettings(Settings *settings);
void slotActivateLoadAnimation(bool flag);
signals:
bool sigAppAvailable();
private:
MainWindow *mainWindow;