286 lines
8.2 KiB
C++
Raw Normal View History

2020-01-04 16:39:25 +03:00
#include "qif.h"
#include "quasarapp.h"
2020-01-13 18:25:03 +03:00
#include "deploycore.h"
#include "deployconfig.h"
2020-01-04 16:39:25 +03:00
2020-01-14 15:48:35 +03:00
#include <QDateTime>
2020-01-15 18:31:09 +03:00
#include <QProcess>
2020-08-15 14:38:03 +03:00
#include <packagecontrol.h>
2020-01-16 15:25:36 +03:00
#include <pathutils.h>
2020-01-14 15:48:35 +03:00
2020-01-15 18:31:09 +03:00
QIF::QIF(FileManager *fileManager)
:iDistribution(fileManager){
2020-08-14 17:47:34 +03:00
setLocation("tmp QIF");
2020-01-15 18:31:09 +03:00
};
2020-01-04 16:39:25 +03:00
2020-01-16 11:10:16 +03:00
Envirement QIF::toolKitEnv() const {
Envirement result;
2020-01-15 18:31:09 +03:00
2020-06-10 11:44:38 +03:00
if (QuasarAppUtils::Params::isEndable("qifFromSystem")) {
result.addEnv(QProcessEnvironment::systemEnvironment().value("PATH"));
2020-01-15 18:31:09 +03:00
2020-08-15 19:29:17 +03:00
// BASE
2020-06-10 11:44:38 +03:00
const DeployConfig *cfg = DeployCore::_config;
auto basePATH = cfg->qtDir.getBins() + "/../../../Tools/QtInstallerFramework/";
QDir QifDir(basePATH);
auto list = QifDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot);
QMap<double, QString> sortedItems;
for (const auto& i : list) {
sortedItems.insert(i.toDouble(), i);
}
2020-01-15 18:31:09 +03:00
2020-06-10 11:44:38 +03:00
if (sortedItems.size()) {
basePATH += ("/" + sortedItems.last() + "/bin");
result.addEnv(basePATH);
}
return result;
2020-01-15 18:31:09 +03:00
}
2020-06-10 11:44:38 +03:00
2020-08-15 19:29:17 +03:00
// SNAP
2020-01-04 16:39:25 +03:00
QString AppPath = QuasarAppUtils::Params::getStrArg("appPath", "");
2020-01-22 16:26:59 +03:00
result.addEnv(AppPath + "/../QIF/");
2020-08-15 19:29:17 +03:00
//Installer
2020-01-22 16:26:59 +03:00
result.addEnvRec(AppPath + "/../../QIF/", 2);
return result;
2020-01-04 16:39:25 +03:00
}
2020-01-16 11:10:16 +03:00
QString QIF::runCmd() {
QString base = "binarycreator";
if (binarycreator.isEmpty())
2020-01-28 13:51:00 +03:00
binarycreator = DeployCore::findProcess(toolKitEnv().concatEnv(), base);
2020-01-16 11:10:16 +03:00
2020-02-27 20:37:05 +03:00
if (binarycreator.isEmpty())
return base;
2020-01-16 11:10:16 +03:00
return binarycreator;
2020-01-04 16:39:25 +03:00
}
2020-08-15 14:38:03 +03:00
bool QIF::deployTemplate(PackageControl &pkg) {
auto customTemplate = QuasarAppUtils::Params::getStrArg("qif", "");
2020-01-13 18:25:03 +03:00
const DeployConfig *cfg = DeployCore::_config;
2020-01-19 13:26:47 +03:00
QStringList sufixes = {
"js", "qs", "xml"
};
2020-09-06 19:12:17 +03:00
QString defaultPackageTempalte = ":/Templates/QIF/Distributions/Templates/qif/packages/default";
QString defaultConfigCustomDesigne = ":/Templates/QIF/Distributions/Templates/qif/config custom designe/";
QString defaultConfig = ":/Templates/QIF/Distributions/Templates/qif/config/";
QHash<QString, QString> pakcagesTemplates;
2020-01-13 18:25:03 +03:00
2020-09-06 19:12:17 +03:00
if (!customTemplate.isEmpty()) {
QuasarAppUtils::Params::log("Using custom template for installer: " + customTemplate,
QuasarAppUtils::Info);
2020-01-13 18:25:03 +03:00
2020-09-06 19:12:17 +03:00
auto availablePacakages = QDir(defaultPackageTempalte).entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot);
2020-08-15 19:29:17 +03:00
2020-09-06 19:12:17 +03:00
for (const auto& pkg: availablePacakages) {
pakcagesTemplates.insert(pkg.fileName(), pkg.absoluteFilePath());
2020-01-15 11:50:30 +03:00
}
2020-09-06 19:12:17 +03:00
defaultConfigCustomDesigne = customTemplate + "/config";
defaultConfig = customTemplate + "/config";
}
2020-09-06 19:12:17 +03:00
for (auto it = cfg->packages().begin();
it != cfg->packages().end(); ++it) {
2020-09-06 19:12:17 +03:00
if (!deployPackage(it, cfg, sufixes, pakcagesTemplates, defaultPackageTempalte, pkg)) {
2020-01-15 11:50:30 +03:00
return false;
2020-01-14 15:48:35 +03:00
}
2020-09-06 19:12:17 +03:00
}
2020-01-14 15:48:35 +03:00
2020-09-06 19:12:17 +03:00
auto configLocation = cfg->getTargetDir() + "/" + getLocation() + "/config/";
2020-09-06 19:12:17 +03:00
auto qifStyle = getStyle(QuasarAppUtils::Params::getStrArg("qifStyle", ""));
auto qifBanner = QuasarAppUtils::Params::getStrArg("qifBanner", "");
auto qifLogo = QuasarAppUtils::Params::getStrArg("qifLogo", "");
2020-09-06 19:12:17 +03:00
auto configTemplate = defaultConfig;
if (qifStyle.size() || qifBanner.size() || qifLogo.size()) {
configTemplate = defaultConfigCustomDesigne;
}
2020-01-15 11:50:30 +03:00
2020-09-06 19:12:17 +03:00
if (!unpackDir(configTemplate,
configLocation, generalInfo, sufixes)) {
return false;
}
2020-01-14 15:48:35 +03:00
2020-09-06 19:12:17 +03:00
if (qifStyle.size() && !copyFile(qifStyle, configLocation + "/style.css", true)) {
return false;
}
if (qifBanner.size() && !copyFile(qifBanner, configLocation + "/banner.png", true)) {
return false;
}
if (qifLogo.size() && !copyFile(qifLogo, configLocation + "/logo.png", true)) {
return false;
}
2020-01-14 15:48:35 +03:00
return true;
}
QStringList QIF::runArg() const {
2020-01-16 15:25:36 +03:00
auto location = DeployCore::_config->getTargetDir() + "/" + getLocation();
return {
"-c", location + "/config/config.xml",
2020-08-15 19:29:17 +03:00
"-p", location + "/packages/",
"-v",
installerFile()
2020-01-16 15:25:36 +03:00
};
}
2020-01-15 11:50:30 +03:00
bool QIF::removeTemplate() const {
auto customTemplate = QuasarAppUtils::Params::getStrArg("qif", "");
const DeployConfig *cfg = DeployCore::_config;
2020-03-08 13:52:26 +03:00
registerOutFiles();
2020-09-06 19:12:17 +03:00
return QDir(cfg->getTargetDir() + "/" + getLocation()).removeRecursively();
2020-01-15 11:50:30 +03:00
}
2020-01-16 11:10:16 +03:00
QProcessEnvironment QIF::processEnvirement() const {
return QProcessEnvironment::systemEnvironment();
}
2020-03-08 13:52:26 +03:00
QStringList QIF::outPutFiles() const {
return {installerFile()};
}
QString QIF::getStyle(const QString& input) const {
QDir resurces(":/Styles/Distributions/Templates/qif/Styles");
auto list = resurces.entryInfoList(QDir::Files);
for (const auto& style : list) {
if (input == style.baseName()) {
return style.absoluteFilePath();
}
}
QFileInfo f(input);
if (f.isFile()) {
return f.absoluteFilePath();
}
2020-04-04 15:43:46 +03:00
QuasarAppUtils::Params::log(input + " not exits",
2020-08-15 19:29:17 +03:00
QuasarAppUtils::Error);
return "";
}
2020-03-08 13:52:26 +03:00
QString QIF::installerFile() const {
#ifdef Q_OS_LINUX
QString sufix = ".run";
#else
QString sufix = ".exe";
#endif
return DeployCore::_config->getTargetDir() + "/Installer" + generalInfo.Name + sufix;
}
2020-09-06 19:12:17 +03:00
bool QIF::deployPackage(const QHash<QString, DistroModule>::const_iterator& it,
const DeployConfig * cfg,
const QStringList sufixes,
const QHash<QString, QString>& pakcagesTemplates,
const QString& defaultPackageTempalte,
PackageControl &pkg) {
auto package = it.value();
TemplateInfo info;
info.Name = PathUtils::stripPath(it.key());
bool 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 location = cfg->getTargetDir() + "/" + getLocation() + "/packages/" + info.Name;
auto locationData = location + "/data";
if (cfg->getDefaultPackage() != info.Name) {
locationData += "/" + 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",
locationData + "/icons/", false)) {
return false;
}
} else {
QFileInfo iconInfo(package.icon());
info.Icon = info.Name + "/icons/" + iconInfo.fileName();
if (!copyFile(package.icon(), locationData + "/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";
}
if (!unpackDir(pakcagesTemplates.value(package.name(), defaultPackageTempalte),
location, info, sufixes)) {
return false;
}
if (!pkg.movePackage(it.key(), locationData)) {
return false;
}
if (fDefaultPakcage)
generalInfo = info;
return true;
}