#include "UpdateController.h" #include UpdateController::UpdateController(DataParserOutput *dataParserOut, SendSystem *sendSystem, QObject *parent) : QObject(parent), versionContainer(nullptr) { this->sendSystem = sendSystem; this->dataParserOut = dataParserOut; applicationFolderPath = QDir::currentPath() + applicationFolderName; } void UpdateController::initialize(VersionContainer *versionContainer) { this->versionContainer = versionContainer; } void UpdateController::calculateCommonHash() { appDataList.clear(); appDataList = calculateHash(applicationFolderPath,"StreamingAssets"); calculateStreamingHash(); appDataList.append(streamingDataList); dataParserOut->createFileDataList(appDataList,fullStaticDataFolderName + hashFilename); qDebug() << "UpdateController threadID " << QThread::currentThreadId(); } void UpdateController::calculateStreamingHash() { streamingDataList.clear(); streamingDataList = calculateHash(QDir::currentPath() + streamingAssetsPath,""); std::sort(streamingDataList.begin(),streamingDataList.end()); dataParserOut->createFileDataList(streamingDataList,streamingHashFilename); } QList UpdateController::calculateHash(const QString& path,const QString& ignoreName) { qDebug() << "Try calculate"; if(!QDir(path).exists()) { QDir().mkdir(path); } QList *hashes = new QList; QStringList filter; filter << "*"; QString hashString; QDirIterator dirIterator(path,filter, QDir::AllEntries | QDir::NoDotAndDotDot, QDirIterator::Subdirectories); while (dirIterator.hasNext()) { QFileInfo fileInfo(dirIterator.next()); FileData currentFile; QString fileName = fileInfo.fileName(); if(fileInfo.isDir() && !fileName.startsWith(".") && fileName != "RRJLoader") { currentFile.path = Tools::createLocalPath(fileInfo.absoluteFilePath()); currentFile.hash = "FOLDER"; if(!hashes->contains(currentFile)) { hashes->push_back(currentFile); } } } 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(ignoreName != "" && fileInfo.path().contains(ignoreName)) 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; hashes->push_back(currentFile); file.close(); } } return *hashes; } void UpdateController::updateFilesOnServer(QList *fileSendList){ QListIterator serverIterator(*fileSendList); try { while(serverIterator.hasNext()) { FileData data = serverIterator.next(); if (data.hash == "FOLDER") { sendSystem->sendFolderBlock(data.path); } else { QString fullPath = Tools::createReceiveFullPath(data.path,versionContainer->getServerVersionData()); sendSystem->sendFileBlockWithVersion(fullPath,data.path); } } calculateCommonHash(); sendSystem->sendFinish(); emit sigUpdateComplete(true); } catch (...) { emit sigUpdateComplete(false); } } UpdateController::~UpdateController() { }