1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
9 * Copyright (C) 2008 by Dominik Riebeling
11 * All files in this archive are subject to the GNU General Public License.
12 * See the file COPYING in the source tree root for full license agreement.
14 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
15 * KIND, either express or implied.
17 ****************************************************************************/
20 #include "bootloaderinstallbase.h"
21 #include "bootloaderinstallipod.h"
23 #include "../ipodpatcher/ipodpatcher.h"
27 BootloaderInstallIpod::BootloaderInstallIpod(QObject
*parent
)
28 : BootloaderInstallBase(parent
)
31 // initialize sector buffer. The sector buffer is part of the ipod_t
32 // structure, so a second instance of this class will have its own buffer.
33 ipod_alloc_buffer(&ipod
, BUFFER_SIZE
);
37 BootloaderInstallIpod::~BootloaderInstallIpod()
40 ipod_dealloc_buffer(&ipod
);
45 bool BootloaderInstallIpod::install(void)
47 if(ipod
.sectorbuf
== NULL
) {
48 emit
logItem(tr("Error: can't allocate buffer memory!"), LOGERROR
);
52 // save buffer pointer before cleaning up ipod_t structure
53 unsigned char* sb
= ipod
.sectorbuf
;
54 memset(&ipod
, 0, sizeof(struct ipod_t
));
57 if(!ipodInitialize(&ipod
)) {
62 if(ipod
.nimages
<= 0) {
63 emit
logItem(tr("Failed to read firmware directory"), LOGERROR
);
67 if(getmodel(&ipod
,(ipod
.ipod_directory
[ipod
.ososimage
].vers
>>8)) < 0) {
68 emit
logItem(tr("Unknown version number in firmware (%1)").arg(
69 ipod
.ipod_directory
[ipod
.ososimage
].vers
), LOGERROR
);
74 emit
logItem(tr("Warning: This is a MacPod, Rockbox only runs on WinPods. \n"
75 "See http://www.rockbox.org/wiki/IpodConversionToFAT32"), LOGERROR
);
79 emit
logItem(tr("Downloading bootloader file"), LOGINFO
);
81 downloadBlStart(m_blurl
);
82 connect(this, SIGNAL(downloadDone()), this, SLOT(installStage2()));
87 void BootloaderInstallIpod::installStage2(void)
89 emit
logItem(tr("Installing Rockbox bootloader"), LOGINFO
);
90 QCoreApplication::processEvents();
92 if(ipod_reopen_rw(&ipod
) < 0) {
93 emit
logItem(tr("Could not open Ipod in R/W mode"), LOGERROR
);
97 QCoreApplication::processEvents();
100 QString blfile
= m_tempfile
.fileName();
102 if(add_bootloader(&ipod
, blfile
.toLatin1().data(), FILETYPE_DOT_IPOD
) == 0) {
103 emit
logItem(tr("Successfull added bootloader"), LOGOK
);
105 #if defined(Q_OS_MACX)
106 m_remountDevice
= ipod
.diskname
;
107 connect(this, SIGNAL(remounted(bool)), this, SLOT(installStage3(bool)));
114 emit
logItem(tr("Failed to add bootloader"), LOGERROR
);
122 void BootloaderInstallIpod::installStage3(bool mounted
)
126 emit
logItem(tr("Bootloader Installation complete."), LOGINFO
);
131 emit
logItem(tr("Writing log aborted"), LOGERROR
);
134 qDebug() << "[BootloaderInstallIpod] version installed:" << m_blversion
.toString(Qt::ISODate
);
138 bool BootloaderInstallIpod::uninstall(void)
140 emit
logItem(tr("Uninstalling bootloader"), LOGINFO
);
141 QCoreApplication::processEvents();
143 if(!ipodInitialize(&ipod
)) {
148 if (ipod
.nimages
<= 0) {
149 emit
logItem(tr("Failed to read firmware directory"),LOGERROR
);
153 if (getmodel(&ipod
,(ipod
.ipod_directory
[ipod
.ososimage
].vers
>>8)) < 0) {
154 emit
logItem(tr("Unknown version number in firmware (%1)").arg(
155 ipod
.ipod_directory
[ipod
.ososimage
].vers
), LOGERROR
);
160 if (ipod_reopen_rw(&ipod
) < 0) {
161 emit
logItem(tr("Could not open Ipod in R/W mode"), LOGERROR
);
166 if (ipod_has_bootloader(&ipod
) == 0) {
167 emit
logItem(tr("No bootloader detected."), LOGERROR
);
172 if (delete_bootloader(&ipod
)==0) {
173 emit
logItem(tr("Successfully removed bootloader"), LOGOK
);
174 logInstall(LogRemove
);
180 emit
logItem(tr("Removing bootloader failed."), LOGERROR
);
188 BootloaderInstallBase::BootloaderType
BootloaderInstallIpod::installed(void)
190 BootloaderInstallBase::BootloaderType result
= BootloaderRockbox
;
192 if(!ipodInitialize(&ipod
)) {
193 qDebug() << "[BootloaderInstallIpod] installed: BootloaderUnknown";
194 result
= BootloaderUnknown
;
197 read_directory(&ipod
);
198 getmodel(&ipod
,(ipod
.ipod_directory
[ipod
.ososimage
].vers
>>8));
199 if(!ipod_has_bootloader(&ipod
)) {
200 result
= BootloaderOther
;
203 qDebug() << "[BootloaderInstallIpod] installed: BootloaderRockbox";
212 BootloaderInstallBase::Capabilities
BootloaderInstallIpod::capabilities(void)
214 return (Install
| Uninstall
| IsRaw
);
218 /** @initialize Ipod by opening its file handle and checking if its an ipod.
219 * Note: the caller has to make sure the file handle gets closed!
221 bool BootloaderInstallIpod::ipodInitialize(struct ipod_t
*ipod
)
223 if(!m_blfile
.isEmpty()) {
224 QString devicename
= Utils::resolveDevicename(m_blfile
);
225 if(devicename
.isEmpty()) {
226 emit
logItem(tr("Error: could not retrieve device name"), LOGERROR
);
229 #if defined(Q_OS_WIN32)
230 sprintf(ipod
->diskname
, "\\\\.\\PhysicalDrive%i", devicename
.toInt());
231 #elif defined(Q_OS_MACX)
232 sprintf(ipod
->diskname
, "%s",
233 qPrintable(devicename
.remove(QRegExp("s[0-9]+$"))));
235 sprintf(ipod
->diskname
, "%s",
236 qPrintable(devicename
.remove(QRegExp("[0-9]+$"))));
238 qDebug() << "[BootloaderInstallIpod] ipodpatcher: overriding scan, using"
242 emit
logItem(tr("Error: no mountpoint specified!"), LOGERROR
);
243 qDebug() << "[BootloaderInstallIpod] no mountpoint specified!";
245 int result
= ipod_open(ipod
, 1);
247 emit
logItem(tr("Could not open Ipod: permission denied"), LOGERROR
);
250 else if(result
< 0) {
251 emit
logItem(tr("Could not open Ipod"), LOGERROR
);
255 if(read_partinfo(ipod
, 1) < 0) {
256 emit
logItem(tr("Error reading partition table - possibly not an Ipod"), LOGERROR
);
261 if(ipod
->pinfo
[0].start
== 0) {
262 emit
logItem(tr("No firmware partition on disk"), LOGERROR
);
266 read_directory(ipod
);