CQtDeployer/Deploy/zipcompresser.cpp
EndrII 96fde6c958
All checks were successful
buildbot/AndroidBuilder_v8Qt6 Build finished.
buildbot/LinuxCMakeBuilderQt6 Build finished.
buildbot/AndroidBuilder_v7 Build finished.
buildbot/DocsGenerator Build finished.
buildbot/LinuxCMakeBuilder Build finished.
buildbot/Wasm32Builder Build finished.
buildbot/AndroidBuilder_v8 Build finished.
buildbot/WindowsCMakeBuilder Build finished.
buildbot/LinuxBuilder Build finished.
buildbot/WindowsBuilder Build finished.
buildbot/IOSCMakeBuilder Build finished.
v 1.5.4.14
2022-03-09 17:56:42 +03:00

105 lines
2.4 KiB
C++

/*
* Copyright (C) 2018-2022 QuasarApp.
* Distributed under the lgplv3 software license, see the accompanying
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
*/
#include "zipcompresser.h"
#include <QDir>
#include "zip.h"
ZipCompresser::ZipCompresser() {
}
bool ZipCompresser::compress(const QString &path, const QString &distArrhive) const {
QFileInfo arrInfo(distArrhive);
QFileInfo srcInfo(path);
if (arrInfo.exists()) {
QFile::remove(arrInfo.absoluteFilePath());
}
if (!QDir().mkpath(arrInfo.absolutePath())) {
return false;
}
if (!srcInfo.exists()) {
return false;
}
auto stdstr = arrInfo.absoluteFilePath().toStdString();
const char *zipArr = stdstr.c_str();
struct zip_t *zip = zip_open(zipArr, ZIP_DEFAULT_COMPRESSION_LEVEL, 'w');
if (!add(srcInfo.absoluteFilePath(), "", zip)) {
zip_close(zip);
QFile::remove(arrInfo.absoluteFilePath());
return false;
}
zip_close(zip);
return true;
}
int on_extract_entry(const char *filename, void *) {
printf("Extracted: %s \n", filename);
return 0;
}
bool ZipCompresser::extract(const QString &arrhive, const QString &distDir) const {
auto stdstr_arr = arrhive.toStdString();
auto stdstr_dir = distDir.toStdString();
return zip_extract(stdstr_arr.c_str(),
stdstr_dir.c_str(),
on_extract_entry, nullptr) == 0;
}
bool ZipCompresser::add(const QString& root, const QString& path, zip_t * zip) const {
QFileInfo info(root + "/" + path);
if (info.isFile()) {
std::string _file_tmp = path.toStdString();
const char *file = _file_tmp.c_str();
if (zip_entry_open(zip, file) != 0) {
return false;
}
QFile src(info.absoluteFilePath());
if (!src.open(QIODevice::ReadOnly)) {
return false;
}
auto data = src.readAll();
if (zip_entry_write(zip, data.data(), data.size()) != 0) {
return false;
}
src.close();
return zip_entry_close(zip) == 0;
}
QDir dir(info.absoluteFilePath());
auto list = dir.entryList(QDir::AllEntries | QDir::NoDotAndDotDot);
for (const auto& entry: list) {
if (!add(root, (path.size())? path + "/" + entry: entry, zip)) {
return false;
}
}
return true;
}