Merge branch 'bugfix-update-diff' into merge-test

# Conflicts:
#	ServerLMS/Systems/tools.h
#	ServerLMS/Systems/updatecontroller.h
This commit is contained in:
semenov
2025-01-20 09:31:15 +03:00
20 changed files with 247 additions and 105 deletions

View File

@@ -6,12 +6,13 @@ kanban-plugin: board
## backLog ## backLog
- [ ] выписать все варианты взаимодействия между всеми клиентами и сервером - [ ] окошко с выбором перенести в GUI
- [ ] sendSystem::sendXmlAnswer новый вариант отпарвки XML пакетов - [ ] Клиент НЕ СМОЖЕТ ВЫБИРАТЬ ВЕРСИИ
## bugs ## bugs
- [ ] При старт стопе не сканится шэред дата
## feature client Unity ## feature client Unity
@@ -25,23 +26,30 @@ kanban-plugin: board
- [ ] Иерархия проекта - папка application, папка updater и линк на основной экзешник - [ ] Иерархия проекта - папка application, папка updater и линк на основной экзешник
- [ ] на старте все мониторы должны быть активны - [ ] на старте все мониторы должны быть активны
- [ ] Нужен ли дополнительный выбор для загрузки с мат моделью или нет? - [ ] Нужен ли дополнительный выбор для загрузки с мат моделью или нет?
- [ ] при создании копии переключение сервера и переключения клиента - [ ] передавать полную версию в StreaminVerData
## feature server ## feature server
- [ ] Прибраться в Server
- [ ] рефакторинг
- [ ] добавить генерацию пустых файлов, если shared не найден - [ ] добавить генерацию пустых файлов, если shared не найден
- [ ] добавить подключение без DB
- [ ] ПЕРЕВЕСТИ все действия под операции и формировать процент из них
- [ ] блокировать выгрузку под инструктором, если режим версия base
## NOW ## NOW
- [ ] добавить автоматическое выключение после создания копии
## Complete ## Complete
- [ ] добавить автоматическое выключение после создания копии
- [ ] sendSystem::sendXmlAnswer новый вариант отпарвки XML пакетов
- [ ] выписать все варианты взаимодействия между всеми клиентами и сервером
- [ ] QT клиента: Не показывает блокировка, если версия удаляется
- [ ] рефакторинг
- [ ] Прибраться в Server
- [ ] не работает восстановление файлов
- [ ] запрет на удаление base - [ ] запрет на удаление base
- [ ] None hash - [ ] None hash
- [ ] сверстать окно создания новой версии - [ ] сверстать окно создания новой версии
@@ -265,6 +273,12 @@ kanban-plugin: board
## BUGFIX Complete ## BUGFIX Complete
- [ ] при создании копии переключение сервера и переключения клиента
- [ ] QT сервер Найти причину двойного вызова проверки при логине инструктором
- [ ] QT клиент: device not open после прерывания загрузки
- [ ] QT сервер При изменении версии правильный списке с файлами прилетает со второго раза
- [ ] QT клиент, если обновление в режиме инструктора доступно, кнопку запуск отключать
- [ ] QT сервер замерзает после выхода пользователя во время скачивания
- [ ] Клиент QT выводить инфу если клиент не подключен - [ ] Клиент QT выводить инфу если клиент не подключен
- [ ] Клиент QT не подключатся повторно, если соединение уже установлено - [ ] Клиент QT не подключатся повторно, если соединение уже установлено
- [ ] Клиент QT Неправильное отображение количества загруженных файлов - [ ] Клиент QT Неправильное отображение количества загруженных файлов

View File

@@ -30,3 +30,13 @@
6. Проверка с перезапуском клиента - ХЭШ КОРРЕКТНЫЙ 6. Проверка с перезапуском клиента - ХЭШ КОРРЕКТНЫЙ
7. Восстановление версии с сервера на клиент 7. Восстановление версии с сервера на клиент
8. Проверка с перезапуском клиента 8. Проверка с перезапуском клиента
Работа с версиями
1. QT клиент: Копирование версии
2. QT клиент: Копирование версии с указанием существующего имени -> ошибка
3. QT клиент: Удаление версии
4. QT клиент: Удаление базовой версии -> ошибка
5. QT клиент: Удаление версии которая выбрана -> ошибка
6. QT клиент: переключении версии
7. Unity: отправка в базовую версию
8.

View File

@@ -14,6 +14,8 @@ enum PacketType
TYPE_XMLANSWER = 8, TYPE_XMLANSWER = 8,
TYPE_QT = 9, TYPE_QT = 9,
TYPE_DISABLE = 11, TYPE_DISABLE = 11,
TYPE_UPDATE = 12,
TYPE_CHECK_VERSION = 13,
TYPE_FILESIZE = 20, TYPE_FILESIZE = 20,
TYPE_XMLANSWER_MESSAGE_FOR_GUI = 90, TYPE_XMLANSWER_MESSAGE_FOR_GUI = 90,

View File

@@ -13,6 +13,7 @@ public:
this->viewName = viewName; this->viewName = viewName;
this->createData = data; this->createData = data;
this->size = size; this->size = size;
this->isChangeable = true;
} }
~StreamingVersionData(); ~StreamingVersionData();
@@ -36,10 +37,21 @@ public:
return size; return size;
} }
bool getIsChangeable() const
{
return isChangeable;
}
void setIsChangeable(bool value)
{
isChangeable = value;
}
private: private:
QString absolutePath; QString absolutePath;
QString viewName; QString viewName;
QDateTime createData; QDateTime createData;
bool isChangeable;
qint32 size; qint32 size;
}; };

View File

@@ -262,6 +262,7 @@ void ProcessParser::clientMessage(QXmlStreamReader &xmlReader,ClientHandler *cli
} }
processingSystem->processingFromClientMessage(client, clientMessage); processingSystem->processingFromClientMessage(client, clientMessage);
} }
void ProcessParser::clientNotify(QXmlStreamReader &xmlReader,ClientHandler *client) void ProcessParser::clientNotify(QXmlStreamReader &xmlReader,ClientHandler *client)
@@ -278,6 +279,8 @@ void ProcessParser::clientNotify(QXmlStreamReader &xmlReader,ClientHandler *clie
clientNotify.Code = value; clientNotify.Code = value;
} }
processingSystem->processingClientNotify(client, clientNotify); processingSystem->processingClientNotify(client, clientNotify);
} }

View File

@@ -11,6 +11,8 @@ void CommonClientHandler::initialize(QMap<int, ClientHandler *> *clientsMap, Pro
this->processingSystem = processingSystem; this->processingSystem = processingSystem;
this->dataParser = dataParser; this->dataParser = dataParser;
this->logger = logger; this->logger = logger;
connect(this,&CommonClientHandler::sigSendToLogger,logger,&Logger::addTextToLogger,Qt::AutoConnection);
} }
void CommonClientHandler::sendNewVersionListToAllClient() void CommonClientHandler::sendNewVersionListToAllClient()
@@ -85,7 +87,8 @@ void CommonClientHandler::slot_msgToClientFromGUI(QString login, QString text)
QString str = "Msg To Client [" + peerAddress + ":" + peerPort + "] : " + textMsg; QString str = "Msg To Client [" + peerAddress + ":" + peerPort + "] : " + textMsg;
logger->addTextToLogger(str); emit sigSendToLogger(str);
break; break;
} }
} }
@@ -111,7 +114,7 @@ void CommonClientHandler::slot_msgToGUIfromClient(QString login, QString text)
QString str = "Msg From Client [" + peerAddress + ":" + peerPort + "] : " + textMsg; QString str = "Msg From Client [" + peerAddress + ":" + peerPort + "] : " + textMsg;
logger->addTextToLogger(str); emit sigSendToLogger(str);
break; break;
} }
} }
@@ -134,7 +137,7 @@ void CommonClientHandler::slot_sendTaskToClient(QString fullNameClient,QString t
QString peerPort = QString::number(handler->getSocket()->peerPort()); QString peerPort = QString::number(handler->getSocket()->peerPort());
QString str = "Task To Client [" + peerAddress + ":" + peerPort + "] : " + textTask; QString str = "Task To Client [" + peerAddress + ":" + peerPort + "] : " + textTask;
logger->addTextToLogger(str); emit sigSendToLogger(str);
} }
} }
} }

View File

@@ -27,7 +27,7 @@ public:
void slot_msgToGUIfromClient(QString login, QString text); void slot_msgToGUIfromClient(QString login, QString text);
void slot_sendTaskToClient(QString fullNameClient, QString textTask); void slot_sendTaskToClient(QString fullNameClient, QString textTask);
signals: signals:
void sigSendToLogger(QString text);
private: private:
QMap<int, ClientHandler*> *clientsMap; QMap<int, ClientHandler*> *clientsMap;
ProcessingSystem *processingSystem; ProcessingSystem *processingSystem;

View File

@@ -11,11 +11,16 @@ ProcessingSystem::ProcessingSystem(ProviderDBLMS* providerDBLMS, UpdateControlle
this->updateController = updateController; this->updateController = updateController;
} }
void ProcessingSystem::initialize(ServerLMSWidget *server, DataParser *dataParser, CommonClientHandler *commonClientHandler,Logger *logger) void ProcessingSystem::initialize(ServerLMSWidget *server,
DataParser *dataParser,
CommonClientHandler *commonClientHandler,
Logger *logger,
UpdateController *updateController)
{ {
this->commonClientServer = commonClientHandler; this->commonClientServer = commonClientHandler;
this->dataParser = dataParser; this->dataParser = dataParser;
this->server = server; this->server = server;
this->updateController = updateController;
connect(this,&ProcessingSystem::sigAuthChanged,commonClientHandler, &CommonClientHandler::slot_AuthChanged,Qt::AutoConnection); connect(this,&ProcessingSystem::sigAuthChanged,commonClientHandler, &CommonClientHandler::slot_AuthChanged,Qt::AutoConnection);
connect(this,&ProcessingSystem::sigUpdateListClients,server, &ServerLMSWidget::slotUpdateListClients,Qt::AutoConnection); connect(this,&ProcessingSystem::sigUpdateListClients,server, &ServerLMSWidget::slotUpdateListClients,Qt::AutoConnection);
@@ -296,6 +301,18 @@ void ProcessingSystem::processingClientNotify(ClientHandler *client, ClientNotif
{ {
client->sendVersionList(); client->sendVersionList();
} }
else if(clientNotify.Code == commandCanChangeVersion)
{
if (updateController->getCurrentVersion()->getIsChangeable())
{
client->sigSendNotify(commandChangable);
}
else
{
client->sigSendNotify(commandUnchangable);
}
}
} }

View File

@@ -23,7 +23,12 @@ class ProcessingSystem : public QObject
public: public:
explicit ProcessingSystem(ProviderDBLMS* providerDBLMS, UpdateController* updateController, QObject *parent = nullptr); explicit ProcessingSystem(ProviderDBLMS* providerDBLMS, UpdateController* updateController, QObject *parent = nullptr);
void initialize(ServerLMSWidget *server,DataParser* dataParser,CommonClientHandler *commonClientServer,Logger *logger); void initialize(ServerLMSWidget *server,
DataParser* dataParser,
CommonClientHandler *commonClientServer,
Logger *logger,
UpdateController *updateComtroller);
void processingClientAutorization(ClientHandler *client, ClientAutorization clientAutorization); void processingClientAutorization(ClientHandler *client, ClientAutorization clientAutorization);
void processingClientDeAutorization(ClientHandler *client, ClientDeAutorization clientDeAutorization); void processingClientDeAutorization(ClientHandler *client, ClientDeAutorization clientDeAutorization);
void processingClientQueryToDB(ClientHandler *client, ClientQueryToDB clientQueryToDB, int id = 0, void* data = nullptr); void processingClientQueryToDB(ClientHandler *client, ClientQueryToDB clientQueryToDB, int id = 0, void* data = nullptr);
@@ -45,7 +50,7 @@ private:
CommonClientHandler *commonClientServer; CommonClientHandler *commonClientServer;
ServerLMSWidget *server; ServerLMSWidget *server;
DataParser *dataParser; DataParser *dataParser;
//InstructorsAndTraineesWidget *pInstructorsAndTrainees; UpdateController *updateController;
ProviderDBLMS* providerDBLMS; ProviderDBLMS* providerDBLMS;
UpdateController* updateController; UpdateController* updateController;
}; };

View File

@@ -87,14 +87,22 @@ void RecognizeSystem::recognize()
if (!stream.commitTransaction()) continue; if (!stream.commitTransaction()) continue;
} }
if (command == commandUpdateFilesClient) //запускает процесс оновления if (packetType == PacketType::TYPE_UPDATE)
{ {
sendSystem->updateFiles(updateController->getFileSendList(), sendSystem->updateFiles(updateController->getFileSendList(),
updateController->getClientDataList()); updateController->getFileDeleteList());
qDebug()<< "Call update"; qDebug()<< "Call update";
packetType = PacketType::TYPE_NONE; packetType = PacketType::TYPE_NONE;
command = ""; }
if(packetType == PacketType::TYPE_CHECK_VERSION)
{
QFile checkFile(clientHash);
checkFile.open(QIODevice::ReadOnly);
updateController->compareFiles(clientHandler,checkFile.readAll());
checkFile.close();
} }
if (packetType == PacketType::TYPE_XMLANSWER) if (packetType == PacketType::TYPE_XMLANSWER)
@@ -160,6 +168,16 @@ void RecognizeSystem::recognize()
QFile file(filePath); QFile file(filePath);
// //ПРОВЕРКА НА ИЗМЕНЕНИЕ БАЗОВОЙ ВЕРСИИ
// bool check = checkIsChangeable();
// bool check2 = checkNonStaticData(filePath);
// if(!check && check2)
// {
// packetType = PacketType::TYPE_NONE;
// sendSystem->sendNotify(commandTryBaseChange);
// mutex->unlock();
// return;
// }
if (file.exists()) if (file.exists())
{ {
@@ -231,6 +249,17 @@ void RecognizeSystem::recognize()
break; break;
} }
// //ПРОВЕРКА НА ИЗМЕНЕНИЕ БАЗОВОЙ ВЕРСИИ
// bool check = checkIsChangeable();
// bool check2 = checkNonStaticData(filePath);
// if(!check && check2)
// {
// sendSystem->sendNotify(commandTryBaseChange);
// packetType = PacketType::TYPE_NONE;
// mutex->unlock();
// return;
// }
QFile file(filePath); QFile file(filePath);
QFileInfo fileInfo(file); QFileInfo fileInfo(file);
@@ -280,14 +309,6 @@ void RecognizeSystem::recognize()
file.close(); file.close();
if(command == "check")
{
QFile checkFile(filePath);
checkFile.open(QIODevice::ReadOnly);
updateController->compareFiles(clientHandler,checkFile.readAll());
checkFile.close();
}
filePath.clear(); filePath.clear();
fileSize = 0; fileSize = 0;
tmpBlock.clear(); tmpBlock.clear();
@@ -412,6 +433,18 @@ QString RecognizeSystem::createFullPath(QString path)
return fullPath; return fullPath;
} }
bool RecognizeSystem::checkIsChangeable()
{
return updateController->getCurrentVersion()->getIsChangeable();
}
bool RecognizeSystem::checkNonStaticData(QString path)
{
if(path.contains(sharedDataFolderName)) return true;
return false;
}
RecognizeSystem::~RecognizeSystem() RecognizeSystem::~RecognizeSystem()
{ {

View File

@@ -61,5 +61,7 @@ private:
void packetTypeInit(PacketType packet,Client *client); void packetTypeInit(PacketType packet,Client *client);
void packetTypeInit(PacketType type); void packetTypeInit(PacketType type);
QString createFullPath(QString path); QString createFullPath(QString path);
bool checkIsChangeable();
bool checkNonStaticData(QString path);
}; };
#endif // RECOGNIZESYSTEM_H #endif // RECOGNIZESYSTEM_H

View File

@@ -35,14 +35,22 @@ void SendSystem::sendMessageBlock(QString message)
void SendSystem::sendFileBlock(QString path) void SendSystem::sendFileBlock(QString path)
{ {
qDebug() << "sendFileBlock thread: " << QThread::currentThreadId(); qDebug() << "sendFileBlock thread: " << QThread::currentThreadId();
QFile file(path);
QFileInfo fileInfo(file);
if(isSendStopped)
{ //Поведение на случай отключения клиента
file.close();
return;
}
QDataStream stream(socket); QDataStream stream(socket);
stream.setVersion(QDataStream::Qt_DefaultCompiledVersion); stream.setVersion(QDataStream::Qt_DefaultCompiledVersion);
QFile file(path);
QFileInfo fileInfo(file);
fileSize = fileInfo.size(); fileSize = fileInfo.size();
if(fileSize == 0){ if(fileSize == 0){
@@ -55,20 +63,19 @@ void SendSystem::sendFileBlock(QString path)
stream << path << fileSize; stream << path << fileSize;
if(isSendStopped) { //Поведение на случай отключения клиента
file.close();
return;
}
socket->waitForBytesWritten(); socket->waitForBytesWritten(10);
if(file.open(QFile::ReadOnly)){ if(file.open(QFile::ReadOnly))
while(!file.atEnd()){ {
while(!file.atEnd())
{
QByteArray data = file.read(1025*250); QByteArray data = file.read(1025*250);
stream << data; stream << data;
socket->waitForBytesWritten(); socket->waitForBytesWritten(10);
if(socket->state() == QAbstractSocket::UnconnectedState) break;
countSend++; countSend++;
} }
@@ -77,7 +84,7 @@ void SendSystem::sendFileBlock(QString path)
file.close(); file.close();
countSend = 0; countSend = 0;
socket->waitForBytesWritten(); socket->waitForBytesWritten(10);
socket->waitForReadyRead(100); socket->waitForReadyRead(100);
} }
@@ -237,11 +244,9 @@ void SendSystem::updateFiles(QList<FileData> fileSendList, QList<FileData> delet
socket->waitForReadyRead(100); socket->waitForReadyRead(100);
} }
if(getIsSendStopped()) return; if(isSendStopped) return;
} }
emit sigLoadHash(); emit sigLoadHash();
sendPacketType(PacketType::TYPE_FINISH); sendPacketType(PacketType::TYPE_FINISH);

View File

@@ -25,10 +25,15 @@ static const QString buildHashName = staticDataFolderName + "/buildHash.xml";
static const QString buildDataPath = "/Application/RRJLoader/RRJ_Data/"; static const QString buildDataPath = "/Application/RRJLoader/RRJ_Data/";
static const QString tasksAMMfileName = "/tasksAmm.xml"; static const QString tasksAMMfileName = "/tasksAmm.xml";
static const QString tasksFIMfileName = "/tasksFIM.xml"; static const QString tasksFIMfileName = "/tasksFIM.xml";
static const QString clientHash = staticDataFolderName + "/clientHash.xml";
static const QString tasksAMMfileName = "/tasksAmm.xml";
static const QString tasksFIMfileName = "/tasksFIM.xml";
static const QString clientHash = staticDataFolderName + "/clientHash.xml";
static const QString baseNameVersion = "base";//может вынести комманды куда нибудь? static const QString baseNameVersion = "base";//может вынести комманды куда нибудь?
static const QString commandTryBaseDelete = "BASEDELETETRY"; static const QString commandTryBaseDelete = "BASEDELETETRY";
static const QString commandTryBaseChange = "TRYBASECHANGE";
static const QString commandTryActiveDelete = "TRYACTIVEDELETE"; static const QString commandTryActiveDelete = "TRYACTIVEDELETE";
static const QString commandTryCopyWithSameNames = "SAMENAMES"; static const QString commandTryCopyWithSameNames = "SAMENAMES";
static const QString commandGetServerDataList = "GETSERVERDATALIST"; static const QString commandGetServerDataList = "GETSERVERDATALIST";
@@ -37,6 +42,9 @@ static const QString commandReadyClient = "READY";
static const QString commandDisableClient = "DISABLE"; static const QString commandDisableClient = "DISABLE";
static const QString commandDuplicateVerName = "DUPLICATEVERNAME"; static const QString commandDuplicateVerName = "DUPLICATEVERNAME";
static const QString commandHashCompleteClient = "HASHSENDCOMPLETE"; static const QString commandHashCompleteClient = "HASHSENDCOMPLETE";
static const QString commandCanChangeVersion = "CANCHANGE";
static const QString commandChangable = "CHANGEABLE";
static const QString commandUnchangable = "UNCHANGEABLE";
static const QString commandUpdateFilesClient = "update"; static const QString commandUpdateFilesClient = "update";
class Tools { class Tools {

View File

@@ -50,7 +50,9 @@ void UpdateController::createCopyVersion(QString versionName,QString newVersionN
void UpdateController::deleteAssetVersion(QString versionName) void UpdateController::deleteAssetVersion(QString versionName)
{ {
commonClientHandler->slot_sendPacketToAllClients(PacketType::BUSY);
assetManager->deleteVersion(versionName); assetManager->deleteVersion(versionName);
commonClientHandler->slot_sendPacketToAllClients(PacketType::FREE);
} }
void UpdateController::compareFiles(ClientHandler* handler, QByteArray array) void UpdateController::compareFiles(ClientHandler* handler, QByteArray array)
@@ -59,7 +61,6 @@ void UpdateController::compareFiles(ClientHandler* handler, QByteArray array)
loadHash(); loadHash();
clientDataList.clear(); clientDataList.clear();
xmlFileDataParse(array); xmlFileDataParse(array);
clientDataList.append(*datas);
checkNeedUpdate(handler); checkNeedUpdate(handler);
mutex->unlock(); mutex->unlock();
} }
@@ -182,8 +183,6 @@ QString UpdateController::getCommands()
} }
void UpdateController::setUpCurrentServerHash() void UpdateController::setUpCurrentServerHash()
{ {
QList<FileData> *fileList = new QList<FileData>; QList<FileData> *fileList = new QList<FileData>;
@@ -296,61 +295,69 @@ QList<FileData>* UpdateController::calculateHash(QString path)
{ {
serverDataList.clear(); serverDataList.clear();
QDirIterator iterator(path,QDirIterator::Subdirectories);
if(!QDir(path).exists()){ if(!QDir(path).exists()){
QDir().mkdir(path); QDir().mkdir(path);
} }
QDir dir(path);
dir.setFilter(QDir::NoDotAndDotDot);
QString hashString; QString hashString;
QStringList filter;
filter << "*";
QList<FileData> *files = new QList<FileData>; QList<FileData> *files = new QList<FileData>;
while (iterator.hasNext()) QDirIterator dirIterator(path,filter, QDir::AllEntries | QDir::NoDotAndDotDot, QDirIterator::Subdirectories);
while (dirIterator.hasNext())
{ {
iterator.next(); QFileInfo fileInfo(dirIterator.next());
QFileInfo fileInfo = iterator.fileInfo();
FileData currentFile; FileData currentFile;
QFile file(fileInfo.absoluteFilePath()); if(fileInfo.isDir() && !fileInfo.fileName().startsWith(".") && fileInfo.fileName() != "RRJLoader")
quint64 fileSize = file.size();
const quint64 bufferSize = 10240;
if (fileInfo.isHidden()) continue;
if(fileInfo.isFile() && file.open(QIODevice::ReadOnly) && !fileInfo.fileName().contains(".meta"))
{ {
char buffer[bufferSize];
int bytesRead;
int readSize = qMin(fileSize,bufferSize);
QCryptographicHash hash(QCryptographicHash::Md5);
while(readSize > 0 && (bytesRead = file.read(buffer,readSize)) > 0){
fileSize -= bytesRead;
hash.addData(buffer,bytesRead);
readSize = qMin(fileSize,bufferSize);
}
hashString = QString(hash.result().toHex());
currentFile.hash = hashString;
currentFile.path = Tools::createLocalPath(fileInfo.absoluteFilePath()); currentFile.path = Tools::createLocalPath(fileInfo.absoluteFilePath());
files->push_back(currentFile);
file.close();
}
else if(fileInfo.isDir() && fileInfo.fileName() != ".." && !fileInfo.isRoot())
{
currentFile.hash = "FOLDER"; currentFile.hash = "FOLDER";
currentFile.path = Tools::createLocalPath(fileInfo.path());
if(!files->contains(currentFile)){ if(!files->contains(currentFile))
{
files->push_back(currentFile); files->push_back(currentFile);
} }
} }
} }
std::sort(files->begin(),files->end()); QDirIterator fileIterator(path,filter,QDir::Files | QDir::NoDotAndDotDot,QDirIterator::Subdirectories);
while (fileIterator.hasNext())
{
fileIterator.next();
QFileInfo fileInfo = fileIterator.fileInfo();
FileData currentFile;
QFile file(fileInfo.absoluteFilePath());
quint64 fileSize = file.size(); //буффер для хэширования крупных файлов
const quint64 bufferSize = 10240;
if(fileInfo.isHidden()) continue;
if(fileInfo.isFile() && file.open(QIODevice::ReadOnly) && !fileInfo.fileName().contains(".meta"))
{
char buffer[bufferSize];
int bytesRead;
int readSize = qMin(fileSize,bufferSize);
QCryptographicHash hash(QCryptographicHash::Md5);
while(readSize > 0 && (bytesRead = file.read(buffer,readSize)) > 0)
{
fileSize -= bytesRead;
hash.addData(buffer,bytesRead);
readSize = qMin(fileSize,bufferSize);
}
hashString = QString(hash.result().toHex());
currentFile.path = Tools::createLocalPath(fileInfo.absoluteFilePath());
currentFile.hash = hashString;
files->push_back(currentFile);
file.close();
}
}
serverDataList.append(*files); serverDataList.append(*files);
return files; return files;
} }
@@ -411,6 +418,12 @@ void UpdateController::CalculateSizeToSend(QList<FileData> diffList)
void UpdateController::calculateSharedHash() void UpdateController::calculateSharedHash()
{ {
QDir sharedDir(sharedDataPath); QDir sharedDir(sharedDataPath);
if(!QDir(sharedDataPath).exists())
{
QDir().mkdir(sharedDataPath);
}
QDirIterator dirIterator(sharedDir); QDirIterator dirIterator(sharedDir);
QList<FileData> *fileList = new QList<FileData>; QList<FileData> *fileList = new QList<FileData>;
QList<StreamingVersionData*> *versionList = new QList<StreamingVersionData*>; QList<StreamingVersionData*> *versionList = new QList<StreamingVersionData*>;
@@ -431,6 +444,15 @@ void UpdateController::calculateSharedHash()
fileInfo.absoluteFilePath(),fileInfo.fileName(), fileInfo.absoluteFilePath(),fileInfo.fileName(),
fileInfo.birthTime(),fileInfo.size()); fileInfo.birthTime(),fileInfo.size());
if(fileInfo.fileName() == baseNameVersion)
{
version->setIsChangeable(false);
}
else
{
version->setIsChangeable(true);
}
versionList->append(version); versionList->append(version);
} }
@@ -447,8 +469,9 @@ void UpdateController::createVersionListXmlAnswer(QList<StreamingVersionData *>
{ {
SAttribute attribute1 = {"Version", ver->getViewName()}; SAttribute attribute1 = {"Version", ver->getViewName()};
SAttribute attribute2 = {"Created", ver->getCreateData().toString()}; SAttribute attribute2 = {"Created", ver->getCreateData().toString()};
SAttribute attribute3 = {"isChangeable",QString::number(ver->getIsChangeable())};
QList<SAttribute> listAttr = {attribute1, attribute2}; QList<SAttribute> listAttr = {attribute1, attribute2,attribute3};
SXmlAnswerTag tag = {"VersionData", listAttr}; SXmlAnswerTag tag = {"VersionData", listAttr};
listTag.append(tag); listTag.append(tag);
@@ -479,6 +502,7 @@ void UpdateController::createVersionListXmlAnswer(QList<StreamingVersionData *>
xmlWriter.writeEndDocument(); xmlWriter.writeEndDocument();
file.close(); file.close();
} }
void UpdateController::saveVersionToFile(StreamingVersionData *streamingVersion) //TODO: переименовать и перебросить в AssetManager void UpdateController::saveVersionToFile(StreamingVersionData *streamingVersion) //TODO: переименовать и перебросить в AssetManager
{ {
QFile file(version); QFile file(version);
@@ -491,6 +515,7 @@ void UpdateController::saveVersionToFile(StreamingVersionData *streamingVersion)
xmlWriter.writeStartElement("VersionData"); xmlWriter.writeStartElement("VersionData");
xmlWriter.writeAttribute("Version",streamingVersion->getViewName()); xmlWriter.writeAttribute("Version",streamingVersion->getViewName());
xmlWriter.writeAttribute("Created",streamingVersion->getCreateData().toString()); xmlWriter.writeAttribute("Created",streamingVersion->getCreateData().toString());
xmlWriter.writeAttribute("isChangeable",QString::number(streamingVersion->getIsChangeable()));
xmlWriter.writeEndElement(); xmlWriter.writeEndElement();
xmlWriter.writeEndDocument(); xmlWriter.writeEndDocument();
@@ -498,7 +523,6 @@ void UpdateController::saveVersionToFile(StreamingVersionData *streamingVersion)
file.close(); file.close();
} }
void UpdateController::sendNewVersionList() void UpdateController::sendNewVersionList()
{ {
commonClientHandler->sendNewVersionListToAllClient(); commonClientHandler->sendNewVersionListToAllClient();
@@ -512,7 +536,6 @@ bool UpdateController::checkDuplicate(QString versionName)
void UpdateController::xmlFileDataParse(QByteArray array) void UpdateController::xmlFileDataParse(QByteArray array)
{ {
QXmlStreamReader xmlReader(array); QXmlStreamReader xmlReader(array);
datas = new QList<FileData>;
xmlReader.readNext(); xmlReader.readNext();
//Крутимся в цикле до тех пор, пока не достигнем конца документа //Крутимся в цикле до тех пор, пока не достигнем конца документа
@@ -536,7 +559,7 @@ void UpdateController::xmlFileDataParse(QByteArray array)
data.hash = value; data.hash = value;
} }
datas->append(data); clientDataList.append(data);
} }
} }
@@ -544,6 +567,11 @@ void UpdateController::xmlFileDataParse(QByteArray array)
} }
} }
StreamingVersionData* UpdateController::getCurrentVersion()
{
return assetManager->getCurrentVersionData();
}
void UpdateController::printFileList(QList<FileData> fileData) void UpdateController::printFileList(QList<FileData> fileData)
{ {
QListIterator<FileData> iterator(fileData); QListIterator<FileData> iterator(fileData);
@@ -578,11 +606,6 @@ DataInfo *UpdateController::getCurrentDataInfo()
return dataInfo; return dataInfo;
} }
QList<FileData> *UpdateController::getDatas() const
{
return datas;
}
void UpdateController::clearCurrentDataInfo() void UpdateController::clearCurrentDataInfo()
{ {
delete dataInfo; delete dataInfo;

View File

@@ -51,12 +51,12 @@ public:
DataInfo *getCurrentDataInfo(); DataInfo *getCurrentDataInfo();
void clearCurrentDataInfo(); void clearCurrentDataInfo();
QList<FileData> *getDatas() const;
void createVersionListXmlAnswer(QList<StreamingVersionData *> version); void createVersionListXmlAnswer(QList<StreamingVersionData *> version);
void saveVersionToFile(StreamingVersionData *streamingVersion); void saveVersionToFile(StreamingVersionData *streamingVersion);
void xmlFileDataParse(QByteArray array); void xmlFileDataParse(QByteArray array);
QByteArray getAdditionalFile(QString name); QByteArray getAdditionalFile(QString name);
StreamingVersionData *getCurrentVersion();
public slots: public slots:
void changeAssetVersion(QString versionName); void changeAssetVersion(QString versionName);
@@ -74,7 +74,6 @@ private:
QList<FileData> fileSendList; QList<FileData> fileSendList;
QList<FileData> fileDeleteList; QList<FileData> fileDeleteList;
QList<FileData> *datas;
DataInfo *dataInfo; DataInfo *dataInfo;
QString buildPath; QString buildPath;

View File

@@ -54,6 +54,7 @@ void ClientHandler::initialize(int descriptor,ServerLMSWidget *serverWidget,
connect(this,&ClientHandler::sigSocketClose,sendSystem,&SendSystem::socketClose,Qt::AutoConnection); connect(this,&ClientHandler::sigSocketClose,sendSystem,&SendSystem::socketClose,Qt::AutoConnection);
connect(this,&ClientHandler::sigSocketFlush,sendSystem,&SendSystem::socketFlush,Qt::AutoConnection); connect(this,&ClientHandler::sigSocketFlush,sendSystem,&SendSystem::socketFlush,Qt::AutoConnection);
connect(this,&ClientHandler::sigSendPacketType,sendSystem,&SendSystem::sendPacketType,Qt::AutoConnection); connect(this,&ClientHandler::sigSendPacketType,sendSystem,&SendSystem::sendPacketType,Qt::AutoConnection);
connect(this,&ClientHandler::sigSendStop,sendSystem,&SendSystem::sendStop,Qt::DirectConnection);
connect(socket,&QTcpSocket::readyRead,recognizeSystem,&RecognizeSystem::recognize,Qt::AutoConnection); connect(socket,&QTcpSocket::readyRead,recognizeSystem,&RecognizeSystem::recognize,Qt::AutoConnection);
connect(socket, &QTcpSocket::disconnected, this, &ClientHandler::sendDisable,Qt::AutoConnection); connect(socket, &QTcpSocket::disconnected, this, &ClientHandler::sendDisable,Qt::AutoConnection);
@@ -129,8 +130,10 @@ void ClientHandler::sendNeedUpdate(bool flag, quint64 size, quint64 fileCount,qu
void ClientHandler::sendDisable() void ClientHandler::sendDisable()
{ {
thread->exit(); // thread->exit();
thread->wait(); // thread->wait();
thread->quit();
emit sigSendStop();
emit sigClientDisconnected(client->getAddress(),client->getPort()); emit sigClientDisconnected(client->getAddress(),client->getPort());
} }

View File

@@ -67,6 +67,7 @@ signals:
bool sigSocketFlush(); bool sigSocketFlush();
void sigSendVersion(); void sigSendVersion();
void sigSendPacketType(PacketType packetType); void sigSendPacketType(PacketType packetType);
void sigSendStop();
public : public :
QThread *thread; QThread *thread;

View File

@@ -8,7 +8,7 @@ MultiThreadServer::MultiThreadServer(ServerLMSWidget *widget,UpdateController *u
dataParser(dataParser), dataParser(dataParser),
logger(logger) logger(logger)
{ {
connect(this,&MultiThreadServer::sigSendToLogger,logger,&Logger::addTextToLogger);
} }
void MultiThreadServer::incomingConnection(qintptr socketDesriptor) void MultiThreadServer::incomingConnection(qintptr socketDesriptor)
@@ -16,14 +16,14 @@ void MultiThreadServer::incomingConnection(qintptr socketDesriptor)
ClientHandler* newClient = new ClientHandler; ClientHandler* newClient = new ClientHandler;
connect(this,&MultiThreadServer::sigInitClient,newClient,&ClientHandler::initialize,Qt::AutoConnection); connect(this,&MultiThreadServer::sigInitClient,newClient,&ClientHandler::initialize,Qt::AutoConnection);
connect(newClient,&ClientHandler::sigClientDisconnected,this,&MultiThreadServer::slotDisconnectClient,Qt::QueuedConnection); connect(newClient,&ClientHandler::sigClientDisconnected,this,&MultiThreadServer::slotDisconnectClient,Qt::AutoConnection);
emit sigInitClient(socketDesriptor,serverLmsWidget,updateController,dataParser,logger); emit sigInitClient(socketDesriptor,serverLmsWidget,updateController,dataParser,logger);
disconnect(this,&MultiThreadServer::sigInitClient,newClient,&ClientHandler::initialize); disconnect(this,&MultiThreadServer::sigInitClient,newClient,&ClientHandler::initialize);
serverLmsWidget->addClient(socketDesriptor,newClient); serverLmsWidget->addClient(socketDesriptor,newClient);
logger->addTextToLogger("To Client: " + QString(SERVER_HELLO)); emit sigSendToLogger("To Client: " + QString(SERVER_HELLO));
} }
void MultiThreadServer::slotDisconnectClient(QString peerAddress, QString peerPort) void MultiThreadServer::slotDisconnectClient(QString peerAddress, QString peerPort)
@@ -53,8 +53,7 @@ void MultiThreadServer::slotDisconnectClient(QString peerAddress, QString peerPo
} }
emit signalStopSendFile(); emit signalStopSendFile();
emit sigSendToLogger("SERVER: Client " + login + " disconnected");
logger->addTextToLogger("SERVER: Client " + login + " disconnected");
serverLmsWidget->slotUpdateListClients(); serverLmsWidget->slotUpdateListClients();
serverLmsWidget->autorizationHandler(login); serverLmsWidget->autorizationHandler(login);

View File

@@ -18,6 +18,7 @@ signals:
void sigInitClient(int descriptor, ServerLMSWidget *serverWidget, void sigInitClient(int descriptor, ServerLMSWidget *serverWidget,
UpdateController *updateController, DataParser *dataParser,Logger *logger); UpdateController *updateController, DataParser *dataParser,Logger *logger);
void signalStopSendFile(); void signalStopSendFile();
void sigSendToLogger(QString text);
public slots: public slots:
void slotDisconnectClient(QString peerAddress, QString peerPort); void slotDisconnectClient(QString peerAddress, QString peerPort);

View File

@@ -14,7 +14,7 @@ ServerLMSWidget::ServerLMSWidget(QWidget *parent) :
tcpServer(nullptr), tcpServer(nullptr),
hostPort(6000), hostPort(6000),
stateServer(stoped), stateServer(stoped),
stateBlockAutorization(blocked), stateBlockAutorization(unblocked),
updateThread(nullptr), updateThread(nullptr),
loggerThread(nullptr), loggerThread(nullptr),
dataParser(nullptr), dataParser(nullptr),
@@ -44,11 +44,13 @@ ServerLMSWidget::ServerLMSWidget(QWidget *parent) :
loggerThread = new QThread; loggerThread = new QThread;
providerDBLMS = new ProviderDBLMS(this); providerDBLMS = new ProviderDBLMS(this);
connect(providerDBLMS, &ProviderDBLMS::signal_BlockAutorization, this, &ServerLMSWidget::slot_BlockAutorization);
providerDBLMS->ConnectionToDB(); providerDBLMS->ConnectionToDB();
logger = new Logger(ui->listWidgetLogger); logger = new Logger(ui->listWidgetLogger);
connect(logger,&Logger::sigSendTextToLogger,this,&ServerLMSWidget::slotAddToLog,Qt::QueuedConnection);
connect(providerDBLMS, &ProviderDBLMS::signal_BlockAutorization, this, &ServerLMSWidget::slot_BlockAutorization);
connect(logger,&Logger::sigSendTextToLogger,this,&ServerLMSWidget::slotAddToLog,Qt::AutoConnection);
logger->moveToThread(loggerThread); logger->moveToThread(loggerThread);
assetsManager = new AssetsManager; assetsManager = new AssetsManager;
@@ -68,7 +70,7 @@ ServerLMSWidget::ServerLMSWidget(QWidget *parent) :
updateThread->start(); updateThread->start();
commonClientHandler->initialize(&clientsMap,processingSystem,dataParser,logger); commonClientHandler->initialize(&clientsMap,processingSystem,dataParser,logger);
processingSystem->initialize(this,dataParser,commonClientHandler,logger); processingSystem->initialize(this,dataParser,commonClientHandler,logger,updateController);
logger->setTypeLog("widget"); logger->setTypeLog("widget");
@@ -194,7 +196,7 @@ void ServerLMSWidget::slotUpdateListClients()
} }
int countClients = clientsMap.count(); int countClients = clientsMap.count();
logger->addTextToLogger("SERVER: countClients = " + QString::number(countClients)); emit sigLog("SERVER: countClients = " + QString::number(countClients));
} }
void ServerLMSWidget::slot_BlockAutorization(bool block) void ServerLMSWidget::slot_BlockAutorization(bool block)