You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
4.5 KiB
101 lines
4.5 KiB
/* |
|
localegeneratorubuntu.cpp |
|
SPDX-FileCopyrightText: 2022 Han Young <hanyoung@protonmail.com> |
|
|
|
SPDX-License-Identifier: GPL-2.0-or-later |
|
*/ |
|
|
|
#include <PackageKit/Daemon> |
|
|
|
#include <QStandardPaths> |
|
|
|
#include <KLocalizedString> |
|
|
|
#include "kcm_regionandlang_debug.h" |
|
#include "localegeneratorubuntu.h" |
|
|
|
void LocaleGeneratorUbuntu::localesGenerate(const QStringList &list) |
|
{ |
|
ubuntuInstall(list); |
|
} |
|
|
|
void LocaleGeneratorUbuntu::ubuntuInstall(const QStringList &locales) |
|
{ |
|
m_packageIDs.clear(); |
|
if (!m_proc) { |
|
m_proc = new QProcess(this); |
|
} |
|
QStringList args; |
|
args.reserve(locales.size()); |
|
for (const auto &locale : locales) { |
|
auto localeStripped = locale; |
|
localeStripped.remove(QStringLiteral(".UTF-8")); |
|
args.append(QStringLiteral("--language=%1").arg(localeStripped)); |
|
} |
|
const QString binaryPath = QStandardPaths::findExecutable(QStringLiteral("check-language-support")); |
|
if (!binaryPath.isEmpty()) { |
|
m_proc->setProgram(binaryPath); |
|
m_proc->setArguments(args); |
|
connect(m_proc, &QProcess::finished, this, &LocaleGeneratorUbuntu::ubuntuLangCheck); |
|
m_proc->start(); |
|
} else { |
|
Q_EMIT userHasToGenerateManually(i18nc("@info:warning", "Can't locate executable `check-language-support`")); |
|
} |
|
} |
|
|
|
void LocaleGeneratorUbuntu::ubuntuLangCheck(int status, QProcess::ExitStatus exit) |
|
{ |
|
Q_UNUSED(exit) |
|
if (status != 0) { |
|
// Something wrong with this Ubuntu, don't try further |
|
Q_EMIT userHasToGenerateManually(i18nc("the arg is the output of failed check-language-support call", |
|
"check-language-support failed, output: %1", |
|
QString::fromUtf8(m_proc->readAllStandardOutput()))); |
|
return; |
|
} |
|
const QString output = QString::fromUtf8(m_proc->readAllStandardOutput().simplified()); |
|
QStringList packages = output.split(QLatin1Char(' ')); |
|
packages.erase(std::remove_if(packages.begin(), |
|
packages.end(), |
|
[](QString &i) { |
|
return i.isEmpty(); |
|
}), |
|
packages.end()); |
|
|
|
if (!packages.isEmpty()) { |
|
auto transaction = PackageKit::Daemon::resolve(packages, PackageKit::Transaction::FilterNotInstalled | PackageKit::Transaction::FilterArch); |
|
connect(transaction, |
|
&PackageKit::Transaction::package, |
|
this, |
|
[this](PackageKit::Transaction::Info info, const QString &packageID, const QString &summary) { |
|
Q_UNUSED(info); |
|
Q_UNUSED(summary); |
|
m_packageIDs << packageID; |
|
}); |
|
connect(transaction, &PackageKit::Transaction::errorCode, this, [](PackageKit::Transaction::Error error, const QString &details) { |
|
qCDebug(KCM_REGIONANDLANG) << "resolve error" << error << details; |
|
}); |
|
connect(transaction, &PackageKit::Transaction::finished, this, [packages, this](PackageKit::Transaction::Exit status, uint code) { |
|
qCDebug(KCM_REGIONANDLANG) << "resolve finished" << status << code << m_packageIDs; |
|
if (m_packageIDs.size() != packages.size()) { |
|
qCWarning(KCM_REGIONANDLANG) << "Not all missing packages managed to resolve!" << packages << m_packageIDs; |
|
const QString packagesString = packages.join(QLatin1Char(';')); |
|
Q_EMIT userHasToGenerateManually(i18nc("%1 is a list of package names", "Not all missing packages managed to resolve! %1", packagesString)); |
|
return; |
|
} |
|
auto transaction = PackageKit::Daemon::installPackages(m_packageIDs); |
|
connect(transaction, &PackageKit::Transaction::errorCode, this, [this](PackageKit::Transaction::Error error, const QString &details) { |
|
qCDebug(KCM_REGIONANDLANG) << "install error:" << error << details; |
|
Q_EMIT userHasToGenerateManually(i18nc("%1 is a list of package names", "Failed to install package %1", details)); |
|
}); |
|
connect(transaction, &PackageKit::Transaction::finished, this, [this](PackageKit::Transaction::Exit status, uint code) { |
|
qCDebug(KCM_REGIONANDLANG) << "install finished:" << status << code; |
|
if (status == PackageKit::Transaction::Exit::ExitSuccess) { |
|
Q_EMIT success(); |
|
} |
|
}); |
|
}); |
|
} else { |
|
Q_EMIT success(); |
|
} |
|
}
|
|
|