Bump version numbers for 3.13
[maemo-rb.git] / rbutil / rbutilqt / base / bootloaderinstallipod.cpp
blobde7aaa897bc3d1a7f54412610d77a3f11a8e45a6
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
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 ****************************************************************************/
19 #include <QtCore>
20 #include "bootloaderinstallbase.h"
21 #include "bootloaderinstallipod.h"
23 #include "../ipodpatcher/ipodpatcher.h"
24 #include "utils.h"
27 BootloaderInstallIpod::BootloaderInstallIpod(QObject *parent)
28 : BootloaderInstallBase(parent)
30 (void)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()
39 if(ipod.sectorbuf) {
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);
49 emit done(true);
50 return false;
52 // save buffer pointer before cleaning up ipod_t structure
53 unsigned char* sb = ipod.sectorbuf;
54 memset(&ipod, 0, sizeof(struct ipod_t));
55 ipod.sectorbuf = sb;
57 if(!ipodInitialize(&ipod)) {
58 emit done(true);
59 return false;
62 if(ipod.nimages <= 0) {
63 emit logItem(tr("Failed to read firmware directory"), LOGERROR);
64 emit done(true);
65 return false;
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);
70 emit done(true);
71 return false;
73 if(ipod.macpod) {
74 emit logItem(tr("Warning: This is a MacPod, Rockbox only runs on WinPods. \n"
75 "See http://www.rockbox.org/wiki/IpodConversionToFAT32"), LOGERROR);
76 emit done(true);
77 return false;
79 emit logItem(tr("Downloading bootloader file"), LOGINFO);
81 downloadBlStart(m_blurl);
82 connect(this, SIGNAL(downloadDone()), this, SLOT(installStage2()));
83 return true;
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);
94 emit done(true);
95 return;
97 QCoreApplication::processEvents();
99 m_tempfile.open();
100 QString blfile = m_tempfile.fileName();
101 m_tempfile.close();
102 if(add_bootloader(&ipod, blfile.toLatin1().data(), FILETYPE_DOT_IPOD) == 0) {
103 emit logItem(tr("Successfull added bootloader"), LOGOK);
104 ipod_close(&ipod);
105 #if defined(Q_OS_MACX)
106 m_remountDevice = ipod.diskname;
107 connect(this, SIGNAL(remounted(bool)), this, SLOT(installStage3(bool)));
108 waitRemount();
109 #else
110 installStage3(true);
111 #endif
113 else {
114 emit logItem(tr("Failed to add bootloader"), LOGERROR);
115 ipod_close(&ipod);
116 emit done(true);
117 return;
122 void BootloaderInstallIpod::installStage3(bool mounted)
124 if(mounted) {
125 logInstall(LogAdd);
126 emit logItem(tr("Bootloader Installation complete."), LOGINFO);
127 emit done(false);
128 return;
130 else {
131 emit logItem(tr("Writing log aborted"), LOGERROR);
132 emit done(true);
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)) {
144 emit done(true);
145 return false;
148 if (ipod.nimages <= 0) {
149 emit logItem(tr("Failed to read firmware directory"),LOGERROR);
150 emit done(true);
151 return false;
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);
156 emit done(true);
157 return false;
160 if (ipod_reopen_rw(&ipod) < 0) {
161 emit logItem(tr("Could not open Ipod in R/W mode"), LOGERROR);
162 emit done(true);
163 return false;
166 if (ipod_has_bootloader(&ipod) == 0) {
167 emit logItem(tr("No bootloader detected."), LOGERROR);
168 emit done(true);
169 return false;
172 if (delete_bootloader(&ipod)==0) {
173 emit logItem(tr("Successfully removed bootloader"), LOGOK);
174 logInstall(LogRemove);
175 emit done(false);
176 ipod_close(&ipod);
177 return true;
179 else {
180 emit logItem(tr("Removing bootloader failed."), LOGERROR);
181 emit done(true);
182 ipod_close(&ipod);
183 return false;
188 BootloaderInstallBase::BootloaderType BootloaderInstallIpod::installed(void)
190 BootloaderInstallBase::BootloaderType result = BootloaderRockbox;
192 if(!ipodInitialize(&ipod)) {
193 qDebug() << "[BootloaderInstallIpod] installed: BootloaderUnknown";
194 result = BootloaderUnknown;
196 else {
197 read_directory(&ipod);
198 getmodel(&ipod,(ipod.ipod_directory[ipod.ososimage].vers>>8));
199 if(!ipod_has_bootloader(&ipod)) {
200 result = BootloaderOther;
202 else {
203 qDebug() << "[BootloaderInstallIpod] installed: BootloaderRockbox";
206 ipod_close(&ipod);
208 return result;
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);
227 return false;
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]+$"))));
234 #else
235 sprintf(ipod->diskname, "%s",
236 qPrintable(devicename.remove(QRegExp("[0-9]+$"))));
237 #endif
238 qDebug() << "[BootloaderInstallIpod] ipodpatcher: overriding scan, using"
239 << ipod->diskname;
241 else {
242 emit logItem(tr("Error: no mountpoint specified!"), LOGERROR);
243 qDebug() << "[BootloaderInstallIpod] no mountpoint specified!";
245 int result = ipod_open(ipod, 1);
246 if(result == -2) {
247 emit logItem(tr("Could not open Ipod: permission denied"), LOGERROR);
248 return false;
250 else if(result < 0) {
251 emit logItem(tr("Could not open Ipod"), LOGERROR);
252 return false;
255 if(read_partinfo(ipod, 1) < 0) {
256 emit logItem(tr("Error reading partition table - possibly not an Ipod"), LOGERROR);
257 ipod_close(ipod);
258 return false;
261 if(ipod->pinfo[0].start == 0) {
262 emit logItem(tr("No firmware partition on disk"), LOGERROR);
263 ipod_close(ipod);
264 return false;
266 read_directory(ipod);
267 return true;