diff options
Diffstat (limited to 'rbutil/rbutilqt/base/bootloaderinstallsansa.cpp')
-rw-r--r-- | rbutil/rbutilqt/base/bootloaderinstallsansa.cpp | 100 |
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 | ||
26 | BootloaderInstallSansa::BootloaderInstallSansa(QObject *parent) | 27 | BootloaderInstallSansa::BootloaderInstallSansa(QObject *parent) |
27 | : BootloaderInstallBase(parent) | 28 | : BootloaderInstallBase(parent) |
@@ -36,7 +37,8 @@ BootloaderInstallSansa::BootloaderInstallSansa(QObject *parent) | |||
36 | 37 | ||
37 | BootloaderInstallSansa::~BootloaderInstallSansa() | 38 | BootloaderInstallSansa::~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) | |||
80 | void BootloaderInstallSansa::installStage2(void) | 82 | void 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 | ||
217 | bool 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 | */ |