e4af97300d
Useful for targets that needs multi-stage uninstall. On current targets (with Uninstall capability) the progress is updated to 100% when bootloader uninstall is successfully finished. Change-Id: I61be1c4f5cfc2d2f35fa5005962be9703888447d
159 lines
5.1 KiB
C++
159 lines
5.1 KiB
C++
/***************************************************************************
|
|
* __________ __ ___.
|
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
|
* \/ \/ \/ \/ \/
|
|
*
|
|
* Copyright (C) 2008 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 <QtCore>
|
|
#include <QtDebug>
|
|
#include "bootloaderinstallfile.h"
|
|
#include "utils.h"
|
|
#include "Logger.h"
|
|
|
|
|
|
BootloaderInstallFile::BootloaderInstallFile(QObject *parent)
|
|
: BootloaderInstallBase(parent)
|
|
{
|
|
}
|
|
|
|
|
|
bool BootloaderInstallFile::install(void)
|
|
{
|
|
emit logItem(tr("Downloading bootloader"), LOGINFO);
|
|
LOG_INFO() << "installing bootloader";
|
|
downloadBlStart(m_blurl);
|
|
connect(this, SIGNAL(downloadDone()), this, SLOT(installStage2()));
|
|
return true;
|
|
}
|
|
|
|
void BootloaderInstallFile::installStage2(void)
|
|
{
|
|
emit logItem(tr("Installing Rockbox bootloader"), LOGINFO);
|
|
QCoreApplication::processEvents();
|
|
|
|
// if an old bootloader is present (Gigabeat) move it out of the way.
|
|
QString fwfile(Utils::resolvePathCase(m_blfile));
|
|
if(!fwfile.isEmpty()) {
|
|
QString moved = Utils::resolvePathCase(m_blfile) + ".ORIG";
|
|
LOG_INFO() << "renaming" << fwfile << "to" << moved;
|
|
QFile::rename(fwfile, moved);
|
|
}
|
|
|
|
// if no old file found resolve path without basename
|
|
QFileInfo fi(m_blfile);
|
|
QString absPath = Utils::resolvePathCase(fi.absolutePath());
|
|
|
|
// if it's not possible to locate the base path try to create it
|
|
if(absPath.isEmpty()) {
|
|
QStringList pathElements = m_blfile.split("/");
|
|
// remove filename from list and save last path element
|
|
pathElements.removeLast();
|
|
QString lastElement = pathElements.last();
|
|
// remove last path element for base
|
|
pathElements.removeLast();
|
|
QString basePath = pathElements.join("/");
|
|
|
|
// check for base and bail out if not found. Otherwise create folder.
|
|
absPath = Utils::resolvePathCase(basePath);
|
|
QDir d(absPath);
|
|
d.mkpath(lastElement);
|
|
absPath = Utils::resolvePathCase(fi.absolutePath());
|
|
|
|
if(absPath.isEmpty()) {
|
|
emit logItem(tr("Error accessing output folder"), LOGERROR);
|
|
emit done(true);
|
|
return;
|
|
}
|
|
}
|
|
fwfile = absPath + "/" + fi.fileName();
|
|
|
|
// place (new) bootloader
|
|
m_tempfile.open();
|
|
LOG_INFO() << "renaming" << m_tempfile.fileName()
|
|
<< "to" << fwfile;
|
|
m_tempfile.close();
|
|
|
|
if(!Utils::resolvePathCase(fwfile).isEmpty()) {
|
|
emit logItem(tr("A firmware file is already present on player"), LOGERROR);
|
|
emit done(true);
|
|
return;
|
|
}
|
|
if(m_tempfile.copy(fwfile)) {
|
|
emit logItem(tr("Bootloader successful installed"), LOGOK);
|
|
}
|
|
else {
|
|
emit logItem(tr("Copying modified firmware file failed"), LOGERROR);
|
|
emit done(true);
|
|
return;
|
|
}
|
|
|
|
logInstall(LogAdd);
|
|
|
|
emit done(false);
|
|
}
|
|
|
|
|
|
bool BootloaderInstallFile::uninstall(void)
|
|
{
|
|
LOG_INFO() << "Uninstalling bootloader";
|
|
emit logItem(tr("Removing Rockbox bootloader"), LOGINFO);
|
|
// check if a .ORIG file is present, and allow moving it back.
|
|
QString origbl = Utils::resolvePathCase(m_blfile + ".ORIG");
|
|
if(origbl.isEmpty()) {
|
|
emit logItem(tr("No original firmware file found."), LOGERROR);
|
|
emit done(true);
|
|
return false;
|
|
}
|
|
QString fwfile = Utils::resolvePathCase(m_blfile);
|
|
if(!QFile::remove(fwfile)) {
|
|
emit logItem(tr("Can't remove Rockbox bootloader file."), LOGERROR);
|
|
emit done(true);
|
|
return false;
|
|
}
|
|
if(!QFile::rename(origbl, fwfile)) {
|
|
emit logItem(tr("Can't restore bootloader file."), LOGERROR);
|
|
emit done(true);
|
|
return false;
|
|
}
|
|
emit logItem(tr("Original bootloader restored successfully."), LOGOK);
|
|
logInstall(LogRemove);
|
|
emit logProgress(1, 1);
|
|
emit done(false);
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
//! @brief check if bootloader is installed.
|
|
//! @return BootloaderRockbox, BootloaderOther or BootloaderUnknown.
|
|
BootloaderInstallBase::BootloaderType BootloaderInstallFile::installed(void)
|
|
{
|
|
LOG_INFO() << "checking installed bootloader";
|
|
if(!Utils::resolvePathCase(m_blfile).isEmpty()
|
|
&& !Utils::resolvePathCase(m_blfile + ".ORIG").isEmpty())
|
|
return BootloaderRockbox;
|
|
else if(!Utils::resolvePathCase(m_blfile).isEmpty())
|
|
return BootloaderOther;
|
|
else
|
|
return BootloaderUnknown;
|
|
}
|
|
|
|
|
|
BootloaderInstallBase::Capabilities BootloaderInstallFile::capabilities(void)
|
|
{
|
|
LOG_INFO() << "getting capabilities";
|
|
return Install | Uninstall | IsFile | CanCheckInstalled | Backup;
|
|
}
|
|
|