MPEGPlayer: Skip to next file when there is a problem with a video file in all-play...
[kugel-rb.git] / rbutil / rbutilqt / base / bootloaderinstallipod.cpp
blob14f3fa5ddf239bd76e28e68804f2b9c1ed8f0484
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;
58 memset(&ipod, 0, sizeof(struct ipod_t));
60 if(!ipodInitialize(&ipod)) {
61 emit done(true);
62 return false;
65 if(ipod.nimages <= 0) {
66 emit logItem(tr("Failed to read firmware directory"), LOGERROR);
67 emit done(true);
68 return false;
70 if(getmodel(&ipod,(ipod.ipod_directory[ipod.ososimage].vers>>8)) < 0) {
71 emit logItem(tr("Unknown version number in firmware (%1)").arg(
72 ipod.ipod_directory[0].vers), LOGERROR);
73 emit done(true);
74 return false;
76 if(ipod.macpod) {
77 emit logItem(tr("Warning: This is a MacPod, Rockbox only runs on WinPods. \n"
78 "See http://www.rockbox.org/wiki/IpodConversionToFAT32"), LOGERROR);
79 emit done(true);
80 return false;
82 emit logItem(tr("Downloading bootloader file"), LOGINFO);
84 downloadBlStart(m_blurl);
85 connect(this, SIGNAL(downloadDone()), this, SLOT(installStage2()));
86 return true;
90 void BootloaderInstallIpod::installStage2(void)
92 emit logItem(tr("Installing Rockbox bootloader"), LOGINFO);
93 QCoreApplication::processEvents();
95 if(ipod_reopen_rw(&ipod) < 0) {
96 emit logItem(tr("Could not open Ipod in R/W mode"), LOGERROR);
97 emit done(true);
98 return;
100 QCoreApplication::processEvents();
102 m_tempfile.open();
103 QString blfile = m_tempfile.fileName();
104 m_tempfile.close();
105 if(add_bootloader(&ipod, blfile.toLatin1().data(), FILETYPE_DOT_IPOD) == 0) {
106 emit logItem(tr("Successfull added bootloader"), LOGOK);
107 ipod_close(&ipod);
108 #if defined(Q_OS_MACX)
109 m_remountDevice = ipod.diskname;
110 connect(this, SIGNAL(remounted(bool)), this, SLOT(installStage3(bool)));
111 waitRemount();
112 #else
113 installStage3(true);
114 #endif
116 else {
117 emit logItem(tr("Failed to add bootloader"), LOGERROR);
118 ipod_close(&ipod);
119 emit done(true);
120 return;
125 void BootloaderInstallIpod::installStage3(bool mounted)
127 if(mounted) {
128 logInstall(LogAdd);
129 emit logItem(tr("Bootloader Installation complete."), LOGINFO);
130 emit done(false);
131 return;
133 else {
134 emit logItem(tr("Writing log aborted"), LOGERROR);
135 emit done(true);
137 qDebug() << "[BootloaderInstallIpod] version installed:" << m_blversion.toString(Qt::ISODate);
141 bool BootloaderInstallIpod::uninstall(void)
143 struct ipod_t ipod;
144 emit logItem(tr("Uninstalling bootloader"), LOGINFO);
145 QCoreApplication::processEvents();
147 if(!ipodInitialize(&ipod)) {
148 emit done(true);
149 return false;
152 if (ipod.nimages <= 0) {
153 emit logItem(tr("Failed to read firmware directory"),LOGERROR);
154 emit done(true);
155 return false;
157 if (getmodel(&ipod,(ipod.ipod_directory[0].vers>>8)) < 0) {
158 emit logItem(tr("Unknown version number in firmware (%1)").arg(
159 ipod.ipod_directory[0].vers), LOGERROR);
160 emit done(true);
161 return false;
164 if (ipod_reopen_rw(&ipod) < 0) {
165 emit logItem(tr("Could not open Ipod in R/W mode"), LOGERROR);
166 emit done(true);
167 return false;
170 if (ipod.ipod_directory[0].entryOffset == 0) {
171 emit logItem(tr("No bootloader detected."), LOGERROR);
172 emit done(true);
173 return false;
176 if (delete_bootloader(&ipod)==0) {
177 emit logItem(tr("Successfully removed bootloader"), LOGOK);
178 logInstall(LogRemove);
179 emit done(false);
180 ipod_close(&ipod);
181 return true;
183 else {
184 emit logItem(tr("Removing bootloader failed."), LOGERROR);
185 emit done(true);
186 ipod_close(&ipod);
187 return false;
192 BootloaderInstallBase::BootloaderType BootloaderInstallIpod::installed(void)
194 struct ipod_t ipod;
195 BootloaderInstallBase::BootloaderType result = BootloaderRockbox;
197 if(!ipodInitialize(&ipod)) {
198 qDebug() << "[BootloaderInstallIpod] installed: BootloaderUnknown";
199 result = BootloaderUnknown;
201 else {
202 read_directory(&ipod);
203 if(ipod.ipod_directory[0].entryOffset == 0 || ipod.macpod) {
204 qDebug() << "[BootloaderInstallIpod] installed: BootloaderOther";
205 result = BootloaderOther;
207 else {
208 qDebug() << "[BootloaderInstallIpod] installed: BootloaderRockbox";
211 ipod_close(&ipod);
213 return result;
217 BootloaderInstallBase::Capabilities BootloaderInstallIpod::capabilities(void)
219 return (Install | Uninstall | IsRaw);
223 /** @initialize Ipod by opening its file handle and checking if its an ipod.
224 * Note: the caller has to make sure the file handle gets closed!
226 bool BootloaderInstallIpod::ipodInitialize(struct ipod_t *ipod)
228 if(!m_blfile.isEmpty()) {
229 QString devicename = Autodetection::resolveDevicename(m_blfile);
230 if(devicename.isEmpty()) {
231 emit logItem(tr("Error: could not retrieve device name"), LOGERROR);
232 return false;
234 #if defined(Q_OS_WIN32)
235 sprintf(ipod->diskname, "\\\\.\\PhysicalDrive%i", devicename.toInt());
236 #elif defined(Q_OS_MACX)
237 sprintf(ipod->diskname, "%s",
238 qPrintable(devicename.remove(QRegExp("s[0-9]+$"))));
239 #else
240 sprintf(ipod->diskname, "%s",
241 qPrintable(devicename.remove(QRegExp("[0-9]+$"))));
242 #endif
243 qDebug() << "[BootloaderInstallIpod] ipodpatcher: overriding scan, using"
244 << ipod->diskname;
246 else {
247 emit logItem(tr("Error: no mountpoint specified!"), LOGERROR);
248 qDebug() << "[BootloaderInstallIpod] no mountpoint specified!";
250 int result = ipod_open(ipod, 1);
251 if(result == -2) {
252 emit logItem(tr("Could not open Ipod: permission denied"), LOGERROR);
253 return false;
255 else if(result < 0) {
256 emit logItem(tr("Could not open Ipod"), LOGERROR);
257 return false;
260 if(read_partinfo(ipod, 1) < 0) {
261 emit logItem(tr("Error reading partition table - possibly not an Ipod"), LOGERROR);
262 ipod_close(ipod);
263 return false;
266 if(ipod->pinfo[0].start == 0) {
267 emit logItem(tr("No firmware partition on disk"), LOGERROR);
268 ipod_close(ipod);
269 return false;
271 read_directory(ipod);
272 return true;