From 999676bdd9b19c9fddb143698bfb5e3f4f4ae62a Mon Sep 17 00:00:00 2001 From: Dominik Wenger Date: Sat, 28 Jul 2007 11:32:32 +0000 Subject: [PATCH] rbutilqt: added sansapatcher to bootloader installation. now only iriver bootloaders are missing. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@14039 a1c6a512-1295-4272-9138-f99709370657 --- rbutil/rbutilqt/icons/talkfile_btn.png | Bin 2796 -> 3776 bytes rbutil/rbutilqt/installbootloader.cpp | 194 ++++++++++++++++++++++++- rbutil/rbutilqt/installbootloader.h | 6 + rbutil/rbutilqt/rbutilqt.pro | 12 +- 4 files changed, 205 insertions(+), 7 deletions(-) diff --git a/rbutil/rbutilqt/icons/talkfile_btn.png b/rbutil/rbutilqt/icons/talkfile_btn.png index ba168676e12f062f1f28ca5657c5972d62e04138..64e2763c94b60bed8a14acf017480da8fd325a41 100644 GIT binary patch literal 3776 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"unsupported install Method")); @@ -91,6 +97,11 @@ void BootloaderInstaller::uninstall(Ui::InstallProgressFrm* dp) // connect internal signal connect(this,SIGNAL(prepare()),this,SLOT(ipodPrepare())); } + else if(m_bootloadermethod == "sansapatcher") + { + // connect internal signal + connect(this,SIGNAL(prepare()),this,SLOT(sansaPrepare())); + } else { m_dp->listProgress->addItem(tr("unsupported install Method")); @@ -596,7 +607,7 @@ void BootloaderInstaller::ipodPrepare() if (delete_bootloader(&ipod)==0) { m_dp->listProgress->addItem(tr("Successfully removed Bootloader")); - emit done(true); + emit done(false); ipod_close(&ipod); return; } @@ -604,6 +615,7 @@ void BootloaderInstaller::ipodPrepare() { m_dp->listProgress->addItem(tr("--delete-bootloader failed.")); emit done(true); + ipod_close(&ipod); return; } } @@ -685,7 +697,7 @@ void BootloaderInstaller::ipodFinish() if (add_bootloader(&ipod, m_tempfilename.toLatin1().data(), FILETYPE_DOT_IPOD)==0) { m_dp->listProgress->addItem(tr("Successfully added Bootloader")); - emit done(true); + emit done(false); ipod_close(&ipod); return; } @@ -695,8 +707,182 @@ void BootloaderInstaller::ipodFinish() ipod_close(&ipod); emit done(true); return; - } - + } +} + +/************************************************** +*** sansa secific code +***************************************************/ +// reserves memory for sansapatcher +bool initSansaPatcher() +{ + if (sansa_alloc_buffer(§orbuf,BUFFER_SIZE) < 0) return true; + else return false; +} + + +void BootloaderInstaller::sansaPrepare() +{ + m_dp->listProgress->addItem(tr("Searching for sansas")); + struct sansa_t sansa; + + int n = sansa_scan(&sansa); + if (n == 0) + { + m_dp->listProgress->addItem(tr("No Sansa found")); + emit done(true); + return; + } + if (n > 1) + { + m_dp->listProgress->addItem(tr("Too many Sansas found")); + emit done(true); + } + + if(m_install) // Installation + { + QString url = m_bootloaderUrlBase + "/sandisk-sansa/e200/" + 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 + { + + if (sansa_open(&sansa, 0) < 0) + { + m_dp->listProgress->addItem(tr("could not open Sansa")); + emit done(true); + return; + } + + if (sansa_read_partinfo(&sansa,0) < 0) + { + m_dp->listProgress->addItem(tr("could not read partitiontable")); + emit done(true); + return; + } + + int i = is_e200(&sansa); + if (i < 0) { + m_dp->listProgress->addItem(tr("Disk is not an E200 (%1), aborting.").arg(i)); + emit done(true); + return; + } + + if (sansa.hasoldbootloader) + { + m_dp->listProgress->addItem(tr("********************************************\n" + "OLD ROCKBOX INSTALLATION DETECTED, ABORTING.\n" + "You must reinstall the original Sansa firmware before running\n" + "sansapatcher for the first time.\n" + "See http://www.rockbox.org/twiki/bin/view/Main/SansaE200Install\n" + "*********************************************\n")); + emit done(true); + return; + } + + + if (sansa_reopen_rw(&sansa) < 0) + { + m_dp->listProgress->addItem(tr("Could not open Sansa in RW mode")); + emit done(true); + return; + } + + if (sansa_delete_bootloader(&sansa)==0) + { + m_dp->listProgress->addItem(tr("Successfully removed Bootloader")); + emit done(false); + sansa_close(&sansa); + return; + } + else + { + m_dp->listProgress->addItem(tr("--delete-bootloader failed.")); + emit done(true); + sansa_close(&sansa); + return; + } + } +} + +void BootloaderInstaller::sansaFinish() +{ + struct sansa_t sansa; + sansa_scan(&sansa); + + if (sansa_open(&sansa, 0) < 0) + { + m_dp->listProgress->addItem(tr("could not open Sansa")); + emit done(true); + return; + } + + if (sansa_read_partinfo(&sansa,0) < 0) + { + m_dp->listProgress->addItem(tr("could not read partitiontable")); + emit done(true); + return; + } + + + int i = is_e200(&sansa); + if (i < 0) { + + m_dp->listProgress->addItem(tr("Disk is not an E200 (%1), aborting.").arg(i)); + emit done(true); + return; + } + + if (sansa.hasoldbootloader) + { + m_dp->listProgress->addItem(tr("********************************************\n" + "OLD ROCKBOX INSTALLATION DETECTED, ABORTING.\n" + "You must reinstall the original Sansa firmware before running\n" + "sansapatcher for the first time.\n" + "See http://www.rockbox.org/twiki/bin/view/Main/SansaE200Install\n" + "*********************************************\n")); + emit done(true); + return; + } + + if (sansa_reopen_rw(&sansa) < 0) + { + m_dp->listProgress->addItem(tr("Could not open Sansa in RW mode")); + emit done(true); + return; + } + + if (sansa_add_bootloader(&sansa, m_tempfilename.toLatin1().data(), FILETYPE_MI4)==0) + { + m_dp->listProgress->addItem(tr("Successfully added Bootloader")); + emit done(false); + sansa_close(&sansa); + return; + } + else + { + m_dp->listProgress->addItem(tr("failed to add Bootloader")); + sansa_close(&sansa); + emit done(true); + return; + } + } diff --git a/rbutil/rbutilqt/installbootloader.h b/rbutil/rbutilqt/installbootloader.h index 24d1fe33e4..8f3b6d4b64 100644 --- a/rbutil/rbutilqt/installbootloader.h +++ b/rbutil/rbutilqt/installbootloader.h @@ -28,9 +28,11 @@ extern "C" { // Ipodpatcher #include "../ipodpatcher/ipodpatcher.h" + #include "../sansapatcher/sansapatcher.h" }; bool initIpodpatcher(); +bool initSansapatcher(); class BootloaderInstaller : public QObject { @@ -78,6 +80,10 @@ private slots: void ipodPrepare(); void ipodFinish(); + //sansa specific routines + void sansaPrepare(); + void sansaFinish(); + private: QString m_mountpoint, m_device,m_bootloadermethod,m_bootloadername; QString m_bootloaderUrlBase,m_tempfilename; diff --git a/rbutil/rbutilqt/rbutilqt.pro b/rbutil/rbutilqt/rbutilqt.pro index ef558de6a8..dd8e1bca2c 100644 --- a/rbutil/rbutilqt/rbutilqt.pro +++ b/rbutil/rbutilqt/rbutilqt.pro @@ -8,7 +8,8 @@ SOURCES += rbutilqt.cpp \ installzip.cpp \ installbootloader.cpp \ installbl.cpp \ - ../ipodpatcher/ipodpatcher.c + ../ipodpatcher/ipodpatcher.c \ + ../sansapatcher/sansapatcher.c HEADERS += rbutilqt.h \ @@ -27,7 +28,9 @@ HEADERS += rbutilqt.h \ installbl.h \ ../ipodpatcher/ipodpatcher.h \ ../ipodpatcher/ipodio.h \ - ../ipodpatcher/parttypes.h + ../ipodpatcher/parttypes.h \ + ../sansapatcher/sansapatcher.h \ + ../sansapatcher/sansaio.h TEMPLATE = app @@ -46,11 +49,14 @@ RESOURCES += rbutilqt.qrc TRANSLATIONS += rbutil_de.ts QT += network +DEFINES += RBUTIL win32{ SOURCES += ../ipodpatcher/ipodio-win32.c + SOURCES += ../sansapatcher/sansaio-win32.c } -!win32{ +unix{ SOURCES += ../ipodpatcher/ipodio-posix.c + SOURCES += ../sansapatcher/sansaio-posix.c }