1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
9 * Copyright (C) 2007 by Dominik Wenger
10 * $Id: installbootloader.cpp 13990 2007-07-25 22:26:10Z 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"
23 BootloaderInstaller::BootloaderInstaller(QObject
* parent
): QObject(parent
)
28 void BootloaderInstaller::install(ProgressloggerInterface
* dp
)
32 m_dp
->addItem(tr("Starting bootloader installation"),LOGINFO
);
33 connect(this, SIGNAL(done(bool)), this, SLOT(installEnded(bool)));
35 if(m_bootloadermethod
== "gigabeatf")
37 // connect internal signal
38 connect(this,SIGNAL(prepare()),this,SLOT(gigabeatPrepare()));
39 connect(this,SIGNAL(finish()),this,SLOT(gigabeatFinish()));
41 else if(m_bootloadermethod
== "iaudio")
43 // connect internal signal
44 connect(this,SIGNAL(prepare()),this,SLOT(iaudioPrepare()));
45 connect(this,SIGNAL(finish()),this,SLOT(iaudioFinish()));
47 else if(m_bootloadermethod
== "h10")
49 // connect internal signal
50 connect(this,SIGNAL(prepare()),this,SLOT(h10Prepare()));
51 connect(this,SIGNAL(finish()),this,SLOT(h10Finish()));
53 else if(m_bootloadermethod
== "ipodpatcher")
55 // connect internal signal
56 connect(this,SIGNAL(prepare()),this,SLOT(ipodPrepare()));
57 connect(this,SIGNAL(finish()),this,SLOT(ipodFinish()));
59 else if(m_bootloadermethod
== "sansapatcher")
61 // connect internal signal
62 connect(this,SIGNAL(prepare()),this,SLOT(sansaPrepare()));
63 connect(this,SIGNAL(finish()),this,SLOT(sansaFinish()));
65 else if(m_bootloadermethod
== "fwpatcher")
67 // connect internal signal
68 connect(this,SIGNAL(prepare()),this,SLOT(iriverPrepare()));
69 connect(this,SIGNAL(finish()),this,SLOT(iriverFinish()));
73 m_dp
->addItem(tr("unsupported install Method"),LOGERROR
);
81 void BootloaderInstaller::uninstall(ProgressloggerInterface
* dp
)
85 m_dp
->addItem(tr("Starting bootloader uninstallation"),LOGINFO
);
86 connect(this, SIGNAL(done(bool)), this, SLOT(installEnded(bool)));
88 if(m_bootloadermethod
== "gigabeatf")
90 // connect internal signal
91 connect(this,SIGNAL(prepare()),this,SLOT(gigabeatPrepare()));
93 else if(m_bootloadermethod
== "iaudio")
95 m_dp
->addItem(tr("No uninstallation possible"),LOGWARNING
);
99 else if(m_bootloadermethod
== "iaudio")
101 // connect internal signal
102 connect(this,SIGNAL(prepare()),this,SLOT(h10Prepare()));
104 else if(m_bootloadermethod
== "ipodpatcher")
106 // connect internal signal
107 connect(this,SIGNAL(prepare()),this,SLOT(ipodPrepare()));
109 else if(m_bootloadermethod
== "sansapatcher")
111 // connect internal signal
112 connect(this,SIGNAL(prepare()),this,SLOT(sansaPrepare()));
114 else if(m_bootloadermethod
== "fwpatcher")
116 m_dp
->addItem(tr("No uninstallation possible"),LOGWARNING
);
122 m_dp
->addItem(tr("unsupported install Method"),LOGERROR
);
130 void BootloaderInstaller::downloadRequestFinished(int id
, bool error
)
132 qDebug() << "BootloaderInstall::downloadRequestFinished" << id
<< error
;
133 qDebug() << "error:" << getter
->errorString();
138 void BootloaderInstaller::downloadDone(bool error
)
140 qDebug() << "Install::downloadDone, error:" << error
;
142 // update progress bar
144 int max
= m_dp
->getProgressMax();
147 m_dp
->setProgressMax(max
);
149 m_dp
->setProgressValue(max
);
150 if(getter
->httpResponse() != 200) {
151 m_dp
->addItem(tr("Download error: received HTTP error %1.").arg(getter
->httpResponse()),LOGERROR
);
157 m_dp
->addItem(tr("Download error: %1").arg(getter
->errorString()),LOGERROR
);
162 else m_dp
->addItem(tr("Download finished."),LOGOK
);
168 void BootloaderInstaller::updateDataReadProgress(int read
, int total
)
170 m_dp
->setProgressMax(total
);
171 m_dp
->setProgressValue(read
);
172 qDebug() << "progress:" << read
<< "/" << total
;
176 void BootloaderInstaller::installEnded(bool error
)
183 /**************************************************
184 *** gigabeat secific code
185 ***************************************************/
187 void BootloaderInstaller::gigabeatPrepare()
189 if(m_install
) // Installation
191 QString url
= m_bootloaderUrlBase
+ "/gigabeat/" + m_bootloadername
;
193 m_dp
->addItem(tr("Downloading file %1.%2")
194 .arg(QFileInfo(url
).baseName(), QFileInfo(url
).completeSuffix()),LOGINFO
);
196 // temporary file needs to be opened to get the filename
198 m_tempfilename
= downloadFile
.fileName();
199 downloadFile
.close();
200 // get the real file.
201 getter
= new HttpGet(this);
202 getter
->setProxy(m_proxy
);
203 getter
->setFile(&downloadFile
);
204 getter
->getFile(QUrl(url
));
205 // connect signals from HttpGet
206 connect(getter
, SIGNAL(done(bool)), this, SLOT(downloadDone(bool)));
207 connect(getter
, SIGNAL(dataReadProgress(int, int)), this, SLOT(updateDataReadProgress(int, int)));
208 connect(m_dp
, SIGNAL(aborted()), getter
, SLOT(abort()));
210 else //UnInstallation
212 QString firmware
= m_mountpoint
+ "/GBSYSTEM/FWIMG/FWIMG01.DAT";
213 QString firmwareOrig
= firmware
.append(".ORIG");
215 QFileInfo
firmwareOrigFI(firmwareOrig
);
217 // check if original firmware exists
218 if(!firmwareOrigFI
.exists())
220 m_dp
->addItem(tr("Could not find the Original Firmware at: %1")
221 .arg(firmwareOrig
),LOGERROR
);
226 QFile
firmwareFile(firmware
);
227 QFile
firmwareOrigFile(firmwareOrig
);
229 //remove modified firmware
230 if(!firmwareFile
.remove())
232 m_dp
->addItem(tr("Could not remove the Firmware at: %1")
233 .arg(firmware
),LOGERROR
);
238 //copy original firmware
239 if(!firmwareOrigFile
.copy(firmware
))
241 m_dp
->addItem(tr("Could not copy the Firmware from: %1 to %2")
242 .arg(firmwareOrig
,firmware
),LOGERROR
);
247 emit
done(false); //success
252 void BootloaderInstaller::gigabeatFinish()
254 // this step is only need for installation, so no code for uninstall here
256 m_dp
->addItem(tr("Finishing bootloader install"),LOGINFO
);
258 QString firmware
= m_mountpoint
+ "/GBSYSTEM/FWIMG/" + m_bootloadername
;
260 QFileInfo
firmwareFI(firmware
);
262 // check if firmware exists
263 if(!firmwareFI
.exists())
265 m_dp
->addItem(tr("Could not find the Firmware at: %1")
266 .arg(firmware
),LOGERROR
);
271 QString firmwareOrig
= firmware
;
272 firmwareOrig
.append(".ORIG");
273 QFileInfo
firmwareOrigFI(firmwareOrig
);
275 // rename the firmware, if there is no original firmware there
276 if(!firmwareOrigFI
.exists())
278 QFile
firmwareFile(firmware
);
279 if(!firmwareFile
.rename(firmwareOrig
))
281 m_dp
->addItem(tr("Could not rename: %1 to %2")
282 .arg(firmware
,firmwareOrig
),LOGERROR
);
287 else // or remove the normal firmware, if the original is there
289 QFile
firmwareFile(firmware
);
290 firmwareFile
.remove();
294 if(!downloadFile
.copy(firmware
))
296 m_dp
->addItem(tr("Could not copy: %1 to %2")
297 .arg(m_tempfilename
,firmware
),LOGERROR
);
302 downloadFile
.remove();
304 m_dp
->addItem(tr("Bootloader install finished successfully."),LOGOK
);
307 emit
done(false); // success
311 /**************************************************
312 *** iaudio secific code
313 ***************************************************/
314 void BootloaderInstaller::iaudioPrepare()
317 QString url
= m_bootloaderUrlBase
+ "/iaudio/" + m_bootloadername
;
319 m_dp
->addItem(tr("Downloading file %1.%2")
320 .arg(QFileInfo(url
).baseName(), QFileInfo(url
).completeSuffix()),LOGINFO
);
322 // temporary file needs to be opened to get the filename
324 m_tempfilename
= downloadFile
.fileName();
325 downloadFile
.close();
326 // get the real file.
327 getter
= new HttpGet(this);
328 getter
->setProxy(m_proxy
);
329 getter
->setFile(&downloadFile
);
330 getter
->getFile(QUrl(url
));
331 // connect signals from HttpGet
332 connect(getter
, SIGNAL(done(bool)), this, SLOT(downloadDone(bool)));
333 connect(getter
, SIGNAL(dataReadProgress(int, int)), this, SLOT(updateDataReadProgress(int, int)));
334 connect(m_dp
, SIGNAL(aborted()), getter
, SLOT(abort()));
337 void BootloaderInstaller::iaudioFinish()
339 QString firmware
= m_mountpoint
+ "/FIRMWARE/" + m_bootloadername
;
342 if(!downloadFile
.copy(firmware
))
344 m_dp
->addItem(tr("Could not copy: %1 to %2")
345 .arg(m_tempfilename
,firmware
),LOGERROR
);
350 downloadFile
.remove();
352 m_dp
->addItem(tr("Bootloader install finished successfully."),LOGOK
);
355 emit
done(false); // success
360 /**************************************************
362 ***************************************************/
363 void BootloaderInstaller::h10Prepare()
365 if(m_install
) // Installation
367 QString url
= m_bootloaderUrlBase
+ "/iriver/" + m_bootloadername
;
369 m_dp
->addItem(tr("Downloading file %1.%2")
370 .arg(QFileInfo(url
).baseName(), QFileInfo(url
).completeSuffix()),LOGINFO
);
372 // temporary file needs to be opened to get the filename
374 m_tempfilename
= downloadFile
.fileName();
375 downloadFile
.close();
376 // get the real file.
377 getter
= new HttpGet(this);
378 getter
->setProxy(m_proxy
);
379 getter
->setFile(&downloadFile
);
380 getter
->getFile(QUrl(url
));
381 // connect signals from HttpGet
382 connect(getter
, SIGNAL(done(bool)), this, SLOT(downloadDone(bool)));
383 connect(getter
, SIGNAL(dataReadProgress(int, int)), this, SLOT(updateDataReadProgress(int, int)));
384 connect(m_dp
, SIGNAL(aborted()), getter
, SLOT(abort()));
386 else // Uninstallation
389 QString firmwarename
= m_bootloadername
.section('/', -1);
391 QString firmware
= m_mountpoint
+ "/SYSTEM/" + firmwarename
;
392 QString firmwareOrig
= m_mountpoint
+ "/SYSTEM/Original.mi4";
394 QFileInfo
firmwareFI(firmware
);
395 if(!firmwareFI
.exists()) //Firmware dosent exists on player
397 firmware
= m_mountpoint
+ "/SYSTEM/H10EMP.mi4"; //attempt other firmwarename
398 firmwareFI
.setFile(firmware
);
399 if(!firmwareFI
.exists()) //Firmware dosent exists on player
401 m_dp
->addItem(tr("Firmware doesn not exist: %1")
402 .arg(firmware
),LOGERROR
);
408 QFileInfo
firmwareOrigFI(firmwareOrig
);
409 if(!firmwareOrigFI
.exists()) //Original Firmware dosent exists on player
411 m_dp
->addItem(tr("Original Firmware doesn not exist: %1")
412 .arg(firmwareOrig
),LOGERROR
);
417 QFile
firmwareFile(firmware
);
418 QFile
firmwareOrigFile(firmwareOrig
);
420 //remove modified firmware
421 if(!firmwareFile
.remove())
423 m_dp
->addItem(tr("Could not remove the Firmware at: %1")
424 .arg(firmware
),LOGERROR
);
429 //copy original firmware
430 if(!firmwareOrigFile
.copy(firmware
))
432 m_dp
->addItem(tr("Could not copy the Firmware from: %1 to %2")
433 .arg(firmwareOrig
,firmware
),LOGERROR
);
438 emit
done(false); //success
443 void BootloaderInstaller::h10Finish()
445 QString firmwarename
= m_bootloadername
.section('/', -1);
447 QString firmware
= m_mountpoint
+ "/SYSTEM/" + firmwarename
;
448 QString firmwareOrig
= m_mountpoint
+ "/SYSTEM/Original.mi4";
450 QFileInfo
firmwareFI(firmware
);
452 if(!firmwareFI
.exists()) //Firmware dosent exists on player
454 firmware
= m_mountpoint
+ "/SYSTEM/H10EMP.mi4"; //attempt other firmwarename
455 firmwareFI
.setFile(firmware
);
456 if(!firmwareFI
.exists()) //Firmware dosent exists on player
458 m_dp
->addItem(tr("Firmware does not exist: %1")
459 .arg(firmware
),LOGERROR
);
465 QFileInfo
firmwareOrigFI(firmwareOrig
);
467 if(!firmwareOrigFI
.exists()) //there is already a original firmware
469 QFile
firmwareFile(firmware
);
470 if(!firmwareFile
.rename(firmwareOrig
)) //rename Firmware to Original
472 m_dp
->addItem(tr("Could not rename: %1 to %2")
473 .arg(firmware
,firmwareOrig
),LOGERROR
);
480 QFile
firmwareFile(firmware
);
481 firmwareFile
.remove();
484 if(!downloadFile
.copy(firmware
))
486 m_dp
->addItem(tr("Could not copy: %1 to %2")
487 .arg(m_tempfilename
,firmware
),LOGERROR
);
492 downloadFile
.remove();
494 m_dp
->addItem(tr("Bootloader install finished successfully."),LOGOK
);
497 emit
done(false); // success
501 /**************************************************
502 *** ipod secific code
503 ***************************************************/
505 // reserves memory for ipodpatcher
506 bool initIpodpatcher()
508 if (ipod_alloc_buffer(§orbuf
,BUFFER_SIZE
) < 0) return true;
512 void BootloaderInstaller::ipodPrepare()
514 m_dp
->addItem(tr("Searching for ipods"),LOGINFO
);
517 int n
= ipod_scan(&ipod
);
520 m_dp
->addItem(tr("No Ipods found"),LOGERROR
);
526 m_dp
->addItem(tr("Too many Ipods found"),LOGERROR
);
530 if(m_install
) // Installation
533 QString url
= m_bootloaderUrlBase
+ "/ipod/bootloader-" + m_bootloadername
+ ".ipod";
535 m_dp
->addItem(tr("Downloading file %1.%2")
536 .arg(QFileInfo(url
).baseName(), QFileInfo(url
).completeSuffix()),LOGINFO
);
538 // temporary file needs to be opened to get the filename
540 m_tempfilename
= downloadFile
.fileName();
541 downloadFile
.close();
542 // get the real file.
543 getter
= new HttpGet(this);
544 getter
->setProxy(m_proxy
);
545 getter
->setFile(&downloadFile
);
546 getter
->getFile(QUrl(url
));
547 // connect signals from HttpGet
548 connect(getter
, SIGNAL(done(bool)), this, SLOT(downloadDone(bool)));
549 connect(getter
, SIGNAL(dataReadProgress(int, int)), this, SLOT(updateDataReadProgress(int, int)));
550 connect(m_dp
, SIGNAL(aborted()), getter
, SLOT(abort()));
552 else // Uninstallation
554 if (ipod_open(&ipod
, 0) < 0)
556 m_dp
->addItem(tr("could not open ipod"),LOGERROR
);
561 if (read_partinfo(&ipod
,0) < 0)
563 m_dp
->addItem(tr("could not read partitiontable"),LOGERROR
);
568 if (ipod
.pinfo
[0].start
==0)
570 m_dp
->addItem(tr("No partition 0 on disk"),LOGERROR
);
573 double sectors_per_MB
= (1024.0*1024.0)/ipod
.sector_size
;
574 m_dp
->addItem(tr("[INFO] Part Start Sector End Sector Size (MB) Type\n"),LOGINFO
);
575 for ( i
= 0; i
< 4; i
++ )
577 if (ipod
.pinfo
[i
].start
!= 0)
579 m_dp
->addItem(tr("[INFO] %1 %2 %3 %4 %5 (%6)").arg(
581 ipod
.pinfo
[i
].start
).arg(
582 ipod
.pinfo
[i
].start
+ipod
.pinfo
[i
].size
-1).arg(
583 ipod
.pinfo
[i
].size
/sectors_per_MB
).arg(
584 get_parttype(ipod
.pinfo
[i
].type
)).arg(
585 ipod
.pinfo
[i
].type
),LOGINFO
);
592 read_directory(&ipod
);
594 if (ipod
.nimages
<= 0)
596 m_dp
->addItem(tr("Failed to read firmware directory"),LOGERROR
);
600 if (getmodel(&ipod
,(ipod
.ipod_directory
[0].vers
>>8)) < 0)
602 m_dp
->addItem(tr("Unknown version number in firmware (%1)").arg(
603 ipod
.ipod_directory
[0].vers
),LOGERROR
);
610 m_dp
->addItem(tr("Warning this is a MacPod, Rockbox doesnt work on this. Convert it to WinPod"),LOGWARNING
);
613 if (ipod_reopen_rw(&ipod
) < 0)
615 m_dp
->addItem(tr("Could not open Ipod in RW mode"),LOGERROR
);
620 if (ipod
.ipod_directory
[0].entryOffset
==0) {
621 m_dp
->addItem(tr("No bootloader detected."),LOGERROR
);
626 if (delete_bootloader(&ipod
)==0)
628 m_dp
->addItem(tr("Successfully removed Bootloader"),LOGOK
);
635 m_dp
->addItem(tr("--delete-bootloader failed."),LOGERROR
);
643 void BootloaderInstaller::ipodFinish()
648 if (ipod_open(&ipod
, 0) < 0)
650 m_dp
->addItem(tr("could not open ipod"),LOGERROR
);
655 if (read_partinfo(&ipod
,0) < 0)
657 m_dp
->addItem(tr("could not read partitiontable"),LOGERROR
);
662 if (ipod
.pinfo
[0].start
==0)
664 m_dp
->addItem(tr("No partition 0 on disk"),LOGERROR
);
667 double sectors_per_MB
= (1024.0*1024.0)/ipod
.sector_size
;
669 m_dp
->addItem(tr("[INFO] Part Start Sector End Sector Size (MB) Type\n"),LOGINFO
);
671 for ( i
= 0; i
< 4; i
++ )
673 if (ipod
.pinfo
[i
].start
!= 0)
675 m_dp
->addItem(tr("[INFO] %1 %2 %3 %4 %5 (%6)").arg(
677 ipod
.pinfo
[i
].start
).arg(
678 ipod
.pinfo
[i
].start
+ipod
.pinfo
[i
].size
-1).arg(
679 ipod
.pinfo
[i
].size
/sectors_per_MB
).arg(
680 get_parttype(ipod
.pinfo
[i
].type
)).arg(
681 ipod
.pinfo
[i
].type
),LOGWARNING
);
688 read_directory(&ipod
);
690 if (ipod
.nimages
<= 0)
692 m_dp
->addItem(tr("Failed to read firmware directory"),LOGERROR
);
696 if (getmodel(&ipod
,(ipod
.ipod_directory
[0].vers
>>8)) < 0)
698 m_dp
->addItem(tr("Unknown version number in firmware (%1)").arg(
699 ipod
.ipod_directory
[0].vers
),LOGERROR
);
706 m_dp
->addItem(tr("Warning this is a MacPod, Rockbox doesnt work on this. Convert it to WinPod"),LOGWARNING
);
709 if (ipod_reopen_rw(&ipod
) < 0)
711 m_dp
->addItem(tr("Could not open Ipod in RW mode"),LOGERROR
);
716 if (add_bootloader(&ipod
, m_tempfilename
.toLatin1().data(), FILETYPE_DOT_IPOD
)==0)
718 m_dp
->addItem(tr("Successfully added Bootloader"),LOGOK
);
725 m_dp
->addItem(tr("failed to add Bootloader"),LOGERROR
);
732 /**************************************************
733 *** sansa secific code
734 ***************************************************/
735 // reserves memory for sansapatcher
736 bool initSansaPatcher()
738 if (sansa_alloc_buffer(§orbuf
,BUFFER_SIZE
) < 0) return true;
743 void BootloaderInstaller::sansaPrepare()
745 m_dp
->addItem(tr("Searching for sansas"),LOGINFO
);
746 struct sansa_t sansa
;
748 int n
= sansa_scan(&sansa
);
751 m_dp
->addItem(tr("No Sansa found"),LOGERROR
);
757 m_dp
->addItem(tr("Too many Sansas found"),LOGERROR
);
761 if(m_install
) // Installation
763 QString url
= m_bootloaderUrlBase
+ "/sandisk-sansa/e200/" + m_bootloadername
;
765 m_dp
->addItem(tr("Downloading file %1.%2")
766 .arg(QFileInfo(url
).baseName(), QFileInfo(url
).completeSuffix()),LOGINFO
);
768 // temporary file needs to be opened to get the filename
770 m_tempfilename
= downloadFile
.fileName();
771 downloadFile
.close();
772 // get the real file.
773 getter
= new HttpGet(this);
774 getter
->setProxy(m_proxy
);
775 getter
->setFile(&downloadFile
);
776 getter
->getFile(QUrl(url
));
777 // connect signals from HttpGet
778 connect(getter
, SIGNAL(done(bool)), this, SLOT(downloadDone(bool)));
779 connect(getter
, SIGNAL(dataReadProgress(int, int)), this, SLOT(updateDataReadProgress(int, int)));
780 connect(m_dp
, SIGNAL(aborted()), getter
, SLOT(abort()));
782 else // Uninstallation
785 if (sansa_open(&sansa
, 0) < 0)
787 m_dp
->addItem(tr("could not open Sansa"),LOGERROR
);
792 if (sansa_read_partinfo(&sansa
,0) < 0)
794 m_dp
->addItem(tr("could not read partitiontable"),LOGERROR
);
799 int i
= is_e200(&sansa
);
801 m_dp
->addItem(tr("Disk is not an E200 (%1), aborting.").arg(i
),LOGERROR
);
806 if (sansa
.hasoldbootloader
)
808 m_dp
->addItem(tr("********************************************\n"
809 "OLD ROCKBOX INSTALLATION DETECTED, ABORTING.\n"
810 "You must reinstall the original Sansa firmware before running\n"
811 "sansapatcher for the first time.\n"
812 "See http://www.rockbox.org/twiki/bin/view/Main/SansaE200Install\n"
813 "*********************************************\n"),LOGERROR
);
819 if (sansa_reopen_rw(&sansa
) < 0)
821 m_dp
->addItem(tr("Could not open Sansa in RW mode"),LOGERROR
);
826 if (sansa_delete_bootloader(&sansa
)==0)
828 m_dp
->addItem(tr("Successfully removed Bootloader"),LOGOK
);
835 m_dp
->addItem(tr("--delete-bootloader failed."),LOGERROR
);
843 void BootloaderInstaller::sansaFinish()
845 struct sansa_t sansa
;
848 if (sansa_open(&sansa
, 0) < 0)
850 m_dp
->addItem(tr("could not open Sansa"),LOGERROR
);
855 if (sansa_read_partinfo(&sansa
,0) < 0)
857 m_dp
->addItem(tr("could not read partitiontable"),LOGERROR
);
863 int i
= is_e200(&sansa
);
866 m_dp
->addItem(tr("Disk is not an E200 (%1), aborting.").arg(i
),LOGERROR
);
871 if (sansa
.hasoldbootloader
)
873 m_dp
->addItem(tr("********************************************\n"
874 "OLD ROCKBOX INSTALLATION DETECTED, ABORTING.\n"
875 "You must reinstall the original Sansa firmware before running\n"
876 "sansapatcher for the first time.\n"
877 "See http://www.rockbox.org/twiki/bin/view/Main/SansaE200Install\n"
878 "*********************************************\n"),LOGERROR
);
883 if (sansa_reopen_rw(&sansa
) < 0)
885 m_dp
->addItem(tr("Could not open Sansa in RW mode"),LOGERROR
);
890 if (sansa_add_bootloader(&sansa
, m_tempfilename
.toLatin1().data(), FILETYPE_MI4
)==0)
892 m_dp
->addItem(tr("Successfully added Bootloader"),LOGOK
);
899 m_dp
->addItem(tr("failed to add Bootloader"),LOGERROR
);
907 /**************************************************
908 *** iriver /fwpatcher secific code
909 ***************************************************/
911 void BootloaderInstaller::iriverPrepare()
914 if (!FileMD5(m_origfirmware
, md5sum_str
)) {
915 m_dp
->addItem(tr("Could not MD5Sum original firmware"),LOGERROR
);
920 /* Check firmware against md5sums in h120sums and h100sums */
922 table_entry
= intable(md5sum_str
, &h120pairs
[0],
923 sizeof(h120pairs
)/sizeof(struct sumpairs
));
924 if (table_entry
>= 0) {
929 table_entry
= intable(md5sum_str
, &h100pairs
[0],
930 sizeof(h100pairs
)/sizeof(struct sumpairs
));
931 if (table_entry
>= 0)
937 table_entry
= intable(md5sum_str
, &h300pairs
[0],
938 sizeof(h300pairs
)/sizeof(struct sumpairs
));
939 if (table_entry
>= 0)
945 m_dp
->addItem(tr("Could not detect firmware type"),LOGERROR
);
950 QString url
= m_bootloaderUrlBase
+ "/iriver/" + m_bootloadername
;
952 m_dp
->addItem(tr("Downloading file %1.%2")
953 .arg(QFileInfo(url
).baseName(), QFileInfo(url
).completeSuffix()),LOGINFO
);
955 // temporary file needs to be opened to get the filename
957 m_tempfilename
= downloadFile
.fileName();
958 downloadFile
.close();
959 // get the real file.
960 getter
= new HttpGet(this);
961 getter
->setProxy(m_proxy
);
962 getter
->setFile(&downloadFile
);
963 getter
->getFile(QUrl(url
));
964 // connect signals from HttpGet
965 connect(getter
, SIGNAL(done(bool)), this, SLOT(downloadDone(bool)));
966 connect(getter
, SIGNAL(dataReadProgress(int, int)), this, SLOT(updateDataReadProgress(int, int)));
967 connect(m_dp
, SIGNAL(aborted()), getter
, SLOT(abort()));
970 void BootloaderInstaller::iriverFinish()
974 struct sumpairs
*sums
= 0;
977 /* get pointer to the correct bootloader.bin */
980 sums
= &h100pairs
[0];
984 sums
= &h120pairs
[0];
988 sums
= &h300pairs
[0];
993 // temporary files needs to be opened to get the filename
994 QTemporaryFile firmwareBin
, newBin
, newHex
;
998 QString firmwareBinName
= firmwareBin
.fileName();
999 QString newBinName
= newBin
.fileName();
1000 QString newHexName
= newHex
.fileName();
1001 firmwareBin
.close();
1006 if (iriver_decode(m_origfirmware
, firmwareBinName
, FALSE
, STRIP_NONE
,m_dp
) == -1)
1008 m_dp
->addItem(tr("Error in descramble"),LOGERROR
);
1009 firmwareBin
.remove();
1016 if (!mkboot(firmwareBinName
, newBinName
, m_tempfilename
, origin
,m_dp
))
1018 m_dp
->addItem(tr("Error in patching"),LOGERROR
);
1019 firmwareBin
.remove();
1026 if (iriver_encode(newBinName
, newHexName
, FALSE
,m_dp
) == -1)
1028 m_dp
->addItem(tr("Error in scramble"),LOGERROR
);
1029 firmwareBin
.remove();
1037 if (!FileMD5(newHexName
, md5sum_str
))
1039 m_dp
->addItem(tr("Error in checksumming"),LOGERROR
);
1040 firmwareBin
.remove();
1046 if (strncmp(sums
[table_entry
].patched
, md5sum_str
, 32) == 0) {
1047 /* delete temp files */
1048 firmwareBin
.remove();
1052 // Load patched Firmware to player
1055 dest
= m_mountpoint
+ "/ihp_100.hex";
1056 else if(series
== 120)
1057 dest
= m_mountpoint
+ "/ihp_120.hex";
1058 else if(series
== 300)
1059 dest
= m_mountpoint
+ "/H300.hex";
1061 if(!newHex
.copy(dest
))
1063 m_dp
->addItem(tr("Could not copy: %1 to %2")
1064 .arg(newHexName
,dest
),LOGERROR
);
1069 downloadFile
.remove();
1072 m_dp
->addItem(tr("Bootloader install finished successfully."),LOGOK
);
1075 emit
done(false); // success