diff options
author | Aidan MacDonald <amachronic@protonmail.com> | 2021-12-29 00:26:47 +0000 |
---|---|---|
committer | Aidan MacDonald <amachronic@protonmail.com> | 2022-01-02 15:50:17 -0500 |
commit | cbb57fe714b633cd5b91850eae9cfd326dee2eeb (patch) | |
tree | 57fce120fed1c96313842f63b770dbee9fa55333 | |
parent | 42999913ba3a76221fceb04b1f935ed4e0e71476 (diff) | |
download | rockbox-cbb57fe714b633cd5b91850eae9cfd326dee2eeb.tar.gz rockbox-cbb57fe714b633cd5b91850eae9cfd326dee2eeb.zip |
rbutil: allow checking bootloader installer capabilities
Instead of checking for certain hardcoded strings, fetch
the actual capability bitmask by instantiating an installer
and querying it.
Change-Id: I7883d9c1e90da37ee7c0189732ac626685adbfa1
-rw-r--r-- | utils/rbutilqt/base/bootloaderinstallbase.h | 2 | ||||
-rw-r--r-- | utils/rbutilqt/base/bootloaderinstallhelper.cpp | 20 | ||||
-rw-r--r-- | utils/rbutilqt/base/bootloaderinstallhelper.h | 1 | ||||
-rw-r--r-- | utils/rbutilqt/base/bootloaderinstallipod.cpp | 11 | ||||
-rw-r--r-- | utils/rbutilqt/base/bootloaderinstallsansa.cpp | 10 | ||||
-rw-r--r-- | utils/rbutilqt/rbutilqt.cpp | 22 |
6 files changed, 44 insertions, 22 deletions
diff --git a/utils/rbutilqt/base/bootloaderinstallbase.h b/utils/rbutilqt/base/bootloaderinstallbase.h index 9a216a632c..0d9423a06f 100644 --- a/utils/rbutilqt/base/bootloaderinstallbase.h +++ b/utils/rbutilqt/base/bootloaderinstallbase.h | |||
@@ -67,8 +67,6 @@ class BootloaderInstallBase : public QObject | |||
67 | // be modified for new targets | 67 | // be modified for new targets |
68 | static QString postinstallHints(QString model); | 68 | static QString postinstallHints(QString model); |
69 | 69 | ||
70 | //! returns the correct BootloaderInstaller object for the requested type | ||
71 | static BootloaderInstallBase* createBootloaderInstaller(QObject* parent,QString type); | ||
72 | protected slots: | 70 | protected slots: |
73 | void downloadReqFinished(int id, bool error); | 71 | void downloadReqFinished(int id, bool error); |
74 | void downloadBlFinish(bool error); | 72 | void downloadBlFinish(bool error); |
diff --git a/utils/rbutilqt/base/bootloaderinstallhelper.cpp b/utils/rbutilqt/base/bootloaderinstallhelper.cpp index c94ed29140..4a1b24883b 100644 --- a/utils/rbutilqt/base/bootloaderinstallhelper.cpp +++ b/utils/rbutilqt/base/bootloaderinstallhelper.cpp | |||
@@ -77,6 +77,26 @@ BootloaderInstallBase* BootloaderInstallHelper::createBootloaderInstaller(QObjec | |||
77 | } | 77 | } |
78 | } | 78 | } |
79 | 79 | ||
80 | BootloaderInstallBase::Capabilities | ||
81 | BootloaderInstallHelper::bootloaderInstallerCapabilities(QObject *parent, QString type) | ||
82 | { | ||
83 | /* Note - this is a terrible pattern in general, but in this case | ||
84 | * it is a much simpler option to just allocate a class instance. | ||
85 | * This operation is rarely used, anyway. */ | ||
86 | |||
87 | BootloaderInstallBase* bootloaderInstaller = | ||
88 | createBootloaderInstaller(parent, type); | ||
89 | |||
90 | BootloaderInstallBase::Capabilities caps = BootloaderInstallBase::Capabilities(); | ||
91 | |||
92 | if(bootloaderInstaller) { | ||
93 | caps = bootloaderInstaller->capabilities(); | ||
94 | delete bootloaderInstaller; | ||
95 | } | ||
96 | |||
97 | return caps; | ||
98 | } | ||
99 | |||
80 | 100 | ||
81 | //! @brief Return post install hints string. | 101 | //! @brief Return post install hints string. |
82 | //! @param model model string | 102 | //! @param model model string |
diff --git a/utils/rbutilqt/base/bootloaderinstallhelper.h b/utils/rbutilqt/base/bootloaderinstallhelper.h index c89444d7a7..9b6fed0866 100644 --- a/utils/rbutilqt/base/bootloaderinstallhelper.h +++ b/utils/rbutilqt/base/bootloaderinstallhelper.h | |||
@@ -29,6 +29,7 @@ class BootloaderInstallHelper : public QObject | |||
29 | Q_OBJECT | 29 | Q_OBJECT |
30 | public: | 30 | public: |
31 | static BootloaderInstallBase* createBootloaderInstaller(QObject* parent, QString type); | 31 | static BootloaderInstallBase* createBootloaderInstaller(QObject* parent, QString type); |
32 | static BootloaderInstallBase::Capabilities bootloaderInstallerCapabilities(QObject *parent, QString type); | ||
32 | static QString postinstallHints(QString model); | 33 | static QString postinstallHints(QString model); |
33 | }; | 34 | }; |
34 | 35 | ||
diff --git a/utils/rbutilqt/base/bootloaderinstallipod.cpp b/utils/rbutilqt/base/bootloaderinstallipod.cpp index f94813f99f..d08cc22339 100644 --- a/utils/rbutilqt/base/bootloaderinstallipod.cpp +++ b/utils/rbutilqt/base/bootloaderinstallipod.cpp | |||
@@ -28,10 +28,6 @@ | |||
28 | BootloaderInstallIpod::BootloaderInstallIpod(QObject *parent) | 28 | BootloaderInstallIpod::BootloaderInstallIpod(QObject *parent) |
29 | : BootloaderInstallBase(parent) | 29 | : BootloaderInstallBase(parent) |
30 | { | 30 | { |
31 | (void)parent; | ||
32 | // initialize sector buffer. The sector buffer is part of the ipod_t | ||
33 | // structure, so a second instance of this class will have its own buffer. | ||
34 | ipod_alloc_buffer(&ipod, BUFFER_SIZE); | ||
35 | } | 31 | } |
36 | 32 | ||
37 | 33 | ||
@@ -45,11 +41,18 @@ BootloaderInstallIpod::~BootloaderInstallIpod() | |||
45 | 41 | ||
46 | bool BootloaderInstallIpod::install(void) | 42 | bool BootloaderInstallIpod::install(void) |
47 | { | 43 | { |
44 | // initialize sector buffer. The sector buffer is part of the ipod_t | ||
45 | // structure, so a second instance of this class will have its own buffer. | ||
46 | if(ipod.sectorbuf == nullptr) { | ||
47 | ipod_alloc_buffer(&ipod, BUFFER_SIZE); | ||
48 | } | ||
49 | |||
48 | if(ipod.sectorbuf == nullptr) { | 50 | if(ipod.sectorbuf == nullptr) { |
49 | emit logItem(tr("Error: can't allocate buffer memory!"), LOGERROR); | 51 | emit logItem(tr("Error: can't allocate buffer memory!"), LOGERROR); |
50 | emit done(true); | 52 | emit done(true); |
51 | return false; | 53 | return false; |
52 | } | 54 | } |
55 | |||
53 | // save buffer pointer before cleaning up ipod_t structure | 56 | // save buffer pointer before cleaning up ipod_t structure |
54 | unsigned char* sb = ipod.sectorbuf; | 57 | unsigned char* sb = ipod.sectorbuf; |
55 | memset(&ipod, 0, sizeof(struct ipod_t)); | 58 | memset(&ipod, 0, sizeof(struct ipod_t)); |
diff --git a/utils/rbutilqt/base/bootloaderinstallsansa.cpp b/utils/rbutilqt/base/bootloaderinstallsansa.cpp index d4a2799f73..568bb82afa 100644 --- a/utils/rbutilqt/base/bootloaderinstallsansa.cpp +++ b/utils/rbutilqt/base/bootloaderinstallsansa.cpp | |||
@@ -27,10 +27,6 @@ | |||
27 | BootloaderInstallSansa::BootloaderInstallSansa(QObject *parent) | 27 | BootloaderInstallSansa::BootloaderInstallSansa(QObject *parent) |
28 | : BootloaderInstallBase(parent) | 28 | : BootloaderInstallBase(parent) |
29 | { | 29 | { |
30 | (void)parent; | ||
31 | // initialize sector buffer. The sector buffer is part of the sansa_t | ||
32 | // structure, so a second instance of this class will have its own buffer. | ||
33 | sansa_alloc_buffer(&sansa, BUFFER_SIZE); | ||
34 | } | 30 | } |
35 | 31 | ||
36 | 32 | ||
@@ -46,6 +42,12 @@ BootloaderInstallSansa::~BootloaderInstallSansa() | |||
46 | */ | 42 | */ |
47 | bool BootloaderInstallSansa::install(void) | 43 | bool BootloaderInstallSansa::install(void) |
48 | { | 44 | { |
45 | // initialize sector buffer. The sector buffer is part of the sansa_t | ||
46 | // structure, so a second instance of this class will have its own buffer. | ||
47 | if(sansa.sectorbuf == nullptr) { | ||
48 | sansa_alloc_buffer(&sansa, BUFFER_SIZE); | ||
49 | } | ||
50 | |||
49 | if(sansa.sectorbuf == nullptr) { | 51 | if(sansa.sectorbuf == nullptr) { |
50 | emit logItem(tr("Error: can't allocate buffer memory!"), LOGERROR); | 52 | emit logItem(tr("Error: can't allocate buffer memory!"), LOGERROR); |
51 | return false; | 53 | return false; |
diff --git a/utils/rbutilqt/rbutilqt.cpp b/utils/rbutilqt/rbutilqt.cpp index d0ff9f2799..aa405418be 100644 --- a/utils/rbutilqt/rbutilqt.cpp +++ b/utils/rbutilqt/rbutilqt.cpp | |||
@@ -359,16 +359,14 @@ void RbUtilQt::updateSettings() | |||
359 | 359 | ||
360 | void RbUtilQt::updateDevice() | 360 | void RbUtilQt::updateDevice() |
361 | { | 361 | { |
362 | /* TODO: We should check the flags of the bootloaderinstall classes, and not | 362 | PlayerBuildInfo* playerBuildInfo = PlayerBuildInfo::instance(); |
363 | * just check if its != none or != "fwpatcher" */ | ||
364 | 363 | ||
365 | /* Enable bootloader installation, if possible */ | 364 | BootloaderInstallBase::Capabilities bootloaderCapabilities = |
366 | bool bootloaderInstallable = | 365 | BootloaderInstallHelper::bootloaderInstallerCapabilities(this, |
367 | PlayerBuildInfo::instance()->value(PlayerBuildInfo::BootloaderMethod).toString() != "none"; | 366 | playerBuildInfo->value(PlayerBuildInfo::BootloaderMethod).toString()); |
368 | 367 | ||
369 | /* Enable bootloader uninstallation, if possible */ | 368 | /* Disable uninstallation actions if they are not supported. */ |
370 | bool bootloaderUninstallable = bootloaderInstallable && | 369 | bool bootloaderUninstallable = !(bootloaderCapabilities & BootloaderInstallBase::Uninstall); |
371 | PlayerBuildInfo::instance()->value(PlayerBuildInfo::BootloaderMethod) != "fwpatcher"; | ||
372 | ui.labelRemoveBootloader->setEnabled(bootloaderUninstallable); | 370 | ui.labelRemoveBootloader->setEnabled(bootloaderUninstallable); |
373 | ui.buttonRemoveBootloader->setEnabled(bootloaderUninstallable); | 371 | ui.buttonRemoveBootloader->setEnabled(bootloaderUninstallable); |
374 | ui.actionRemove_bootloader->setEnabled(bootloaderUninstallable); | 372 | ui.actionRemove_bootloader->setEnabled(bootloaderUninstallable); |
@@ -379,11 +377,11 @@ void RbUtilQt::updateDevice() | |||
379 | ui.menuA_ctions->setEnabled(configurationValid); | 377 | ui.menuA_ctions->setEnabled(configurationValid); |
380 | 378 | ||
381 | // displayed device info | 379 | // displayed device info |
382 | QString brand = PlayerBuildInfo::instance()->value(PlayerBuildInfo::Brand).toString(); | 380 | QString brand = playerBuildInfo->value(PlayerBuildInfo::Brand).toString(); |
383 | QString name | 381 | QString name |
384 | = QString("%1 (%2)").arg( | 382 | = QString("%1 (%2)").arg( |
385 | PlayerBuildInfo::instance()->value(PlayerBuildInfo::DisplayName).toString(), | 383 | playerBuildInfo->value(PlayerBuildInfo::DisplayName).toString(), |
386 | PlayerBuildInfo::instance()->statusAsString()); | 384 | playerBuildInfo->statusAsString()); |
387 | ui.labelDevice->setText(QString("<b>%1 %2</b>").arg(brand, name)); | 385 | ui.labelDevice->setText(QString("<b>%1 %2</b>").arg(brand, name)); |
388 | 386 | ||
389 | QString mountpoint = RbSettings::value(RbSettings::Mountpoint).toString(); | 387 | QString mountpoint = RbSettings::value(RbSettings::Mountpoint).toString(); |
@@ -398,7 +396,7 @@ void RbUtilQt::updateDevice() | |||
398 | } | 396 | } |
399 | 397 | ||
400 | QPixmap pm; | 398 | QPixmap pm; |
401 | QString m = PlayerBuildInfo::instance()->value(PlayerBuildInfo::PlayerPicture).toString(); | 399 | QString m = playerBuildInfo->value(PlayerBuildInfo::PlayerPicture).toString(); |
402 | pm.load(":/icons/players/" + m + "-small.png"); | 400 | pm.load(":/icons/players/" + m + "-small.png"); |
403 | pm = pm.scaledToHeight(QFontMetrics(QApplication::font()).height() * 3); | 401 | pm = pm.scaledToHeight(QFontMetrics(QApplication::font()).height() * 3); |
404 | ui.labelPlayerPic->setPixmap(pm); | 402 | ui.labelPlayerPic->setPixmap(pm); |