summaryrefslogtreecommitdiffstats
path: root/rbutil
diff options
context:
space:
mode:
Diffstat (limited to 'rbutil')
-rw-r--r--rbutil/rbutilqt/base/autodetection.cpp7
-rw-r--r--rbutil/rbutilqt/base/bootloaderinstalls5l.cpp6
-rw-r--r--rbutil/rbutilqt/base/playerbuildinfo.cpp265
-rw-r--r--rbutil/rbutilqt/base/playerbuildinfo.h106
-rw-r--r--rbutil/rbutilqt/base/rbsettings.cpp5
-rw-r--r--rbutil/rbutilqt/base/serverinfo.cpp157
-rw-r--r--rbutil/rbutilqt/base/serverinfo.h71
-rw-r--r--rbutil/rbutilqt/base/systeminfo.cpp85
-rw-r--r--rbutil/rbutilqt/base/systeminfo.h44
-rw-r--r--rbutil/rbutilqt/base/talkgenerator.cpp9
-rw-r--r--rbutil/rbutilqt/base/utils.cpp8
-rw-r--r--rbutil/rbutilqt/base/voicefile.cpp5
-rw-r--r--rbutil/rbutilqt/configure.cpp54
-rw-r--r--rbutil/rbutilqt/gui/selectiveinstallwidget.cpp152
-rw-r--r--rbutil/rbutilqt/gui/selectiveinstallwidget.h4
-rw-r--r--rbutil/rbutilqt/rbutil.ini26
-rw-r--r--rbutil/rbutilqt/rbutilqt.cpp35
-rw-r--r--rbutil/rbutilqt/rbutilqt.pri4
-rw-r--r--rbutil/rbutilqt/test/stubs/stubs-playerbuildinfo.cpp36
-rw-r--r--rbutil/rbutilqt/test/stubs/stubs-serverinfo.cpp105
-rw-r--r--rbutil/rbutilqt/test/test-playerbuildinfo.cpp237
-rw-r--r--rbutil/rbutilqt/test/test-playerbuildinfo.pro (renamed from rbutil/rbutilqt/test/test-serverinfo.pro)9
-rw-r--r--rbutil/rbutilqt/test/test-serverinfo.cpp124
-rw-r--r--rbutil/rbutilqt/themesinstallwindow.cpp10
24 files changed, 791 insertions, 773 deletions
diff --git a/rbutil/rbutilqt/base/autodetection.cpp b/rbutil/rbutilqt/base/autodetection.cpp
index 00918bf769..58e844b4c3 100644
--- a/rbutil/rbutilqt/base/autodetection.cpp
+++ b/rbutil/rbutilqt/base/autodetection.cpp
@@ -20,6 +20,7 @@
#include "autodetection.h"
#include "rbsettings.h"
#include "systeminfo.h"
+#include "playerbuildinfo.h"
#include "../ipodpatcher/ipodpatcher.h"
#include "../sansapatcher/sansapatcher.h"
@@ -69,7 +70,8 @@ bool Autodetection::detect(void)
}
for(int i = 0; i < m_detected.size(); ++i) {
LOG_INFO() << "Detected player:" << m_detected.at(i).device
- << "at" << m_detected.at(i).mountpoint << states[m_detected.at(i).status];
+ << "at" << m_detected.at(i).mountpoint
+ << states[m_detected.at(i).status];
}
return m_detected.size() > 0;
@@ -108,7 +110,8 @@ void Autodetection::detectUsb()
LOG_WARNING() << "[USB] detected problem with player" << d.device;
}
QString idstring = QString("%1").arg(attached.at(i), 8, 16, QChar('0'));
- if(!SystemInfo::platformValue(SystemInfo::Name, idstring).toString().isEmpty()) {
+ if(!PlayerBuildInfo::instance()->value(
+ PlayerBuildInfo::DisplayName, idstring).toString().isEmpty()) {
struct Detected d;
d.status = PlayerIncompatible;
d.device = idstring;
diff --git a/rbutil/rbutilqt/base/bootloaderinstalls5l.cpp b/rbutil/rbutilqt/base/bootloaderinstalls5l.cpp
index e8852d6df5..3621a27e26 100644
--- a/rbutil/rbutilqt/base/bootloaderinstalls5l.cpp
+++ b/rbutil/rbutilqt/base/bootloaderinstalls5l.cpp
@@ -23,7 +23,7 @@
#include "utils.h"
#include "system.h"
#include "rbsettings.h"
-#include "systeminfo.h"
+#include "playerbuildinfo.h"
#include "../mks5lboot/mks5lboot.h"
@@ -408,8 +408,8 @@ BootloaderInstallBase::BootloaderType BootloaderInstallS5l::installed(void)
QString logfile = RbSettings::value(RbSettings::Mountpoint).toString()
+ "/.rockbox/rbutil.log";
QSettings s(logfile, QSettings::IniFormat, this);
- QString section = SystemInfo::platformValue(
- SystemInfo::BootloaderName).toString().section('/', -1);
+ QString section = PlayerBuildInfo::instance()->value(
+ PlayerBuildInfo::BootloaderName).toString().section('/', -1);
rbblInstalled = s.contains("Bootloader/" + section);
if (rbblInstalled) {
diff --git a/rbutil/rbutilqt/base/playerbuildinfo.cpp b/rbutil/rbutilqt/base/playerbuildinfo.cpp
new file mode 100644
index 0000000000..fb8b121e8f
--- /dev/null
+++ b/rbutil/rbutilqt/base/playerbuildinfo.cpp
@@ -0,0 +1,265 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ *
+ * Copyright (C) 2020 by Dominik Riebeling
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+#include "playerbuildinfo.h"
+#include "rbsettings.h"
+#include "Logger.h"
+
+PlayerBuildInfo* PlayerBuildInfo::infoInstance = nullptr;
+
+PlayerBuildInfo* PlayerBuildInfo::instance()
+{
+ if (infoInstance == nullptr) {
+ infoInstance = new PlayerBuildInfo();
+ }
+ return infoInstance;
+}
+
+// server infos
+const static struct {
+ PlayerBuildInfo::BuildInfo item;
+ const char* name;
+} ServerInfoList[] = {
+ { PlayerBuildInfo::BuildVoiceLangs, "voices/:version:" },
+ { PlayerBuildInfo::BuildVersion, ":build:/:target:" },
+ { PlayerBuildInfo::BuildUrl, ":build:/build_url" },
+ { PlayerBuildInfo::BuildVoiceUrl, ":build:/voice_url" },
+ { PlayerBuildInfo::BuildManualUrl, ":build:/manual_url" },
+ { PlayerBuildInfo::BuildSourceUrl, ":build:/source_url" },
+ { PlayerBuildInfo::BuildFontUrl, ":build:/font_url" },
+
+ // other URLs -- those are not directly related to the build, but handled here.
+ { PlayerBuildInfo::DoomUrl, "other/doom_url" },
+ { PlayerBuildInfo::Duke3DUrl, "other/duke3d_url" },
+ { PlayerBuildInfo::PuzzFontsUrl, "other/puzzfonts_url" },
+ { PlayerBuildInfo::QuakeUrl, "other/quake_url" },
+ { PlayerBuildInfo::Wolf3DUrl, "other/wolf3d_url" },
+ { PlayerBuildInfo::XWorldUrl, "other/xworld_url" },
+ { PlayerBuildInfo::MidiPatchsetUrl, "other/patcheset_url" },
+};
+
+const static struct {
+ PlayerBuildInfo::DeviceInfo item;
+ const char* name;
+} PlayerInfoList[] = {
+ { PlayerBuildInfo::BuildStatus, "status/:target:" },
+ { PlayerBuildInfo::DisplayName, ":target:/name" },
+ { PlayerBuildInfo::BootloaderMethod, ":target:/bootloadermethod" },
+ { PlayerBuildInfo::BootloaderName, ":target:/bootloadername" },
+ { PlayerBuildInfo::BootloaderFile, ":target:/bootloaderfile" },
+ { PlayerBuildInfo::BootloaderFilter, ":target:/bootloaderfilter" },
+ { PlayerBuildInfo::Encoder, ":target:/encoder" },
+ { PlayerBuildInfo::Brand, ":target:/brand" },
+ { PlayerBuildInfo::PlayerPicture, ":target:/playerpic" },
+};
+
+const static struct {
+ PlayerBuildInfo::SystemUrl item;
+ const char* name;
+} PlayerSystemUrls[] = {
+ { PlayerBuildInfo::BootloaderUrl, "bootloader/download_url" },
+ { PlayerBuildInfo::BuildInfoUrl, "build_info_url" },
+ { PlayerBuildInfo::GenlangUrl, "genlang_url" },
+ { PlayerBuildInfo::ThemesUrl, "themes_url" },
+ { PlayerBuildInfo::ThemesInfoUrl, "themes_info_url" },
+ { PlayerBuildInfo::RbutilUrl, "rbutil_url" },
+};
+
+PlayerBuildInfo::PlayerBuildInfo() :
+ serverInfo(nullptr),
+ playerInfo(":/ini/rbutil.ini", QSettings::IniFormat)
+{
+
+}
+
+void PlayerBuildInfo::setBuildInfo(QString file)
+{
+ if (serverInfo)
+ delete serverInfo;
+ LOG_INFO() << "updated:" << file;
+ serverInfo = new QSettings(file, QSettings::IniFormat);
+}
+
+QVariant PlayerBuildInfo::value(BuildInfo item, BuildType type)
+{
+ // locate setting item in server info file
+ int i = 0;
+ while(ServerInfoList[i].item != item)
+ i++;
+
+ // split of variant for target.
+ // we can have an optional variant part in the target string.
+ // For build info we don't use that.
+ QString target = RbSettings::value(RbSettings::CurrentPlatform).toString().split('.').at(0);
+
+ QString s = ServerInfoList[i].name;
+ s.replace(":target:", target);
+ QString v;
+ switch(type) {
+ case TypeRelease:
+ v = "release";
+ break;
+ case TypeCandidate:
+ v = "release-candidate";
+ break;
+ case TypeDaily:
+ v = "daily";
+ break;
+ case TypeDevel:
+ v = "development";
+ break;
+ }
+
+ QVariant result = QString();
+ if (!serverInfo)
+ return result;
+ QStringList version = serverInfo->value(v + "/" + target, "").toStringList();
+ s.replace(":build:", v);
+ s.replace(":version:", version.at(0));
+
+ // get value from server build-info
+ // we need to get a version string, otherwise the data is invalid.
+ // For invalid data return an empty string.
+ if(version.at(0).isEmpty()) {
+ LOG_INFO() << s << "(version invalid)";
+ return result;
+ }
+ if(!s.isEmpty())
+ result = serverInfo->value(s);
+
+ // depending on the actual value we need more replacements.
+ switch(item) {
+ case BuildVersion:
+ result = result.toStringList().at(0);
+ break;
+
+ case BuildUrl:
+ if(version.size() > 1) {
+ // version info has an URL appended. Takes precendence.
+ result = version.at(1);
+ }
+ break;
+
+ case BuildVoiceLangs:
+ if (type == TypeDaily)
+ s = "voices/daily";
+ result = serverInfo->value(s);
+ break;
+
+ case BuildManualUrl:
+ {
+ // special case: if playerInfo has a non-empty manualname entry for the
+ // target, use that as target for the manual name.
+ QString manualtarget = playerInfo.value(target + "/manualname", "").toString();
+ if(!manualtarget.isEmpty())
+ target = manualtarget;
+ break;
+ }
+
+ default:
+ break;
+ }
+ // if the value is a string we can replace some patterns.
+ // if we cannot convert it (f.e. for a QStringList) we leave as-is, since
+ // the conversion would return an empty type.
+ if (result.canConvert(QMetaType::QString))
+ result = result.toString()
+ .replace("%TARGET%", target)
+ .replace("%VERSION%", version.at(0));
+
+ LOG_INFO() << "B:" << s << result;
+ return result;
+}
+
+QVariant PlayerBuildInfo::value(DeviceInfo item, QString target)
+{
+ // locate setting item in server info file
+ int i = 0;
+ while(PlayerInfoList[i].item != item)
+ i++;
+
+ // split of variant for target.
+ // we can have an optional variant part in the target string.
+ // For device info we use this.
+ if (target.isEmpty())
+ target = RbSettings::value(RbSettings::CurrentPlatform).toString();
+
+ QVariant result = QString();
+
+ QString s = PlayerInfoList[i].name;
+ s.replace(":target:", target);
+
+ switch(item) {
+ case BuildStatus:
+ {
+ // build status is the only value that doesn't depend on the version
+ // but the selected target instead.
+ bool ok = false;
+ if (serverInfo)
+ result = serverInfo->value(s).toInt(&ok);
+ if (!ok)
+ result = -1;
+ break;
+ }
+
+ default:
+ result = playerInfo.value(s);
+ break;
+ }
+
+ LOG_INFO() << "T:" << s << result;
+ return result;
+}
+
+QVariant PlayerBuildInfo::value(SystemUrl item)
+{
+ // locate setting item in server info file
+ int i = 0;
+ while(PlayerSystemUrls[i].item != item)
+ i++;
+
+ QVariant result = playerInfo.value(PlayerSystemUrls[i].name);
+ LOG_INFO() << "U:" << PlayerSystemUrls[i].name << result;
+ return result;
+}
+
+
+QString PlayerBuildInfo::statusAsString(QString platform)
+{
+ QString result;
+ switch(value(BuildStatus, platform).toInt())
+ {
+ case STATUS_RETIRED:
+ result = tr("Stable (Retired)");
+ break;
+ case STATUS_UNUSABLE:
+ result = tr("Unusable");
+ break;
+ case STATUS_UNSTABLE:
+ result = tr("Unstable");
+ break;
+ case STATUS_STABLE:
+ result = tr("Stable");
+ break;
+ default:
+ result = tr("Unknown");
+ break;
+ }
+
+ return result;
+}
diff --git a/rbutil/rbutilqt/base/playerbuildinfo.h b/rbutil/rbutilqt/base/playerbuildinfo.h
new file mode 100644
index 0000000000..81d7d97312
--- /dev/null
+++ b/rbutil/rbutilqt/base/playerbuildinfo.h
@@ -0,0 +1,106 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ *
+ * Copyright (C) 2020 by Dominik Riebeling
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+#ifndef PLAYERBUILDINFO_H
+#define PLAYERBUILDINFO_H
+
+#include <QSettings>
+
+#define STATUS_RETIRED 0
+#define STATUS_UNUSABLE 1
+#define STATUS_UNSTABLE 2
+#define STATUS_STABLE 3
+
+// Provide information about both player and builds.
+// For build info data retrieved from the build server has to be passed.
+class PlayerBuildInfo : public QObject
+{
+public:
+
+ enum BuildType {
+ TypeRelease,
+ TypeCandidate,
+ TypeDaily,
+ TypeDevel,
+ };
+ enum BuildInfo {
+ BuildUrl,
+ BuildVersion,
+ BuildManualUrl,
+ BuildVoiceUrl,
+ BuildVoiceLangs,
+ BuildSourceUrl,
+ BuildFontUrl,
+
+ DoomUrl,
+ Duke3DUrl,
+ PuzzFontsUrl,
+ QuakeUrl,
+ Wolf3DUrl,
+ XWorldUrl,
+ MidiPatchsetUrl,
+ };
+ enum DeviceInfo {
+ BuildStatus,
+
+ DisplayName,
+ BootloaderMethod,
+ BootloaderName,
+ BootloaderFile,
+ BootloaderFilter,
+ Encoder,
+ Brand,
+ PlayerPicture,
+ };
+
+ enum SystemUrl {
+ BootloaderUrl,
+ BuildInfoUrl,
+ GenlangUrl,
+ ThemesUrl,
+ ThemesInfoUrl,
+ RbutilUrl,
+ };
+
+ static PlayerBuildInfo* instance();
+
+ //! Update with build information from server
+ void setBuildInfo(QString file);
+
+ // Get information about a device. This data does not depend on the build type.
+ QVariant value(DeviceInfo item, QString target = "");
+
+ // Get build information for currently selected player.
+ QVariant value(BuildInfo item, BuildType type);
+
+ // Get fixed download URL information
+ QVariant value(SystemUrl item);
+
+ QString statusAsString(QString target = "");
+
+protected:
+ explicit PlayerBuildInfo();
+
+private:
+ static PlayerBuildInfo* infoInstance;
+ QSettings* serverInfo;
+ QSettings playerInfo;
+
+};
+
+#endif
diff --git a/rbutil/rbutilqt/base/rbsettings.cpp b/rbutil/rbutilqt/base/rbsettings.cpp
index adb222f80e..47217a15fe 100644
--- a/rbutil/rbutilqt/base/rbsettings.cpp
+++ b/rbutil/rbutilqt/base/rbsettings.cpp
@@ -17,7 +17,7 @@
****************************************************************************/
#include "rbsettings.h"
-#include "systeminfo.h"
+#include "playerbuildinfo.h"
#include <QSettings>
#include "Logger.h"
@@ -196,7 +196,8 @@ QString RbSettings::constructSettingPath(QString path, QString substitute)
}
else {
path.replace(":tts:", userSettings->value("tts").toString());
- path.replace(":encoder:", SystemInfo::platformValue(SystemInfo::Encoder, platform).toString());
+ path.replace(":encoder:", PlayerBuildInfo::instance()->value(
+ PlayerBuildInfo::Encoder, platform).toString());
}
path.replace(":platform:", platform);
}
diff --git a/rbutil/rbutilqt/base/serverinfo.cpp b/rbutil/rbutilqt/base/serverinfo.cpp
deleted file mode 100644
index 5fee75f689..0000000000
--- a/rbutil/rbutilqt/base/serverinfo.cpp
+++ /dev/null
@@ -1,157 +0,0 @@
-/***************************************************************************
- * __________ __ ___.
- * Open \______ \ ____ ____ | | _\_ |__ _______ ___
- * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
- * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
- * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
- * \/ \/ \/ \/ \/
- *
- * Copyright (C) 2010 by Dominik Wenger
- *
- * All files in this archive are subject to the GNU General Public License.
- * See the file COPYING in the source tree root for full license agreement.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ****************************************************************************/
-
-#include "serverinfo.h"
-#include "rbsettings.h"
-#include "systeminfo.h"
-#include "Logger.h"
-
-ServerInfo* ServerInfo::infoInstance = nullptr;
-
-ServerInfo* ServerInfo::instance()
-{
- if (infoInstance == nullptr) {
- infoInstance = new ServerInfo();
- }
- return infoInstance;
-}
-
-// server infos
-const static struct {
- ServerInfo::ServerInfos info;
- const char* name;
- const char* def;
-} ServerInfoList[] = {
- { ServerInfo::CurReleaseVersion, "release/:platform:", "" },
- { ServerInfo::CurReleaseUrl, "release/:platform:", "" },
- { ServerInfo::RelCandidateVersion, "release-candidate/:platform:", "" },
- { ServerInfo::RelCandidateUrl, "release-candidate/:platform:", "" },
- { ServerInfo::DailyVersion, "daily/:platform:", "" },
- { ServerInfo::DailyUrl, "daily/:platform:", "" },
- { ServerInfo::CurStatus, "status/:platform:", "-1" },
- { ServerInfo::BleedingRevision, "bleeding/rev", "" },
- { ServerInfo::BleedingDate, "bleeding/timestamp", "" },
- { ServerInfo::CurDevelUrl, "", "" },
-};
-
-void ServerInfo::readBuildInfo(QString file)
-{
- if (serverSettings)
- delete serverSettings;
- serverSettings = new QSettings(file, QSettings::IniFormat);
-}
-
-
-QVariant ServerInfo::platformValue(enum ServerInfos info, QString platform)
-{
- // locate setting item in server info file
- int i = 0;
- while(ServerInfoList[i].info != info)
- i++;
-
- // replace setting name
- if(platform.isEmpty())
- platform = RbSettings::value(RbSettings::CurrentPlatform).toString();
-
- // split of variant for platform.
- // we can have an optional variant part in the platform string.
- // For build info we don't use that.
- platform = platform.split('.').at(0);
-
- QString s = ServerInfoList[i].name;
- s.replace(":platform:", platform);
-
- // get value
- QVariant value = QString();
- if(!s.isEmpty() && serverSettings)
- value = serverSettings->value(s, ServerInfoList[i].def);
-
- // depending on the actual value we need more replacements.
- switch(info) {
- case CurReleaseVersion:
- case RelCandidateVersion:
- case DailyVersion:
- value = value.toStringList().at(0);
- break;
- case CurReleaseUrl:
- case RelCandidateUrl:
- case DailyUrl:
- {
- QString version = value.toStringList().at(0);
- if(value.toStringList().size() > 1)
- value = value.toStringList().at(1);
- else if(!version.isEmpty() && info == CurReleaseUrl)
- value = SystemInfo::value(SystemInfo::BuildUrl,
- SystemInfo::BuildRelease).toString()
- .replace("%MODEL%", platform)
- .replace("%RELVERSION%", version);
- else if(!version.isEmpty() && info == RelCandidateUrl)
- value = SystemInfo::value(SystemInfo::BuildUrl,
- SystemInfo::BuildCandidate).toString()
- .replace("%MODEL%", platform)
- .replace("%RELVERSION%", version);
- else if(!version.isEmpty() && info == DailyUrl)
- value = SystemInfo::value(SystemInfo::BuildUrl,
- SystemInfo::BuildDaily).toString()
- .replace("%MODEL%", platform)
- .replace("%RELVERSION%", version);
- }
- break;
- case CurDevelUrl:
- value = SystemInfo::value(SystemInfo::BuildUrl,
- SystemInfo::BuildCurrent).toString()
- .replace("%MODEL%", platform);
- break;
- case BleedingDate:
- // TODO: get rid of this, it's location specific.
- value = QDateTime::fromString(value.toString(),
- "yyyyMMddThhmmssZ").toString(Qt::ISODate);
- break;
-
- default:
- break;
- }
-
- LOG_INFO() << "Server:" << value;
- return value;
-}
-
-QString ServerInfo::statusAsString(QString platform)
-{
- QString value;
- switch(platformValue(CurStatus, platform).toInt())
- {
- case STATUS_RETIRED:
- value = tr("Stable (Retired)");
- break;
- case STATUS_UNUSABLE:
- value = tr("Unusable");
- break;
- case STATUS_UNSTABLE:
- value = tr("Unstable");
- break;
- case STATUS_STABLE:
- value = tr("Stable");
- break;
- default:
- value = tr("Unknown");
- break;
- }
-
- return value;
-}
diff --git a/rbutil/rbutilqt/base/serverinfo.h b/rbutil/rbutilqt/base/serverinfo.h
deleted file mode 100644
index 0746ec2c4f..0000000000
--- a/rbutil/rbutilqt/base/serverinfo.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/***************************************************************************
- * __________ __ ___.
- * Open \______ \ ____ ____ | | _\_ |__ _______ ___
- * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
- * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
- * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
- * \/ \/ \/ \/ \/
- *
- * Copyright (C) 2010 by Dominik Wenger
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ****************************************************************************/
-
-// Parse and provide information from build server via build-info file.
-// This is a singleton.
-
-#ifndef SERVERINFO_H
-#define SERVERINFO_H
-
-#include <QtCore>
-#define STATUS_RETIRED 0
-#define STATUS_UNUSABLE 1
-#define STATUS_UNSTABLE 2
-#define STATUS_STABLE 3
-
-class ServerInfo : public QObject
-{
- Q_OBJECT
- public:
-
- //! All Server infos
- enum ServerInfos {
- CurReleaseVersion,
- CurStatus,
- CurReleaseUrl,
- CurDevelUrl,
- BleedingRevision,
- BleedingDate,
- RelCandidateVersion,
- RelCandidateUrl,
- DailyVersion,
- DailyUrl
- };
-
- static ServerInfo* instance();
-
- //! read in buildinfo file
- void readBuildInfo(QString file);
- //! get a value from server info for a named platform.
- QVariant platformValue(enum ServerInfos setting, QString platform = "");
- //! Get status number as string
- QString statusAsString(QString platform = "");
-
- protected:
- ServerInfo() : serverSettings(nullptr) {}
-
- private:
- static ServerInfo* infoInstance;
- QSettings* serverSettings;
-
-};
-
-#endif
-
diff --git a/rbutil/rbutilqt/base/systeminfo.cpp b/rbutil/rbutilqt/base/systeminfo.cpp
index 8868ba937b..aa847540b9 100644
--- a/rbutil/rbutilqt/base/systeminfo.cpp
+++ b/rbutil/rbutilqt/base/systeminfo.cpp
@@ -23,44 +23,6 @@
#include "Logger.h"
// device settings
-const static struct {
- SystemInfo::SystemInfos info;
- const char* name;
-} SystemInfosList[] = {
- { SystemInfo::ManualUrl, ":build:/manual_url" },
- { SystemInfo::BuildUrl, ":build:/build_url" },
- { SystemInfo::FontUrl, ":build:/font_url" },
- { SystemInfo::VoiceUrl, ":build:/voice_url" },
- { SystemInfo::BootloaderUrl, "bootloader/download_url" },
- { SystemInfo::BootloaderInfoUrl, "bootloader/info_url" },
- { SystemInfo::DoomUrl, "doom_url" },
- { SystemInfo::Duke3DUrl, "duke3d_url" },
- { SystemInfo::PuzzFontsUrl, "puzzfonts_url" },
- { SystemInfo::QuakeUrl, "quake_url" },
- { SystemInfo::Wolf3DUrl, "wolf3d_url" },
- { SystemInfo::XWorldUrl, "xworld_url" },
- { SystemInfo::BuildInfoUrl, "build_info_url" },
- { SystemInfo::GenlangUrl, "genlang_url" },
- { SystemInfo::ThemesUrl, "themes_url" },
- { SystemInfo::ThemesInfoUrl, "themes_info_url" },
- { SystemInfo::RbutilUrl, "rbutil_url" },
-};
-
-const static struct {
- SystemInfo::PlatformInfo info;
- const char* name;
- const char* def;
-} PlatformInfosList[] = {
- { SystemInfo::Manual, ":platform:/manualname", ":platform:" },
- { SystemInfo::BootloaderMethod, ":platform:/bootloadermethod", "none" },
- { SystemInfo::BootloaderName, ":platform:/bootloadername", "" },
- { SystemInfo::BootloaderFile, ":platform:/bootloaderfile", "" },
- { SystemInfo::BootloaderFilter, ":platform:/bootloaderfilter", "" },
- { SystemInfo::Encoder, ":platform:/encoder", "" },
- { SystemInfo::Brand, ":platform:/brand", "" },
- { SystemInfo::Name, ":platform:/name", "" },
- { SystemInfo::PlayerPicture, ":platform:/playerpic", "" },
-};
//! pointer to setting object to nullptr
QSettings* SystemInfo::systemInfos = nullptr;
@@ -76,53 +38,6 @@ void SystemInfo::ensureSystemInfoExists()
}
-QVariant SystemInfo::value(enum SystemInfos info, BuildType type)
-{
- ensureSystemInfoExists();
-
- // locate setting item
- int i = 0;
- while(SystemInfosList[i].info != info)
- i++;
- QString s = SystemInfosList[i].name;
- switch(type) {
- case BuildDaily:
- s.replace(":build:", "daily");
- break;
- case BuildCurrent:
- s.replace(":build:", "development");
- break;
- case BuildCandidate:
- s.replace(":build:", "release-candidate");
- break;
- case BuildRelease:
- s.replace(":build:", "release");
- break;
- }
- LOG_INFO() << "GET:" << s << systemInfos->value(s).toString();
- return systemInfos->value(s);
-}
-
-QVariant SystemInfo::platformValue(enum PlatformInfo info, QString platform)
-{
- ensureSystemInfoExists();
-
- // locate setting item
- int i = 0;
- while(PlatformInfosList[i].info != info)
- i++;
-
- if (platform.isEmpty())
- platform = RbSettings::value(RbSettings::CurrentPlatform).toString();
-
- QString s = PlatformInfosList[i].name;
- s.replace(":platform:", platform);
- QString d = PlatformInfosList[i].def;
- d.replace(":platform:", platform);
- LOG_INFO() << "GET P:" << s << systemInfos->value(s, d).toString();
- return systemInfos->value(s, d);
-}
-
QStringList SystemInfo::platforms(enum SystemInfo::PlatformType type, QString variant)
{
ensureSystemInfoExists();
diff --git a/rbutil/rbutilqt/base/systeminfo.h b/rbutil/rbutilqt/base/systeminfo.h
index 67863c2268..7b5b68131b 100644
--- a/rbutil/rbutilqt/base/systeminfo.h
+++ b/rbutil/rbutilqt/base/systeminfo.h
@@ -34,47 +34,6 @@ class SystemInfo : public QObject
MapIncompatible,
};
- enum BuildType {
- BuildCurrent,
- BuildDaily,
- BuildRelease,
- BuildCandidate
- };
-
- //! All system settings
- enum SystemInfos {
- BuildUrl,
- FontUrl,
- VoiceUrl,
- ManualUrl,
- BootloaderUrl,
- BootloaderInfoUrl,
- DoomUrl,
- Duke3DUrl,
- QuakeUrl,
- PuzzFontsUrl,
- Wolf3DUrl,
- XWorldUrl,
- ReleaseUrl,
- BuildInfoUrl,
- GenlangUrl,
- ThemesUrl,
- ThemesInfoUrl,
- RbutilUrl,
- };
-
- enum PlatformInfo {
- Manual,
- BootloaderMethod,
- BootloaderName,
- BootloaderFile,
- BootloaderFilter,
- Encoder,
- Brand,
- Name,
- PlayerPicture,
- };
-
enum PlatformType {
PlatformAll,
PlatformAllDisabled,
@@ -93,9 +52,6 @@ class SystemInfo : public QObject
//! returns a map of usb-ids and their targets
static QMap<int, QStringList> usbIdMap(enum MapType type);
//! get a value from system settings
- static QVariant value(enum SystemInfos info, BuildType type = BuildCurrent);
- //! get a value from system settings for a named platform.
- static QVariant platformValue(enum PlatformInfo info, QString platform = "");
private:
//! you shouldnt call this, its a fully static calls
diff --git a/rbutil/rbutilqt/base/talkgenerator.cpp b/rbutil/rbutilqt/base/talkgenerator.cpp
index 951bf0e804..9139ceb274 100644
--- a/rbutil/rbutilqt/base/talkgenerator.cpp
+++ b/rbutil/rbutilqt/base/talkgenerator.cpp
@@ -18,7 +18,7 @@
#include "talkgenerator.h"
#include "rbsettings.h"
-#include "systeminfo.h"
+#include "playerbuildinfo.h"
#include "wavtrim.h"
#include "Logger.h"
@@ -56,8 +56,8 @@ TalkGenerator::Status TalkGenerator::process(QList<TalkEntry>* list,int wavtrimt
// Encoder
emit logItem(tr("Starting Encoder Engine"),LOGINFO);
- m_enc = EncoderBase::getEncoder(
- this, SystemInfo::platformValue(SystemInfo::Encoder).toString());
+ m_enc = EncoderBase::getEncoder(this, PlayerBuildInfo::instance()->value(
+ PlayerBuildInfo::Encoder).toString());
if(!m_enc->start())
{
emit logItem(tr("Init of Encoder engine failed"),LOGERROR);
@@ -156,7 +156,8 @@ TalkGenerator::Status TalkGenerator::voiceList(QList<TalkEntry>* list,int wavtri
QString error;
LOG_INFO() << "voicing: " << list->at(i).toSpeak
<< "to" << list->at(i).wavfilename;
- TTSStatus status = m_tts->voice(list->at(i).toSpeak,list->at(i).wavfilename, &error);
+ TTSStatus status = m_tts->voice(list->at(i).toSpeak,
+ list->at(i).wavfilename, &error);
if(status == Warning)
{
warnings = true;
diff --git a/rbutil/rbutilqt/base/utils.cpp b/rbutil/rbutilqt/base/utils.cpp
index 2f01f42e2c..3ab8aa6906 100644
--- a/rbutil/rbutilqt/base/utils.cpp
+++ b/rbutil/rbutilqt/base/utils.cpp
@@ -20,7 +20,7 @@
#include "rockboxinfo.h"
#include "system.h"
#include "rbsettings.h"
-#include "systeminfo.h"
+#include "playerbuildinfo.h"
#include "Logger.h"
#if !defined(_UNICODE)
@@ -385,8 +385,10 @@ QString Utils::checkEnvironment(bool permission)
{
text += tr("<li>Target mismatch detected.<br/>"
"Installed target: %1<br/>Selected target: %2.</li>")
- .arg(SystemInfo::platformValue(SystemInfo::Name, installed).toString(),
- SystemInfo::platformValue(SystemInfo::Name).toString());
+ .arg(PlayerBuildInfo::instance()->value(
+ PlayerBuildInfo::DisplayName, installed).toString(),
+ PlayerBuildInfo::instance()->value(
+ PlayerBuildInfo::DisplayName).toString());
}
if(!text.isEmpty())
diff --git a/rbutil/rbutilqt/base/voicefile.cpp b/rbutil/rbutilqt/base/voicefile.cpp
index c4edac64b9..98ab96b8ab 100644
--- a/rbutil/rbutilqt/base/voicefile.cpp
+++ b/rbutil/rbutilqt/base/voicefile.cpp
@@ -21,7 +21,7 @@
#include "utils.h"
#include "rockboxinfo.h"
#include "rbsettings.h"
-#include "systeminfo.h"
+#include "playerbuildinfo.h"
#include "ziputil.h"
#include "Logger.h"
@@ -148,7 +148,8 @@ bool VoiceFileCreator::createVoiceFile()
// genlang output as previously from the webserver.
// prepare download url
- QString genlang = SystemInfo::value(SystemInfo::GenlangUrl).toString();
+ QString genlang = PlayerBuildInfo::instance()->value(
+ PlayerBuildInfo::GenlangUrl).toString();
genlang.replace("%LANG%", m_lang);
genlang.replace("%TARGET%", target);
genlang.replace("%REVISION%", version);
diff --git a/rbutil/rbutilqt/configure.cpp b/rbutil/rbutilqt/configure.cpp
index b34379641e..6b784a6383 100644
--- a/rbutil/rbutilqt/configure.cpp
+++ b/rbutil/rbutilqt/configure.cpp
@@ -33,8 +33,8 @@
#include "system.h"
#include "encttscfggui.h"
#include "rbsettings.h"
-#include "serverinfo.h"
#include "systeminfo.h"
+#include "playerbuildinfo.h"
#include "utils.h"
#include "comboboxviewdelegate.h"
#if defined(Q_OS_WIN32)
@@ -355,8 +355,8 @@ void Config::setDevices()
QMultiMap <QString, QString> manuf;
for(int it = 0; it < platformList.size(); it++)
{
- QString curbrand = SystemInfo::platformValue(
- SystemInfo::Brand, platformList.at(it)).toString();
+ QString curbrand = PlayerBuildInfo::instance()->value(
+ PlayerBuildInfo::Brand, platformList.at(it)).toString();
manuf.insert(curbrand, platformList.at(it));
}
@@ -384,9 +384,10 @@ void Config::setDevices()
if(!manuf.values(brands.at(c)).contains(platformList.at(it)))
continue;
// construct display name
- QString curname = SystemInfo::platformValue(
- SystemInfo::Name, platformList.at(it)).toString()
- + " (" + ServerInfo::instance()->statusAsString(platformList.at(it)) + ")";
+ QString curname = QString("%1 (%2)").arg(
+ PlayerBuildInfo::instance()->value(PlayerBuildInfo::DisplayName,
+ platformList.at(it)).toString(),
+ PlayerBuildInfo::instance()->statusAsString(platformList.at(it)));
LOG_INFO() << "add supported device:" << brands.at(c) << curname;
w2 = new QTreeWidgetItem(w, QStringList(curname));
w2->setData(0, Qt::UserRole, platformList.at(it));
@@ -470,10 +471,10 @@ void Config::updateEncState()
return;
QString devname = ui.treeDevices->selectedItems().at(0)->data(0, Qt::UserRole).toString();
- QString encoder = SystemInfo::platformValue(
- SystemInfo::Encoder, devname).toString();
- ui.encoderName->setText(EncoderBase::getEncoderName(SystemInfo::platformValue(
- SystemInfo::Encoder, devname).toString()));
+ QString encoder = PlayerBuildInfo::instance()->value(
+ PlayerBuildInfo::Encoder, devname).toString();
+ ui.encoderName->setText(EncoderBase::getEncoderName(
+ PlayerBuildInfo::instance()->value(PlayerBuildInfo::Encoder, devname).toString()));
EncoderBase* enc = EncoderBase::getEncoder(this,encoder);
@@ -741,8 +742,9 @@ void Config::autodetect()
mp = tr("(unknown)");
}
msg += QString("<li>%1</li>").arg(tr("%1 at %2").arg(
- SystemInfo::platformValue(
- SystemInfo::Name, detected.at(i).device).toString(),
+ PlayerBuildInfo::instance()->value(
+ PlayerBuildInfo::DisplayName,
+ detected.at(i).device).toString(),
QDir::toNativeSeparators(mp)));
}
msg += "</ul>";
@@ -767,22 +769,25 @@ void Config::autodetect()
case Autodetection::PlayerIncompatible:
msg += tr("Detected an unsupported player:\n%1\n"
"Sorry, Rockbox doesn't run on your player.")
- .arg(SystemInfo::platformValue(
- SystemInfo::Name, detected.at(0).device).toString());
+ .arg(PlayerBuildInfo::instance()->value(
+ PlayerBuildInfo::DisplayName,
+ detected.at(0).device).toString());
break;
case Autodetection::PlayerMtpMode:
msg = tr("%1 in MTP mode found!\n"
"You need to change your player to MSC mode for installation. ")
- .arg(SystemInfo::platformValue(
- SystemInfo::Name, detected.at(0).device).toString());
+ .arg(PlayerBuildInfo::instance()->value(
+ PlayerBuildInfo::DisplayName,
+ detected.at(0).device).toString());
break;
case Autodetection::PlayerWrongFilesystem:
- if(SystemInfo::platformValue(
- SystemInfo::BootloaderMethod, detected.at(0).device) == "ipod") {
+ if(PlayerBuildInfo::instance()->value(
+ PlayerBuildInfo::BootloaderMethod, detected.at(0).device) == "ipod") {
msg = tr("%1 \"MacPod\" found!\n"
"Rockbox needs a FAT formatted Ipod (so-called \"WinPod\") "
- "to run. ").arg(SystemInfo::platformValue(
- SystemInfo::Name, detected.at(0).device).toString());
+ "to run. ").arg(PlayerBuildInfo::instance()->value(
+ PlayerBuildInfo::DisplayName,
+ detected.at(0).device).toString());
}
else {
msg = tr("The player contains an incompatible filesystem.\n"
@@ -961,10 +966,11 @@ void Config::configEnc()
return;
QString devname = ui.treeDevices->selectedItems().at(0)->data(0, Qt::UserRole).toString();
- QString encoder = SystemInfo::platformValue(
- SystemInfo::Encoder, devname).toString();
- ui.encoderName->setText(EncoderBase::getEncoderName(SystemInfo::platformValue(
- SystemInfo::Encoder, devname).toString()));
+ QString encoder = PlayerBuildInfo::instance()->value(
+ PlayerBuildInfo::Encoder, devname).toString();
+ ui.encoderName->setText(
+ EncoderBase::getEncoderName(PlayerBuildInfo::instance()->value(
+ PlayerBuildInfo::Encoder, devname).toString()));
EncoderBase* enc = EncoderBase::getEncoder(this,encoder);
diff --git a/rbutil/rbutilqt/gui/selectiveinstallwidget.cpp b/rbutil/rbutilqt/gui/selectiveinstallwidget.cpp
index 3ac24666df..190bdb28f4 100644
--- a/rbutil/rbutilqt/gui/selectiveinstallwidget.cpp
+++ b/rbutil/rbutilqt/gui/selectiveinstallwidget.cpp
@@ -21,7 +21,7 @@
#include <QFileDialog>
#include "selectiveinstallwidget.h"
#include "ui_selectiveinstallwidgetfrm.h"
-#include "serverinfo.h"
+#include "playerbuildinfo.h"
#include "rbsettings.h"
#include "rockboxinfo.h"
#include "systeminfo.h"
@@ -71,26 +71,28 @@ SelectiveInstallWidget::SelectiveInstallWidget(QWidget* parent) : QWidget(parent
void SelectiveInstallWidget::selectedVersionChanged(int index)
{
- m_buildtype = static_cast<SystemInfo::BuildType>(ui.selectedVersion->itemData(index).toInt());
+ m_buildtype = static_cast<PlayerBuildInfo::BuildType>(ui.selectedVersion->itemData(index).toInt());
bool voice = true;
switch(m_buildtype) {
- case SystemInfo::BuildRelease:
+ case PlayerBuildInfo::TypeRelease:
ui.selectedDescription->setText(tr("This is the latest stable "
"release available."));
voice = true;
break;
- case SystemInfo::BuildCurrent:
+ case PlayerBuildInfo::TypeDevel:
ui.selectedDescription->setText(tr("The development version is "
- "updated on every code change. Last update was on %1").arg(
- ServerInfo::instance()->platformValue(ServerInfo::BleedingDate).toString()));
+ "updated on every code change. Last update was on %1").arg(
+ PlayerBuildInfo::instance()->value(
+ PlayerBuildInfo::BuildVersion,
+ PlayerBuildInfo::TypeDevel).toString()));
voice = false;
break;
- case SystemInfo::BuildCandidate:
+ case PlayerBuildInfo::TypeCandidate:
ui.selectedDescription->setText(tr("This will eventually become the "
"next Rockbox version. Install it to help testing."));
voice = false;
break;
- case SystemInfo::BuildDaily:
+ case PlayerBuildInfo::TypeDaily:
ui.selectedDescription->setText(tr("Daily updated development version."));
voice = true;
break;
@@ -106,8 +108,8 @@ void SelectiveInstallWidget::updateVersion(void)
// get some configuration values globally
m_mountpoint = RbSettings::value(RbSettings::Mountpoint).toString();
m_target = RbSettings::value(RbSettings::CurrentPlatform).toString();
- m_blmethod = SystemInfo::platformValue(
- SystemInfo::BootloaderMethod, m_target).toString();
+ m_blmethod = PlayerBuildInfo::instance()->value(
+ PlayerBuildInfo::BootloaderMethod, m_target).toString();
if(m_logger != nullptr) {
delete m_logger;
@@ -115,46 +117,29 @@ void SelectiveInstallWidget::updateVersion(void)
}
// re-populate all version items
- m_versions.clear();
- m_versions.insert(SystemInfo::BuildRelease, ServerInfo::instance()->platformValue(
- ServerInfo::CurReleaseVersion).toString());
- // Don't populate RC or development selections if target has been retired.
- if (ServerInfo::instance()->platformValue(ServerInfo::CurStatus).toInt() != STATUS_RETIRED) {
- m_versions.insert(SystemInfo::BuildCurrent, ServerInfo::instance()->platformValue(
- ServerInfo::BleedingRevision).toString());
- m_versions.insert(SystemInfo::BuildCandidate, ServerInfo::instance()->platformValue(
- ServerInfo::RelCandidateVersion).toString());
- m_versions.insert(SystemInfo::BuildDaily, ServerInfo::instance()->platformValue(
- ServerInfo::DailyVersion).toString());
+ QMap<PlayerBuildInfo::BuildType, QString> types;
+ types[PlayerBuildInfo::TypeRelease] = tr("Stable Release (Version %1)");
+ if (PlayerBuildInfo::instance()->value(PlayerBuildInfo::BuildStatus).toInt() != STATUS_RETIRED) {
+ types[PlayerBuildInfo::TypeCandidate] = tr("Release Candidate (Revison %1)");
+ types[PlayerBuildInfo::TypeDaily] = tr("Daily Build (%1)");
+ types[PlayerBuildInfo::TypeDevel] = tr("Development Version (Revison %1)");
}
ui.selectedVersion->clear();
- if(!m_versions[SystemInfo::BuildRelease].isEmpty()) {
- ui.selectedVersion->addItem(tr("Stable Release (Version %1)").arg(
- m_versions[SystemInfo::BuildRelease]), SystemInfo::BuildRelease);
- }
- if(!m_versions[SystemInfo::BuildCurrent].isEmpty()) {
- ui.selectedVersion->addItem(tr("Development Version (Revison %1)").arg(
- m_versions[SystemInfo::BuildCurrent]), SystemInfo::BuildCurrent);
- }
- if(!m_versions[SystemInfo::BuildCandidate].isEmpty()) {
- ui.selectedVersion->addItem(tr("Release Candidate (Revison %1)").arg(
- m_versions[SystemInfo::BuildCandidate]), SystemInfo::BuildCandidate);
- }
- if(!m_versions[SystemInfo::BuildDaily].isEmpty()) {
- ui.selectedVersion->addItem(tr("Daily Build (%1)").arg(
- m_versions[SystemInfo::BuildDaily]), SystemInfo::BuildDaily);
+ for(auto i = types.begin(); i != types.end(); i++) {
+ QString version = PlayerBuildInfo::instance()->value(
+ PlayerBuildInfo::BuildVersion, i.key()).toString();
+ if(!version.isEmpty())
+ ui.selectedVersion->addItem(i.value().arg(version), i.key());
}
// select previously selected version
int index = ui.selectedVersion->findData(
- static_cast<SystemInfo::BuildType>(RbSettings::value(RbSettings::Build).toInt()));
+ static_cast<PlayerBuildInfo::BuildType>(RbSettings::value(RbSettings::Build).toInt()));
if(index < 0) {
- if(!m_versions[SystemInfo::BuildRelease].isEmpty()) {
- index = ui.selectedVersion->findData(SystemInfo::BuildRelease);
- }
- else {
- index = ui.selectedVersion->findData(SystemInfo::BuildCurrent);
+ index = ui.selectedVersion->findData(PlayerBuildInfo::TypeRelease);
+ if(index < 0) {
+ index = ui.selectedVersion->findData(PlayerBuildInfo::TypeDevel);
}
}
ui.selectedVersion->setCurrentIndex(index);
@@ -295,7 +280,8 @@ void SelectiveInstallWidget::installBootloader(void)
// create installer
BootloaderInstallBase *bl =
BootloaderInstallHelper::createBootloaderInstaller(this,
- SystemInfo::platformValue(SystemInfo::BootloaderMethod).toString());
+ PlayerBuildInfo::instance()->value(
+ PlayerBuildInfo::BootloaderMethod).toString());
if(bl == nullptr) {
m_logger->addItem(tr("No install method known."), LOGERROR);
m_logger->setFinished();
@@ -312,15 +298,16 @@ void SelectiveInstallWidget::installBootloader(void)
connect(m_logger, SIGNAL(aborted()), bl, SLOT(progressAborted()));
// set bootloader filename. Do this now as installed() needs it.
- QStringList blfile = SystemInfo::platformValue(SystemInfo::BootloaderFile).toStringList();
+ QStringList blfile = PlayerBuildInfo::instance()->value(
+ PlayerBuildInfo::BootloaderFile).toStringList();
QStringList blfilepath;
for(int a = 0; a < blfile.size(); a++) {
blfilepath.append(RbSettings::value(RbSettings::Mountpoint).toString()
+ blfile.at(a));
}
bl->setBlFile(blfilepath);
- QUrl url(SystemInfo::value(SystemInfo::BootloaderUrl).toString()
- + SystemInfo::platformValue(SystemInfo::BootloaderName).toString());
+ QUrl url(PlayerBuildInfo::instance()->value(PlayerBuildInfo::BootloaderUrl).toString()
+ + PlayerBuildInfo::instance()->value(PlayerBuildInfo::BootloaderName).toString());
bl->setBlUrl(url);
bl->setLogfile(RbSettings::value(RbSettings::Mountpoint).toString()
+ "/.rockbox/rbutil.log");
@@ -340,7 +327,8 @@ void SelectiveInstallWidget::installBootloader(void)
else if(bl->installed() == BootloaderInstallBase::BootloaderOther
&& bl->capabilities() & BootloaderInstallBase::Backup)
{
- QString targetFolder = SystemInfo::platformValue(SystemInfo::Name).toString()
+ QString targetFolder = PlayerBuildInfo::instance()->value(
+ PlayerBuildInfo::DisplayName).toString()
+ " Firmware Backup";
// remove invalid character(s)
targetFolder.remove(QRegExp("[:/]"));
@@ -377,7 +365,7 @@ void SelectiveInstallWidget::installBootloader(void)
// open dialog to browse to of file
QString offile;
QString filter
- = SystemInfo::platformValue(SystemInfo::BootloaderFilter).toString();
+ = PlayerBuildInfo::instance()->value(PlayerBuildInfo::BootloaderFilter).toString();
if(!filter.isEmpty()) {
filter = tr("Bootloader files (%1)").arg(filter) + ";;";
}
@@ -442,23 +430,8 @@ void SelectiveInstallWidget::installRockbox(void)
RbSettings::setValue(RbSettings::Build, m_buildtype);
RbSettings::sync();
- switch(m_buildtype) {
- case SystemInfo::BuildRelease:
- url = ServerInfo::instance()->platformValue(
- ServerInfo::CurReleaseUrl, m_target).toString();
- break;
- case SystemInfo::BuildCurrent:
- url = ServerInfo::instance()->platformValue(
- ServerInfo::CurDevelUrl, m_target).toString();
- break;
- case SystemInfo::BuildCandidate:
- url = ServerInfo::instance()->platformValue(
- ServerInfo::RelCandidateUrl, m_target).toString();
- break;
- case SystemInfo::BuildDaily:
- url = ServerInfo::instance()->platformValue(
- ServerInfo::DailyUrl, m_target).toString();
- }
+ url = PlayerBuildInfo::instance()->value(
+ PlayerBuildInfo::BuildUrl, m_buildtype).toString();
//! install build
if(m_zipinstaller != nullptr) m_zipinstaller->deleteLater();
m_zipinstaller = new ZipInstaller(this);
@@ -466,7 +439,8 @@ void SelectiveInstallWidget::installRockbox(void)
m_zipinstaller->setLogSection("Rockbox (Base)");
if(!RbSettings::value(RbSettings::CacheDisabled).toBool())
m_zipinstaller->setCache(true);
- m_zipinstaller->setLogVersion(m_versions[m_buildtype]);
+ m_zipinstaller->setLogVersion(PlayerBuildInfo::instance()->value(
+ PlayerBuildInfo::BuildVersion, m_buildtype).toString());
m_zipinstaller->setMountPoint(m_mountpoint);
connect(m_zipinstaller, SIGNAL(done(bool)), this, SLOT(continueInstall(bool)));
@@ -497,7 +471,8 @@ void SelectiveInstallWidget::installFonts(void)
// release is empty for non-release versions (i.e. daily / current)
logversion = installInfo.release();
}
- fontsurl = SystemInfo::value(SystemInfo::FontUrl, m_buildtype).toString();
+ fontsurl = PlayerBuildInfo::instance()->value(
+ PlayerBuildInfo::BuildFontUrl, m_buildtype).toString();
fontsurl.replace("%RELVERSION%", relversion);
// create new zip installer
@@ -532,13 +507,12 @@ void SelectiveInstallWidget::installVoicefile(void)
QString voiceurl;
QString logversion;
QString relversion = installInfo.release();
- if(m_buildtype != SystemInfo::BuildRelease) {
+ if(m_buildtype != PlayerBuildInfo::TypeRelease) {
// release is empty for non-release versions (i.e. daily / current)
logversion = installInfo.release();
}
- voiceurl = SystemInfo::value(SystemInfo::VoiceUrl, m_buildtype).toString();
- voiceurl.replace("%RELVERSION%", m_versions[m_buildtype]);
- voiceurl.replace("%MODEL%", m_target);
+ voiceurl = PlayerBuildInfo::instance()->value(
+ PlayerBuildInfo::BuildVoiceUrl, m_buildtype).toString();
voiceurl.replace("%LANGUAGE%", lang);
// create new zip installer
@@ -573,18 +547,13 @@ void SelectiveInstallWidget::installManual(void)
QString manualurl;
QString logversion;
QString relversion = installInfo.release();
- if(m_buildtype != SystemInfo::BuildRelease) {
+ if(m_buildtype != PlayerBuildInfo::TypeRelease) {
// release is empty for non-release versions (i.e. daily / current)
logversion = installInfo.release();
}
- manualurl = SystemInfo::value(SystemInfo::ManualUrl, m_buildtype).toString();
- manualurl.replace("%RELVERSION%", m_versions[m_buildtype]);
- QString model = SystemInfo::platformValue(SystemInfo::Manual, m_target).toString();
- if(model.isEmpty())
- model = m_target;
- manualurl.replace("%MODEL%", model);
-
+ manualurl = PlayerBuildInfo::instance()->value(
+ PlayerBuildInfo::BuildManualUrl, m_buildtype).toString();
if(mantype == "pdf")
manualurl.replace("%FORMAT%", ".pdf");
else
@@ -644,15 +613,15 @@ void SelectiveInstallWidget::installThemes(void)
static const struct {
const char *name;
- const char *pluginpath;
- SystemInfo::SystemInfos zipurl; // add new games to SystemInfo
+ const char *rockfile;
+ PlayerBuildInfo::BuildInfo zipurl; // add new games to PlayerBuildInfo
} GamesList[] = {
- { "Doom", "/.rockbox/rocks/games/doom.rock", SystemInfo::DoomUrl },
- { "Duke3D", "/.rockbox/rocks/games/duke3d.rock", SystemInfo::Duke3DUrl },
- { "Quake", "/.rockbox/rocks/games/quake.rock", SystemInfo::QuakeUrl },
- { "Puzzles fonts", "/.rockbox/rocks/games/sgt-blackbox.rock", SystemInfo::PuzzFontsUrl },
- { "Wolf3D", "/.rockbox/rocks/games/wolf3d.rock", SystemInfo::Wolf3DUrl },
- { "XWorld", "/.rockbox/rocks/games/xworld.rock", SystemInfo::XWorldUrl },
+ { "Doom", "games/doom.rock", PlayerBuildInfo::DoomUrl },
+ { "Duke3D", "games/duke3d.rock", PlayerBuildInfo::Duke3DUrl },
+ { "Quake", "games/quake.rock", PlayerBuildInfo::QuakeUrl },
+ { "Puzzles fonts", "games/sgt-blackbox.rock", PlayerBuildInfo::PuzzFontsUrl },
+ { "Wolf3D", "games/wolf3d.rock", PlayerBuildInfo::Wolf3DUrl },
+ { "XWorld", "games/xworld.rock", PlayerBuildInfo::XWorldUrl },
};
void SelectiveInstallWidget::installGamefiles(void)
@@ -665,10 +634,13 @@ void SelectiveInstallWidget::installGamefiles(void)
for(unsigned int i = 0; i < sizeof(GamesList) / sizeof(GamesList[0]); i++)
{
// check if installed Rockbox has this plugin.
- if(QFileInfo(m_mountpoint + GamesList[i].pluginpath).exists()) {
+ if(QFileInfo(m_mountpoint + "/.rockbox/rocks/" + GamesList[i].rockfile).exists()) {
gameNames.append(GamesList[i].name);
- gameUrls.append(SystemInfo::value(GamesList[i].zipurl).toString());
- LOG_INFO() << gameUrls.at(gameUrls.size() - 1);
+ // game URLs do not depend on the actual build type, but we need
+ // to pass it (simplifies the API, and will allow to make them
+ // type specific later if needed)
+ gameUrls.append(PlayerBuildInfo::instance()->value(
+ GamesList[i].zipurl, m_buildtype).toString());
}
}
diff --git a/rbutil/rbutilqt/gui/selectiveinstallwidget.h b/rbutil/rbutilqt/gui/selectiveinstallwidget.h
index 7a969a9e89..6cd1936de5 100644
--- a/rbutil/rbutilqt/gui/selectiveinstallwidget.h
+++ b/rbutil/rbutilqt/gui/selectiveinstallwidget.h
@@ -25,6 +25,7 @@
#include "zipinstaller.h"
#include "themesinstallwindow.h"
#include "systeminfo.h"
+#include "playerbuildinfo.h"
class SelectiveInstallWidget : public QWidget
{
@@ -65,9 +66,8 @@ class SelectiveInstallWidget : public QWidget
ProgressLoggerGui *m_logger;
int m_installStage;
ZipInstaller *m_zipinstaller;
- QMap<SystemInfo::BuildType, QString> m_versions;
ThemesInstallWindow *m_themesinstaller;
- SystemInfo::BuildType m_buildtype;
+ PlayerBuildInfo::BuildType m_buildtype;
};
#endif
diff --git a/rbutil/rbutilqt/rbutil.ini b/rbutil/rbutilqt/rbutil.ini
index 321d4bd096..9a99909f92 100644
--- a/rbutil/rbutilqt/rbutil.ini
+++ b/rbutil/rbutilqt/rbutil.ini
@@ -20,32 +20,6 @@ rbutil_url=http://download.rockbox.org/rbutil/
info_url=http://download.rockbox.org/bootloader/bootloaders-info
download_url=http://download.rockbox.org/bootloader
-[release]
-build_url=https://download.rockbox.org/release/%RELVERSION%/rockbox-%MODEL%-%RELVERSION%.zip
-voice_url=https://download.rockbox.org/release/%RELVERSION%/%MODEL%-%RELVERSION%-%LANGUAGE%.zip
-font_url=https://download.rockbox.org/release/%RELVERSION%/rockbox-fonts-%RELVERSION%.zip
-manual_url=https://download.rockbox.org/release/%RELVERSION%/rockbox-%MODEL%-%RELVERSION%%FORMAT%
-
-[release-candidate]
-build_url=https://download.rockbox.org/release-candidate/%RELVERSION%/rockbox-%MODEL%-%RELVERSION%.zip
-voice_url=https://download.rockbox.org/release-candidate/%RELVERSION%/%MODEL%-%RELVERSION%-%LANGUAGE%.zip
-font_url=https://download.rockbox.org/release-candidate/%RELVERSION%/rockbox-fonts-%RELVERSION%.zip
-manual_url=https://download.rockbox.org/release-candidate/%RELVERSION%/rockbox-%MODEL%-%RELVERSION%%FORMAT%
-
-[development]
-build_url=http://build.rockbox.org/data/rockbox-%MODEL%.zip
-; we don't have voices for dev builds.
-voice_url=https://download.rockbox.org/daily/voices/%MODEL%-%LANGUAGE%.zip
-font_url=https://download.rockbox.org/daily/fonts/rockbox-fonts.zip
-; manual is only built daily, use that one instead.
-manual_url=https://download.rockbox.org/daily/manual/rockbox-%MODEL%%FORMAT%
-
-[daily]
-build_url=https://download.rockbox.org/daily/%MODEL%/rockbox-%MODEL%.zip
-voice_url=https://download.rockbox.org/daily/%MODEL%/voice-%MODEL%-%LANGUAGE%.zip
-font_url=https://download.rockbox.org/daily/fonts/rockbox-fonts.zip
-manual_url=https://download.rockbox.org/daily/manual/rockbox-%MODEL%%FORMAT%
-
; [platforms] is used to determine the order in the device tree.
; Only devices present in this section will get displayed!
[platforms]
diff --git a/rbutil/rbutilqt/rbutilqt.cpp b/rbutil/rbutilqt/rbutilqt.cpp
index 4953db3470..a5c5967862 100644
--- a/rbutil/rbutilqt/rbutilqt.cpp
+++ b/rbutil/rbutilqt/rbutilqt.cpp
@@ -35,7 +35,7 @@
#include "system.h"
#include "systrace.h"
#include "rbsettings.h"
-#include "serverinfo.h"
+#include "playerbuildinfo.h"
#include "systeminfo.h"
#include "ziputil.h"
#include "infowidget.h"
@@ -224,7 +224,7 @@ void RbUtilQt::downloadInfo()
ui.statusbar->showMessage(tr("Downloading build information, please wait ..."));
LOG_INFO() << "downloading build info";
daily->setFile(&buildInfo);
- daily->getFile(QUrl(SystemInfo::value(SystemInfo::BuildInfoUrl).toString()));
+ daily->getFile(QUrl(PlayerBuildInfo::instance()->value(PlayerBuildInfo::BuildInfoUrl).toString()));
}
@@ -241,9 +241,9 @@ void RbUtilQt::downloadDone(bool error)
}
LOG_INFO() << "network status:" << daily->errorString();
- // read info into ServerInfo object
+ // read info into PlayerBuildInfo object
buildInfo.open();
- ServerInfo::instance()->readBuildInfo(buildInfo.fileName());
+ PlayerBuildInfo::instance()->setBuildInfo(buildInfo.fileName());
buildInfo.close();
ui.statusbar->showMessage(tr("Download build information finished."), 5000);
@@ -380,11 +380,11 @@ void RbUtilQt::updateDevice()
/* Enable bootloader installation, if possible */
bool bootloaderInstallable =
- SystemInfo::platformValue(SystemInfo::BootloaderMethod) != "none";
+ PlayerBuildInfo::instance()->value(PlayerBuildInfo::BootloaderMethod).toString() != "none";
/* Enable bootloader uninstallation, if possible */
bool bootloaderUninstallable = bootloaderInstallable &&
- SystemInfo::platformValue(SystemInfo::BootloaderMethod) != "fwpatcher";
+ PlayerBuildInfo::instance()->value(PlayerBuildInfo::BootloaderMethod) != "fwpatcher";
ui.labelRemoveBootloader->setEnabled(bootloaderUninstallable);
ui.buttonRemoveBootloader->setEnabled(bootloaderUninstallable);
ui.actionRemove_bootloader->setEnabled(bootloaderUninstallable);
@@ -395,10 +395,11 @@ void RbUtilQt::updateDevice()
ui.menuA_ctions->setEnabled(configurationValid);
// displayed device info
- QString brand = SystemInfo::platformValue(SystemInfo::Brand).toString();
+ QString brand = PlayerBuildInfo::instance()->value(PlayerBuildInfo::Brand).toString();
QString name
- = QString("%1 (%2)").arg(SystemInfo::platformValue(SystemInfo::Name).toString(),
- ServerInfo::instance()->statusAsString());
+ = QString("%1 (%2)").arg(
+ PlayerBuildInfo::instance()->value(PlayerBuildInfo::DisplayName).toString(),
+ PlayerBuildInfo::instance()->statusAsString());
ui.labelDevice->setText(QString("<b>%1 %2</b>").arg(brand, name));
QString mountpoint = RbSettings::value(RbSettings::Mountpoint).toString();
@@ -413,7 +414,7 @@ void RbUtilQt::updateDevice()
}
QPixmap pm;
- QString m = SystemInfo::platformValue(SystemInfo::PlayerPicture).toString();
+ QString m = PlayerBuildInfo::instance()->value(PlayerBuildInfo::PlayerPicture).toString();
pm.load(":/icons/players/" + m + "-small.png");
pm = pm.scaledToHeight(QFontMetrics(QApplication::font()).height() * 3);
ui.labelPlayerPic->setPixmap(pm);
@@ -478,14 +479,14 @@ void RbUtilQt::uninstallBootloader(void)
// create installer
BootloaderInstallBase *bl
= BootloaderInstallHelper::createBootloaderInstaller(this,
- SystemInfo::platformValue(SystemInfo::BootloaderMethod).toString());
+ PlayerBuildInfo::instance()->value(PlayerBuildInfo::BootloaderMethod).toString());
if(bl == nullptr) {
logger->addItem(tr("No uninstall method for this target known."), LOGERROR);
logger->setFinished();
return;
}
- QStringList blfile = SystemInfo::platformValue(SystemInfo::BootloaderFile).toStringList();
+ QStringList blfile = PlayerBuildInfo::instance()->value(PlayerBuildInfo::BootloaderFile).toStringList();
QStringList blfilepath;
for(int a = 0; a < blfile.size(); a++) {
blfilepath.append(RbSettings::value(RbSettings::Mountpoint).toString()
@@ -610,8 +611,8 @@ bool RbUtilQt::chkConfig(QWidget *parent)
void RbUtilQt::checkUpdate(void)
{
- QString url = SystemInfo::value(SystemInfo::RbutilUrl).toString();
-#if defined(Q_OS_WIN32)
+ QString url = PlayerBuildInfo::instance()->value(PlayerBuildInfo::RbutilUrl).toString();
+#if defined(Q_OS_WIN32)
url += "win32/";
#elif defined(Q_OS_LINUX)
url += "linux/";
@@ -678,8 +679,8 @@ void RbUtilQt::downloadUpdateDone(bool error)
// if we found something newer, display info
if(foundVersion != "")
{
- QString url = SystemInfo::value(SystemInfo::RbutilUrl).toString();
-#if defined(Q_OS_WIN32)
+ QString url = PlayerBuildInfo::instance()->value(PlayerBuildInfo::RbutilUrl).toString();
+#if defined(Q_OS_WIN32)
url += "win32/";
#elif defined(Q_OS_LINUX)
url += "linux/";
@@ -707,7 +708,7 @@ void RbUtilQt::changeEvent(QEvent *e)
if(e->type() == QEvent::LanguageChange) {
ui.retranslateUi(this);
buildInfo.open();
- ServerInfo::instance()->readBuildInfo(buildInfo.fileName());
+ PlayerBuildInfo::instance()->setBuildInfo(buildInfo.fileName());
buildInfo.close();
updateDevice();
} else {
diff --git a/rbutil/rbutilqt/rbutilqt.pri b/rbutil/rbutilqt/rbutilqt.pri
index c8f60052c4..bf127819fd 100644
--- a/rbutil/rbutilqt/rbutilqt.pri
+++ b/rbutil/rbutilqt/rbutilqt.pri
@@ -48,7 +48,6 @@ SOURCES += \
base/voicefile.cpp \
createvoicewindow.cpp \
base/rbsettings.cpp \
- base/serverinfo.cpp \
base/systeminfo.cpp \
base/system.cpp \
sysinfo.cpp \
@@ -82,6 +81,7 @@ SOURCES += \
mspack/system-mspack.c \
base/mspackutil.cpp \
base/archiveutil.cpp \
+ base/playerbuildinfo.cpp
HEADERS += \
@@ -127,7 +127,6 @@ HEADERS += \
base/voicefile.h \
createvoicewindow.h \
base/rbsettings.h \
- base/serverinfo.h \
base/systeminfo.h \
sysinfo.h \
base/system.h \
@@ -173,6 +172,7 @@ HEADERS += \
mspack/szdd.h \
base/mspackutil.h \
base/archiveutil.h \
+ base/playerbuildinfo.h
FORMS += \
diff --git a/rbutil/rbutilqt/test/stubs/stubs-playerbuildinfo.cpp b/rbutil/rbutilqt/test/stubs/stubs-playerbuildinfo.cpp
new file mode 100644
index 0000000000..8856645e89
--- /dev/null
+++ b/rbutil/rbutilqt/test/stubs/stubs-playerbuildinfo.cpp
@@ -0,0 +1,36 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ *
+ * Copyright (C) 2020 Dominik Riebeling
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+// Stubs for PlayerBuildInfo unit test.
+
+#include "rbsettings.h"
+
+static QMap<RbSettings::UserSettings, QVariant> stubUserSettings;
+
+void RbSettings::setValue(UserSettings setting, QVariant value)
+{
+ stubUserSettings[setting] = value;
+}
+
+QVariant RbSettings::value(UserSettings setting)
+{
+ return stubUserSettings[setting];
+}
+
diff --git a/rbutil/rbutilqt/test/stubs/stubs-serverinfo.cpp b/rbutil/rbutilqt/test/stubs/stubs-serverinfo.cpp
deleted file mode 100644
index f0fcaf6613..0000000000
--- a/rbutil/rbutilqt/test/stubs/stubs-serverinfo.cpp
+++ /dev/null
@@ -1,105 +0,0 @@
-/***************************************************************************
- * __________ __ ___.
- * Open \______ \ ____ ____ | | _\_ |__ _______ ___
- * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
- * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
- * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
- * \/ \/ \/ \/ \/
- *
- * Copyright (C) 2020 Dominik Riebeling
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ****************************************************************************/
-
-// Stubs for ServerInfo unit test.
-
-#include "rbsettings.h"
-#include "systeminfo.h"
-
-QVariant SystemInfo::platformValue(SystemInfo::PlatformInfo info, QString platform)
-{
- switch(info) {
- case SystemInfo::Manual:
- if (platform == "iriverh120") return "iriverh100";
- if (platform == "ipodmini2g") return "ipodmini1g";
- break;
- case SystemInfo::BuildserverModel:
- return platform.split('.').at(0);
- default:
- return QString();
- }
- return QString();
-}
-
-QVariant SystemInfo::value(SystemInfo::SystemInfos info, SystemInfo::BuildType type)
-{
- (void)info; // test is currently only using BuildUrl.
- switch(type) {
- case SystemInfo::BuildCurrent:
- return QString("https://unittest/dev/rockbox-%MODEL%.zip");
- case SystemInfo::BuildDaily:
- return QString("https://unittest/daily/rockbox-%MODEL%-%RELVERSION%.zip");
- case SystemInfo::BuildRelease:
- return QString("https://unittest/release/%RELVERSION%/rockbox-%MODEL%-%RELVERSION%.zip");
- case SystemInfo::BuildCandidate:
- return QString("https://unittest/rc/%RELVERSION%/rockbox-%MODEL%-%RELVERSION%.zip");
- default:
- break;
- }
- return QString();
-}
-
-QStringList SystemInfo::platforms(SystemInfo::PlatformType type, QString variant)
-{
- // stub implementation: we have a fixed list of players, and only iaudiox5
- // has variant iaudiox5.v
- QStringList result;
- result << "iriverh100" << "iriverh120" << "iriverh300"
- << "ipodmini2g" << "archosrecorder" << "archosfmrecorder"
- << "gigabeatfx" << "iaudiom3" << "sansae200" << "iriverh10";
- switch (type)
- {
- case SystemInfo::PlatformBaseDisabled:
- // return base platforms only, i.e. return iaudiox5 for iaudiox5.v
- result << "iaudiox5";
- break;
- case SystemInfo::PlatformVariantDisabled:
- // return variants for the passed variant
- if (variant == "iaudiox5") {
- result.clear();
- result << "iaudiox5" << "iaudiox5.v";
- }
- else {
- result.clear();
- result << variant;
- }
- break;
- case SystemInfo::PlatformAllDisabled:
- // return all, both with and without variant.
- result << "iaudiox5" << "iaudiox5.v";
- break;
- default:
- break;
- }
- return result;
-}
-
-
-QVariant RbSettings::value(UserSettings setting)
-{
- switch (setting)
- {
- case RbSettings::CurrentPlatform:
- return QString("ipodmini2g");
- default:
- return QString("");
- }
-}
-
diff --git a/rbutil/rbutilqt/test/test-playerbuildinfo.cpp b/rbutil/rbutilqt/test/test-playerbuildinfo.cpp
new file mode 100644
index 0000000000..fe07ba8348
--- /dev/null
+++ b/rbutil/rbutilqt/test/test-playerbuildinfo.cpp
@@ -0,0 +1,237 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ *
+ * Copyright (C) 2020 Dominik Riebeling
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+#include <QtTest>
+#include <QObject>
+#include "playerbuildinfo.h"
+#include "rbsettings.h"
+
+class TestPlayerBuildInfo : public QObject
+{
+ Q_OBJECT
+
+ private slots:
+ void testBuildInfo();
+ void testBuildInfo_data();
+ void testPlayerInfo();
+ void testPlayerInfo_data();
+};
+
+const char* testinfo =
+ "[release]\n"
+ "build_url=https://buildurl/release/%VERSION%/rockbox-%TARGET%-%VERSION%.zip\n"
+ "voice_url=https://buildurl/release/%VERSION%/voice-%TARGET%-%VERSION%.zip\n"
+ "manual_url=https://buildurl/release/%VERSION%/manual-%TARGET%-%VERSION%.zip\n"
+ "source_url=https://buildurl/release/%VERSION%/rockbox-%TARGET%-src-%VERSION%.zip\n"
+ "font_url=https://buildurl/release/%VERSION%/fonts-%VERSION%.zip\n"
+ "archosfmrecorder=3.11.2\n"
+ "iaudiom3=3.11.2,http://dl.rockbox.org/release/3.11.2/rockbox-iaudiom5-3.11.2.zip\n"
+ "sansae200 = 3.15\n"
+ "iriverh100 = 3.11.2, http://dl.rockbox.org/release/3.11.2/rockbox-iriverh100-3.11.2.zip\n"
+ "iriverh120 = 3.3\n"
+ "iriverh300 = \n"
+ "[release-candidate]\n"
+ "build_url=https://buildurl/rc/%VERSION%/rockbox-%TARGET%-%VERSION%.zip\n"
+ "gigabeatfx=f9dce96,http://dl.rockbox.org/rc/f9dce96/rockbox-gigabeatfx.zip\n"
+ "archosfmrecorder=f9dce96\n"
+ "archosrecorder = f9dce96\n"
+ "iaudiox5=f9dce96,http://dl.rockbox.org/rc/f9dce96/rockbox-iaudiox5.zip\n"
+ "[development]\n"
+ "build_url=https://buildurl/dev/rockbox-%TARGET%.zip\n"
+ "iriverh100 = be1be79\n"
+ "iaudiox5 = be1be76\n"
+ "[dailies]\n"
+ "timestamp = 20201113\n"
+ "rev = 362f7a3\n"
+ "[daily]\n"
+ "build_url=https://buildurl/daily/rockbox-%TARGET%-%VERSION%.zip\n"
+ "iriverh100 = f9dce00\n"
+ "[bleeding]\n"
+ "timestamp = 20201114T105723Z\n"
+ "rev = be1be79\n"
+ "[status]\n"
+ "archosfmrecorder=3\n"
+ "iriverh100=2\n"
+ "iriverh300=1\n"
+ "iriverh10=0\n"
+ "[voices]\n"
+ "3.15=english,francais\n"
+ "3.11.2=english\n"
+ "daily=deutsch,english,francais\n"
+ ;
+
+Q_DECLARE_METATYPE(PlayerBuildInfo::BuildInfo);
+Q_DECLARE_METATYPE(PlayerBuildInfo::BuildType);
+Q_DECLARE_METATYPE(PlayerBuildInfo::DeviceInfo);
+
+struct {
+ QString target;
+ PlayerBuildInfo::BuildInfo item;
+ PlayerBuildInfo::BuildType type;
+ QString expected;
+} testdataBuild[] =
+{
+ // release builds
+ { "iriverh100", PlayerBuildInfo::BuildVoiceLangs, PlayerBuildInfo::TypeRelease, "english" },
+ { "iriverh300", PlayerBuildInfo::BuildVersion, PlayerBuildInfo::TypeRelease, "" },
+ { "iriverh300", PlayerBuildInfo::BuildUrl, PlayerBuildInfo::TypeRelease, "" },
+ { "iriverh10", PlayerBuildInfo::BuildVersion, PlayerBuildInfo::TypeRelease, "" },
+ { "iriverh10", PlayerBuildInfo::BuildUrl, PlayerBuildInfo::TypeRelease, "" },
+ { "archosfmrecorder", PlayerBuildInfo::BuildVersion, PlayerBuildInfo::TypeRelease, "3.11.2" },
+ { "iaudiom3", PlayerBuildInfo::BuildVersion, PlayerBuildInfo::TypeRelease, "3.11.2" },
+ { "iaudiom3", PlayerBuildInfo::BuildUrl, PlayerBuildInfo::TypeRelease, "http://dl.rockbox.org/release/3.11.2/rockbox-iaudiom5-3.11.2.zip" },
+ { "sansae200", PlayerBuildInfo::BuildVersion, PlayerBuildInfo::TypeRelease, "3.15" },
+ { "sansae200", PlayerBuildInfo::BuildUrl, PlayerBuildInfo::TypeRelease, "https://buildurl/release/3.15/rockbox-sansae200-3.15.zip" },
+ { "iriverh100", PlayerBuildInfo::BuildVersion, PlayerBuildInfo::TypeRelease, "3.11.2" },
+ { "iriverh100", PlayerBuildInfo::BuildUrl, PlayerBuildInfo::TypeRelease, "http://dl.rockbox.org/release/3.11.2/rockbox-iriverh100-3.11.2.zip" },
+ { "iriverh100", PlayerBuildInfo::BuildVoiceUrl, PlayerBuildInfo::TypeRelease, "https://buildurl/release/3.11.2/voice-iriverh100-3.11.2.zip" },
+ { "iriverh100", PlayerBuildInfo::BuildManualUrl, PlayerBuildInfo::TypeRelease, "https://buildurl/release/3.11.2/manual-iriverh100-3.11.2.zip" },
+ { "iriverh100", PlayerBuildInfo::BuildSourceUrl, PlayerBuildInfo::TypeRelease, "https://buildurl/release/3.11.2/rockbox-iriverh100-src-3.11.2.zip" },
+ // h120 uses the same manual as h100.
+ { "iriverh120", PlayerBuildInfo::BuildManualUrl, PlayerBuildInfo::TypeRelease, "https://buildurl/release/3.3/manual-iriverh100-3.3.zip" },
+ { "iriverh100", PlayerBuildInfo::BuildFontUrl, PlayerBuildInfo::TypeRelease, "https://buildurl/release/3.11.2/fonts-3.11.2.zip" },
+
+ // rc builds
+ { "gigabeatfx", PlayerBuildInfo::BuildVersion, PlayerBuildInfo::TypeCandidate, "f9dce96" },
+ { "gigabeatfx", PlayerBuildInfo::BuildUrl, PlayerBuildInfo::TypeCandidate, "http://dl.rockbox.org/rc/f9dce96/rockbox-gigabeatfx.zip" },
+ { "archosfmrecorder", PlayerBuildInfo::BuildVersion, PlayerBuildInfo::TypeCandidate, "f9dce96" },
+ { "archosfmrecorder", PlayerBuildInfo::BuildUrl, PlayerBuildInfo::TypeCandidate, "https://buildurl/rc/f9dce96/rockbox-archosfmrecorder-f9dce96.zip" },
+ { "archosrecorder", PlayerBuildInfo::BuildVersion, PlayerBuildInfo::TypeCandidate, "f9dce96" },
+ { "archosrecorder", PlayerBuildInfo::BuildUrl, PlayerBuildInfo::TypeCandidate, "https://buildurl/rc/f9dce96/rockbox-archosrecorder-f9dce96.zip" },
+ { "iaudiox5", PlayerBuildInfo::BuildVersion, PlayerBuildInfo::TypeCandidate, "f9dce96" },
+ { "iaudiox5", PlayerBuildInfo::BuildUrl, PlayerBuildInfo::TypeCandidate, "http://dl.rockbox.org/rc/f9dce96/rockbox-iaudiox5.zip" },
+ { "iaudiox5.v", PlayerBuildInfo::BuildVersion, PlayerBuildInfo::TypeCandidate, "f9dce96" },
+ { "iaudiox5.v", PlayerBuildInfo::BuildUrl, PlayerBuildInfo::TypeCandidate, "http://dl.rockbox.org/rc/f9dce96/rockbox-iaudiox5.zip" },
+
+ // devel builds
+ { "iriverh100", PlayerBuildInfo::BuildUrl, PlayerBuildInfo::TypeDevel, "https://buildurl/dev/rockbox-iriverh100.zip" },
+ { "iaudiox5.v", PlayerBuildInfo::BuildVersion, PlayerBuildInfo::TypeDevel, "be1be76" },
+ { "iaudiox5.v", PlayerBuildInfo::BuildUrl, PlayerBuildInfo::TypeDevel, "https://buildurl/dev/rockbox-iaudiox5.zip" },
+
+ // daily builds
+ { "iriverh100", PlayerBuildInfo::BuildVoiceLangs, PlayerBuildInfo::TypeDaily, "deutsch,english,francais" },
+ { "iriverh100", PlayerBuildInfo::BuildVersion, PlayerBuildInfo::TypeDaily, "f9dce00" },
+ { "iriverh100", PlayerBuildInfo::BuildUrl, PlayerBuildInfo::TypeDaily, "https://buildurl/daily/rockbox-iriverh100-f9dce00.zip" },
+};
+
+struct {
+ QString target;
+ PlayerBuildInfo::DeviceInfo item;
+ QString expected;
+} testdataPlayer[] =
+{
+ {"archosfmrecorder", PlayerBuildInfo::BuildStatus, "3"},
+ { "iriverh10", PlayerBuildInfo::BuildStatus, "0" },
+ { "iriverh100", PlayerBuildInfo::BuildStatus, "2" },
+ { "iriverh300", PlayerBuildInfo::BuildStatus, "1" },
+ { "archosfmrecorder", PlayerBuildInfo::BuildStatus, "3" },
+ {"archosfmrecorder", PlayerBuildInfo::DisplayName, "Jukebox Recorder FM"},
+ {"archosfmrecorder", PlayerBuildInfo::BootloaderMethod, "none"},
+ {"archosfmrecorder", PlayerBuildInfo::BootloaderName, ""},
+ {"archosfmrecorder", PlayerBuildInfo::BootloaderFile, ""},
+ {"archosfmrecorder", PlayerBuildInfo::BootloaderFilter, ""},
+ {"archosfmrecorder", PlayerBuildInfo::Encoder, "lame"},
+ {"archosfmrecorder", PlayerBuildInfo::Brand, "Archos"},
+ {"archosfmrecorder", PlayerBuildInfo::PlayerPicture, "archosfmrecorder"},
+ {"iriverh100", PlayerBuildInfo::BuildStatus, "2"},
+ {"iriverh100", PlayerBuildInfo::BootloaderMethod, "hex"},
+ {"iriverh100", PlayerBuildInfo::BootloaderFilter, "*.hex *.zip"},
+ {"ipodmini2g", PlayerBuildInfo::Encoder, "rbspeex"},
+};
+
+void TestPlayerBuildInfo::testBuildInfo_data()
+{
+ QTest::addColumn<QString>("target");
+ QTest::addColumn<PlayerBuildInfo::BuildInfo>("item");
+ QTest::addColumn<PlayerBuildInfo::BuildType>("type");
+ QTest::addColumn<QString>("expected");
+ for (size_t i = 0; i < sizeof(testdataBuild) / sizeof(testdataBuild[0]); i++)
+ QTest::newRow("") << testdataBuild[i].target << testdataBuild[i].item
+ << testdataBuild[i].type << testdataBuild[i].expected;
+}
+
+
+void TestPlayerBuildInfo::testBuildInfo()
+{
+ // create a temporary file for test input. Do not use QSettings() to allow
+ // creating different format variations.
+ QTemporaryFile tf(this);
+ tf.open();
+ QString filename = tf.fileName();
+ tf.write(testinfo);
+ tf.close();
+
+ PlayerBuildInfo::instance()->setBuildInfo(filename);
+
+ QFETCH(QString, target);
+ QFETCH(PlayerBuildInfo::BuildInfo, item);
+ QFETCH(PlayerBuildInfo::BuildType, type);
+ QFETCH(QString, expected);
+
+ RbSettings::setValue(RbSettings::CurrentPlatform, target);
+ QVariant result = PlayerBuildInfo::instance()->value(item, type);
+ if(result.canConvert(QMetaType::QString))
+ QCOMPARE(result.toString(), QString(expected));
+ else
+ QCOMPARE(result.toStringList().join(","), QString(expected));
+}
+
+
+// NOTE: These tests rely on rbutil.ini
+void TestPlayerBuildInfo::testPlayerInfo_data()
+{
+ QTest::addColumn<QString>("target");
+ QTest::addColumn<PlayerBuildInfo::DeviceInfo>("item");
+ QTest::addColumn<QString>("expected");
+ for (size_t i = 0; i < sizeof(testdataPlayer) / sizeof(testdataPlayer[0]); i++)
+ QTest::newRow("") << testdataPlayer[i].target << testdataPlayer[i].item
+ << testdataPlayer[i].expected;
+}
+
+void TestPlayerBuildInfo::testPlayerInfo()
+{
+ // create a temporary file for test input. Do not use QSettings() to allow
+ // creating different format variations.
+ QTemporaryFile tf(this);
+ tf.open();
+ QString filename = tf.fileName();
+ tf.write(testinfo);
+ tf.close();
+
+ PlayerBuildInfo::instance()->setBuildInfo(filename);
+
+ QFETCH(QString, target);
+ QFETCH(PlayerBuildInfo::DeviceInfo, item);
+ QFETCH(QString, expected);
+
+ QVariant result = PlayerBuildInfo::instance()->value(item, target);
+ if(result.canConvert(QMetaType::QString))
+ QCOMPARE(result.toString(), QString(expected));
+ else
+ QCOMPARE(result.toStringList().join(","), QString(expected));
+}
+
+
+QTEST_MAIN(TestPlayerBuildInfo)
+
+// this include is needed because we don't use a separate header file for the
+// test class. It also needs to be at the end.
+#include "test-playerbuildinfo.moc"
+
diff --git a/rbutil/rbutilqt/test/test-serverinfo.pro b/rbutil/rbutilqt/test/test-playerbuildinfo.pro
index 903d5a6b07..724da59162 100644
--- a/rbutil/rbutilqt/test/test-serverinfo.pro
+++ b/rbutil/rbutilqt/test/test-playerbuildinfo.pro
@@ -18,19 +18,18 @@
QT += testlib
TEMPLATE = app
-TARGET = test-serverinfo
+TARGET = test-playerbuildinfo
INCLUDEPATH += . ../base stubs
# Input
SOURCES += \
- test-serverinfo.cpp \
- stubs/stubs-serverinfo.cpp \
- ../base/serverinfo.cpp
+ test-playerbuildinfo.cpp \
+ stubs/stubs-playerbuildinfo.cpp \
+ ../base/playerbuildinfo.cpp
HEADERS += \
../base/rbsettings.h \
../base/rockboxinfo.h \
../base/systeminfo.h \
- ../base/serverinfo.h \
RESOURCES += ../rbutilqt.qrc
diff --git a/rbutil/rbutilqt/test/test-serverinfo.cpp b/rbutil/rbutilqt/test/test-serverinfo.cpp
deleted file mode 100644
index b999624c78..0000000000
--- a/rbutil/rbutilqt/test/test-serverinfo.cpp
+++ /dev/null
@@ -1,124 +0,0 @@
-/***************************************************************************
- * __________ __ ___.
- * Open \______ \ ____ ____ | | _\_ |__ _______ ___
- * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
- * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
- * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
- * \/ \/ \/ \/ \/
- *
- * Copyright (C) 2012 Dominik Riebeling
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- ****************************************************************************/
-
-#include <QtTest/QtTest>
-#include <QObject>
-#include "serverinfo.h"
-
-class TestServerInfo : public QObject
-{
- Q_OBJECT
- private slots:
- void testMain();
-};
-
-const char* testinfo =
- "[release]\n"
- "archosfmrecorder=3.11.2\n"
- "iaudiom3=3.11.2,http://dl.rockbox.org/release/3.11.2/rockbox-iaudiom5-3.11.2.zip\n"
- "sansae200 = 3.11.2\n"
- "iriverh100 = 3.11.2, http://dl.rockbox.org/release/3.11.2/rockbox-iriverh100-3.11.2.zip\n"
- "iriverh300 = \n"
- "[release-candidate]\n"
- "gigabeatfx=f9dce96,http://dl.rockbox.org/rc/f9dce96/rockbox-gigabeatfx.zip\n"
- "archosfmrecorder=f9dce96\n"
- "archosrecorder = f9dce96\n"
- "iaudiox5=f9dce96,http://dl.rockbox.org/rc/f9dce96/rockbox-iaudiox5.zip\n"
- "[dailies]\n"
- "timestamp = 20201113\n"
- "rev = 362f7a3\n"
- "[bleeding]\n"
- "timestamp = 20201114T105723Z\n"
- "rev = be1be79\n"
- "[status]\n"
- "archosfmrecorder=3\n"
- "iriverh100=2\n"
- "iriverh300=1\n"
- "iriverh10=0\n"
- ;
-
-
-struct testvector {
- const char* target;
- ServerInfo::ServerInfos entry;
- const char* expected;
-};
-
-
-const struct testvector testdata[] =
-{
- { "archosfmrecorder", ServerInfo::CurReleaseVersion, "3.11.2" },
- { "archosfmrecorder", ServerInfo::CurStatus, "3" },
- { "iaudiom3", ServerInfo::CurReleaseVersion, "3.11.2" },
- { "iaudiom3", ServerInfo::CurReleaseUrl, "http://dl.rockbox.org/release/3.11.2/rockbox-iaudiom5-3.11.2.zip" },
- { "sansae200", ServerInfo::CurReleaseVersion, "3.11.2" },
- { "sansae200", ServerInfo::CurReleaseUrl, "https://unittest/release/3.11.2/rockbox-sansae200-3.11.2.zip" },
- { "iriverh100", ServerInfo::CurReleaseVersion, "3.11.2" },
- { "iriverh100", ServerInfo::CurReleaseUrl, "http://dl.rockbox.org/release/3.11.2/rockbox-iriverh100-3.11.2.zip" },
- { "iriverh100", ServerInfo::CurStatus, "2" },
- { "iriverh100", ServerInfo::CurDevelUrl, "https://unittest/dev/rockbox-iriverh100.zip" },
- { "iriverh300", ServerInfo::CurReleaseVersion, "" },
- { "iriverh300", ServerInfo::CurReleaseUrl, "" },
- { "iriverh300", ServerInfo::CurStatus, "1" },
- { "iriverh10", ServerInfo::CurReleaseVersion, "" },
- { "iriverh10", ServerInfo::CurReleaseUrl, "" },
- { "iriverh10", ServerInfo::CurStatus, "0" },
- { "gigabeatfx", ServerInfo::RelCandidateVersion, "f9dce96" },
- { "gigabeatfx", ServerInfo::RelCandidateUrl, "http://dl.rockbox.org/rc/f9dce96/rockbox-gigabeatfx.zip" },
- { "archosfmrecorder", ServerInfo::RelCandidateVersion, "f9dce96" },
- { "archosfmrecorder", ServerInfo::RelCandidateUrl, "https://unittest/rc/f9dce96/rockbox-archosfmrecorder-f9dce96.zip" },
- { "archosrecorder", ServerInfo::RelCandidateVersion, "f9dce96" },
- { "archosrecorder", ServerInfo::RelCandidateUrl, "https://unittest/rc/f9dce96/rockbox-archosrecorder-f9dce96.zip" },
- { "iaudiox5", ServerInfo::RelCandidateVersion, "f9dce96" },
- { "iaudiox5", ServerInfo::RelCandidateUrl, "http://dl.rockbox.org/rc/f9dce96/rockbox-iaudiox5.zip" },
- { "iaudiox5.v", ServerInfo::RelCandidateVersion, "f9dce96" },
- { "iaudiox5.v", ServerInfo::RelCandidateUrl, "http://dl.rockbox.org/rc/f9dce96/rockbox-iaudiox5.zip" },
- { "iaudiox5.v", ServerInfo::BleedingRevision, "be1be79" },
- { "iaudiox5.v", ServerInfo::BleedingDate, "2020-11-14T10:57:23" },
- { "iaudiox5.v", ServerInfo::CurDevelUrl, "https://unittest/dev/rockbox-iaudiox5.zip" },
-};
-
-
-void TestServerInfo::testMain()
-{
- // create a temporary file for test input. Do not use QSettings() to allow
- // creating different format variations.
- QTemporaryFile tf(this);
- tf.open();
- QString filename = tf.fileName();
- tf.write(testinfo);
- tf.close();
-
- ServerInfo::instance()->readBuildInfo(filename);
-
- unsigned int i;
- for(i = 0; i < sizeof(testdata) / sizeof(struct testvector); i++) {
- QString result = ServerInfo::instance()->platformValue(testdata[i].entry, testdata[i].target).toString();
- QCOMPARE(result, QString(testdata[i].expected));
- }
-}
-
-
-QTEST_MAIN(TestServerInfo)
-
-// this include is needed because we don't use a separate header file for the
-// test class. It also needs to be at the end.
-#include "test-serverinfo.moc"
-
diff --git a/rbutil/rbutilqt/themesinstallwindow.cpp b/rbutil/rbutilqt/themesinstallwindow.cpp
index e87d530c8c..daa910d6bf 100644
--- a/rbutil/rbutilqt/themesinstallwindow.cpp
+++ b/rbutil/rbutilqt/themesinstallwindow.cpp
@@ -26,7 +26,7 @@
#include "progressloggergui.h"
#include "utils.h"
#include "rbsettings.h"
-#include "systeminfo.h"
+#include "playerbuildinfo.h"
#include "rockboxinfo.h"
#include "version.h"
#include "Logger.h"
@@ -84,7 +84,7 @@ void ThemesInstallWindow::downloadInfo()
LOG_INFO() << "downloading info to" << themesInfo.fileName();
themesInfo.close();
- QString infoUrl = SystemInfo::value(SystemInfo::ThemesInfoUrl).toString();
+ QString infoUrl = PlayerBuildInfo::instance()->value(PlayerBuildInfo::ThemesInfoUrl).toString();
infoUrl.replace("%TARGET%",
RbSettings::value(RbSettings::CurrentPlatform).toString().split(".").at(0));
infoUrl.replace("%REVISION%", installInfo.revision());
@@ -218,9 +218,9 @@ void ThemesInstallWindow::updateDetails(QListWidgetItem* cur, QListWidgetItem* p
iniDetails.beginGroup(cur->data(Qt::UserRole).toString());
QUrl img, txt;
- txt = QUrl(QString(SystemInfo::value(SystemInfo::ThemesUrl).toString() + "/"
+ txt = QUrl(QString(PlayerBuildInfo::instance()->value(PlayerBuildInfo::ThemesUrl).toString() + "/"
+ iniDetails.value("descriptionfile").toString()));
- img = QUrl(QString(SystemInfo::value(SystemInfo::ThemesUrl).toString() + "/"
+ img = QUrl(QString(PlayerBuildInfo::instance()->value(PlayerBuildInfo::ThemesUrl).toString() + "/"
+ iniDetails.value("image").toString()));
QString text;
@@ -334,7 +334,7 @@ void ThemesInstallWindow::install()
QSettings iniDetails(themesInfo.fileName(), QSettings::IniFormat, this);
for(int i = 0; i < ui.listThemes->selectedItems().size(); i++) {
iniDetails.beginGroup(ui.listThemes->selectedItems().at(i)->data(Qt::UserRole).toString());
- zip = SystemInfo::value(SystemInfo::ThemesUrl).toString()
+ zip = PlayerBuildInfo::instance()->value(PlayerBuildInfo::ThemesUrl).toString()
+ "/" + iniDetails.value("archive").toString();
themes.append(zip);
names.append("Theme: " +