mirror of
https://github.com/Armored-Dragon/overte.git
synced 2025-03-11 16:13:16 +01:00
Add unzipper to qt launcher
This commit is contained in:
parent
1f1115f983
commit
93367ce8a4
6 changed files with 9103 additions and 1 deletions
|
@ -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}
|
||||
|
|
7657
launchers/qt/deps/miniz/miniz.cpp
Normal file
7657
launchers/qt/deps/miniz/miniz.cpp
Normal file
File diff suppressed because it is too large
Load diff
1338
launchers/qt/deps/miniz/miniz.h
Normal file
1338
launchers/qt/deps/miniz/miniz.h
Normal file
File diff suppressed because it is too large
Load diff
0
launchers/qt/deps/miniz/stdafx.h
Normal file
0
launchers/qt/deps/miniz/stdafx.h
Normal file
80
launchers/qt/src/Unzipper.cpp
Normal file
80
launchers/qt/src/Unzipper.cpp
Normal 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, "");
|
||||
}
|
21
launchers/qt/src/Unzipper.h
Normal file
21
launchers/qt/src/Unzipper.h
Normal 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;
|
||||
};
|
Loading…
Reference in a new issue