summaryrefslogtreecommitdiff
path: root/rbutil/rbutilqt/base/bootloaderinstallsansa.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'rbutil/rbutilqt/base/bootloaderinstallsansa.cpp')
-rw-r--r--rbutil/rbutilqt/base/bootloaderinstallsansa.cpp100
1 files changed, 45 insertions, 55 deletions
diff --git a/rbutil/rbutilqt/base/bootloaderinstallsansa.cpp b/rbutil/rbutilqt/base/bootloaderinstallsansa.cpp
index 4679c2e9a8..aab298ce95 100644
--- a/rbutil/rbutilqt/base/bootloaderinstallsansa.cpp
+++ b/rbutil/rbutilqt/base/bootloaderinstallsansa.cpp
@@ -22,6 +22,7 @@
22#include "bootloaderinstallsansa.h" 22#include "bootloaderinstallsansa.h"
23 23
24#include "../sansapatcher/sansapatcher.h" 24#include "../sansapatcher/sansapatcher.h"
25#include "autodetection.h"
25 26
26BootloaderInstallSansa::BootloaderInstallSansa(QObject *parent) 27BootloaderInstallSansa::BootloaderInstallSansa(QObject *parent)
27 : BootloaderInstallBase(parent) 28 : BootloaderInstallBase(parent)
@@ -36,7 +37,8 @@ BootloaderInstallSansa::BootloaderInstallSansa(QObject *parent)
36 37
37BootloaderInstallSansa::~BootloaderInstallSansa() 38BootloaderInstallSansa::~BootloaderInstallSansa()
38{ 39{
39 free(sansa_sectorbuf); 40 if(sansa_sectorbuf)
41 free(sansa_sectorbuf);
40} 42}
41 43
42 44
@@ -80,30 +82,12 @@ bool BootloaderInstallSansa::install(void)
80void BootloaderInstallSansa::installStage2(void) 82void BootloaderInstallSansa::installStage2(void)
81{ 83{
82 struct sansa_t sansa; 84 struct sansa_t sansa;
83 sansa_scan(&sansa);
84 85
85 emit logItem(tr("Installing Rockbox bootloader"), LOGINFO); 86 emit logItem(tr("Installing Rockbox bootloader"), LOGINFO);
86 QCoreApplication::processEvents(); 87 QCoreApplication::processEvents();
87 88 if(!sansaInitialize(&sansa)) {
88 if(sansa_open(&sansa, 0) < 0) { 89 emit done(true);
89 emit logItem(tr("could not open Sansa"), LOGERROR); 90 return;
90 emit done(true);
91 return;
92 }
93
94 if(sansa_read_partinfo(&sansa, 0) < 0)
95 {
96 emit logItem(tr("could not read partitiontable"), LOGERROR);
97 emit done(true);
98 return;
99 }
100
101 int i = is_sansa(&sansa);
102 if(i < 0) {
103
104 emit logItem(tr("Disk is not a Sansa (Error: %1), aborting.").arg(i), LOGERROR);
105 emit done(true);
106 return;
107 } 91 }
108 92
109 if(sansa.hasoldbootloader) { 93 if(sansa.hasoldbootloader) {
@@ -169,27 +153,7 @@ bool BootloaderInstallSansa::uninstall(void)
169 emit logItem(tr("Uninstalling bootloader"), LOGINFO); 153 emit logItem(tr("Uninstalling bootloader"), LOGINFO);
170 QCoreApplication::processEvents(); 154 QCoreApplication::processEvents();
171 155
172 if(sansa_scan(&sansa) != 1) { 156 if(!sansaInitialize(&sansa)) {
173 emit logItem(tr("Can't find Sansa"), LOGERROR);
174 emit done(true);
175 return false;
176 }
177
178 if (sansa_open(&sansa, 0) < 0) {
179 emit logItem(tr("Could not open Sansa"), LOGERROR);
180 emit done(true);
181 return false;
182 }
183
184 if (sansa_read_partinfo(&sansa,0) < 0) {
185 emit logItem(tr("Could not read partition table"), LOGERROR);
186 emit done(true);
187 return false;
188 }
189
190 int i = is_sansa(&sansa);
191 if(i < 0) {
192 emit logItem(tr("Disk is not a Sansa (Error %1), aborting.").arg(i), LOGERROR);
193 emit done(true); 157 emit done(true);
194 return false; 158 return false;
195 } 159 }
@@ -235,18 +199,7 @@ BootloaderInstallBase::BootloaderType BootloaderInstallSansa::installed(void)
235 struct sansa_t sansa; 199 struct sansa_t sansa;
236 int num; 200 int num;
237 201
238 if(sansa_scan(&sansa) != 1) { 202 if(!sansaInitialize(&sansa)) {
239 return BootloaderUnknown;
240 }
241 if (sansa_open(&sansa, 0) < 0) {
242 return BootloaderUnknown;
243 }
244 if (sansa_read_partinfo(&sansa,0) < 0) {
245 sansa_close(&sansa);
246 return BootloaderUnknown;
247 }
248 if(is_sansa(&sansa) < 0) {
249 sansa_close(&sansa);
250 return BootloaderUnknown; 203 return BootloaderUnknown;
251 } 204 }
252 if((num = sansa_list_images(&sansa)) == 2) { 205 if((num = sansa_list_images(&sansa)) == 2) {
@@ -261,6 +214,43 @@ BootloaderInstallBase::BootloaderType BootloaderInstallSansa::installed(void)
261 214
262} 215}
263 216
217bool BootloaderInstallSansa::sansaInitialize(struct sansa_t *sansa)
218{
219 if(!m_blfile.isEmpty()) {
220#if defined(Q_OS_WIN32)
221 sprintf(sansa->diskname, "\\\\.\\PhysicalDrive%i",
222 Autodetection::resolveDevicename(m_blfile).toInt());
223#else
224 sprintf(sansa->diskname,
225 qPrintable(Autodetection::resolveDevicename(m_blfile).remove(QRegExp("[0-9]+$"))));
226#endif
227 qDebug() << "sansapatcher: overriding scan, using" << sansa->diskname;
228 }
229 else if(sansa_scan(sansa) != 1) {
230 emit logItem(tr("Can't find Sansa"), LOGERROR);
231 return false;
232 }
233
234 if (sansa_open(sansa, 0) < 0) {
235 emit logItem(tr("Could not open Sansa"), LOGERROR);
236 return false;
237 }
238
239 if (sansa_read_partinfo(sansa,0) < 0) {
240 emit logItem(tr("Could not read partition table"), LOGERROR);
241 sansa_close(sansa);
242 return false;
243 }
244
245 int i = is_sansa(sansa);
246 if(i < 0) {
247 emit logItem(tr("Disk is not a Sansa (Error %1), aborting.").arg(i), LOGERROR);
248 sansa_close(sansa);
249 return false;
250 }
251 return true;
252}
253
264 254
265/** Get capabilities of subclass installer. 255/** Get capabilities of subclass installer.
266 */ 256 */