Files
RRJServer/ServerLMS/Systems/recognizesystem.cpp
2025-01-17 16:47:22 +03:00

452 lines
13 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "recognizesystem.h"
RecognizeSystem::RecognizeSystem(QObject *parent):
QObject(parent)
{
packetType = PacketType::TYPE_NONE;
filePath.clear();
fileSize = 0;
sizeReceiveData = 0;
tmpBlock.clear();
countSend = 0;
mutex = new QMutex;
}
void RecognizeSystem::initialize(UpdateController *updateController,DataParser* dataParser,
ServerLMSWidget *server,SendSystem *sendSystem, ClientHandler *handler)
{
this->updateController = updateController;
this->dataParser = dataParser;
this->server = server;
this->clientHandler = handler;
this->sendSystem = sendSystem;
socket = handler->getSocket();
connect(this,&RecognizeSystem::sigCalculateHash,updateController,&UpdateController::calculateFullHash,Qt::AutoConnection);
connect(this,&RecognizeSystem::sigCalculateHash,updateController,&UpdateController::setUpCurrentServerHash,Qt::AutoConnection);
connect(this,&RecognizeSystem::sigChangeVersion,updateController,&UpdateController::changeAssetVersion,Qt::AutoConnection);
connect(this,&RecognizeSystem::sigDeleteVersion,updateController,&UpdateController::deleteAssetVersion,Qt::AutoConnection);
connect(this,&RecognizeSystem::sigCopyVersion,updateController,&UpdateController::createCopyVersion,Qt::AutoConnection);
connect(this,&RecognizeSystem::sigXmlParser,dataParser->getProcessParser(),&ProcessParser::read,Qt::DirectConnection);
qDebug() << "Recognize init thread ID " << QThread::currentThreadId();
}
void RecognizeSystem::recognize()
{
mutex->lock();
qDebug() << "Recognize thread ID " << QThread::currentThreadId();
QDataStream stream(socket);
stream.setVersion(QDataStream::Qt_DefaultCompiledVersion);
QByteArray data;
Client *client = clientHandler->getClient();
while (socket->bytesAvailable() > 0)
{
if (packetType == PacketType::TYPE_NONE)
{
stream.startTransaction();
if(!isPackageTypeInited) //первичная инициализация для типа клиента
{
char *read = new char[0];
stream.readRawData(read,1);
packetType = static_cast<PacketType>(QString(read[0]).toInt());
packetTypeInit(packetType,client);
if(!stream.commitTransaction()) continue;
continue;
}
if(client->getIsUnity())
{
char *read = new char[0];
stream.readRawData(read,1);
packetType = static_cast<PacketType>(QString(read[0]).toInt());
if(!stream.commitTransaction()) continue;
continue;
}
else
{
stream >> packetType;
if(!stream.commitTransaction()) continue;
}
}
if (packetType == PacketType::TYPE_COMMAND) //TODO: надо переделать под какой то нормальный тип, который уже существует
{
stream.startTransaction();
stream >> command;
if (!stream.commitTransaction()) continue;
}
if (packetType == PacketType::TYPE_UPDATE)
{
sendSystem->updateFiles(updateController->getFileSendList(),
updateController->getFileDeleteList());
qDebug()<< "Call update";
packetType = PacketType::TYPE_NONE;
}
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(clientHandler->getClient()->getIsUnity())
{
data = socket->readAll();
}
else
{
stream.startTransaction();
stream >> data;
if(!stream.commitTransaction()) continue;
}
qDebug() << data;
emit sigXmlParser(clientHandler,data);
packetType = PacketType::TYPE_NONE;
continue;
}
if(packetType == PacketType::TYPE_FOLDER) //создание папок
{
if(client->getIsUnity())
{
filePath = socket->readAll();
filePath = Tools::createSharedPath(filePath);
}
else
{
stream.startTransaction();
stream >> filePath;
if(!stream.commitTransaction()){
continue;
}
filePath = createFullPath(filePath);
}
QDir dir(filePath);
if(!dir.exists()){
if(dir.mkpath(filePath)){
qDebug() << "Dir Created";
}
}
packetType = PacketType::TYPE_NONE;
continue;
}
if (packetType == PacketType::TYPE_FILE) //выгрузка одного файла
{
if(client->getIsUnity())
{
DataInfo *currentFileData = updateController->getCurrentDataInfo();
filePath = currentFileData->path;
filePath = Tools::createSharedPath(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())
{
file.remove(); //удаление файла, если он уже есть, но необходимо обновить
qDebug() << Tools::getTime() + "Delete exist file: " + filePath;
}
if (!file.open(QFile::Append))
{
QString folderPath = Tools::createFolderPath(filePath);
qDebug() << "FULL PATH: " << folderPath;
QDir dir(folderPath);
if (!dir.exists()){
dir.mkpath(".");
}
file.open(QFile::Append);
}
//socket->waitForReadyRead(1000);
fileSize = currentFileData->size;
qint64 readSize = 65535;
forever
{
if(fileSize < readSize)
{
readSize = fileSize;
qDebug() << "LastPackage: " << readSize;
}
socket->waitForReadyRead(20);
tmpBlock = socket->read(readSize);
quint64 toFile = file.write(tmpBlock);
fileSize -= toFile;
sizeReceiveData += toFile;
countSend++;
tmpBlock.clear();
qDebug() << "Loading progress: " << fileSize << "/" << currentFileData->size;
if(fileSize == 0) break;
}
file.close();
filePath.clear();
updateController->clearCurrentDataInfo();
socket->waitForReadyRead(100);
packetType = PacketType::TYPE_NONE;
}
else
{
forever
{
stream.startTransaction();
stream >> filePath;
stream >> fileSize;
if(!stream.commitTransaction()) continue;
filePath = createFullPath(filePath);
socket->waitForReadyRead(100);
break;
}
// //ПРОВЕРКА НА ИЗМЕНЕНИЕ БАЗОВОЙ ВЕРСИИ
// bool check = checkIsChangeable();
// bool check2 = checkNonStaticData(filePath);
// if(!check && check2)
// {
// sendSystem->sendNotify(commandTryBaseChange);
// packetType = PacketType::TYPE_NONE;
// mutex->unlock();
// return;
// }
QFile file(filePath);
QFileInfo fileInfo(file);
if(file.exists())
{
file.remove();
}
file.open(QFile::Append);
forever
{
stream.startTransaction();
stream >> tmpBlock;
if(!stream.commitTransaction()){
if(socket->state() == QAbstractSocket::UnconnectedState){
qDebug() << "UNCONNECT";
mutex->unlock();
file.close();
return;
}
if(socket->waitForReadyRead(TCP_READ_TIMEOUT)){
continue;
}
continue;
}
quint64 toFile = file.write(tmpBlock);
sizeReceiveData += toFile;
countSend++;
tmpBlock.clear();
if(sizeReceiveData == fileSize) break;
}
QString logMessage = Tools::getTime() + " ";
logMessage.append("Load from " + client->getLogin() + " ");
logMessage.append(fileInfo.fileName());
emit sigSendToLogger(logMessage);
file.close();
filePath.clear();
fileSize = 0;
tmpBlock.clear();
sizeReceiveData = 0;
countSend = 0;
}
}
if (packetType == PacketType::TYPE_FILESIZE)
{
fileSize = socket->readAll().toULong();
qDebug() << fileSize;
packetType = PacketType::TYPE_NONE;
continue;
}
if (packetType == PacketType::TYPE_FINISH)
{
emit sigCalculateHash();
packetType = PacketType::TYPE_NONE;
}
if(packetType == PacketType::CHANGE_DATA_VERSION)
{
stream.startTransaction();
QString versionName;
stream >> versionName;
if(!stream.commitTransaction()) continue;
qDebug() << "For change " + versionName;
emit sigChangeVersion(versionName);
}
if(packetType == PacketType::COPY_VERSION)
{
QString source;
QStringList result;
stream.startTransaction();
stream >> source;
if(!stream.commitTransaction()) continue;
result = source.split(";");
if (updateController->checkDuplicate(result[1]))
{
sendSystem->sendNotify(commandDuplicateVerName);
packetType = PacketType::TYPE_NONE;
break;
}
emit sigCopyVersion(result[0],result[1]);
sendSystem->sendPacketType(PacketType::BUSY);
}
if(packetType == PacketType::DELETE_DATA_VERSION)
{
stream.startTransaction();
QString versionName;
stream >> versionName;
if(!stream.commitTransaction()) continue;
qDebug() << "For delete " + versionName;
if (versionName == baseNameVersion)
{
sendSystem->sendNotify(commandTryBaseDelete);
}
else if (versionName == updateController->getCurrentVersionName())
{
sendSystem->sendNotify(commandTryActiveDelete);
}
else
{
emit sigDeleteVersion(versionName);
}
}
packetType = PacketType::TYPE_NONE;
}
mutex->unlock();
}
void RecognizeSystem::packetTypeInit(PacketType packet,Client *client)
{
if(packet == PacketType::TYPE_QT)
{
client->setUnity(false);
qDebug() << "ConnectionType isUnity: " << client->getIsUnity();
}
else if (packet == PacketType::TYPE_UNITY)
{
client->setUnity(true);
}
isPackageTypeInited = true;
packetType = PacketType::TYPE_NONE;
}
QString RecognizeSystem::createFullPath(QString path)
{
QString fullPath;
qint8 pos = path.indexOf("Application");
QString localPath = path.remove(0,--pos);
//qDebug() << "CLIENT: localPath" << localPath;
fullPath = QDir::currentPath() + localPath;
return fullPath;
}
bool RecognizeSystem::checkIsChangeable()
{
return updateController->getCurrentVersion()->getIsChangeable();
}
bool RecognizeSystem::checkNonStaticData(QString path)
{
if(path.contains(sharedDataFolderName)) return true;
return false;
}
RecognizeSystem::~RecognizeSystem()
{
}