Display the correct icon upon success.
[Rockbox.git] / rbutil / rbutilqt / installbootloader.cpp
blob3ca3affe5406a05a6eb23549f46fa8fa07ce2b36
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
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)
30 m_dp = dp;
31 m_install = true;
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()));
71 else
73 m_dp->addItem(tr("unsupported install Method"),LOGERROR);
74 emit done(true);
75 return;
78 emit prepare();
81 void BootloaderInstaller::uninstall(ProgressloggerInterface* dp)
83 m_dp = dp;
84 m_install = false;
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);
96 emit done(true);
97 return;
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);
117 emit done(true);
118 return;
120 else
122 m_dp->addItem(tr("unsupported install Method"),LOGERROR);
123 emit done(true);
124 return;
127 emit prepare();
130 void BootloaderInstaller::downloadRequestFinished(int id, bool error)
132 qDebug() << "BootloaderInstall::downloadRequestFinished" << id << error;
133 qDebug() << "error:" << getter->errorString();
135 downloadDone(error);
138 void BootloaderInstaller::downloadDone(bool error)
140 qDebug() << "Install::downloadDone, error:" << error;
142 // update progress bar
144 int max = m_dp->getProgressMax();
145 if(max == 0) {
146 max = 100;
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);
152 m_dp->abort();
153 emit done(true);
154 return;
156 if(error) {
157 m_dp->addItem(tr("Download error: %1").arg(getter->errorString()),LOGERROR);
158 m_dp->abort();
159 emit done(true);
160 return;
162 else m_dp->addItem(tr("Download finished."),LOGOK);
164 emit finish();
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)
178 (void) error;
179 m_dp->abort();
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
197 downloadFile.open();
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);
222 emit done(true);
223 return;
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);
234 emit done(true);
235 return;
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);
243 emit done(true);
244 return;
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);
267 emit done(true);
268 return;
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);
283 emit done(true);
284 return;
287 else // or remove the normal firmware, if the original is there
289 QFile firmwareFile(firmware);
290 firmwareFile.remove();
293 //copy the firmware
294 if(!downloadFile.copy(firmware))
296 m_dp->addItem(tr("Could not copy: %1 to %2")
297 .arg(m_tempfilename,firmware),LOGERROR);
298 emit done(true);
299 return;
302 downloadFile.remove();
304 m_dp->addItem(tr("Bootloader install finished successfully."),LOGOK);
305 m_dp->abort();
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
323 downloadFile.open();
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;
341 //copy the firmware
342 if(!downloadFile.copy(firmware))
344 m_dp->addItem(tr("Could not copy: %1 to %2")
345 .arg(m_tempfilename,firmware),LOGERROR);
346 emit done(true);
347 return;
350 downloadFile.remove();
352 m_dp->addItem(tr("Bootloader install finished successfully."),LOGOK);
353 m_dp->abort();
355 emit done(false); // success
360 /**************************************************
361 *** h10 secific code
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
373 downloadFile.open();
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);
403 emit done(true);
404 return;
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);
413 emit done(true);
414 return;
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);
425 emit done(true);
426 return;
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);
434 emit done(true);
435 return;
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);
460 emit done(true);
461 return;
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);
474 emit done(true);
475 return;
478 else
480 QFile firmwareFile(firmware);
481 firmwareFile.remove();
483 //copy the firmware
484 if(!downloadFile.copy(firmware))
486 m_dp->addItem(tr("Could not copy: %1 to %2")
487 .arg(m_tempfilename,firmware),LOGERROR);
488 emit done(true);
489 return;
492 downloadFile.remove();
494 m_dp->addItem(tr("Bootloader install finished successfully."),LOGOK);
495 m_dp->abort();
497 emit done(false); // success
501 /**************************************************
502 *** ipod secific code
503 ***************************************************/
504 int verbose =0;
505 // reserves memory for ipodpatcher
506 bool initIpodpatcher()
508 if (ipod_alloc_buffer(&sectorbuf,BUFFER_SIZE) < 0) return true;
509 else return false;
512 void BootloaderInstaller::ipodPrepare()
514 m_dp->addItem(tr("Searching for ipods"),LOGINFO);
515 struct ipod_t ipod;
517 int n = ipod_scan(&ipod);
518 if (n == 0)
520 m_dp->addItem(tr("No Ipods found"),LOGERROR);
521 emit done(true);
522 return;
524 if (n > 1)
526 m_dp->addItem(tr("Too many Ipods found"),LOGERROR);
527 emit done(true);
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
539 downloadFile.open();
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);
557 emit done(true);
558 return;
561 if (read_partinfo(&ipod,0) < 0)
563 m_dp->addItem(tr("could not read partitiontable"),LOGERROR);
564 emit done(true);
565 return;
568 if (ipod.pinfo[0].start==0)
570 m_dp->addItem(tr("No partition 0 on disk"),LOGERROR);
572 int i;
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(
580 i).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);
588 emit done(true);
589 return;
592 read_directory(&ipod);
594 if (ipod.nimages <= 0)
596 m_dp->addItem(tr("Failed to read firmware directory"),LOGERROR);
597 emit done(true);
598 return;
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);
604 emit done(true);
605 return;
608 if (ipod.macpod)
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);
616 emit done(true);
617 return;
620 if (ipod.ipod_directory[0].entryOffset==0) {
621 m_dp->addItem(tr("No bootloader detected."),LOGERROR);
622 emit done(true);
623 return;
626 if (delete_bootloader(&ipod)==0)
628 m_dp->addItem(tr("Successfully removed Bootloader"),LOGOK);
629 emit done(false);
630 ipod_close(&ipod);
631 return;
633 else
635 m_dp->addItem(tr("--delete-bootloader failed."),LOGERROR);
636 emit done(true);
637 ipod_close(&ipod);
638 return;
643 void BootloaderInstaller::ipodFinish()
645 struct ipod_t ipod;
646 ipod_scan(&ipod);
648 if (ipod_open(&ipod, 0) < 0)
650 m_dp->addItem(tr("could not open ipod"),LOGERROR);
651 emit done(true);
652 return;
655 if (read_partinfo(&ipod,0) < 0)
657 m_dp->addItem(tr("could not read partitiontable"),LOGERROR);
658 emit done(true);
659 return;
662 if (ipod.pinfo[0].start==0)
664 m_dp->addItem(tr("No partition 0 on disk"),LOGERROR);
666 int i;
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(
676 i).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);
684 emit done(true);
685 return;
688 read_directory(&ipod);
690 if (ipod.nimages <= 0)
692 m_dp->addItem(tr("Failed to read firmware directory"),LOGERROR);
693 emit done(true);
694 return;
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);
700 emit done(true);
701 return;
704 if (ipod.macpod)
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);
712 emit done(true);
713 return;
716 if (add_bootloader(&ipod, m_tempfilename.toLatin1().data(), FILETYPE_DOT_IPOD)==0)
718 m_dp->addItem(tr("Successfully added Bootloader"),LOGOK);
719 emit done(false);
720 ipod_close(&ipod);
721 return;
723 else
725 m_dp->addItem(tr("failed to add Bootloader"),LOGERROR);
726 ipod_close(&ipod);
727 emit done(true);
728 return;
732 /**************************************************
733 *** sansa secific code
734 ***************************************************/
735 // reserves memory for sansapatcher
736 bool initSansaPatcher()
738 if (sansa_alloc_buffer(&sectorbuf,BUFFER_SIZE) < 0) return true;
739 else return false;
743 void BootloaderInstaller::sansaPrepare()
745 m_dp->addItem(tr("Searching for sansas"),LOGINFO);
746 struct sansa_t sansa;
748 int n = sansa_scan(&sansa);
749 if (n == 0)
751 m_dp->addItem(tr("No Sansa found"),LOGERROR);
752 emit done(true);
753 return;
755 if (n > 1)
757 m_dp->addItem(tr("Too many Sansas found"),LOGERROR);
758 emit done(true);
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
769 downloadFile.open();
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);
788 emit done(true);
789 return;
792 if (sansa_read_partinfo(&sansa,0) < 0)
794 m_dp->addItem(tr("could not read partitiontable"),LOGERROR);
795 emit done(true);
796 return;
799 int i = is_e200(&sansa);
800 if (i < 0) {
801 m_dp->addItem(tr("Disk is not an E200 (%1), aborting.").arg(i),LOGERROR);
802 emit done(true);
803 return;
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);
814 emit done(true);
815 return;
819 if (sansa_reopen_rw(&sansa) < 0)
821 m_dp->addItem(tr("Could not open Sansa in RW mode"),LOGERROR);
822 emit done(true);
823 return;
826 if (sansa_delete_bootloader(&sansa)==0)
828 m_dp->addItem(tr("Successfully removed Bootloader"),LOGOK);
829 emit done(false);
830 sansa_close(&sansa);
831 return;
833 else
835 m_dp->addItem(tr("--delete-bootloader failed."),LOGERROR);
836 emit done(true);
837 sansa_close(&sansa);
838 return;
843 void BootloaderInstaller::sansaFinish()
845 struct sansa_t sansa;
846 sansa_scan(&sansa);
848 if (sansa_open(&sansa, 0) < 0)
850 m_dp->addItem(tr("could not open Sansa"),LOGERROR);
851 emit done(true);
852 return;
855 if (sansa_read_partinfo(&sansa,0) < 0)
857 m_dp->addItem(tr("could not read partitiontable"),LOGERROR);
858 emit done(true);
859 return;
863 int i = is_e200(&sansa);
864 if (i < 0) {
866 m_dp->addItem(tr("Disk is not an E200 (%1), aborting.").arg(i),LOGERROR);
867 emit done(true);
868 return;
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);
879 emit done(true);
880 return;
883 if (sansa_reopen_rw(&sansa) < 0)
885 m_dp->addItem(tr("Could not open Sansa in RW mode"),LOGERROR);
886 emit done(true);
887 return;
890 if (sansa_add_bootloader(&sansa, m_tempfilename.toLatin1().data(), FILETYPE_MI4)==0)
892 m_dp->addItem(tr("Successfully added Bootloader"),LOGOK);
893 emit done(false);
894 sansa_close(&sansa);
895 return;
897 else
899 m_dp->addItem(tr("failed to add Bootloader"),LOGERROR);
900 sansa_close(&sansa);
901 emit done(true);
902 return;
907 /**************************************************
908 *** iriver /fwpatcher secific code
909 ***************************************************/
911 void BootloaderInstaller::iriverPrepare()
913 char md5sum_str[32];
914 if (!FileMD5(m_origfirmware, md5sum_str)) {
915 m_dp->addItem(tr("Could not MD5Sum original firmware"),LOGERROR);
916 emit done(true);
917 return;
920 /* Check firmware against md5sums in h120sums and h100sums */
921 series = 0;
922 table_entry = intable(md5sum_str, &h120pairs[0],
923 sizeof(h120pairs)/sizeof(struct sumpairs));
924 if (table_entry >= 0) {
925 series = 120;
927 else
929 table_entry = intable(md5sum_str, &h100pairs[0],
930 sizeof(h100pairs)/sizeof(struct sumpairs));
931 if (table_entry >= 0)
933 series = 100;
935 else
937 table_entry = intable(md5sum_str, &h300pairs[0],
938 sizeof(h300pairs)/sizeof(struct sumpairs));
939 if (table_entry >= 0)
940 series = 300;
943 if (series == 0)
945 m_dp->addItem(tr("Could not detect firmware type"),LOGERROR);
946 emit done(true);
947 return;
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
956 downloadFile.open();
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()
972 // Patch firmware
973 char md5sum_str[32];
974 struct sumpairs *sums = 0;
975 int origin = 0;
977 /* get pointer to the correct bootloader.bin */
978 switch(series) {
979 case 100:
980 sums = &h100pairs[0];
981 origin = 0x1f0000;
982 break;
983 case 120:
984 sums = &h120pairs[0];
985 origin = 0x1f0000;
986 break;
987 case 300:
988 sums = &h300pairs[0];
989 origin = 0x3f0000;
990 break;
993 // temporary files needs to be opened to get the filename
994 QTemporaryFile firmwareBin, newBin, newHex;
995 firmwareBin.open();
996 newBin.open();
997 newHex.open();
998 QString firmwareBinName = firmwareBin.fileName();
999 QString newBinName = newBin.fileName();
1000 QString newHexName = newHex.fileName();
1001 firmwareBin.close();
1002 newBin.close();
1003 newHex.close();
1005 // iriver decode
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();
1010 newBin.remove();
1011 newHex.remove();
1012 emit done(true);
1013 return;
1015 // mkboot
1016 if (!mkboot(firmwareBinName, newBinName, m_tempfilename, origin,m_dp))
1018 m_dp->addItem(tr("Error in patching"),LOGERROR);
1019 firmwareBin.remove();
1020 newBin.remove();
1021 newHex.remove();
1022 emit done(true);
1023 return;
1025 // iriver_encode
1026 if (iriver_encode(newBinName, newHexName, FALSE,m_dp) == -1)
1028 m_dp->addItem(tr("Error in scramble"),LOGERROR);
1029 firmwareBin.remove();
1030 newBin.remove();
1031 newHex.remove();
1032 emit done(true);
1033 return;
1036 /* now md5sum it */
1037 if (!FileMD5(newHexName, md5sum_str))
1039 m_dp->addItem(tr("Error in checksumming"),LOGERROR);
1040 firmwareBin.remove();
1041 newBin.remove();
1042 newHex.remove();
1043 emit done(true);
1044 return;
1046 if (strncmp(sums[table_entry].patched, md5sum_str, 32) == 0) {
1047 /* delete temp files */
1048 firmwareBin.remove();
1049 newBin.remove();
1052 // Load patched Firmware to player
1053 QString dest;
1054 if(series == 100)
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";
1060 // copy file
1061 if(!newHex.copy(dest))
1063 m_dp->addItem(tr("Could not copy: %1 to %2")
1064 .arg(newHexName,dest),LOGERROR);
1065 emit done(true);
1066 return;
1069 downloadFile.remove();
1070 newHex.remove();
1072 m_dp->addItem(tr("Bootloader install finished successfully."),LOGOK);
1073 m_dp->abort();
1075 emit done(false); // success