Files
RRJClient/Core/UpdateController.cpp
2024-08-19 11:57:33 +03:00

86 lines
2.3 KiB
C++

#include "updatecontroller.h"
UpdateController::UpdateController(DataParser *parser, QObject *parent) :
QObject(parent)
{
this->dataParser = parser;
localPath = QDir::currentPath() + "/Application";
}
void UpdateController::CalculateHash()
{
qDebug() << "Try calculate";
QDirIterator iterator(localPath,QDirIterator::Subdirectories);
fileDataList.clear();
QList<FileData> *files = new QList<FileData>;
QList<FileData> * folders = new QList<FileData>;
if(!QDir("Application").exists()){ //проверка на наличие папки
QDir().mkdir("Application");
}
QDir dir(localPath);
QString hashString;
while (iterator.hasNext())
{
iterator.next();
QFileInfo fileInfo = iterator.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))
{
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);
}
else if (fileInfo.isDir() && !fileInfo.isRoot() && fileInfo.fileName() != "..")
{
currentFile.path = Tools::CreateLocalPath(fileInfo.path());
currentFile.hash = "FOLDER";
if(!folders->contains(currentFile)){
folders->push_back(currentFile);
}
}
}
fileDataList.append(*folders);
fileDataList.append(*files);
dataParser->CreateXML(fileDataList);
delete folders;
delete files;
}
UpdateController::~UpdateController()
{
}