CQtDeployer/Deploy/Distributions/idistribution.cpp

220 lines
6.2 KiB
C++
Raw Normal View History

2019-11-28 18:13:56 +03:00
#include "idistribution.h"
#include <typeinfo>
#include <QFile>
2020-01-13 18:25:03 +03:00
#include <QTextStream>
2020-01-14 15:48:35 +03:00
#include <QDir>
2020-01-15 18:31:09 +03:00
#include <cassert>
#include <filemanager.h>
2020-01-16 11:10:16 +03:00
#include "deploycore.h"
#include "pathutils.h"
#include <QDate>
2020-01-18 20:01:14 +03:00
#include <QMap>
#include <deployconfig.h>
2020-01-18 20:01:14 +03:00
#include <distromodule.h>
2019-11-28 18:13:56 +03:00
iDistribution::~iDistribution() = default;
2020-01-15 18:31:09 +03:00
iDistribution::iDistribution(FileManager *fileManager) {
_fileManager = fileManager;
assert(_fileManager);
}
2020-11-09 16:33:50 +03:00
bool iDistribution::cb() const {
return true;
}
QString iDistribution::getClassName() const {
return typeid(*this).name();
}
QString iDistribution::getLocation() const {
return _location;
}
void iDistribution::setLocation(const QString &location) {
_location = location;
}
2020-01-13 18:25:03 +03:00
2020-01-14 15:48:35 +03:00
bool iDistribution::unpackFile(const QFileInfo &resource,
const QString &target,
2020-01-19 13:26:47 +03:00
const TemplateInfo &info,
const QStringList& sufixes) const {
2020-01-14 15:48:35 +03:00
QFile file(resource.absoluteFilePath());
2020-01-13 18:25:03 +03:00
if (!file.open(QIODevice::ReadOnly)) {
return false;
}
2020-01-19 13:26:47 +03:00
QByteArray inputData = file.readAll();
2020-01-13 18:25:03 +03:00
file.close();
2020-01-14 15:48:35 +03:00
if (!QDir().mkpath(target))
return false;
file.setFileName(target + "/" + resource.fileName());
2020-01-13 18:25:03 +03:00
if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
return false;
}
2020-01-19 13:26:47 +03:00
if (sufixes.contains(resource.suffix(), Qt::CaseInsensitive)) {
QString inputText(inputData);
2020-01-13 18:25:03 +03:00
2020-01-19 13:26:47 +03:00
inputText.replace("$NAME", info.Name);
inputText.replace("$DESCRIPTION", info.Description);
inputText.replace("$VERSION", info.Version);
inputText.replace("$RELEASEDATA", info.ReleaseData);
inputText.replace("$ICON", info.Icon);
inputText.replace("$PUBLISHER", info.Publisher);
2020-01-13 18:25:03 +03:00
2020-01-19 13:26:47 +03:00
for (auto it = info.Custom.cbegin(); it != info.Custom.cend(); ++it) {
inputText.replace(it.key(), it.value());
}
QTextStream stream(&file);
stream << inputText;
} else {
file.write(inputData);
}
2020-01-13 18:25:03 +03:00
file.close();
2020-01-15 18:31:09 +03:00
return _fileManager->addToDeployed(target + "/" + resource.fileName());
2020-01-13 18:25:03 +03:00
}
2020-01-14 15:48:35 +03:00
bool iDistribution::unpackDir(const QString &resource,
const QString &target,
2020-01-19 13:26:47 +03:00
const TemplateInfo &info,
2020-11-09 16:33:50 +03:00
const QStringList &sufixes,
const QHash<QString, QString> &folderNewNames) const {
2020-01-14 15:48:35 +03:00
QDir res(resource);
2020-09-06 19:12:17 +03:00
auto list = res.entryInfoList(QDir::NoDotAndDotDot | QDir::AllEntries);
2020-01-14 15:48:35 +03:00
for (const auto & item :list) {
if (item.isFile()) {
2020-01-19 13:26:47 +03:00
if (!unpackFile(item, target, info, sufixes)) {
2020-01-14 15:48:35 +03:00
return false;
}
} else {
2020-11-09 16:33:50 +03:00
QString targetName = item.fileName();
if (folderNewNames.contains(targetName)) {
targetName = folderNewNames.value(targetName, "");
}
2020-01-14 15:48:35 +03:00
if (!unpackDir(item.absoluteFilePath(),
2020-11-09 16:33:50 +03:00
target + "/" + targetName,
info, sufixes, folderNewNames)) {
2020-01-14 15:48:35 +03:00
return false;
}
}
}
return true;
}
2020-01-15 18:31:09 +03:00
2020-08-15 19:29:17 +03:00
bool iDistribution::copyDir(const QString &resource,
const QString &target) const {
return _fileManager->copyFolder(resource, target, {}, nullptr, nullptr, true);
}
2020-01-15 18:31:09 +03:00
bool iDistribution::moveData(const QString &from,
2020-01-18 20:01:14 +03:00
const QString &to,
const QString& ignore) const {
return _fileManager->moveFolder(from, to, ignore);
2020-01-15 18:31:09 +03:00
}
2020-01-16 11:10:16 +03:00
bool iDistribution::copyFile(const QString &from, const QString &to, bool isFileTarget) const {
if (isFileTarget) {
_fileManager->removeFile(to);
}
return _fileManager->copyFile(from, to, nullptr, isFileTarget);
2020-01-16 15:25:36 +03:00
}
2020-03-08 13:52:26 +03:00
void iDistribution::registerOutFiles() const {
auto files = outPutFiles();
for (const auto& i : files) {
_fileManager->addToDeployed(i);
}
}
bool iDistribution::collectInfo(
const QHash<QString, DistroModule>::const_iterator& it,
const DeployConfig * cfg,
2020-11-10 14:07:54 +03:00
TemplateInfo &info,
bool &fDefaultPakcage) {
auto package = it.value();
info.Name = PathUtils::stripPath(it.key());
2020-11-10 14:07:54 +03:00
fDefaultPakcage = cfg->getDefaultPackage() == info.Name;
if (fDefaultPakcage) {
QFileInfo targetInfo(*package.targets().begin());
info.Name = targetInfo.baseName();
}
if (!package.name().isEmpty()) {
info.Name = package.name();
}
auto localData = dataLocation(info.Name);
info.Description = "This package contains the " + info.Name;
if (!package.description().isEmpty())
info.Description = package.description();
info.Version = "1.0";
if (!package.version().isEmpty())
info.Version = package.version();
info.ReleaseData = QDate::currentDate().toString("yyyy-MM-dd");
if (!package.releaseData().isEmpty())
info.ReleaseData = package.releaseData();
info.Icon = "icons/Icon.png";
if (package.icon().isEmpty()) {
if (!copyFile(":/Templates/QIF/Distributions/Templates/qif/Icon.png",
localData + "/icons/", false)) {
return false;
}
} else {
QFileInfo iconInfo(package.icon());
info.Icon = info.Name + "/icons/" + iconInfo.fileName();
if (!copyFile(package.icon(), localData + "/icons/", false)) {
return false;
}
}
info.Publisher = "Company";
if (!package.publisher().isEmpty())
info.Publisher = package.publisher();
QString cmdArray = "[";
int initSize = cmdArray.size();
for (const auto &target :package.targets()) {
auto fileinfo = QFileInfo(target);
if (fileinfo.suffix().compare("exe", ONLY_WIN_CASE_INSENSIATIVE) == 0 || fileinfo.suffix().isEmpty()) {
if (cmdArray.size() > initSize) {
cmdArray += ",";
}
cmdArray += "\"" + info.Name + "/" + fileinfo.fileName() + "\"";
}
}
cmdArray += "]";
info.Custom = {{"[\"array\", \"of\", \"cmds\"]", cmdArray},
{"$LOCAL_ICON", info.Name + "/icons/" + QFileInfo(info.Icon).fileName()}};
if (info.Name.isEmpty()) {
info.Name = "Application";
}
return true;
}
2020-01-18 20:01:14 +03:00