From 0063d474ded01d670471b5a9ac8cb39365eb4e7e Mon Sep 17 00:00:00 2001 From: domonoky Date: Fri, 27 Jul 2007 22:46:49 +0000 Subject: [PATCH] rbutilQt: first attempt for bootloader installation. Sansa and irivers are still missing. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@14032 a1c6a512-1295-4272-9138-f99709370657 --- rbutil/rbutilqt/installbl.cpp | 124 +++++ rbutil/rbutilqt/{rbutilqt.h => installbl.h} | 56 ++- rbutil/rbutilqt/installbootloader.cpp | 702 ++++++++++++++++++++++++++++ rbutil/rbutilqt/installbootloader.h | 94 ++++ rbutil/rbutilqt/installbootloaderfrm.ui | 108 +++++ rbutil/rbutilqt/rbutilqt.cpp | 18 + rbutil/rbutilqt/rbutilqt.h | 4 +- rbutil/rbutilqt/rbutilqt.pro | 27 +- 8 files changed, 1103 insertions(+), 30 deletions(-) create mode 100644 rbutil/rbutilqt/installbl.cpp copy rbutil/rbutilqt/{rbutilqt.h => installbl.h} (52%) create mode 100644 rbutil/rbutilqt/installbootloader.cpp create mode 100644 rbutil/rbutilqt/installbootloader.h create mode 100644 rbutil/rbutilqt/installbootloaderfrm.ui diff --git a/rbutil/rbutilqt/installbl.cpp b/rbutil/rbutilqt/installbl.cpp new file mode 100644 index 000000000..eae8fc20f --- /dev/null +++ b/rbutil/rbutilqt/installbl.cpp @@ -0,0 +1,124 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * + * Copyright (C) 2007 by Dominik Wenger + * $Id: installbl.cpp 14027 2007-07-27 17:42:49Z domonoky $ + * + * 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 "installbl.h" +#include "ui_installfrm.h" +#include "ui_installprogressfrm.h" + + +InstallBl::InstallBl(QWidget *parent) : QDialog(parent) +{ + ui.setupUi(this); + connect(ui.buttonBrowse, SIGNAL(clicked()), this, SLOT(browseFolder())); +} + +void InstallBl::setProxy(QUrl proxy_url) +{ + proxy = proxy_url; + qDebug() << "Install::setProxy" << proxy; +} + +void InstallBl::setMountPoint(QString mount) +{ + QFileInfo m(mount); + if(m.isDir()) { + ui.lineMountPoint->clear(); + ui.lineMountPoint->insert(mount); + } +} + +void InstallBl::browseFolder() +{ + QFileDialog browser(this); + if(QFileInfo(ui.lineMountPoint->text()).isDir()) + browser.setDirectory(ui.lineMountPoint->text()); + else + browser.setDirectory("/media"); + browser.setReadOnly(true); + browser.setFileMode(QFileDialog::DirectoryOnly); + browser.setAcceptMode(QFileDialog::AcceptOpen); + if(browser.exec()) { + qDebug() << browser.directory(); + QStringList files = browser.selectedFiles(); + setMountPoint(files.at(0)); + } +} + +void InstallBl::accept() +{ + QDialog *downloadProgress = new QDialog(this); + dp.setupUi(downloadProgress); + // connect close button now as it's needed if we break upon an error + connect(dp.buttonAbort, SIGNAL(clicked()), downloadProgress, SLOT(close())); + // show dialog with error if mount point is wrong + if(QFileInfo(ui.lineMountPoint->text()).isDir()) { + mountPoint = ui.lineMountPoint->text(); + userSettings->setValue("defaults/mountpoint", mountPoint); + } + else { + dp.listProgress->addItem(tr("Mount point is wrong!")); + dp.buttonAbort->setText(tr("&Ok")); + downloadProgress->show(); + return; + } + userSettings->sync(); + + binstaller = new BootloaderInstaller(this); + + binstaller->setMountPoint(mountPoint); + binstaller->setProxy(proxy); + QString plattform = userSettings->value("defaults/platform").toString(); + + binstaller->setDevice(plattform); + binstaller->setBootloaderMethod(devices->value(plattform + "/bootloadermethod").toString()); + binstaller->setBootloaderName(devices->value(plattform + "/bootloadername").toString()); + binstaller->setBootloaderBaseUrl(devices->value("bootloader_url").toString()); + + binstaller->install(&dp); + + connect(binstaller, SIGNAL(done(bool)), this, SLOT(done(bool))); + + downloadProgress->show(); +} + + +void InstallBl::done(bool error) +{ + qDebug() << "Install::done, error:" << error; + + if(error) + { + connect(dp.buttonAbort, SIGNAL(clicked()), this, SLOT(close())); + return; + } + + connect(dp.buttonAbort, SIGNAL(clicked()), this, SLOT(close())); + delete binstaller; +} + +void InstallBl::setDeviceSettings(QSettings *dev) +{ + devices = dev; + qDebug() << "Install::setDeviceSettings:" << devices; +} + +void InstallBl::setUserSettings(QSettings *user) +{ + userSettings = user; +} diff --git a/rbutil/rbutilqt/rbutilqt.h b/rbutil/rbutilqt/installbl.h similarity index 52% copy from rbutil/rbutilqt/rbutilqt.h copy to rbutil/rbutilqt/installbl.h index 89a3610fb..927cfa9b1 100644 --- a/rbutil/rbutilqt/rbutilqt.h +++ b/rbutil/rbutilqt/installbl.h @@ -6,8 +6,8 @@ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ * \/ \/ \/ \/ \/ * - * Copyright (C) 2007 by Dominik Riebeling - * $Id:$ + * Copyright (C) 2007 by Dominik Wenger + * $Id: installbl.h 14027 2007-07-27 17:42:49Z domonoky $ * * 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. @@ -17,42 +17,50 @@ * ****************************************************************************/ +#ifndef INSTALLBL_H +#define INSTALLBL_H -#ifndef QRBUTIL_H -#define QRBUTIL_H +#include -#include "ui_rbutilqtfrm.h" -#include "httpget.h" #include -#include +#include "ui_installbootloaderfrm.h" +#include "ui_installprogressfrm.h" -class RbUtilQt : public QMainWindow +#include "installbootloader.h" + +class InstallBl : public QDialog { Q_OBJECT - public: - RbUtilQt(QWidget *parent = 0); + InstallBl(QWidget *parent = 0); + void setProxy(QUrl); + void setMountPoint(QString); + void setUserSettings(QSettings*); + void setDeviceSettings(QSettings*); + + public slots: + void accept(void); private: - Ui::RbUtilQtFrm ui; + Ui::InstallBootloaderFrm ui; + Ui::InstallProgressFrm dp; + QUrl proxy; QSettings *devices; QSettings *userSettings; - void initDeviceNames(void); - QString deviceName(QString); - QString platform; - HttpGet *daily; - QString absolutePath; - QTemporaryFile buildInfo; + QDialog *downloadProgress; + QHttp *download; + QFile *target; + QString file; + QString fileName; + QString mountPoint; + BootloaderInstaller* binstaller; private slots: - void about(void); - void configDialog(void); - void updateDevice(int); - void install(void); - void downloadDone(bool); - void downloadDone(int, bool); - void downloadInfo(void); + void browseFolder(void); + void done(bool); + }; + #endif diff --git a/rbutil/rbutilqt/installbootloader.cpp b/rbutil/rbutilqt/installbootloader.cpp new file mode 100644 index 000000000..5c278ee5a --- /dev/null +++ b/rbutil/rbutilqt/installbootloader.cpp @@ -0,0 +1,702 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * + * Copyright (C) 2007 by Dominik Wenger + * $Id: installbootloader.cpp 13990 2007-07-25 22:26:10Z 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 "installbootloader.h" + +BootloaderInstaller::BootloaderInstaller(QObject* parent): QObject(parent) +{ + +} + +void BootloaderInstaller::install(Ui::InstallProgressFrm* dp) +{ + m_dp = dp; + m_install = true; + m_dp->listProgress->addItem(tr("Starting bootloader installation")); + + if(m_bootloadermethod == "gigabeatf") + { + // connect internal signal + connect(this,SIGNAL(prepare()),this,SLOT(gigabeatPrepare())); + connect(this,SIGNAL(finish()),this,SLOT(gigabeatFinish())); + } + else if(m_bootloadermethod == "iaudio") + { + // connect internal signal + connect(this,SIGNAL(prepare()),this,SLOT(iaudioPrepare())); + connect(this,SIGNAL(finish()),this,SLOT(iaudioFinish())); + } + else if(m_bootloadermethod == "h10") + { + // connect internal signal + connect(this,SIGNAL(prepare()),this,SLOT(h10Prepare())); + connect(this,SIGNAL(finish()),this,SLOT(h10Finish())); + } + else if(m_bootloadermethod == "ipodpatcher") + { + // connect internal signal + connect(this,SIGNAL(prepare()),this,SLOT(ipodPrepare())); + connect(this,SIGNAL(finish()),this,SLOT(ipodFinish())); + } + else + { + m_dp->listProgress->addItem(tr("unsupported install Method")); + emit done(true); + return; + } + + emit prepare(); +} + +void BootloaderInstaller::uninstall(Ui::InstallProgressFrm* dp) +{ + m_dp = dp; + m_install = false; + m_dp->listProgress->addItem(tr("Starting bootloader uninstallation")); + + if(m_bootloadermethod == "gigabeatf") + { + // connect internal signal + connect(this,SIGNAL(prepare()),this,SLOT(gigabeatPrepare())); + } + else if(m_bootloadermethod == "iaudio") + { + m_dp->listProgress->addItem(tr("No uninstallation possible")); + emit done(true); + return; + } + else if(m_bootloadermethod == "iaudio") + { + // connect internal signal + connect(this,SIGNAL(prepare()),this,SLOT(h10Prepare())); + } + else if(m_bootloadermethod == "ipodpatcher") + { + // connect internal signal + connect(this,SIGNAL(prepare()),this,SLOT(ipodPrepare())); + } + else + { + m_dp->listProgress->addItem(tr("unsupported install Method")); + emit done(true); + return; + } + + emit prepare(); +} + +void BootloaderInstaller::downloadRequestFinished(int id, bool error) +{ + qDebug() << "BootloaderInstall::downloadRequestFinished" << id << error; + qDebug() << "error:" << getter->errorString(); + + downloadDone(error); +} + +void BootloaderInstaller::downloadDone(bool error) +{ + qDebug() << "Install::downloadDone, error:" << error; + + // update progress bar + + int max = m_dp->progressBar->maximum(); + if(max == 0) { + max = 100; + m_dp->progressBar->setMaximum(max); + } + m_dp->progressBar->setValue(max); + if(getter->httpResponse() != 200) { + m_dp->listProgress->addItem(tr("Download error: received HTTP error %1.").arg(getter->httpResponse())); + m_dp->buttonAbort->setText(tr("&Ok")); + emit done(true); + return; + } + if(error) { + m_dp->listProgress->addItem(tr("Download error: %1").arg(getter->errorString())); + m_dp->buttonAbort->setText(tr("&Ok")); + emit done(true); + return; + } + else m_dp->listProgress->addItem(tr("Download finished.")); + + emit finish(); + +} + +void BootloaderInstaller::updateDataReadProgress(int read, int total) +{ + m_dp->progressBar->setMaximum(total); + m_dp->progressBar->setValue(read); + qDebug() << "progress:" << read << "/" << total; +} + + +/************************************************** +*** gigabeat secific code +***************************************************/ + +void BootloaderInstaller::gigabeatPrepare() +{ + if(m_install) // Installation + { + QString url = m_bootloaderUrlBase + "/gigabeat/" + m_bootloadername; + + m_dp->listProgress->addItem(tr("Downloading file %1.%2") + .arg(QFileInfo(url).baseName(), QFileInfo(url).completeSuffix())); + + // temporary file needs to be opened to get the filename + downloadFile.open(); + m_tempfilename = downloadFile.fileName(); + downloadFile.close(); + // get the real file. + getter = new HttpGet(this); + getter->setProxy(m_proxy); + getter->setFile(&downloadFile); + getter->getFile(QUrl(url)); + // connect signals from HttpGet + connect(getter, SIGNAL(done(bool)), this, SLOT(downloadDone(bool))); + //connect(getter, SIGNAL(requestFinished(int, bool)), this, SLOT(downloadRequestFinished(int, bool))); + connect(getter, SIGNAL(dataReadProgress(int, int)), this, SLOT(updateDataReadProgress(int, int))); + + } + else //UnInstallation + { + QString firmware = m_mountpoint + "/GBSYSTEM/FWIMG/FWIMG01.DAT"; + QString firmwareOrig = firmware.append(".ORIG"); + + QFileInfo firmwareOrigFI(firmwareOrig); + + // check if original firmware exists + if(!firmwareOrigFI.exists()) + { + m_dp->listProgress->addItem(tr("Could not find the Original Firmware at: %1") + .arg(firmwareOrig)); + emit done(true); + return; + } + + QFile firmwareFile(firmware); + QFile firmwareOrigFile(firmwareOrig); + + //remove modified firmware + if(!firmwareFile.remove()) + { + m_dp->listProgress->addItem(tr("Could not remove the Firmware at: %1") + .arg(firmware)); + emit done(true); + return; + } + + //copy original firmware + if(!firmwareOrigFile.copy(firmware)) + { + m_dp->listProgress->addItem(tr("Could not copy the Firmware from: %1 to %2") + .arg(firmwareOrig,firmware)); + emit done(true); + return; + } + + emit done(false); //success + } + +} + +void BootloaderInstaller::gigabeatFinish() +{ + // this step is only need for installation, so no code for uninstall here + + m_dp->listProgress->addItem(tr("Finishing bootloader install")); + + QString firmware = m_mountpoint + "/GBSYSTEM/FWIMG/" + m_bootloadername; + + QFileInfo firmwareFI(firmware); + + // check if firmware exists + if(!firmwareFI.exists()) + { + m_dp->listProgress->addItem(tr("Could not find the Firmware at: %1") + .arg(firmware)); + emit done(true); + return; + } + + QString firmwareOrig = firmware; + firmwareOrig.append(".ORIG"); + QFileInfo firmwareOrigFI(firmwareOrig); + + // rename the firmware, if there is no original firmware there + if(!firmwareOrigFI.exists()) + { + QFile firmwareFile(firmware); + if(!firmwareFile.rename(firmwareOrig)) + { + m_dp->listProgress->addItem(tr("Could not rename: %1 to %2") + .arg(firmware,firmwareOrig)); + emit done(true); + return; + } + } + else // or remove the normal firmware, if the original is there + { + QFile firmwareFile(firmware); + firmwareFile.remove(); + } + + //copy the firmware + if(!downloadFile.copy(firmware)) + { + m_dp->listProgress->addItem(tr("Could not copy: %1 to %2") + .arg(m_tempfilename,firmware)); + emit done(true); + return; + } + + downloadFile.remove(); + + m_dp->listProgress->addItem(tr("Bootloader install finished successfully.")); + m_dp->buttonAbort->setText(tr("&Ok")); + + emit done(false); // success + +} + +/************************************************** +*** iaudio secific code +***************************************************/ +void BootloaderInstaller::iaudioPrepare() +{ + + QString url = m_bootloaderUrlBase + "/iaudio/" + m_bootloadername; + + m_dp->listProgress->addItem(tr("Downloading file %1.%2") + .arg(QFileInfo(url).baseName(), QFileInfo(url).completeSuffix())); + + // temporary file needs to be opened to get the filename + downloadFile.open(); + m_tempfilename = downloadFile.fileName(); + downloadFile.close(); + // get the real file. + getter = new HttpGet(this); + getter->setProxy(m_proxy); + getter->setFile(&downloadFile); + getter->getFile(QUrl(url)); + // connect signals from HttpGet + connect(getter, SIGNAL(done(bool)), this, SLOT(downloadDone(bool))); + //connect(getter, SIGNAL(requestFinished(int, bool)), this, SLOT(downloadRequestFinished(int, bool))); + connect(getter, SIGNAL(dataReadProgress(int, int)), this, SLOT(updateDataReadProgress(int, int))); + +} + +void BootloaderInstaller::iaudioFinish() +{ + QString firmware = m_mountpoint + "/FIRMWARE/" + m_bootloadername; + + //copy the firmware + if(!downloadFile.copy(firmware)) + { + m_dp->listProgress->addItem(tr("Could not copy: %1 to %2") + .arg(m_tempfilename,firmware)); + emit done(true); + return; + } + + downloadFile.remove(); + + m_dp->listProgress->addItem(tr("Bootloader install finished successfully.")); + m_dp->buttonAbort->setText(tr("&Ok")); + + emit done(false); // success + +} + + +/************************************************** +*** h10 secific code +***************************************************/ +void BootloaderInstaller::h10Prepare() +{ + if(m_install) // Installation + { + QString url = m_bootloaderUrlBase + "/iriver/" + m_bootloadername; + + m_dp->listProgress->addItem(tr("Downloading file %1.%2") + .arg(QFileInfo(url).baseName(), QFileInfo(url).completeSuffix())); + + // temporary file needs to be opened to get the filename + downloadFile.open(); + m_tempfilename = downloadFile.fileName(); + downloadFile.close(); + // get the real file. + getter = new HttpGet(this); + getter->setProxy(m_proxy); + getter->setFile(&downloadFile); + getter->getFile(QUrl(url)); + // connect signals from HttpGet + connect(getter, SIGNAL(done(bool)), this, SLOT(downloadDone(bool))); + //connect(getter, SIGNAL(requestFinished(int, bool)), this, SLOT(downloadRequestFinished(int, bool))); + connect(getter, SIGNAL(dataReadProgress(int, int)), this, SLOT(updateDataReadProgress(int, int))); + } + else // Uninstallation + { + + QString firmwarename = m_bootloadername.section('/', -1); + + QString firmware = m_mountpoint + "/SYSTEM/" + firmwarename; + QString firmwareOrig = m_mountpoint + "/SYSTEM/Original.mi4"; + + QFileInfo firmwareFI(firmware); + if(!firmwareFI.exists()) //Firmware dosent exists on player + { + firmware = m_mountpoint + "/SYSTEM/H10EMP.mi4"; //attempt other firmwarename + firmwareFI.setFile(firmware); + if(!firmwareFI.exists()) //Firmware dosent exists on player + { + m_dp->listProgress->addItem(tr("Firmware doesn not exist: %1") + .arg(firmware)); + emit done(true); + return; + } + } + + QFileInfo firmwareOrigFI(firmwareOrig); + if(!firmwareOrigFI.exists()) //Original Firmware dosent exists on player + { + m_dp->listProgress->addItem(tr("Original Firmware doesn not exist: %1") + .arg(firmwareOrig)); + emit done(true); + return; + } + + QFile firmwareFile(firmware); + QFile firmwareOrigFile(firmwareOrig); + + //remove modified firmware + if(!firmwareFile.remove()) + { + m_dp->listProgress->addItem(tr("Could not remove the Firmware at: %1") + .arg(firmware)); + emit done(true); + return; + } + + //copy original firmware + if(!firmwareOrigFile.copy(firmware)) + { + m_dp->listProgress->addItem(tr("Could not copy the Firmware from: %1 to %2") + .arg(firmwareOrig,firmware)); + emit done(true); + return; + } + + emit done(false); //success + + } +} + +void BootloaderInstaller::h10Finish() +{ + QString firmwarename = m_bootloadername.section('/', -1); + + QString firmware = m_mountpoint + "/SYSTEM/" + firmwarename; + QString firmwareOrig = m_mountpoint + "/SYSTEM/Original.mi4"; + + QFileInfo firmwareFI(firmware); + + if(!firmwareFI.exists()) //Firmware dosent exists on player + { + firmware = m_mountpoint + "/SYSTEM/H10EMP.mi4"; //attempt other firmwarename + firmwareFI.setFile(firmware); + if(!firmwareFI.exists()) //Firmware dosent exists on player + { + m_dp->listProgress->addItem(tr("Firmware does not exist: %1") + .arg(firmware)); + emit done(true); + return; + } + } + + QFileInfo firmwareOrigFI(firmwareOrig); + + if(!firmwareOrigFI.exists()) //there is already a original firmware + { + QFile firmwareFile(firmware); + if(!firmwareFile.rename(firmwareOrig)) //rename Firmware to Original + { + m_dp->listProgress->addItem(tr("Could not rename: %1 to %2") + .arg(firmware,firmwareOrig)); + emit done(true); + return; + } + } + else + { + QFile firmwareFile(firmware); + firmwareFile.remove(); + } + //copy the firmware + if(!downloadFile.copy(firmware)) + { + m_dp->listProgress->addItem(tr("Could not copy: %1 to %2") + .arg(m_tempfilename,firmware)); + emit done(true); + return; + } + + downloadFile.remove(); + + m_dp->listProgress->addItem(tr("Bootloader install finished successfully.")); + m_dp->buttonAbort->setText(tr("&Ok")); + + emit done(false); // success + +} + +/************************************************** +*** ipod secific code +***************************************************/ +int verbose =0; +// reserves memory for ipodpatcher +bool initIpodpatcher() +{ + if (ipod_alloc_buffer(§orbuf,BUFFER_SIZE) < 0) return true; + else return false; +} + +void BootloaderInstaller::ipodPrepare() +{ + m_dp->listProgress->addItem(tr("Searching for ipods")); + struct ipod_t ipod; + + int n = ipod_scan(&ipod); + if (n == 0) + { + m_dp->listProgress->addItem(tr("No Ipods found")); + emit done(true); + return; + } + if (n > 1) + { + m_dp->listProgress->addItem(tr("Too many Ipods found")); + emit done(true); + } + + if(m_install) // Installation + { + + QString url = m_bootloaderUrlBase + "/ipod/bootloader-" + m_bootloadername + ".ipod"; + + m_dp->listProgress->addItem(tr("Downloading file %1.%2") + .arg(QFileInfo(url).baseName(), QFileInfo(url).completeSuffix())); + + // temporary file needs to be opened to get the filename + downloadFile.open(); + m_tempfilename = downloadFile.fileName(); + downloadFile.close(); + // get the real file. + getter = new HttpGet(this); + getter->setProxy(m_proxy); + getter->setFile(&downloadFile); + getter->getFile(QUrl(url)); + // connect signals from HttpGet + connect(getter, SIGNAL(done(bool)), this, SLOT(downloadDone(bool))); + //connect(getter, SIGNAL(requestFinished(int, bool)), this, SLOT(downloadRequestFinished(int, bool))); + connect(getter, SIGNAL(dataReadProgress(int, int)), this, SLOT(updateDataReadProgress(int, int))); + + } + else // Uninstallation + { + if (ipod_open(&ipod, 0) < 0) + { + m_dp->listProgress->addItem(tr("could not open ipod")); + emit done(true); + return; + } + + if (read_partinfo(&ipod,0) < 0) + { + m_dp->listProgress->addItem(tr("could not read partitiontable")); + emit done(true); + return; + } + + if (ipod.pinfo[0].start==0) + { + m_dp->listProgress->addItem(tr("No partition 0 on disk")); + + int i; + double sectors_per_MB = (1024.0*1024.0)/ipod.sector_size; + m_dp->listProgress->addItem(tr("[INFO] Part Start Sector End Sector Size (MB) Type\n")); + for ( i = 0; i < 4; i++ ) + { + if (ipod.pinfo[i].start != 0) + { + m_dp->listProgress->addItem(tr("[INFO] %1 %2 %3 %4 %5 (%6)").arg( + i).arg( + ipod.pinfo[i].start).arg( + ipod.pinfo[i].start+ipod.pinfo[i].size-1).arg( + ipod.pinfo[i].size/sectors_per_MB).arg( + get_parttype(ipod.pinfo[i].type)).arg( + ipod.pinfo[i].type)); + } + } + emit done(true); + return; + } + + read_directory(&ipod); + + if (ipod.nimages <= 0) + { + m_dp->listProgress->addItem(tr("Failed to read firmware directory")); + emit done(true); + return; + } + if (getmodel(&ipod,(ipod.ipod_directory[0].vers>>8)) < 0) + { + m_dp->listProgress->addItem(tr("Unknown version number in firmware (%1)").arg( + ipod.ipod_directory[0].vers)); + emit done(true); + return; + } + + if (ipod.macpod) + { + m_dp->listProgress->addItem(tr("Warning this is a MacPod, Rockbox doesnt work on this. Convert it to WinPod")); + } + + if (ipod_reopen_rw(&ipod) < 0) + { + m_dp->listProgress->addItem(tr("Could not open Ipod in RW mode")); + emit done(true); + return; + } + + if (ipod.ipod_directory[0].entryOffset==0) { + m_dp->listProgress->addItem(tr("No bootloader detected.")); + emit done(true); + return; + } + + if (delete_bootloader(&ipod)==0) + { + m_dp->listProgress->addItem(tr("Successfully removed Bootloader")); + emit done(true); + ipod_close(&ipod); + return; + } + else + { + m_dp->listProgress->addItem(tr("--delete-bootloader failed.")); + emit done(true); + return; + } + } +} + +void BootloaderInstaller::ipodFinish() +{ + struct ipod_t ipod; + ipod_scan(&ipod); + + if (ipod_open(&ipod, 0) < 0) + { + m_dp->listProgress->addItem(tr("could not open ipod")); + emit done(true); + return; + } + + if (read_partinfo(&ipod,0) < 0) + { + m_dp->listProgress->addItem(tr("could not read partitiontable")); + emit done(true); + return; + } + + if (ipod.pinfo[0].start==0) + { + m_dp->listProgress->addItem(tr("No partition 0 on disk")); + + int i; + double sectors_per_MB = (1024.0*1024.0)/ipod.sector_size; + + m_dp->listProgress->addItem(tr("[INFO] Part Start Sector End Sector Size (MB) Type\n")); + + for ( i = 0; i < 4; i++ ) + { + if (ipod.pinfo[i].start != 0) + { + m_dp->listProgress->addItem(tr("[INFO] %1 %2 %3 %4 %5 (%6)").arg( + i).arg( + ipod.pinfo[i].start).arg( + ipod.pinfo[i].start+ipod.pinfo[i].size-1).arg( + ipod.pinfo[i].size/sectors_per_MB).arg( + get_parttype(ipod.pinfo[i].type)).arg( + ipod.pinfo[i].type)); + } + } + emit done(true); + return; + } + + read_directory(&ipod); + + if (ipod.nimages <= 0) + { + m_dp->listProgress->addItem(tr("Failed to read firmware directory")); + emit done(true); + return; + } + if (getmodel(&ipod,(ipod.ipod_directory[0].vers>>8)) < 0) + { + m_dp->listProgress->addItem(tr("Unknown version number in firmware (%1)").arg( + ipod.ipod_directory[0].vers)); + emit done(true); + return; + } + + if (ipod.macpod) + { + m_dp->listProgress->addItem(tr("Warning this is a MacPod, Rockbox doesnt work on this. Convert it to WinPod")); + } + + if (ipod_reopen_rw(&ipod) < 0) + { + m_dp->listProgress->addItem(tr("Could not open Ipod in RW mode")); + emit done(true); + return; + } + + if (add_bootloader(&ipod, m_tempfilename.toLatin1().data(), FILETYPE_DOT_IPOD)==0) + { + m_dp->listProgress->addItem(tr("Successfully added Bootloader")); + emit done(true); + ipod_close(&ipod); + return; + } + else + { + m_dp->listProgress->addItem(tr("failed to add Bootloader")); + ipod_close(&ipod); + emit done(true); + return; + } + +} + + diff --git a/rbutil/rbutilqt/installbootloader.h b/rbutil/rbutilqt/installbootloader.h new file mode 100644 index 000000000..24d1fe33e --- /dev/null +++ b/rbutil/rbutilqt/installbootloader.h @@ -0,0 +1,94 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * + * Copyright (C) 2007 by Dominik Wenger + * $Id: installbootloader.h 13990 2007-07-25 22:26:10Z 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. + * + ****************************************************************************/ + +#ifndef INSTALLBOOTLOADER_H +#define INSTALLBOOTLOADER_H + +#include + +#include "ui_installprogressfrm.h" +#include "httpget.h" + +extern "C" { + // Ipodpatcher + #include "../ipodpatcher/ipodpatcher.h" +}; + +bool initIpodpatcher(); + +class BootloaderInstaller : public QObject +{ + Q_OBJECT + +public: + BootloaderInstaller(QObject* parent); + ~BootloaderInstaller() {} + + void install(Ui::InstallProgressFrm* dp); + void uninstall(Ui::InstallProgressFrm* dp); + + void setMountPoint(QString mountpoint) {m_mountpoint = mountpoint;} + void setProxy(QUrl proxy) {m_proxy= proxy;} + void setDevice(QString device) {m_device= device;} + void setBootloaderMethod(QString method) {m_bootloadermethod= method;} + void setBootloaderName(QString name){m_bootloadername= name;} + void setBootloaderBaseUrl(QString baseUrl){m_bootloaderUrlBase = baseUrl;} + +signals: + void done(bool error); //installation finished. + + // internal signals. Dont use this from out side. + void prepare(); + void finish(); + +private slots: + void updateDataReadProgress(int, int); + void downloadDone(bool); + void downloadRequestFinished(int, bool); + + // gigabeat specific routines + void gigabeatPrepare(); + void gigabeatFinish(); + + //iaudio specific routines + void iaudioPrepare(); + void iaudioFinish(); + + //h10 specific routines + void h10Prepare(); + void h10Finish(); + + //ipod specific routines + void ipodPrepare(); + void ipodFinish(); + +private: + QString m_mountpoint, m_device,m_bootloadermethod,m_bootloadername; + QString m_bootloaderUrlBase,m_tempfilename; + QUrl m_proxy; + bool m_install; + + + HttpGet *getter; + QTemporaryFile downloadFile; + + Ui::InstallProgressFrm* m_dp; + +}; +#endif diff --git a/rbutil/rbutilqt/installbootloaderfrm.ui b/rbutil/rbutilqt/installbootloaderfrm.ui new file mode 100644 index 000000000..93af75014 --- /dev/null +++ b/rbutil/rbutilqt/installbootloaderfrm.ui @@ -0,0 +1,108 @@ + + InstallBootloaderFrm + + + Qt::WindowModal + + + + 0 + 0 + 673 + 453 + + + + Install Bootloader + + + + + + + + + :/icons/icons/wizard.xpm + + + + + + + Select your device in the filesystem + + + + + + + + + + &Browse + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + buttonBox + accepted() + InstallBootloaderFrm + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + InstallBootloaderFrm + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/rbutil/rbutilqt/rbutilqt.cpp b/rbutil/rbutilqt/rbutilqt.cpp index 90744b5c8..d891acd0f 100644 --- a/rbutil/rbutilqt/rbutilqt.cpp +++ b/rbutil/rbutilqt/rbutilqt.cpp @@ -25,7 +25,9 @@ #include "ui_aboutbox.h" #include "configure.h" #include "install.h" +#include "installbl.h" #include "httpget.h" +#include "installbootloader.h" RbUtilQt::RbUtilQt(QWidget *parent) : QMainWindow(parent) { @@ -71,6 +73,7 @@ RbUtilQt::RbUtilQt(QWidget *parent) : QMainWindow(parent) connect(ui.action_Configure, SIGNAL(triggered()), this, SLOT(configDialog())); connect(ui.comboBoxDevice, SIGNAL(currentIndexChanged(int)), this, SLOT(updateDevice(int))); connect(ui.buttonRockbox, SIGNAL(clicked()), this, SLOT(install())); + connect(ui.buttonBootloader, SIGNAL(clicked()), this, SLOT(installBl())); // disable unimplemented stuff ui.buttonThemes->setEnabled(false); @@ -80,7 +83,9 @@ RbUtilQt::RbUtilQt(QWidget *parent) : QMainWindow(parent) ui.buttonGames->setEnabled(false); ui.buttonFonts->setEnabled(false); ui.buttonComplete->setEnabled(false); + ui.buttonDetect->setEnabled(false); + initIpodpatcher(); downloadInfo(); } @@ -229,3 +234,16 @@ void RbUtilQt::install() installWindow->show(); } + +void RbUtilQt::installBl() +{ + InstallBl *installWindow = new InstallBl(this); + installWindow->setUserSettings(userSettings); + installWindow->setDeviceSettings(devices); + if(userSettings->value("defaults/proxytype") == "manual") + installWindow->setProxy(QUrl(userSettings->value("defaults/proxy").toString())); + installWindow->setMountPoint(userSettings->value("defaults/mountpoint").toString()); + + installWindow->show(); +} + diff --git a/rbutil/rbutilqt/rbutilqt.h b/rbutil/rbutilqt/rbutilqt.h index 89a3610fb..324fe55e5 100644 --- a/rbutil/rbutilqt/rbutilqt.h +++ b/rbutil/rbutilqt/rbutilqt.h @@ -7,7 +7,7 @@ * \/ \/ \/ \/ \/ * * Copyright (C) 2007 by Dominik Riebeling - * $Id:$ + * $Id$ * * 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. @@ -26,7 +26,6 @@ #include #include - class RbUtilQt : public QMainWindow { Q_OBJECT @@ -50,6 +49,7 @@ class RbUtilQt : public QMainWindow void configDialog(void); void updateDevice(int); void install(void); + void installBl(void); void downloadDone(bool); void downloadDone(int, bool); void downloadInfo(void); diff --git a/rbutil/rbutilqt/rbutilqt.pro b/rbutil/rbutilqt/rbutilqt.pro index 1491ab9d6..ef558de6a 100644 --- a/rbutil/rbutilqt/rbutilqt.pro +++ b/rbutil/rbutilqt/rbutilqt.pro @@ -5,7 +5,11 @@ SOURCES += rbutilqt.cpp \ configure.cpp \ zip/zip.cpp \ zip/unzip.cpp \ - installzip.cpp + installzip.cpp \ + installbootloader.cpp \ + installbl.cpp \ + ../ipodpatcher/ipodpatcher.c + HEADERS += rbutilqt.h \ settings.h \ @@ -18,8 +22,14 @@ HEADERS += rbutilqt.h \ zip/unzip_p.h \ zip/zip_p.h \ version.h \ - installzip.h - + installzip.h \ + installbootloader.h \ + installbl.h \ + ../ipodpatcher/ipodpatcher.h \ + ../ipodpatcher/ipodio.h \ + ../ipodpatcher/parttypes.h + + TEMPLATE = app CONFIG += release \ warn_on \ @@ -30,8 +40,17 @@ FORMS += rbutilqtfrm.ui \ aboutbox.ui \ installfrm.ui \ installprogressfrm.ui \ - configurefrm.ui + configurefrm.ui \ + installbootloaderfrm.ui RESOURCES += rbutilqt.qrc TRANSLATIONS += rbutil_de.ts QT += network + +win32{ + SOURCES += ../ipodpatcher/ipodio-win32.c +} + +!win32{ + SOURCES += ../ipodpatcher/ipodio-posix.c +} -- 2.11.4.GIT