Add unzipper to qt launcher

This commit is contained in:
Ryan Huffman 2019-09-13 13:56:38 -07:00
parent 1f1115f983
commit 93367ce8a4
6 changed files with 9103 additions and 1 deletions

View file

@ -72,7 +72,12 @@ set(src_files
src/LauncherState.h
src/LauncherState.cpp
src/LauncherWindow.h
src/LauncherWindow.cpp)
src/LauncherWindow.cpp
src/Unzipper.h
src/Unzipper.cpp
deps/miniz/miniz.h
deps/miniz/miniz.cpp
)
set(TARGET_NAME ${PROJECT_NAME})
add_executable(${PROJECT_NAME} ${src_files})
@ -109,6 +114,7 @@ target_link_libraries(${PROJECT_NAME}
"${_qt5Core_install_prefix}/qml/QtQuick/Templates.2/qtquicktemplates2plugin.lib")
target_include_directories(${PROJECT_NAME} PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/deps/
${Qt5Core_INCLUDE_DIRS}
${Qt5Quick_INCLUDE_DIRS}
${Qt5Gui_INCLUDE_DIRS}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

View file

@ -0,0 +1,80 @@
#include "Unzipper.h"
#include <QDir>
#include <QDebug>
#include <miniz/miniz.h>
#include <Shlobj.h>
Unzipper::Unzipper(const QString& zipFilePath, const QDir& outputDirectory) :
_zipFilePath(zipFilePath), _outputDirectory(outputDirectory) {
}
//uint64_t extractZip(const QString& zipFile, const std::string& path,
//std::vector<std::string>& files) {
//std::function<void(float)> progressCallback) {
void Unzipper::run() {
qDebug() << "Reading zip file" << _zipFilePath << ", extracting to" << _outputDirectory.absolutePath();
mz_zip_archive zip_archive;
memset(&zip_archive, 0, sizeof(zip_archive));
auto status = mz_zip_reader_init_file(&zip_archive, _zipFilePath.toUtf8().data(), 0);
if (!status) {
auto zip_error = mz_zip_get_last_error(&zip_archive);
auto zip_error_msg = mz_zip_get_error_string(zip_error);
emit finished(true, "Failed to initialize miniz: " + QString::number(zip_error) + " " + zip_error_msg);
return;
}
int fileCount = (int)mz_zip_reader_get_num_files(&zip_archive);
qDebug() << "Zip archive has a file count of " << fileCount;
if (fileCount == 0) {
mz_zip_reader_end(&zip_archive);
emit finished(false, "");
return;
}
mz_zip_archive_file_stat file_stat;
if (!mz_zip_reader_file_stat(&zip_archive, 0, &file_stat)) {
mz_zip_reader_end(&zip_archive);
emit finished(true, "Zip archive cannot be stat'd");
return;
}
// Get root folder
uint64_t totalSize = 0;
uint64_t totalCompressedSize = 0;
bool _shouldFail = false;
for (int i = 0; i < fileCount; i++) {
if (!mz_zip_reader_file_stat(&zip_archive, i, &file_stat)) continue;
QString filename = file_stat.m_filename;
QString fullFilename = _outputDirectory.filePath(filename);
if (mz_zip_reader_is_file_a_directory(&zip_archive, i)) {
if (!_outputDirectory.mkpath(fullFilename)) {
mz_zip_reader_end(&zip_archive);
emit finished(true, "Unzipping error while creating folder: " + fullFilename);
return;
}
continue;
}
if (mz_zip_reader_extract_to_file(&zip_archive, i, fullFilename.toUtf8().data(), 0)) {
totalCompressedSize += (uint64_t)file_stat.m_comp_size;
totalSize += (uint64_t)file_stat.m_uncomp_size;
emit progress((float)totalCompressedSize / (float)zip_archive.m_archive_size);
} else {
emit finished(true, "Unzipping error unzipping file: " + fullFilename);
return;
}
}
qDebug() << "Done unzipping archive, total size:" << totalSize;
mz_zip_reader_end(&zip_archive);
emit finished(false, "");
}

View file

@ -0,0 +1,21 @@
#pragma once
#include <QString>
#include <QDir>
#include <QObject>
#include <QRunnable>
class Unzipper : public QObject, public QRunnable {
Q_OBJECT
public:
Unzipper(const QString& zipFilePath, const QDir& outputDirectory);
void run() override;
signals:
void progress(float progress);
void finished(bool error, QString errorMessage);
private:
const QString _zipFilePath;
const QDir _outputDirectory;
};