Files
RRJClient/Core/recognizesystem.cpp

347 lines
11 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 "Core/recognizesystem.h"
#include <QMessageBox>
RecognizeSystem::RecognizeSystem(QObject *parent):
QObject(parent),
versionContainer(nullptr),
dataParser(nullptr),
postProcessorSystem(nullptr),
client(nullptr)
{
packetType = PacketType::TYPE_NONE;
filePath = "";
fileSize = 0;
sizeReceiveData = 0;
tmpBlock.clear();
countSend = 0;
}
void RecognizeSystem::initialize(DataParser *dataParser, VersionContainer *versionContainer,PostProcessorSystem *postProcessorSystem,Client *client)
{
this->versionContainer = versionContainer;
this->dataParser = dataParser;
this->postProcessorSystem = postProcessorSystem;
this->client = client;
}
void RecognizeSystem::recognize(QTcpSocket *socket)
{
//qDebug() << "RecognizeThreadId " << QThread::currentThreadId();
QDataStream stream(socket);
stream.setVersion(QDataStream::Qt_DefaultCompiledVersion);
int cntBytesAvl = 0;
while((cntBytesAvl = socket->bytesAvailable()) > 0)
{
/*
if(cntBytesAvl < 4)
{
//if(!socket->waitForReadyRead(TCP_READ_TIMEOUT))
//return;
socket->waitForReadyRead(TCP_READ_TIMEOUT);
continue;
}
*/
if (socket->state() != QTcpSocket::ConnectedState)
{
qDebug() << "RecognizeSystem::recognize socket->state() != QTcpSocket::ConnectedState";
return;
}
/*
if(!socket->waitForReadyRead(TCP_READ_TIMEOUT))
{
continue;
}
*/
if(packetType == PacketType::TYPE_NONE) //определение первичного пакета
{
stream.startTransaction();
stream >> packetType;
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);
}
//continue;
switch ((int)packetType)
{
case PacketType::TYPE_FOLDER: //создание папок
{
stream.startTransaction();
stream >> filePath;
if(!stream.commitTransaction())
{
socket->waitForReadyRead(TCP_READ_TIMEOUT);
continue;
}
filePath = Tools::createReceiveFullPath(filePath,versionContainer->getServerVersionData());
QDir dir(filePath);
if(!dir.exists())
{
if(dir.mkpath(filePath))
{
qDebug() << "Dir Created: " << filePath;
}
}
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(!socket->waitForReadyRead(TCP_READ_TIMEOUT))
//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;
}
filePath = Tools::createReceiveFullPath(filePath,versionContainer->getServerVersionData());
QFileInfo fileInfo(filePath);
if(fileInfo.exists())
{
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;
}
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;
}
dataParser->xmlParser(array);
}
break;
case PacketType::HASH_READY:
{
emit sigCheckUpdate();
}
break;
case PacketType::RECALCULATE_HASH:
{
emit sigdRecalculateHashOnServerState();
}
break;
case PacketType::BUSY:
{
emit sigAnimationActivated(true);
}
break;
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!";
}
//socket->waitForReadyRead(10);
packetType = PacketType::TYPE_NONE;
}
}