#include "UpdateController.h" #include UpdateController::UpdateController(DataParser *parser,SendSystem *sendSystem, QObject *parent) : QObject(parent) { this->dataParser = parser; this->sendSystem = sendSystem; localPath = QDir::currentPath() + applicationFolderName; } void UpdateController::calculateCommonHash() { fileDataList.clear(); calculateHash(localPath); dataParser->createFileDataList(fileDataList,hashFilename); qDebug() << "UpdateController threadID " << QThread::currentThreadId(); qDebug() << " OR " << thread(); } void UpdateController::calculateStreamingHash() { fileDataList.clear(); calculateHash(QDir::currentPath() + streamingAssetsPath); dataParser->createFileDataList(fileDataList,streamingHashFilename); } void UpdateController::calculateHash(QString path) { qDebug() << "Try calculate"; QDirIterator iterator(path,QDirIterator::Subdirectories); fileDataList.clear(); QList *files = new QList; QList * folders = new QList; if(!QDir(applicationFolderName).exists()){ //проверка на наличие папки QDir().mkdir(applicationFolderName); } QDir dir(path); 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); } file.close(); 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); delete folders; delete files; } 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 { sendSystem->sendFileBlock(data.path); } } calculateCommonHash(); sendSystem->sendFinish(); QTime dieTime= QTime::currentTime().addSecs(10); while (QTime::currentTime() < dieTime) QCoreApplication::processEvents(QEventLoop::AllEvents, 100); emit sigUpdateComplete(true); } catch (...) { emit sigUpdateComplete(false); } } UpdateController::~UpdateController() { }