chore(cpn): Switch from component names to ids (#2602)

* cpn(fix): Switch from component names to ids

* Fix Win compile

* Sound packs list entries should not be editable
This commit is contained in:
Neil Horne
2022-10-27 21:52:05 +10:00
committed by GitHub
parent 56617dc209
commit 6b01a0c673
17 changed files with 441 additions and 350 deletions
+255 -225
View File
@@ -114,19 +114,17 @@ QString UpdateParameters::updateFilterTypeToString(UpdateFilterType uft)
UpdateInterface::UpdateInterface(QWidget * parent) :
QWidget(parent),
progress(nullptr),
resultsPerPage(-1),
reply(nullptr),
buffer(new QByteArray()),
file(nullptr),
m_settingsIdx(-1)
m_id(CID_Unknown),
m_name("")
{
QNetworkProxyFactory::setUseSystemConfiguration(true);
releases = new ReleasesMetaData(this);
assets = new AssetsMetaData(this);
params = new UpdateParameters(this);
setReleasesNightlyName("");
}
UpdateInterface::~UpdateInterface()
@@ -141,6 +139,76 @@ UpdateInterface::~UpdateInterface()
delete params;
}
void UpdateInterface::init(ComponentIdentity id, QString name, QString repo, QString nightly, int resultsPerPage)
{
setId(id);
setName(name);
initAppSettings();
releases->init(repo, nightly, resultsPerPage, id);
assets->init(repo, resultsPerPage);
currentRelease();
}
void UpdateInterface::initAppSettings()
{
if (!isValidSettingsIndex()) {
reportProgress(tr("Component id: %1 exceeds maximum application settings components: %2!").arg(m_id).arg(MAX_COMPONENTS), QtCriticalMsg);
return;
}
if (!g.component[m_id].existsOnDisk()) {
g.component[m_id].init();
}
if (!g.component[m_id].asset[0].existsOnDisk())
initAssetSettings();
}
void UpdateInterface::loadAssetSettings()
{
if (!isValidSettingsIndex())
return;
params->assets.clear();
for (int i = 0; i < MAX_COMPONENT_ASSETS && g.component[m_id].asset[i].existsOnDisk(); i++) {
UpdateParameters::AssetParams &ap = params->addAsset();
ComponentAssetData &cad = g.component[m_id].asset[i];
ap.processes = cad.processes();
ap.flags = cad.flags();
ap.filterType = (UpdateParameters::UpdateFilterType)cad.filterType();
ap.filter = cad.filter();
ap.maxExpected = cad.maxExpected();
ap.destSubDir = cad.destSubDir();
ap.copyFilterType = (UpdateParameters::UpdateFilterType)cad.copyFilterType();
ap.copyFilter = cad.copyFilter();
}
}
void UpdateInterface::saveAssetSettings()
{
if (!isValidSettingsIndex())
return;
for (int i = 0; i < MAX_COMPONENT_ASSETS && g.component[m_id].asset[i].existsOnDisk(); i++) {
const UpdateParameters::AssetParams &ap = params->assets.at(i);
ComponentAssetData &cad = g.component[m_id].asset[i];
// DO NOT overwrite cad.processes
cad.flags(ap.flags);
cad.filterType(ap.filterType);
cad.filter(ap.filter);
cad.maxExpected(ap.maxExpected);
cad.destSubDir(ap.destSubDir);
cad.copyFilterType(ap.copyFilterType);
cad.copyFilter(ap.copyFilter);
}
}
bool UpdateInterface::update(ProgressWidget * progress)
{
if (!(params->flags & UPDFLG_Update))
@@ -149,30 +217,30 @@ bool UpdateInterface::update(ProgressWidget * progress)
this->progress = progress;
if (progress) {
progress->setInfo(tr("Processing updates for: %1").arg(name));
progress->setInfo(tr("Processing updates for: %1").arg(m_name));
progress->setValue(0);
progress->setMaximum(100);
}
reportProgress(tr("Processing updates for: %1").arg(name), QtInfoMsg);
reportProgress(tr("Processing updates for: %1").arg(m_name), QtInfoMsg);
if (!preparation()) {
reportProgress(tr("%1 preparation failed").arg(name), QtCriticalMsg);
reportProgress(tr("%1 preparation failed").arg(m_name), QtCriticalMsg);
return false;
}
if (!download()) {
reportProgress(tr("%1 download failed").arg(name), QtCriticalMsg);
reportProgress(tr("%1 download failed").arg(m_name), QtCriticalMsg);
return false;
}
if (!decompress()) {
reportProgress(tr("%1 decompress failed").arg(name), QtCriticalMsg);
reportProgress(tr("%1 decompress failed").arg(m_name), QtCriticalMsg);
return false;
}
if (!copyToDestination()) {
reportProgress(tr("%1 copy to destination failed").arg(name), QtCriticalMsg);
reportProgress(tr("%1 copy to destination failed").arg(m_name), QtCriticalMsg);
return false;
}
@@ -183,19 +251,19 @@ bool UpdateInterface::update(ProgressWidget * progress)
}
if (!asyncInstall()) {
reportProgress(tr("%1 start async failed").arg(name), QtCriticalMsg);
reportProgress(tr("%1 start async failed").arg(m_name), QtCriticalMsg);
return false;
}
if (!housekeeping()) {
reportProgress(tr("%1 housekeeping failed").arg(name), QtCriticalMsg);
reportProgress(tr("%1 housekeeping failed").arg(m_name), QtCriticalMsg);
return false;
}
reportProgress(tr("%1 update successful").arg(name), QtInfoMsg);
reportProgress(tr("%1 update successful").arg(m_name), QtInfoMsg);
if (!progress)
QMessageBox::information(progress, CPN_STR_APP_NAME, tr("%1 update successful").arg(name));
QMessageBox::information(progress, CPN_STR_APP_NAME, tr("%1 update successful").arg(m_name));
return true;
}
@@ -288,87 +356,9 @@ void UpdateInterface::criticalMsg(const QString & msg)
QMessageBox::critical(progress, tr("Update Interface"), msg);
}
void UpdateInterface::setName(QString name)
{
this->name = name;
setSettingsIndex();
currentRelease();
}
void UpdateInterface::setRepo(QString repo)
{
releases->setRepo(repo);
assets->setRepo(repo);
}
void UpdateInterface::setSettingsIndex()
{
int i = g.getComponentIndex(name);
if (i < 0) {
for (i = 0; i < MAX_COMPONENTS && g.component[i].existsOnDisk(); i++)
;
if (i >= MAX_COMPONENTS) {
reportProgress(tr("No free slot to save interface settings!"), QtCriticalMsg);
i = -1;
}
else {
g.component[i].init();
g.component[i].name(name);
}
}
m_settingsIdx = i;
releases->setSettingsIndex(m_settingsIdx);
if (isValidSettingsIndex() && !g.component[m_settingsIdx].asset[0].existsOnDisk())
initAssetSettings();
}
void UpdateInterface::loadAssetSettings()
{
if (!isValidSettingsIndex())
return;
params->assets.clear();
for (int i = 0; i < MAX_COMPONENT_ASSETS && g.component[m_settingsIdx].asset[i].existsOnDisk(); i++) {
UpdateParameters::AssetParams &ap = params->addAsset();
ComponentAssetData &cad = g.component[m_settingsIdx].asset[i];
ap.processes = cad.processes();
ap.flags = cad.flags();
ap.filterType = (UpdateParameters::UpdateFilterType)cad.filterType();
ap.filter = cad.filter();
ap.maxExpected = cad.maxExpected();
ap.destSubDir = cad.destSubDir();
ap.copyFilterType = (UpdateParameters::UpdateFilterType)cad.copyFilterType();
ap.copyFilter = cad.copyFilter();
}
}
void UpdateInterface::saveAssetSettings()
{
if (!isValidSettingsIndex())
return;
for (int i = 0; i < MAX_COMPONENT_ASSETS && g.component[m_settingsIdx].asset[i].existsOnDisk(); i++) {
const UpdateParameters::AssetParams &ap = params->assets.at(i);
ComponentAssetData &cad = g.component[m_settingsIdx].asset[i];
// ap.processes do not overwrite as read only
cad.flags(ap.flags);
cad.filterType(ap.filterType);
cad.filter(ap.filter);
cad.maxExpected(ap.maxExpected);
cad.destSubDir(ap.destSubDir);
cad.copyFilterType(ap.copyFilterType);
cad.copyFilter(ap.copyFilter);
}
}
bool UpdateInterface::isUpdateable()
{
return g.component[m_settingsIdx].checkForUpdate();
return g.component[m_id].checkForUpdate();
}
void UpdateInterface::resetEnvironment()
@@ -378,7 +368,7 @@ void UpdateInterface::resetEnvironment()
progress = nullptr;
params->logLevel = g.updLogLevel();
setReleaseChannel(g.component[m_settingsIdx].releaseChannel());
setReleaseChannel(g.component[m_id].releaseChannel());
params->updateRelease = "";
setFlavourLanguage();
loadAssetSettings();
@@ -398,9 +388,15 @@ void UpdateInterface::resetEnvironment()
void UpdateInterface::setReleaseChannel(int channel)
{
params->releaseChannel = channel;
//repoReleasesMetaData();
releases->setReleaseChannel(channel);
}
void UpdateInterface::setReleaseId(QString val)
{
releases->getSetId(val);
}
void UpdateInterface::setFlavourLanguage()
{
const Firmware * baseFw = getCurrentFirmware()->getFirmwareBase();
@@ -460,19 +456,21 @@ void UpdateInterface::setParamFolders()
void UpdateInterface::clearRelease()
{
g.component[m_settingsIdx].clearRelease();
g.component[m_id].clearRelease();
currentRelease();
}
const QString UpdateInterface::currentRelease()
{
params->currentRelease = g.component[m_settingsIdx].release();
params->currentRelease = g.component[m_id].release();
return params->currentRelease;
}
QString UpdateInterface::latestRelease()
{
repoReleasesMetaData();
if (!repoReleasesMetaData())
return tr("unknown");
return releases->name();
}
@@ -486,7 +484,7 @@ const QString UpdateInterface::updateRelease()
const bool UpdateInterface::isUpdateAvailable()
{
if (g.component[m_settingsIdx].checkForUpdate())
if (g.component[m_id].checkForUpdate())
return !isLatestRelease();
else {
return false;
@@ -510,11 +508,13 @@ const bool UpdateInterface::isLatestVersion(const QString & installed, const QSt
const bool UpdateInterface::isLatestRelease()
{
repoReleasesMetaData();
if (!repoReleasesMetaData())
return false;
QString currentVer = currentVersion();
QString latestVer = releases->version();
// nightlies often have the same version so also check id
if (isLatestVersion(currentVer, latestVer) && g.component[m_settingsIdx].id() == releases->id()) {
if (isLatestVersion(currentVer, latestVer) && g.component[m_id].releaseId() == releases->id()) {
return true;
}
else {
@@ -524,12 +524,14 @@ const bool UpdateInterface::isLatestRelease()
const QString UpdateInterface::currentVersion()
{
return g.component[m_settingsIdx].version();
return g.component[m_id].version();
}
const QStringList UpdateInterface::getReleases()
{
repoReleasesMetaData();
if (!repoReleasesMetaData())
return QStringList();
return releases->list();
}
@@ -541,17 +543,20 @@ bool UpdateInterface::repoReleasesMetaData()
releases->setId(0);
return false;
}
}
releases->getSetId();
releases->getSetId();
}
return true;
}
bool UpdateInterface::repoReleaseAssetsMetaData()
{
if (!repoReleasesMetaData())
return false;
if (!downloadReleaseAssetsMetaData(releases->id())) {
reportProgress(tr("Unable to download release channel assets information"), QtDebugMsg);
reportProgress(tr("Unable to download release assets information"), QtDebugMsg);
return false;
}
@@ -584,14 +589,14 @@ bool UpdateInterface::setRunFolders()
}
}
downloadDir = QString("%1/%2/%3").arg(params->downloadDir).arg(name).arg(fldr);
downloadDir = QString("%1/%2/%3").arg(params->downloadDir).arg(m_name).arg(fldr);
if (!checkCreateDirectory(downloadDir, UPDFLG_Download))
return false;
//reportProgress(tr("Download directory: %1").arg(downloadDir), QtDebugMsg);
decompressDir = QString("%1/%2/%3").arg(params->decompressDir).arg(name).arg(fldr);
decompressDir = QString("%1/%2/%3").arg(params->decompressDir).arg(m_name).arg(fldr);
if (!checkCreateDirectory(decompressDir, UPDFLG_Decompress))
return false;
@@ -624,6 +629,38 @@ bool UpdateInterface::checkCreateDirectory(const QString & dir, const UpdateFlag
return true;
}
bool UpdateInterface::getReleaseJsonAsset(const QString assetName, QJsonDocument * json)
{
if (!repoReleaseAssetsMetaData())
return false;
if (!assets->getSetId(assetName))
return false;
if (!downloadAssetToBuffer(assets->id())) {
return false;
}
if (!convertDownloadToJson(json)) {
return false;
}
return true;
}
bool UpdateInterface::getRepoJsonFile(const QString filename, QJsonDocument * json)
{
if (!downloadTextFileToBuffer(filename)) {
return false;
}
if (!convertDownloadToJson(json)) {
return false;
}
return true;
}
bool UpdateInterface::downloadReleasesMetaData()
{
//progressMessage(tr("Download releases metadata"));
@@ -649,7 +686,7 @@ bool UpdateInterface::downloadReleaseMetaData(const int releaseId)
bool UpdateInterface::downloadReleaseAssetsMetaData(const int releaseId)
{
//progressMessage(tr("Download release %1 assets metadata").arg(releaseId));
downloadMetaData(MDT_ReleaseAssets, assets->urlReleaseAssets(releaseId, resultsPerPage));
downloadMetaData(MDT_ReleaseAssets, assets->urlReleaseAssets(releaseId));
return downloadSuccess;
}
@@ -1380,10 +1417,10 @@ bool UpdateInterface::asyncInstall()
bool UpdateInterface::saveReleaseSettings()
{
reportProgress(tr("Save release settings"), QtDebugMsg);
g.component[m_settingsIdx].release(releases->name());
g.component[m_settingsIdx].version(releases->version());
g.component[m_settingsIdx].id(releases->id());
g.component[m_settingsIdx].date(releases->date());
g.component[m_id].release(releases->name());
g.component[m_id].version(releases->version());
g.component[m_id].releaseId(releases->id());
g.component[m_id].date(releases->date());
return true;
}
@@ -1405,6 +1442,12 @@ UpdateFactories::~UpdateFactories()
void UpdateFactories::registerUpdateFactory(UpdateFactoryInterface * factory)
{
foreach (UpdateFactoryInterface * registeredFactory, registeredUpdateFactories) {
if (registeredFactory->id() == factory->id()) {
qDebug() << "Duplicate factory - id:" << factory->id() << "name:" << factory->name();
return;
}
}
registeredUpdateFactories.append(factory);
qDebug() << "Registered update factory:" << factory->name();
}
@@ -1429,63 +1472,60 @@ void UpdateFactories::unregisterUpdateFactories()
delete factory;
}
void UpdateFactories::initAssetSettings(const QString & name)
UpdateInterface * UpdateFactories::getInstance(const int id)
{
foreach (UpdateFactoryInterface * factory, registeredUpdateFactories) {
if (name == factory->name()) {
factory->instance()->initAssetSettings();
break;
}
if (id == factory->id())
return factory->instance();
}
qDebug() << "Critical error - Interface not found for id:" << id;
return nullptr;
}
void UpdateFactories::saveAssetSettings(const QString & name)
const QString UpdateFactories::name(const int id)
{
foreach (UpdateFactoryInterface * factory, registeredUpdateFactories) {
if (name == factory->name()) {
factory->instance()->saveAssetSettings();
break;
}
}
UpdateInterface * iface = getInstance(id);
if (iface)
return iface->name();
return "";
}
UpdateParameters * const UpdateFactories::getParams(const QString & name)
void UpdateFactories::saveAssetSettings(const int id)
{
foreach (UpdateFactoryInterface * factory, registeredUpdateFactories) {
if (name == factory->name()) {
return factory->instance()->getParams();
break;
}
}
UpdateInterface * iface = getInstance(id);
if (iface)
iface->saveAssetSettings();
}
UpdateParameters * const UpdateFactories::getParams(const int id)
{
UpdateInterface * iface = getInstance(id);
if (iface)
return iface->getParams();
return nullptr;
}
void UpdateFactories::resetEnvironment(const QString & name)
void UpdateFactories::resetEnvironment(const int id)
{
foreach (UpdateFactoryInterface * factory, registeredUpdateFactories) {
if (name == factory->name()) {
factory->instance()->resetEnvironment();
break;
}
}
UpdateInterface * iface = getInstance(id);
if (iface)
iface->resetEnvironment();
}
void UpdateFactories::resetAllEnvironments()
{
foreach (UpdateFactoryInterface * factory, registeredUpdateFactories) {
resetEnvironment(factory->name());
resetEnvironment(factory->id());
}
}
void UpdateFactories::setRunUpdate(const QString & name)
void UpdateFactories::setRunUpdate(const int id)
{
foreach (UpdateFactoryInterface * factory, registeredUpdateFactories) {
if (name == factory->name()) {
factory->instance()->setRunUpdate();
break;
}
}
UpdateInterface * iface = getInstance(id);
if (iface)
iface->setRunUpdate();
}
const QMap<QString, int> UpdateFactories::sortedComponentsList(bool updateableOnly)
@@ -1495,114 +1535,85 @@ const QMap<QString, int> UpdateFactories::sortedComponentsList(bool updateableOn
foreach (UpdateFactoryInterface * factory, registeredUpdateFactories) {
if (updateableOnly && !factory->instance()->isUpdateable())
continue;
map.insert(factory->name(), factory->instance()->settingsIndex());
map.insert(factory->name(), factory->id());
}
return map;
}
void UpdateFactories::clearRelease(const QString & name)
void UpdateFactories::clearRelease(const int id)
{
foreach (UpdateFactoryInterface * factory, registeredUpdateFactories) {
if (name == factory->name()) {
factory->instance()->clearRelease();
break;
}
}
UpdateInterface * iface = getInstance(id);
if (iface)
iface->clearRelease();
}
void UpdateFactories::setReleaseChannel(const QString & name, int channel)
void UpdateFactories::setReleaseChannel(const int id, int channel)
{
foreach (UpdateFactoryInterface * factory, registeredUpdateFactories) {
if (name == factory->name()) {
factory->instance()->setReleaseChannel(channel);
break;
}
}
UpdateInterface * iface = getInstance(id);
if (iface)
iface->setReleaseChannel(channel);
}
const QString UpdateFactories::currentRelease(const QString & name)
void UpdateFactories::setReleaseId(const int id, QString val)
{
QString ret;
foreach (UpdateFactoryInterface * factory, registeredUpdateFactories) {
if (name == factory->name()) {
ret = factory->instance()->currentRelease();
break;
}
}
return ret;
UpdateInterface * iface = getInstance(id);
if (iface)
iface->setReleaseId(val);
}
const QString UpdateFactories::updateRelease(const QString & name)
const QString UpdateFactories::currentRelease(const int id)
{
QString ret;
UpdateInterface * iface = getInstance(id);
if (iface)
return iface->currentRelease();
foreach (UpdateFactoryInterface * factory, registeredUpdateFactories) {
if (name == factory->name()) {
ret = factory->instance()->updateRelease();
break;
}
}
return ret;
return "";
}
const bool UpdateFactories::isLatestRelease(const QString & name)
const QString UpdateFactories::updateRelease(const int id)
{
bool ret = true;
UpdateInterface * iface = getInstance(id);
if (iface)
return iface->updateRelease();
foreach (UpdateFactoryInterface * factory, registeredUpdateFactories) {
if (name == factory->name()) {
ret = factory->instance()->isLatestRelease();
break;
}
}
return ret;
return "";
}
const QString UpdateFactories::latestRelease(const QString & name)
const bool UpdateFactories::isLatestRelease(const int id)
{
QString ret;
UpdateInterface * iface = getInstance(id);
if (iface)
return iface->isLatestRelease();
foreach (UpdateFactoryInterface * factory, registeredUpdateFactories) {
if (name == factory->name()) {
ret = factory->instance()->latestRelease();
break;
}
}
return ret;
return true;
}
const QStringList UpdateFactories::releases(const QString & name)
const QString UpdateFactories::latestRelease(const int id)
{
QStringList ret;
UpdateInterface * iface = getInstance(id);
if (iface)
return iface->latestRelease();
foreach (UpdateFactoryInterface * factory, registeredUpdateFactories) {
if (name == factory->name()) {
ret = factory->instance()->getReleases();
break;
}
}
return ret;
return "";
}
bool UpdateFactories::update(const QString & name, ProgressWidget * progress)
const QStringList UpdateFactories::releases(const int id)
{
bool ret = false;
UpdateInterface * iface = getInstance(id);
if (iface)
return iface->getReleases();
foreach (UpdateFactoryInterface * factory, registeredUpdateFactories) {
if (name == factory->name()) {
ret = factory->instance()->update(progress);
break;
}
}
return QStringList();
}
return ret;
bool UpdateFactories::update(const int id, ProgressWidget * progress)
{
UpdateInterface * iface = getInstance(id);
if (iface)
return iface->update(progress);
return false;
}
bool UpdateFactories::updateAll(ProgressWidget * progress)
@@ -1610,7 +1621,7 @@ bool UpdateFactories::updateAll(ProgressWidget * progress)
bool ret = false;
foreach (UpdateFactoryInterface * factory, registeredUpdateFactories) {
ret = update(factory->name(), progress);
ret = factory->instance()->update(progress);
if (!ret)
break;
}
@@ -1618,17 +1629,36 @@ bool UpdateFactories::updateAll(ProgressWidget * progress)
return ret;
}
const bool UpdateFactories::isUpdateAvailable(QStringList & names)
const bool UpdateFactories::isUpdateAvailable(QMap<QString, int> & list)
{
bool ret = false;
names.clear();
list.clear();
foreach (UpdateFactoryInterface * factory, registeredUpdateFactories) {
if (factory->instance()->isUpdateable() && factory->instance()->isUpdateAvailable()) {
names.append(factory->name());
list.insert(factory->name(), factory->id());
ret = true;
}
}
return ret;
}
bool UpdateFactories::getReleaseJsonAsset(const int id, const QString assetName, QJsonDocument * json)
{
UpdateInterface * iface = getInstance(id);
if (iface)
return iface->getReleaseJsonAsset(assetName, json);
return false;
}
bool UpdateFactories::getRepoJsonFile(const int id, const QString filename, QJsonDocument * json)
{
UpdateInterface * iface = getInstance(id);
if (iface)
return iface->getRepoJsonFile(filename, json);
return false;
}