summaryrefslogtreecommitdiff
path: root/rbutil/rbutilqt/bootloaderinstallipod.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'rbutil/rbutilqt/bootloaderinstallipod.cpp')
-rw-r--r--rbutil/rbutilqt/bootloaderinstallipod.cpp235
1 files changed, 235 insertions, 0 deletions
diff --git a/rbutil/rbutilqt/bootloaderinstallipod.cpp b/rbutil/rbutilqt/bootloaderinstallipod.cpp
new file mode 100644
index 0000000000..211b864b06
--- /dev/null
+++ b/rbutil/rbutilqt/bootloaderinstallipod.cpp
@@ -0,0 +1,235 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 *
9 * Copyright (C) 2008 by Dominik Riebeling
10 * $Id:$
11 *
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.
14 *
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
17 *
18 ****************************************************************************/
19
20#include <QtCore>
21#include "bootloaderinstallbase.h"
22#include "bootloaderinstallipod.h"
23
24#include "../ipodpatcher/ipodpatcher.h"
25
26
27BootloaderInstallIpod::BootloaderInstallIpod(QObject *parent)
28 : BootloaderInstallBase(parent)
29{
30 (void)parent;
31 // initialize sector buffer. ipod_sectorbuf is defined in ipodpatcher.
32 ipod_sectorbuf = NULL;
33 ipod_alloc_buffer(&ipod_sectorbuf, BUFFER_SIZE);
34}
35
36
37BootloaderInstallIpod::~BootloaderInstallIpod()
38{
39 free(ipod_sectorbuf);
40}
41
42
43bool BootloaderInstallIpod::install(void)
44{
45 if(ipod_sectorbuf == NULL) {
46 emit logItem(tr("Error: can't allocate buffer memory!"), LOGERROR);
47 emit done(true);
48 return false;
49 }
50
51 struct ipod_t ipod;
52
53 int n = ipod_scan(&ipod);
54 if(n == -1) {
55 emit logItem(tr("No Ipod detected\n"
56 "Permission for disc access denied!"),
57 LOGERROR);
58 emit done(true);
59 return false;
60 }
61 if(n == 0) {
62 emit logItem(tr("No Ipod detected!"), LOGERROR);
63 emit done(true);
64 return false;
65 }
66
67 if(ipod.macpod) {
68 emit logItem(tr("Warning: This is a MacPod, Rockbox only runs on WinPods.\n"
69 "See http://www.rockbox.org/wiki/IpodConversionToFAT32"), LOGERROR);
70 emit done(true);
71 return false;
72 }
73 emit logItem(tr("Downloading bootloader file"), LOGINFO);
74
75 downloadBlStart(m_blurl);
76 connect(this, SIGNAL(downloadDone()), this, SLOT(installStage2()));
77 return true;
78}
79
80
81void BootloaderInstallIpod::installStage2(void)
82{
83 struct ipod_t ipod;
84
85 if(!ipodInitialize(&ipod)) {
86 emit done(true);
87 return;
88 }
89
90 read_directory(&ipod);
91
92 if(ipod.nimages <= 0) {
93 emit logItem(tr("Failed to read firmware directory"), LOGERROR);
94 emit done(true);
95 return;
96 }
97 if(getmodel(&ipod,(ipod.ipod_directory[0].vers>>8)) < 0) {
98 emit logItem(tr("Unknown version number in firmware (%1)").arg(
99 ipod.ipod_directory[0].vers), LOGERROR);
100 emit done(true);
101 return;
102 }
103
104 if(ipod.macpod) {
105 emit logItem(tr("Warning: This is a MacPod. Rockbox only runs on WinPods.\n"
106 "See http://www.rockbox.org/wiki/IpodConversionToFAT32"), LOGERROR);
107 emit done(true);
108 return;
109 }
110
111 if(ipod_reopen_rw(&ipod) < 0) {
112 emit logItem(tr("Could not open Ipod in R/W mode"), LOGERROR);
113 emit done(true);
114 return;
115 }
116
117 m_tempfile.open();
118 QString blfile = m_tempfile.fileName();
119 m_tempfile.close();
120 if(add_bootloader(&ipod, blfile.toLatin1().data(), FILETYPE_DOT_IPOD) == 0) {
121 emit logItem(tr("Successfull added bootloader"), LOGOK);
122 logInstall(LogAdd);
123 emit done(false);
124 ipod_close(&ipod);
125 return;
126 }
127 else {
128 emit logItem(tr("Failed to add bootloader"), LOGERROR);
129 ipod_close(&ipod);
130 emit done(true);
131 return;
132 }
133 qDebug() << "version installed:" << m_blversion.toString(Qt::ISODate);
134}
135
136
137bool BootloaderInstallIpod::uninstall(void)
138{
139 struct ipod_t ipod;
140
141 if(!ipodInitialize(&ipod)) {
142 emit done(true);
143 return false;
144 }
145
146 read_directory(&ipod);
147
148 if (ipod.nimages <= 0) {
149 emit logItem(tr("Failed to read firmware directory"),LOGERROR);
150 emit done(true);
151 return false;
152 }
153 if (getmodel(&ipod,(ipod.ipod_directory[0].vers>>8)) < 0) {
154 emit logItem(tr("Unknown version number in firmware (%1)").arg(
155 ipod.ipod_directory[0].vers), LOGERROR);
156 emit done(true);
157 return false;
158 }
159
160 if (ipod_reopen_rw(&ipod) < 0) {
161 emit logItem(tr("Could not open Ipod in RW mode"), LOGERROR);
162 emit done(true);
163 return false;
164 }
165
166 if (ipod.ipod_directory[0].entryOffset == 0) {
167 emit logItem(tr("No bootloader detected."), LOGERROR);
168 emit done(true);
169 return false;
170 }
171
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;
178 }
179 else {
180 emit logItem(tr("Removing the bootloader failed."), LOGERROR);
181 emit done(true);
182 ipod_close(&ipod);
183 return false;
184 }
185}
186
187
188BootloaderInstallBase::BootloaderType BootloaderInstallIpod::installed(void)
189{
190 struct ipod_t ipod;
191 BootloaderInstallBase::BootloaderType result = BootloaderRockbox;
192
193 if(!ipodInitialize(&ipod)) {
194 qDebug() << "BootloaderInstallIpod::installed(): BootloaderUnknown";
195 result = BootloaderUnknown;
196 }
197
198 if (ipod.ipod_directory[0].entryOffset == 0) {
199 qDebug() << "BootloaderInstallIpod::installed(): BootloaderOther";
200 result = BootloaderOther;
201 }
202 qDebug() << "BootloaderInstallIpod::installed(): BootloaderRockbox";
203 ipod_close(&ipod);
204
205 return result;
206}
207
208
209BootloaderInstallBase::Capabilities BootloaderInstallIpod::capabilities(void)
210{
211 return (Install | Uninstall | IsRaw);
212}
213
214
215bool BootloaderInstallIpod::ipodInitialize(struct ipod_t *ipod)
216{
217 ipod_scan(ipod);
218 if(ipod_open(ipod, 0) < 0) {
219 emit logItem(tr("Could not open Ipod"), LOGERROR);
220 return false;
221 }
222
223 if(read_partinfo(ipod, 0) < 0) {
224 emit logItem(tr("Could not read partition table"), LOGERROR);
225 return false;
226 }
227
228 if(ipod->pinfo[0].start == 0) {
229 emit logItem(tr("No firmware partition on disk"), LOGERROR);
230
231 return false;
232 }
233 return true;
234}
235