Rearange menu of mpegplayer. Add new menu with "settings" and "quit", and remove...
[kugel-rb.git] / rbutil / rbutilqt / base / bootloaderinstallipod.cpp
blobca243a944c361dbc0fa738346f3d67c29c14fc2f
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
9 * Copyright (C) 2008 by Dominik Riebeling
10 * $Id$
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 <QtCore>
21 #include "bootloaderinstallbase.h"
22 #include "bootloaderinstallipod.h"
24 #include "../ipodpatcher/ipodpatcher.h"
25 #include "autodetection.h"
28 BootloaderInstallIpod::BootloaderInstallIpod(QObject *parent)
29 : BootloaderInstallBase(parent)
31 (void)parent;
32 // initialize sector buffer. ipod_sectorbuf is defined in ipodpatcher.
33 // The buffer itself is only present once, so make sure to not allocate
34 // it if it was already allocated. The application needs to take care
35 // no concurrent (i.e. multiple objects of this class running) requests
36 // are done.
37 if(ipod_sectorbuf == NULL)
38 ipod_alloc_buffer(&ipod_sectorbuf, BUFFER_SIZE);
42 BootloaderInstallIpod::~BootloaderInstallIpod()
44 if(ipod_sectorbuf) {
45 free(ipod_sectorbuf);
46 ipod_sectorbuf = NULL;
51 bool BootloaderInstallIpod::install(void)
53 if(ipod_sectorbuf == NULL) {
54 emit logItem(tr("Error: can't allocate buffer memory!"), LOGERROR);
55 emit done(true);
56 return false;
59 struct ipod_t ipod;
61 int n = ipod_scan(&ipod);
62 if(n == -1) {
63 emit logItem(tr("No Ipod detected\n"
64 "Permission for disc access denied!"),
65 LOGERROR);
66 emit done(true);
67 return false;
69 if(n == 0) {
70 emit logItem(tr("No Ipod detected!"), LOGERROR);
71 emit done(true);
72 return false;
75 if(ipod.macpod) {
76 emit logItem(tr("Warning: This is a MacPod, Rockbox only runs on WinPods.\n"
77 "See http://www.rockbox.org/wiki/IpodConversionToFAT32"), LOGERROR);
78 emit done(true);
79 return false;
81 emit logItem(tr("Downloading bootloader file"), LOGINFO);
83 downloadBlStart(m_blurl);
84 connect(this, SIGNAL(downloadDone()), this, SLOT(installStage2()));
85 return true;
89 void BootloaderInstallIpod::installStage2(void)
91 struct ipod_t ipod;
93 emit logItem(tr("Installing Rockbox bootloader"), LOGINFO);
94 QCoreApplication::processEvents();
95 if(!ipodInitialize(&ipod)) {
96 emit done(true);
97 return;
100 read_directory(&ipod);
102 if(ipod.nimages <= 0) {
103 emit logItem(tr("Failed to read firmware directory"), LOGERROR);
104 emit done(true);
105 return;
107 if(getmodel(&ipod,(ipod.ipod_directory[0].vers>>8)) < 0) {
108 emit logItem(tr("Unknown version number in firmware (%1)").arg(
109 ipod.ipod_directory[0].vers), LOGERROR);
110 emit done(true);
111 return;
114 if(ipod.macpod) {
115 emit logItem(tr("Warning: This is a MacPod, Rockbox only runs on WinPods.\n"
116 "See http://www.rockbox.org/wiki/IpodConversionToFAT32"), LOGERROR);
117 emit done(true);
118 return;
121 if(ipod_reopen_rw(&ipod) < 0) {
122 emit logItem(tr("Could not open Ipod in R/W mode"), LOGERROR);
123 emit done(true);
124 return;
127 m_tempfile.open();
128 QString blfile = m_tempfile.fileName();
129 m_tempfile.close();
130 if(add_bootloader(&ipod, blfile.toLatin1().data(), FILETYPE_DOT_IPOD) == 0) {
131 emit logItem(tr("Successfull added bootloader"), LOGOK);
132 logInstall(LogAdd);
133 emit done(false);
134 ipod_close(&ipod);
135 return;
137 else {
138 emit logItem(tr("Failed to add bootloader"), LOGERROR);
139 ipod_close(&ipod);
140 emit done(true);
141 return;
143 qDebug() << "[BootloaderInstallIpod] version installed:" << m_blversion.toString(Qt::ISODate);
147 bool BootloaderInstallIpod::uninstall(void)
149 struct ipod_t ipod;
150 emit logItem(tr("Uninstalling bootloader"), LOGINFO);
151 QCoreApplication::processEvents();
153 if(!ipodInitialize(&ipod)) {
154 emit done(true);
155 return false;
158 read_directory(&ipod);
160 if (ipod.nimages <= 0) {
161 emit logItem(tr("Failed to read firmware directory"),LOGERROR);
162 emit done(true);
163 return false;
165 if (getmodel(&ipod,(ipod.ipod_directory[0].vers>>8)) < 0) {
166 emit logItem(tr("Unknown version number in firmware (%1)").arg(
167 ipod.ipod_directory[0].vers), LOGERROR);
168 emit done(true);
169 return false;
172 if (ipod_reopen_rw(&ipod) < 0) {
173 emit logItem(tr("Could not open Ipod in R/W mode"), LOGERROR);
174 emit done(true);
175 return false;
178 if (ipod.ipod_directory[0].entryOffset == 0) {
179 emit logItem(tr("No bootloader detected."), LOGERROR);
180 emit done(true);
181 return false;
184 if (delete_bootloader(&ipod)==0) {
185 emit logItem(tr("Successfully removed bootloader"), LOGOK);
186 logInstall(LogRemove);
187 emit done(false);
188 ipod_close(&ipod);
189 return true;
191 else {
192 emit logItem(tr("Removing bootloader failed."), LOGERROR);
193 emit done(true);
194 ipod_close(&ipod);
195 return false;
200 BootloaderInstallBase::BootloaderType BootloaderInstallIpod::installed(void)
202 struct ipod_t ipod;
203 BootloaderInstallBase::BootloaderType result = BootloaderRockbox;
205 if(!ipodInitialize(&ipod)) {
206 qDebug() << "[BootloaderInstallIpod] installed: BootloaderUnknown";
207 result = BootloaderUnknown;
209 else {
210 read_directory(&ipod);
211 if(ipod.ipod_directory[0].entryOffset == 0) {
212 qDebug() << "[BootloaderInstallIpod] installed: BootloaderOther";
213 result = BootloaderOther;
215 else {
216 qDebug() << "[BootloaderInstallIpod] installed: BootloaderRockbox";
219 ipod_close(&ipod);
221 return result;
225 BootloaderInstallBase::Capabilities BootloaderInstallIpod::capabilities(void)
227 return (Install | Uninstall | IsRaw);
231 bool BootloaderInstallIpod::ipodInitialize(struct ipod_t *ipod)
233 if(!m_blfile.isEmpty()) {
234 #if defined(Q_OS_WIN32)
235 sprintf(ipod->diskname, "\\\\.\\PhysicalDrive%i",
236 Autodetection::resolveDevicename(m_blfile).toInt());
237 #elif defined(Q_OS_MACX)
238 sprintf(ipod->diskname,
239 qPrintable(Autodetection::resolveDevicename(m_blfile)
240 .remove(QRegExp("s[0-9]+$"))));
241 #else
242 sprintf(ipod->diskname,
243 qPrintable(Autodetection::resolveDevicename(m_blfile)
244 .remove(QRegExp("[0-9]+$"))));
245 #endif
246 qDebug() << "[BootloaderInstallIpod] ipodpatcher: overriding scan, using"
247 << ipod->diskname;
249 else {
250 ipod_scan(ipod);
252 if(ipod_open(ipod, 0) < 0) {
253 emit logItem(tr("Could not open Ipod"), LOGERROR);
254 return false;
257 if(read_partinfo(ipod, 0) < 0) {
258 emit logItem(tr("Error reading partition table - possibly not an Ipod"), LOGERROR);
259 ipod_close(ipod);
260 return false;
263 if(ipod->pinfo[0].start == 0) {
264 emit logItem(tr("No firmware partition on disk"), LOGERROR);
265 ipod_close(ipod);
266 return false;
268 return true;