1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
9 * Copyright (C) 2007 by Dominik Wenger
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
18 ****************************************************************************/
20 #include "installbootloader.h"
21 #include "irivertools/checksums.h"
24 BootloaderInstaller::BootloaderInstaller(QObject
* parent
): QObject(parent
)
29 void BootloaderInstaller::install(ProgressloggerInterface
* dp
)
33 m_dp
->addItem(tr("Starting bootloader installation"),LOGINFO
);
34 connect(this, SIGNAL(done(bool)), this, SLOT(installEnded(bool)));
36 if(m_bootloadermethod
== "gigabeatf")
38 // connect internal signal
39 connect(this,SIGNAL(prepare()),this,SLOT(gigabeatPrepare()));
40 connect(this,SIGNAL(finish()),this,SLOT(gigabeatFinish()));
42 else if(m_bootloadermethod
== "iaudio")
44 // connect internal signal
45 connect(this,SIGNAL(prepare()),this,SLOT(iaudioPrepare()));
46 connect(this,SIGNAL(finish()),this,SLOT(iaudioFinish()));
48 else if(m_bootloadermethod
== "h10")
50 // connect internal signal
51 connect(this,SIGNAL(prepare()),this,SLOT(h10Prepare()));
52 connect(this,SIGNAL(finish()),this,SLOT(h10Finish()));
54 else if(m_bootloadermethod
== "ipodpatcher")
56 // connect internal signal
57 connect(this,SIGNAL(prepare()),this,SLOT(ipodPrepare()));
58 connect(this,SIGNAL(finish()),this,SLOT(ipodFinish()));
60 else if(m_bootloadermethod
== "sansapatcher")
62 // connect internal signal
63 connect(this,SIGNAL(prepare()),this,SLOT(sansaPrepare()));
64 connect(this,SIGNAL(finish()),this,SLOT(sansaFinish()));
66 else if(m_bootloadermethod
== "fwpatcher")
68 // connect internal signal
69 connect(this,SIGNAL(prepare()),this,SLOT(iriverPrepare()));
70 connect(this,SIGNAL(finish()),this,SLOT(iriverFinish()));
72 else if(m_bootloadermethod
== "mrobe100")
74 // connect internal signal
75 connect(this,SIGNAL(prepare()),this,SLOT(mrobe100Prepare()));
76 connect(this,SIGNAL(finish()),this,SLOT(mrobe100Finish()));
80 m_dp
->addItem(tr("unsupported install Method"),LOGERROR
);
88 void BootloaderInstaller::uninstall(ProgressloggerInterface
* dp
)
92 m_dp
->addItem(tr("Starting bootloader uninstallation"),LOGINFO
);
93 connect(this, SIGNAL(done(bool)), this, SLOT(installEnded(bool)));
95 if(m_bootloadermethod
== "gigabeatf")
97 // connect internal signal
98 connect(this,SIGNAL(prepare()),this,SLOT(gigabeatPrepare()));
100 else if(m_bootloadermethod
== "iaudio")
102 m_dp
->addItem(tr("No uninstallation possible"),LOGWARNING
);
106 else if(m_bootloadermethod
== "iaudio")
108 // connect internal signal
109 connect(this,SIGNAL(prepare()),this,SLOT(h10Prepare()));
111 else if(m_bootloadermethod
== "ipodpatcher")
113 // connect internal signal
114 connect(this,SIGNAL(prepare()),this,SLOT(ipodPrepare()));
116 else if(m_bootloadermethod
== "sansapatcher")
118 // connect internal signal
119 connect(this,SIGNAL(prepare()),this,SLOT(sansaPrepare()));
121 else if(m_bootloadermethod
== "h10")
123 // connect internal signal
124 connect(this,SIGNAL(prepare()),this,SLOT(h10Prepare()));
126 else if(m_bootloadermethod
== "mrobe100")
128 // connect internal signal
129 connect(this,SIGNAL(prepare()),this,SLOT(mrobe100Prepare()));
131 else if(m_bootloadermethod
== "fwpatcher")
133 m_dp
->addItem(tr("No uninstallation possible"),LOGWARNING
);
139 m_dp
->addItem(tr("unsupported install Method"),LOGERROR
);
147 void BootloaderInstaller::downloadRequestFinished(int id
, bool error
)
149 qDebug() << "BootloaderInstall::downloadRequestFinished" << id
<< error
;
150 qDebug() << "error:" << getter
->errorString();
155 void BootloaderInstaller::downloadDone(bool error
)
157 qDebug() << "Install::downloadDone, error:" << error
;
159 // update progress bar
161 int max
= m_dp
->getProgressMax();
164 m_dp
->setProgressMax(max
);
166 m_dp
->setProgressValue(max
);
167 if(getter
->httpResponse() != 200) {
168 m_dp
->addItem(tr("Download error: received HTTP error %1.").arg(getter
->httpResponse()),LOGERROR
);
174 m_dp
->addItem(tr("Download error: %1").arg(getter
->errorString()),LOGERROR
);
179 else m_dp
->addItem(tr("Download finished."),LOGOK
);
185 void BootloaderInstaller::updateDataReadProgress(int read
, int total
)
187 m_dp
->setProgressMax(total
);
188 m_dp
->setProgressValue(read
);
189 qDebug() << "progress:" << read
<< "/" << total
;
193 void BootloaderInstaller::installEnded(bool error
)
199 bool BootloaderInstaller::downloadInfo()
201 // try to get the current build information
202 infodownloader
= new HttpGet(this);
204 connect(infodownloader
, SIGNAL(done(bool)), this, SLOT(infoDownloadDone(bool)));
205 connect(infodownloader
, SIGNAL(requestFinished(int, bool)), this, SLOT(infoRequestFinished(int, bool)));
207 qDebug() << "downloading bootloader info";
208 infodownloader
->setFile(&bootloaderInfo
);
209 infodownloader
->getFile(QUrl(m_bootloaderinfoUrl
));
211 // block until its downloaded
212 qDebug() << "Waiting for Download finished";
213 infoDownloaded
=false;
215 while(!infoDownloaded
)
216 QCoreApplication::processEvents();
220 void BootloaderInstaller::infoDownloadDone(bool error
)
224 qDebug() << "network error:" << infodownloader
->error();
227 qDebug() << "network status:" << infodownloader
->error();
229 infoDownloaded
= true;
232 void BootloaderInstaller::infoRequestFinished(int id
, bool error
)
238 errorString
= tr("Network error: %1. Please check your network and proxy settings.")
239 .arg(infodownloader
->errorString());
241 if(error
) QMessageBox::about(NULL
, "Network Error", errorString
);
243 qDebug() << "downloadDone:" << id
<< error
;
246 infoDownloaded
= true;
248 qDebug() << "infoRequestFinished:" << id
<< error
;
252 void BootloaderInstaller::createInstallLog()
254 m_dp
->addItem(tr("Creating installation log"),LOGINFO
);
255 QSettings
installlog(m_mountpoint
+ "/.rockbox/rbutil.log", QSettings::IniFormat
, 0);
257 bootloaderInfo
.open();
258 QSettings
info(bootloaderInfo
.fileName(), QSettings::IniFormat
, this);
259 bootloaderInfo
.close();
260 info
.beginGroup(m_device
);
262 installlog
.beginGroup("Bootloader");
263 installlog
.setValue("md5sum",info
.value("md5sum").toString());
264 installlog
.endGroup();
268 void BootloaderInstaller::removeInstallLog()
270 m_dp
->addItem(tr("Editing installation log"),LOGINFO
);
271 QSettings
installlog(m_mountpoint
+ "/.rockbox/rbutil.log", QSettings::IniFormat
, 0);
272 installlog
.beginGroup("Bootloader");
273 installlog
.remove("md5sum");
274 installlog
.endGroup();
279 bool BootloaderInstaller::uptodate()
281 QString installedMd5
;
284 QSettings
installlog(m_mountpoint
+ "/.rockbox/rbutil.log", QSettings::IniFormat
, 0);
285 installlog
.beginGroup("Bootloader");
286 installedMd5
= installlog
.value("md5sum").toString();
287 installlog
.endGroup();
289 if(installedMd5
.isEmpty())
291 bootloaderInfo
.open();
292 QSettings
info(bootloaderInfo
.fileName(), QSettings::IniFormat
, this);
293 bootloaderInfo
.close();
294 info
.beginGroup(m_device
);
295 serverMd5
= info
.value("md5sum").toString();
298 if(installedMd5
!= serverMd5
)
304 /**************************************************
305 *** gigabeat secific code
306 ***************************************************/
308 void BootloaderInstaller::gigabeatPrepare()
310 if(m_install
) // Installation
312 QString url
= m_bootloaderUrlBase
+ "/gigabeat/" + m_bootloadername
;
314 m_dp
->addItem(tr("Downloading file %1.%2")
315 .arg(QFileInfo(url
).baseName(), QFileInfo(url
).completeSuffix()),LOGINFO
);
317 // temporary file needs to be opened to get the filename
319 m_tempfilename
= downloadFile
.fileName();
320 downloadFile
.close();
321 // get the real file.
322 getter
= new HttpGet(this);
323 getter
->setFile(&downloadFile
);
324 // connect signals from HttpGet
325 connect(getter
, SIGNAL(done(bool)), this, SLOT(downloadDone(bool)));
326 connect(getter
, SIGNAL(dataReadProgress(int, int)), this, SLOT(updateDataReadProgress(int, int)));
327 connect(m_dp
, SIGNAL(aborted()), getter
, SLOT(abort()));
329 getter
->getFile(QUrl(url
));
331 else //UnInstallation
334 firmware
= resolvePathCase(m_mountpoint
+ "/GBSYSTEM/FWIMG/FWIMG01.DAT");
335 QString firmwareOrig
= resolvePathCase(firmware
.append(".ORIG"));
337 QFileInfo
firmwareOrigFI(firmwareOrig
);
339 // check if original firmware exists
340 if(!firmwareOrigFI
.exists())
342 m_dp
->addItem(tr("Could not find the Original Firmware at: %1")
343 .arg(firmwareOrig
),LOGERROR
);
348 QFile
firmwareFile(firmware
);
349 QFile
firmwareOrigFile(firmwareOrig
);
351 //remove modified firmware
352 if(!firmwareFile
.remove())
354 m_dp
->addItem(tr("Could not remove the Firmware at: %1")
355 .arg(firmware
),LOGERROR
);
360 // rename original firmware back
361 if(!firmwareOrigFile
.rename(firmware
))
363 m_dp
->addItem(tr("Could not copy the Firmware from: %1 to %2")
364 .arg(firmwareOrig
,firmware
),LOGERROR
);
371 emit
done(false); //success
376 void BootloaderInstaller::gigabeatFinish()
378 // this step is only need for installation, so no code for uninstall here
380 m_dp
->addItem(tr("Finishing bootloader install"),LOGINFO
);
383 firmware
= resolvePathCase(m_mountpoint
+ "/GBSYSTEM/FWIMG/" + m_bootloadername
);
385 QFileInfo
firmwareFI(firmware
);
387 // check if firmware exists
388 if(!firmwareFI
.exists())
390 m_dp
->addItem(tr("Could not find the Firmware at: %1")
391 .arg(firmware
),LOGERROR
);
396 QString firmwareOrig
= firmware
;
397 firmwareOrig
.append(".ORIG");
398 QFileInfo
firmwareOrigFI(firmwareOrig
);
400 // rename and backup the firmware, if there is no original firmware there
401 if(!firmwareOrigFI
.exists())
403 QFile
firmwareFile(firmware
);
405 QDir::home().mkdir("Gigabeat Original Firmware Backup");
406 firmwareFile
.copy(QDir::toNativeSeparators(QDir::homePath()) + QDir::toNativeSeparators("/Gigabeat Original Firmware Backup/") + m_bootloadername
);
407 firmwareFile
.unsetError();
409 if(!firmwareFile
.rename(firmwareOrig
))
411 m_dp
->addItem(tr("Could not rename: %1 to %2")
412 .arg(firmware
,firmwareOrig
),LOGERROR
);
417 else // or remove the normal firmware, if the original is there
419 QFile
firmwareFile(firmware
);
420 firmwareFile
.remove();
424 if(!downloadFile
.copy(firmware
))
426 m_dp
->addItem(tr("Could not copy: %1 to %2")
427 .arg(m_tempfilename
,firmware
),LOGERROR
);
432 downloadFile
.remove();
436 m_dp
->addItem(tr("Bootloader install finished successfully."),LOGOK
);
437 m_dp
->addItem(tr("To finish the Bootloader installation, follow the steps below."),LOGINFO
);
438 m_dp
->addItem(tr("1. Eject/Unmount your Device."),LOGINFO
);
439 m_dp
->addItem(tr("2. Unplug USB and any Power adapters."),LOGINFO
);
440 m_dp
->addItem(tr("3. Hold POWER to turn the Device off."),LOGINFO
);
441 m_dp
->addItem(tr("4. Toggle the Battery switch on the Device."),LOGINFO
);
442 m_dp
->addItem(tr("5. Hold POWER to boot the Rockbox bootloader."),LOGINFO
);
447 emit
done(false); // success
451 /**************************************************
452 *** iaudio secific code
453 ***************************************************/
454 void BootloaderInstaller::iaudioPrepare()
457 QString url
= m_bootloaderUrlBase
+ "/iaudio/" + m_bootloadername
;
459 m_dp
->addItem(tr("Downloading file %1.%2")
460 .arg(QFileInfo(url
).baseName(), QFileInfo(url
).completeSuffix()),LOGINFO
);
462 // temporary file needs to be opened to get the filename
464 m_tempfilename
= downloadFile
.fileName();
465 downloadFile
.close();
466 // get the real file.
467 getter
= new HttpGet(this);
468 getter
->setFile(&downloadFile
);
469 getter
->getFile(QUrl(url
));
470 // connect signals from HttpGet
471 connect(getter
, SIGNAL(done(bool)), this, SLOT(downloadDone(bool)));
472 connect(getter
, SIGNAL(dataReadProgress(int, int)), this, SLOT(updateDataReadProgress(int, int)));
473 connect(m_dp
, SIGNAL(aborted()), getter
, SLOT(abort()));
476 void BootloaderInstaller::iaudioFinish()
479 firmware
= resolvePathCase(m_mountpoint
+ "/FIRMWARE/") + "/" + m_bootloadername
;
482 if(!downloadFile
.copy(firmware
))
484 m_dp
->addItem(tr("Could not copy: %1 to %2")
485 .arg(m_tempfilename
,firmware
),LOGERROR
);
490 downloadFile
.remove();
494 m_dp
->addItem(tr("Bootloader install finished successfully."),LOGOK
);
495 m_dp
->addItem(tr("To finish the Bootloader installation, follow the steps below."),LOGINFO
);
496 m_dp
->addItem(tr("1. Eject/Unmount your Device."),LOGINFO
);
497 m_dp
->addItem(tr("2. Turn you Device OFF."),LOGINFO
);
498 m_dp
->addItem(tr("3. Insert Charger."),LOGINFO
);
502 emit
done(false); // success
507 /**************************************************
509 ***************************************************/
510 void BootloaderInstaller::h10Prepare()
512 if(m_install
) // Installation
514 QString url
= m_bootloaderUrlBase
+ "/iriver/" + m_bootloadername
;
516 m_dp
->addItem(tr("Downloading file %1.%2")
517 .arg(QFileInfo(url
).baseName(), QFileInfo(url
).completeSuffix()),LOGINFO
);
519 // temporary file needs to be opened to get the filename
521 m_tempfilename
= downloadFile
.fileName();
522 downloadFile
.close();
523 // get the real file.
524 getter
= new HttpGet(this);
525 getter
->setFile(&downloadFile
);
526 // connect signals from HttpGet
527 connect(getter
, SIGNAL(done(bool)), this, SLOT(downloadDone(bool)));
528 connect(getter
, SIGNAL(dataReadProgress(int, int)), this, SLOT(updateDataReadProgress(int, int)));
529 connect(m_dp
, SIGNAL(aborted()), getter
, SLOT(abort()));
531 getter
->getFile(QUrl(url
));
533 else // Uninstallation
536 QString firmwarename
= m_bootloadername
.section('/', -1);
539 firmware
= resolvePathCase(m_mountpoint
+ "/SYSTEM/" + firmwarename
);
540 QString firmwareOrig
= resolvePathCase(m_mountpoint
+ "/SYSTEM/OF.mi4");
542 QFileInfo
firmwareFI(firmware
);
543 if(!firmwareFI
.exists()) //Firmware dosent exists on player
545 firmware
= resolvePathCase(m_mountpoint
+ "/SYSTEM/H10EMP.mi4");
546 //attempt other firmwarename
547 firmwareFI
.setFile(firmware
);
548 if(!firmwareFI
.exists()) //Firmware dosent exists on player
550 m_dp
->addItem(tr("Firmware does not exist: %1")
551 .arg(firmware
),LOGERROR
);
557 QFileInfo
firmwareOrigFI(firmwareOrig
);
558 if(!firmwareOrigFI
.exists()) //Original Firmware dosent exists on player
560 m_dp
->addItem(tr("Original Firmware does not exist: %1")
561 .arg(firmwareOrig
),LOGERROR
);
566 QFile
firmwareFile(firmware
);
567 QFile
firmwareOrigFile(firmwareOrig
);
569 //remove modified firmware
570 if(!firmwareFile
.remove())
572 m_dp
->addItem(tr("Could not remove the Firmware at: %1")
573 .arg(firmware
),LOGERROR
);
578 // rename original firmware back
579 if(!firmwareOrigFile
.rename(firmware
))
581 m_dp
->addItem(tr("Could not copy the Firmware from: %1 to %2")
582 .arg(firmwareOrig
,firmware
),LOGERROR
);
589 emit
done(false); //success
594 void BootloaderInstaller::h10Finish()
596 QString firmwarename
= m_bootloadername
.section('/', -1);
599 firmware
= resolvePathCase(m_mountpoint
+ "/SYSTEM/" + firmwarename
);
600 QString firmwareOrig
= resolvePathCase(m_mountpoint
+ "/SYSTEM") + "/OF.mi4";
602 QFileInfo
firmwareFI(firmware
);
604 if(!firmwareFI
.exists()) //Firmware dosent exists on player
606 firmware
= resolvePathCase(m_mountpoint
+ "/SYSTEM") +"/H10EMP.mi4";
607 //attempt other firmwarename
608 firmwareFI
.setFile(firmware
);
609 if(!firmwareFI
.exists()) //Firmware dosent exists on player
611 m_dp
->addItem(tr("Firmware does not exist: %1")
612 .arg(firmware
),LOGERROR
);
618 QFileInfo
firmwareOrigFI(firmwareOrig
);
620 if(!firmwareOrigFI
.exists())
622 QFile
firmwareFile(firmware
);
625 QDir::home().mkdir("Iriver H10 Original Firmware Backup");
626 firmwareFile
.copy(QDir::toNativeSeparators(QDir::homePath()) + QDir::toNativeSeparators("/Iriver H10 Original Firmware Backup/") + m_bootloadername
);
627 firmwareFile
.unsetError();
630 if(!firmwareFile
.rename(firmwareOrig
)) //rename Firmware to Original
632 m_dp
->addItem(tr("Could not rename: %1 to %2")
633 .arg(firmware
,firmwareOrig
),LOGERROR
);
638 else //there is already a original firmware
640 QFile
firmwareFile(firmware
);
641 firmwareFile
.remove();
644 if(!downloadFile
.copy(firmware
))
646 m_dp
->addItem(tr("Could not copy: %1 to %2")
647 .arg(m_tempfilename
,firmware
),LOGERROR
);
652 downloadFile
.remove();
656 m_dp
->addItem(tr("Bootloader install finished successfully."),LOGOK
);
659 emit
done(false); // success
665 /**************************************************
666 *** mrobe100 secific code
667 ***************************************************/
668 void BootloaderInstaller::mrobe100Prepare()
670 if(m_install
) // Installation
672 QString url
= m_bootloaderUrlBase
+ "/olympus/mrobe100/" + m_bootloadername
;
674 m_dp
->addItem(tr("Downloading file %1.%2")
675 .arg(QFileInfo(url
).baseName(), QFileInfo(url
).completeSuffix()),LOGINFO
);
677 // temporary file needs to be opened to get the filename
679 m_tempfilename
= downloadFile
.fileName();
680 downloadFile
.close();
681 // get the real file.
682 getter
= new HttpGet(this);
683 getter
->setFile(&downloadFile
);
685 // connect signals from HttpGet
686 connect(getter
, SIGNAL(done(bool)), this, SLOT(downloadDone(bool)));
687 connect(getter
, SIGNAL(dataReadProgress(int, int)), this, SLOT(updateDataReadProgress(int, int)));
688 connect(m_dp
, SIGNAL(aborted()), getter
, SLOT(abort()));
690 getter
->getFile(QUrl(url
));
692 else // Uninstallation
695 QString firmwarename
= m_bootloadername
;
698 firmware
= resolvePathCase(m_mountpoint
+ "/SYSTEM/" + firmwarename
);
699 QString firmwareOrig
= resolvePathCase(m_mountpoint
+ "/SYSTEM/OF.mi4");
701 QFileInfo
firmwareFI(firmware
);
702 if(!firmwareFI
.exists()) //Firmware dosent exists on player
704 m_dp
->addItem(tr("Firmware does not exist: %1")
705 .arg(firmware
),LOGERROR
);
710 QFileInfo
firmwareOrigFI(firmwareOrig
);
711 if(!firmwareOrigFI
.exists()) //Original Firmware dosent exists on player
713 m_dp
->addItem(tr("Original Firmware does not exist: %1")
714 .arg(firmwareOrig
),LOGERROR
);
719 QFile
firmwareFile(firmware
);
720 QFile
firmwareOrigFile(firmwareOrig
);
722 //remove modified firmware
723 if(!firmwareFile
.remove())
725 m_dp
->addItem(tr("Could not remove the Firmware at: %1")
726 .arg(firmware
),LOGERROR
);
731 // move original firmware back
732 if(!firmwareOrigFile
.rename(firmware
))
734 m_dp
->addItem(tr("Could not copy the Firmware from: %1 to %2")
735 .arg(firmwareOrig
,firmware
),LOGERROR
);
742 emit
done(false); //success
747 void BootloaderInstaller::mrobe100Finish()
749 QString firmwarename
= m_bootloadername
;
752 firmware
= resolvePathCase(m_mountpoint
+ "/SYSTEM/" + firmwarename
);
753 // NOTE: the filename for the OF may not exist yet, so resolve path only!
754 QString firmwareOrig
= resolvePathCase(m_mountpoint
+ "/SYSTEM") + "/OF.mi4";
756 QFileInfo
firmwareFI(firmware
);
758 if(!firmwareFI
.exists()) //Firmware dosent exists on player
760 m_dp
->addItem(tr("Firmware does not exist: %1")
761 .arg(firmware
),LOGERROR
);
766 QFileInfo
firmwareOrigFI(firmwareOrig
);
768 if(!firmwareOrigFI
.exists())
770 QFile
firmwareFile(firmware
);
773 QDir::home().mkdir("Olympus mrobe100 Original Firmware Backup");
774 firmwareFile
.copy(QDir::toNativeSeparators(QDir::homePath()) + QDir::toNativeSeparators("/Olympus mrobe100 Original Firmware Backup/") + m_bootloadername
);
775 firmwareFile
.unsetError();
777 if(!firmwareFile
.rename(firmwareOrig
)) //rename Firmware to Original
779 m_dp
->addItem(tr("Could not rename: %1 to %2")
780 .arg(firmware
,firmwareOrig
),LOGERROR
);
785 else //there is already a original firmware
787 QFile
firmwareFile(firmware
);
788 firmwareFile
.remove();
791 if(!downloadFile
.copy(firmware
))
793 m_dp
->addItem(tr("Could not copy: %1 to %2")
794 .arg(m_tempfilename
,firmware
),LOGERROR
);
799 downloadFile
.remove();
803 m_dp
->addItem(tr("Bootloader install finished successfully."),LOGOK
);
806 emit
done(false); // success
810 /**************************************************
811 *** ipod secific code
812 ***************************************************/
814 // reserves memory for ipodpatcher
815 bool initIpodpatcher()
817 if (ipod_alloc_buffer(§orbuf
,BUFFER_SIZE
) < 0) return true;
821 void BootloaderInstaller::ipodPrepare()
823 m_dp
->addItem(tr("Searching for ipods"),LOGINFO
);
826 int n
= ipod_scan(&ipod
);
829 m_dp
->addItem(tr("No Ipods found"),LOGERROR
);
835 m_dp
->addItem(tr("Too many Ipods found"),LOGERROR
);
839 if(m_install
) // Installation
842 QString url
= m_bootloaderUrlBase
+ "/ipod/bootloader-" + m_bootloadername
+ ".ipod";
844 m_dp
->addItem(tr("Downloading file %1.%2")
845 .arg(QFileInfo(url
).baseName(), QFileInfo(url
).completeSuffix()),LOGINFO
);
847 // temporary file needs to be opened to get the filename
849 m_tempfilename
= downloadFile
.fileName();
850 downloadFile
.close();
851 // get the real file.
852 getter
= new HttpGet(this);
853 getter
->setFile(&downloadFile
);
855 // connect signals from HttpGet
856 connect(getter
, SIGNAL(done(bool)), this, SLOT(downloadDone(bool)));
857 connect(getter
, SIGNAL(dataReadProgress(int, int)), this, SLOT(updateDataReadProgress(int, int)));
858 connect(m_dp
, SIGNAL(aborted()), getter
, SLOT(abort()));
860 getter
->getFile(QUrl(url
));
862 else // Uninstallation
864 if (ipod_open(&ipod
, 0) < 0)
866 m_dp
->addItem(tr("could not open ipod"),LOGERROR
);
871 if (read_partinfo(&ipod
,0) < 0)
873 m_dp
->addItem(tr("could not read partitiontable"),LOGERROR
);
878 if (ipod
.pinfo
[0].start
==0)
880 m_dp
->addItem(tr("No partition 0 on disk"),LOGERROR
);
883 double sectors_per_MB
= (1024.0*1024.0)/ipod
.sector_size
;
884 m_dp
->addItem(tr("[INFO] Part Start Sector End Sector Size (MB) Type\n"),LOGINFO
);
885 for ( i
= 0; i
< 4; i
++ )
887 if (ipod
.pinfo
[i
].start
!= 0)
889 m_dp
->addItem(tr("[INFO] %1 %2 %3 %4 %5 (%6)").arg(
891 ipod
.pinfo
[i
].start
).arg(
892 ipod
.pinfo
[i
].start
+ipod
.pinfo
[i
].size
-1).arg(
893 ipod
.pinfo
[i
].size
/sectors_per_MB
).arg(
894 get_parttype(ipod
.pinfo
[i
].type
)).arg(
895 ipod
.pinfo
[i
].type
),LOGINFO
);
902 read_directory(&ipod
);
904 if (ipod
.nimages
<= 0)
906 m_dp
->addItem(tr("Failed to read firmware directory"),LOGERROR
);
910 if (getmodel(&ipod
,(ipod
.ipod_directory
[0].vers
>>8)) < 0)
912 m_dp
->addItem(tr("Unknown version number in firmware (%1)").arg(
913 ipod
.ipod_directory
[0].vers
),LOGERROR
);
920 m_dp
->addItem(tr("Warning this is a MacPod, Rockbox doesnt work on "
921 "this. Convert it to WinPod\n"
922 "See http://www.rockbox.org/wiki/IpodConversionToFAT32"),
928 if (ipod_reopen_rw(&ipod
) < 0)
930 m_dp
->addItem(tr("Could not open Ipod in RW mode"),LOGERROR
);
935 if (ipod
.ipod_directory
[0].entryOffset
==0) {
936 m_dp
->addItem(tr("No bootloader detected."),LOGERROR
);
941 if (delete_bootloader(&ipod
)==0)
943 m_dp
->addItem(tr("Successfully removed Bootloader"),LOGOK
);
951 m_dp
->addItem(tr("--delete-bootloader failed."),LOGERROR
);
959 void BootloaderInstaller::ipodFinish()
964 if (ipod_open(&ipod
, 0) < 0)
966 m_dp
->addItem(tr("could not open ipod"),LOGERROR
);
971 if (read_partinfo(&ipod
,0) < 0)
973 m_dp
->addItem(tr("could not read partitiontable"),LOGERROR
);
978 if (ipod
.pinfo
[0].start
==0)
980 m_dp
->addItem(tr("No partition 0 on disk"),LOGERROR
);
983 double sectors_per_MB
= (1024.0*1024.0)/ipod
.sector_size
;
985 m_dp
->addItem(tr("[INFO] Part Start Sector End Sector Size (MB) Type\n"),LOGINFO
);
987 for ( i
= 0; i
< 4; i
++ )
989 if (ipod
.pinfo
[i
].start
!= 0)
991 m_dp
->addItem(tr("[INFO] %1 %2 %3 %4 %5 (%6)").arg(
993 ipod
.pinfo
[i
].start
).arg(
994 ipod
.pinfo
[i
].start
+ipod
.pinfo
[i
].size
-1).arg(
995 ipod
.pinfo
[i
].size
/sectors_per_MB
).arg(
996 get_parttype(ipod
.pinfo
[i
].type
)).arg(
997 ipod
.pinfo
[i
].type
),LOGWARNING
);
1004 read_directory(&ipod
);
1006 if (ipod
.nimages
<= 0)
1008 m_dp
->addItem(tr("Failed to read firmware directory"),LOGERROR
);
1012 if (getmodel(&ipod
,(ipod
.ipod_directory
[0].vers
>>8)) < 0)
1014 m_dp
->addItem(tr("Unknown version number in firmware (%1)").arg(
1015 ipod
.ipod_directory
[0].vers
),LOGERROR
);
1022 m_dp
->addItem(tr("Warning this is a MacPod, Rockbox doesnt work on "
1023 "this. Convert it to WinPod\n"
1024 "See http://www.rockbox.org/wiki/IpodConversionToFAT32"),
1030 if (ipod_reopen_rw(&ipod
) < 0)
1032 m_dp
->addItem(tr("Could not open Ipod in RW mode"),LOGERROR
);
1037 if (add_bootloader(&ipod
, m_tempfilename
.toLatin1().data(), FILETYPE_DOT_IPOD
)==0)
1039 m_dp
->addItem(tr("Successfully added Bootloader"),LOGOK
);
1047 m_dp
->addItem(tr("failed to add Bootloader"),LOGERROR
);
1054 /**************************************************
1055 *** sansa secific code
1056 ***************************************************/
1057 // reserves memory for sansapatcher
1058 bool initSansapatcher()
1060 if (sansa_alloc_buffer(§orbuf
,BUFFER_SIZE
) < 0) return true;
1065 void BootloaderInstaller::sansaPrepare()
1067 m_dp
->addItem(tr("Searching for sansas"),LOGINFO
);
1068 struct sansa_t sansa
;
1070 int n
= sansa_scan(&sansa
);
1073 m_dp
->addItem(tr("No Sansa found"),LOGERROR
);
1079 m_dp
->addItem(tr("Too many Sansas found"),LOGERROR
);
1083 if(m_install
) // Installation
1085 QString url
= m_bootloaderUrlBase
+ "/sandisk-sansa/"
1086 + QString(sansa
.targetname
) + "/" + m_bootloadername
;
1088 m_dp
->addItem(tr("Downloading file %1.%2")
1089 .arg(QFileInfo(url
).baseName(), QFileInfo(url
).completeSuffix()),LOGINFO
);
1091 // temporary file needs to be opened to get the filename
1092 downloadFile
.open();
1093 m_tempfilename
= downloadFile
.fileName();
1094 downloadFile
.close();
1095 // get the real file.
1096 getter
= new HttpGet(this);
1097 getter
->setFile(&downloadFile
);
1099 // connect signals from HttpGet
1100 connect(getter
, SIGNAL(done(bool)), this, SLOT(downloadDone(bool)));
1101 connect(getter
, SIGNAL(dataReadProgress(int, int)), this, SLOT(updateDataReadProgress(int, int)));
1102 connect(m_dp
, SIGNAL(aborted()), getter
, SLOT(abort()));
1104 getter
->getFile(QUrl(url
));
1106 else // Uninstallation
1109 if (sansa_open(&sansa
, 0) < 0)
1111 m_dp
->addItem(tr("could not open Sansa"),LOGERROR
);
1116 if (sansa_read_partinfo(&sansa
,0) < 0)
1118 m_dp
->addItem(tr("could not read partitiontable"),LOGERROR
);
1123 int i
= is_sansa(&sansa
);
1125 m_dp
->addItem(tr("Disk is not a Sansa (%1), aborting.").arg(i
),LOGERROR
);
1130 if (sansa
.hasoldbootloader
)
1132 m_dp
->addItem(tr("********************************************\n"
1133 "OLD ROCKBOX INSTALLATION DETECTED, ABORTING.\n"
1134 "You must reinstall the original Sansa firmware before running\n"
1135 "sansapatcher for the first time.\n"
1136 "See http://www.rockbox.org/wiki/SansaE200Install\n"
1137 "*********************************************\n"),LOGERROR
);
1143 if (sansa_reopen_rw(&sansa
) < 0)
1145 m_dp
->addItem(tr("Could not open Sansa in RW mode"),LOGERROR
);
1150 if (sansa_delete_bootloader(&sansa
)==0)
1152 m_dp
->addItem(tr("Successfully removed Bootloader"),LOGOK
);
1155 sansa_close(&sansa
);
1160 m_dp
->addItem(tr("--delete-bootloader failed."),LOGERROR
);
1162 sansa_close(&sansa
);
1168 void BootloaderInstaller::sansaFinish()
1170 struct sansa_t sansa
;
1173 if (sansa_open(&sansa
, 0) < 0)
1175 m_dp
->addItem(tr("could not open Sansa"),LOGERROR
);
1180 if (sansa_read_partinfo(&sansa
,0) < 0)
1182 m_dp
->addItem(tr("could not read partitiontable"),LOGERROR
);
1188 int i
= is_sansa(&sansa
);
1191 m_dp
->addItem(tr("Disk is not a Sansa (%1), aborting.").arg(i
),LOGERROR
);
1196 if (sansa
.hasoldbootloader
)
1198 m_dp
->addItem(tr("********************************************\n"
1199 "OLD ROCKBOX INSTALLATION DETECTED, ABORTING.\n"
1200 "You must reinstall the original Sansa firmware before running\n"
1201 "sansapatcher for the first time.\n"
1202 "See http://www.rockbox.org/wiki/SansaE200Install\n"
1203 "*********************************************\n"),LOGERROR
);
1208 if (sansa_reopen_rw(&sansa
) < 0)
1210 m_dp
->addItem(tr("Could not open Sansa in RW mode"),LOGERROR
);
1215 if (sansa_add_bootloader(&sansa
, m_tempfilename
.toLatin1().data(), FILETYPE_MI4
)==0)
1217 m_dp
->addItem(tr("Successfully added Bootloader"),LOGOK
);
1220 sansa_close(&sansa
);
1225 m_dp
->addItem(tr("failed to add Bootloader"),LOGERROR
);
1226 sansa_close(&sansa
);
1233 /**************************************************
1234 *** iriver /fwpatcher secific code
1235 ***************************************************/
1237 void BootloaderInstaller::iriverPrepare()
1239 char md5sum_str
[32];
1240 if (!FileMD5(m_origfirmware
, md5sum_str
)) {
1241 m_dp
->addItem(tr("Could not MD5Sum original firmware"),LOGERROR
);
1246 /* Check firmware against md5sums in h120sums and h100sums */
1248 table_entry
= intable(md5sum_str
, &h120pairs
[0],
1249 sizeof(h120pairs
)/sizeof(struct sumpairs
));
1250 if (table_entry
>= 0) {
1255 table_entry
= intable(md5sum_str
, &h100pairs
[0],
1256 sizeof(h100pairs
)/sizeof(struct sumpairs
));
1257 if (table_entry
>= 0)
1263 table_entry
= intable(md5sum_str
, &h300pairs
[0],
1264 sizeof(h300pairs
)/sizeof(struct sumpairs
));
1265 if (table_entry
>= 0)
1271 m_dp
->addItem(tr("Could not detect firmware type"),LOGERROR
);
1276 QString url
= m_bootloaderUrlBase
+ "/iriver/" + m_bootloadername
;
1278 m_dp
->addItem(tr("Downloading file %1.%2")
1279 .arg(QFileInfo(url
).baseName(), QFileInfo(url
).completeSuffix()),LOGINFO
);
1281 // temporary file needs to be opened to get the filename
1282 downloadFile
.open();
1283 m_tempfilename
= downloadFile
.fileName();
1284 downloadFile
.close();
1285 // get the real file.
1286 getter
= new HttpGet(this);
1287 getter
->setFile(&downloadFile
);
1289 // connect signals from HttpGet
1290 connect(getter
, SIGNAL(done(bool)), this, SLOT(downloadDone(bool)));
1291 connect(getter
, SIGNAL(dataReadProgress(int, int)), this, SLOT(updateDataReadProgress(int, int)));
1292 connect(m_dp
, SIGNAL(aborted()), getter
, SLOT(abort()));
1294 getter
->getFile(QUrl(url
));
1297 void BootloaderInstaller::iriverFinish()
1300 char md5sum_str
[32];
1301 struct sumpairs
*sums
= 0;
1304 /* get pointer to the correct bootloader.bin */
1307 sums
= &h100pairs
[0];
1311 sums
= &h120pairs
[0];
1315 sums
= &h300pairs
[0];
1320 // temporary files needs to be opened to get the filename
1321 QTemporaryFile firmwareBin
, newBin
, newHex
;
1325 QString firmwareBinName
= firmwareBin
.fileName();
1326 QString newBinName
= newBin
.fileName();
1327 QString newHexName
= newHex
.fileName();
1328 firmwareBin
.close();
1334 if ((result
= iriver_decode(m_origfirmware
, firmwareBinName
, FALSE
, STRIP_NONE
)) < 0)
1338 case -1: error
= tr("Can't open input file"); break;
1339 case -2: error
= tr("Can't open output file"); break;
1340 case -3: error
= tr("invalid file: header length wrong"); break;
1341 case -4: error
= tr("invalid file: unrecognized header"); break;
1342 case -5: error
= tr("invalid file: \"length\" field wrong"); break;
1343 case -6: error
= tr("invalid file: \"length2\" field wrong"); break;
1344 case -7: error
= tr("invalid file: internal checksum error"); break;
1345 case -8: error
= tr("invalid file: \"length3\" field wrong"); break;
1346 default: error
= tr("unknown"); break;
1348 m_dp
->addItem(tr("Error in descramble: %1").arg(error
), LOGERROR
);
1349 firmwareBin
.remove();
1356 if((result
= mkboot(firmwareBinName
, newBinName
, m_tempfilename
, origin
)) < 0)
1360 case -1: error
= tr("could not open input file"); break;
1361 case -2: error
= tr("reading header failed"); break;
1362 case -3: error
= tr("reading firmware failed"); break;
1363 case -4: error
= tr("can't open bootloader file"); break;
1364 case -5: error
= tr("reading bootloader file failed"); break;
1365 case -6: error
= tr("can't open output file"); break;
1366 case -7: error
= tr("writing output file failed"); break;
1368 m_dp
->addItem(tr("Error in patching: %1").arg(error
), LOGERROR
);
1370 firmwareBin
.remove();
1377 if((result
= iriver_encode(newBinName
, newHexName
, FALSE
)) < 0)
1381 case -1: error
= tr("Can't open input file"); break;
1382 case -2: error
= tr("Can't open output file"); break;
1383 case -3: error
= tr("invalid file: header length wrong"); break;
1384 case -4: error
= tr("invalid file: unrecognized header"); break;
1385 case -5: error
= tr("invalid file: \"length\" field wrong"); break;
1386 case -6: error
= tr("invalid file: \"length2\" field wrong"); break;
1387 case -7: error
= tr("invalid file: internal checksum error"); break;
1388 case -8: error
= tr("invalid file: \"length3\" field wrong"); break;
1389 default: error
= tr("unknown"); break;
1391 m_dp
->addItem(tr("Error in scramble: %1").arg(error
), LOGERROR
);
1393 firmwareBin
.remove();
1401 if (!FileMD5(newHexName
, md5sum_str
))
1403 m_dp
->addItem(tr("Error in checksumming"),LOGERROR
);
1404 firmwareBin
.remove();
1410 if (strncmp(sums
[table_entry
].patched
, md5sum_str
, 32) == 0) {
1411 /* delete temp files */
1412 firmwareBin
.remove();
1416 // Load patched Firmware to player
1419 dest
= m_mountpoint
+ "/ihp_100.hex";
1420 else if(series
== 120)
1421 dest
= m_mountpoint
+ "/ihp_120.hex";
1422 else if(series
== 300)
1423 dest
= m_mountpoint
+ "/H300.hex";
1426 QFile
destfile(dest
);
1427 if(destfile
.exists()) destfile
.remove();
1428 if(!newHex
.copy(dest
))
1430 m_dp
->addItem(tr("Could not copy: %1 to %2")
1431 .arg(newHexName
,dest
),LOGERROR
);
1436 downloadFile
.remove();
1441 m_dp
->addItem(tr("Bootloader install finished successfully."),LOGOK
);
1442 m_dp
->addItem(tr("To finish the Bootloader installation, follow the steps below."),LOGINFO
);
1443 m_dp
->addItem(tr("1. Eject/Unmount your Device."),LOGINFO
);
1444 m_dp
->addItem(tr("2. Boot into the original Firmware."),LOGINFO
);
1445 m_dp
->addItem(tr("3. Use the Firmware flash option in the Original Firmware."),LOGINFO
);
1446 m_dp
->addItem(tr("4. Reboot."),LOGINFO
);
1449 emit
done(false); // success