summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDominik Riebeling <Dominik.Riebeling@gmail.com>2009-11-22 22:13:25 +0000
committerDominik Riebeling <Dominik.Riebeling@gmail.com>2009-11-22 22:13:25 +0000
commit38dde55c27a3f5171a1b7235c8729c4bc8502779 (patch)
tree2a5b32aea0a122ac0d3276b3d5638870296636cc
parent46e56582b02f833983c7c9244f3b597424089559 (diff)
downloadrockbox-38dde55c27a3f5171a1b7235c8729c4bc8502779.tar.gz
rockbox-38dde55c27a3f5171a1b7235c8729c4bc8502779.zip
FS#10100: Wait for the system to remount the player after bootloader installation.
OS X requires to unmount the player during bootloader installation on Sansas / Ipods. The system remounts the player automatically after a short while. Not waiting for the system to remount the player will result in a changed mount point, making the small / full install write the main build to the wrong location. This currently waits up to 60 seconds for the player to get remounted until it errors out. This value seems to be sufficient, if it's not please report so we can adjust it. Also, the waiting can't be interrupted right now. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@23716 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--rbutil/rbutilqt/base/autodetection.cpp1
-rw-r--r--rbutil/rbutilqt/base/bootloaderinstallbase.cpp52
-rw-r--r--rbutil/rbutilqt/base/bootloaderinstallbase.h15
-rw-r--r--rbutil/rbutilqt/base/bootloaderinstallipod.cpp27
-rw-r--r--rbutil/rbutilqt/base/bootloaderinstallipod.h1
-rw-r--r--rbutil/rbutilqt/base/bootloaderinstallsansa.cpp26
-rw-r--r--rbutil/rbutilqt/base/bootloaderinstallsansa.h1
7 files changed, 116 insertions, 7 deletions
diff --git a/rbutil/rbutilqt/base/autodetection.cpp b/rbutil/rbutilqt/base/autodetection.cpp
index 50612b58ba..e6bfc440a7 100644
--- a/rbutil/rbutilqt/base/autodetection.cpp
+++ b/rbutil/rbutilqt/base/autodetection.cpp
@@ -26,7 +26,6 @@
26 26
27#if defined(Q_OS_LINUX) || defined(Q_OS_MACX) 27#if defined(Q_OS_LINUX) || defined(Q_OS_MACX)
28#include <stdio.h> 28#include <stdio.h>
29#include <usb.h>
30#endif 29#endif
31#if defined(Q_OS_LINUX) 30#if defined(Q_OS_LINUX)
32#include <mntent.h> 31#include <mntent.h>
diff --git a/rbutil/rbutilqt/base/bootloaderinstallbase.cpp b/rbutil/rbutilqt/base/bootloaderinstallbase.cpp
index a4cf22af29..8672e29a4f 100644
--- a/rbutil/rbutilqt/base/bootloaderinstallbase.cpp
+++ b/rbutil/rbutilqt/base/bootloaderinstallbase.cpp
@@ -23,6 +23,12 @@
23#include "bootloaderinstallbase.h" 23#include "bootloaderinstallbase.h"
24#include "utils.h" 24#include "utils.h"
25 25
26#if defined(Q_OS_MACX)
27#include <sys/param.h>
28#include <sys/ucred.h>
29#include <sys/mount.h>
30#endif
31
26BootloaderInstallBase::BootloaderType BootloaderInstallBase::installed(void) 32BootloaderInstallBase::BootloaderType BootloaderInstallBase::installed(void)
27{ 33{
28 return BootloaderUnknown; 34 return BootloaderUnknown;
@@ -189,6 +195,52 @@ QString BootloaderInstallBase::postinstallHints(QString model)
189} 195}
190 196
191 197
198#if defined(Q_OS_MACX)
199void BootloaderInstallBase::waitRemount()
200{
201 m_remountTries = 600;
202 emit logItem(tr("Waiting for system to remount player"), LOGINFO);
203
204 QTimer::singleShot(100, this, SLOT(checkRemount()));
205}
206#endif
207
208
209void BootloaderInstallBase::checkRemount()
210{
211#if defined(Q_OS_MACX)
212 if(m_remountTries--) {
213 int status = 0;
214 // check if device has been remounted
215 QCoreApplication::processEvents();
216 int num;
217 struct statfs *mntinf;
218
219 num = getmntinfo(&mntinf, MNT_WAIT);
220 while(num--) {
221 if(QString(mntinf->f_mntfromname).startsWith(m_remountDevice)
222 && QString(mntinf->f_fstypename).contains("msdos", Qt::CaseInsensitive))
223 status = 1;
224 mntinf++;
225 }
226 if(!status) {
227 // still not remounted, restart timer.
228 QTimer::singleShot(500, this, SLOT(checkRemount()));
229 qDebug() << "player not remounted yet" << m_remountDevice;
230 }
231 else {
232 emit logItem(tr("Player remounted"), LOGINFO);
233 emit remounted(true);
234 }
235 }
236 else {
237 emit logItem(tr("Timeout on remount"), LOGERROR);
238 emit remounted(false);
239 }
240#endif
241}
242
243
192//! @brief set list of possible bootloader files and pick the existing one. 244//! @brief set list of possible bootloader files and pick the existing one.
193//! @param sl list of possible bootloader files. 245//! @param sl list of possible bootloader files.
194void BootloaderInstallBase::setBlFile(QStringList sl) 246void BootloaderInstallBase::setBlFile(QStringList sl)
diff --git a/rbutil/rbutilqt/base/bootloaderinstallbase.h b/rbutil/rbutilqt/base/bootloaderinstallbase.h
index d96e8ca73b..07fbd9ebcf 100644
--- a/rbutil/rbutilqt/base/bootloaderinstallbase.h
+++ b/rbutil/rbutilqt/base/bootloaderinstallbase.h
@@ -74,6 +74,10 @@ class BootloaderInstallBase : public QObject
74 void downloadReqFinished(int id, bool error); 74 void downloadReqFinished(int id, bool error);
75 void downloadBlFinish(bool error); 75 void downloadBlFinish(bool error);
76 void installBlfile(void); 76 void installBlfile(void);
77
78 // NOTE: we need to keep this slot even on targets that don't need it
79 // -- using the preprocessor here confused moc.
80 void checkRemount(void);
77 protected: 81 protected:
78 enum LogMode 82 enum LogMode
79 { LogAdd, LogRemove }; 83 { LogAdd, LogRemove };
@@ -88,11 +92,22 @@ class BootloaderInstallBase : public QObject
88 QTemporaryFile m_tempfile; //! temporary file for download 92 QTemporaryFile m_tempfile; //! temporary file for download
89 QDateTime m_blversion; //! download timestamp used for version information 93 QDateTime m_blversion; //! download timestamp used for version information
90 QString m_offile; //! path to the offile 94 QString m_offile; //! path to the offile
95#if defined(Q_OS_MACX)
96 void waitRemount(void);
97
98 int m_remountTries;
99 QString m_remountDevice;
100#endif
101
91 signals: 102 signals:
92 void downloadDone(void); //! internal signal sent when download finished. 103 void downloadDone(void); //! internal signal sent when download finished.
93 void done(bool); 104 void done(bool);
94 void logItem(QString, int); //! set logger item 105 void logItem(QString, int); //! set logger item
95 void logProgress(int, int); //! set progress bar. 106 void logProgress(int, int); //! set progress bar.
107
108 // NOTE: we need to keep this signal even on targets that don't need it
109 // -- using the preprocessor here confused moc.
110 void remounted(bool);
96}; 111};
97 112
98Q_DECLARE_OPERATORS_FOR_FLAGS(BootloaderInstallBase::Capabilities) 113Q_DECLARE_OPERATORS_FOR_FLAGS(BootloaderInstallBase::Capabilities)
diff --git a/rbutil/rbutilqt/base/bootloaderinstallipod.cpp b/rbutil/rbutilqt/base/bootloaderinstallipod.cpp
index 0e374a9699..eaf69e4773 100644
--- a/rbutil/rbutilqt/base/bootloaderinstallipod.cpp
+++ b/rbutil/rbutilqt/base/bootloaderinstallipod.cpp
@@ -129,10 +129,14 @@ void BootloaderInstallIpod::installStage2(void)
129 m_tempfile.close(); 129 m_tempfile.close();
130 if(add_bootloader(&ipod, blfile.toLatin1().data(), FILETYPE_DOT_IPOD) == 0) { 130 if(add_bootloader(&ipod, blfile.toLatin1().data(), FILETYPE_DOT_IPOD) == 0) {
131 emit logItem(tr("Successfull added bootloader"), LOGOK); 131 emit logItem(tr("Successfull added bootloader"), LOGOK);
132 logInstall(LogAdd);
133 emit done(false);
134 ipod_close(&ipod); 132 ipod_close(&ipod);
135 return; 133#if defined(Q_OS_MACX)
134 m_remountDevice = ipod.diskname;
135 connect(this, SIGNAL(remounted(bool)), this, SLOT(installStage3(bool)));
136 waitRemount();
137#else
138 installStage3(true);
139#endif
136 } 140 }
137 else { 141 else {
138 emit logItem(tr("Failed to add bootloader"), LOGERROR); 142 emit logItem(tr("Failed to add bootloader"), LOGERROR);
@@ -140,6 +144,21 @@ void BootloaderInstallIpod::installStage2(void)
140 emit done(true); 144 emit done(true);
141 return; 145 return;
142 } 146 }
147}
148
149
150void BootloaderInstallIpod::installStage3(bool mounted)
151{
152 if(mounted) {
153 logInstall(LogAdd);
154 emit logItem(tr("Bootloader Installation complete."), LOGINFO);
155 emit done(false);
156 return;
157 }
158 else {
159 emit logItem(tr("Writing log aborted"), LOGERROR);
160 emit done(true);
161 }
143 qDebug() << "[BootloaderInstallIpod] version installed:" << m_blversion.toString(Qt::ISODate); 162 qDebug() << "[BootloaderInstallIpod] version installed:" << m_blversion.toString(Qt::ISODate);
144} 163}
145 164
@@ -248,6 +267,8 @@ bool BootloaderInstallIpod::ipodInitialize(struct ipod_t *ipod)
248 } 267 }
249 else { 268 else {
250 ipod_scan(ipod); 269 ipod_scan(ipod);
270 qDebug() << "[BootloaderInstallIpod] ipodpatcher: scanning, found device"
271 << ipod->diskname;
251 } 272 }
252 if(ipod_open(ipod, 0) < 0) { 273 if(ipod_open(ipod, 0) < 0) {
253 emit logItem(tr("Could not open Ipod"), LOGERROR); 274 emit logItem(tr("Could not open Ipod"), LOGERROR);
diff --git a/rbutil/rbutilqt/base/bootloaderinstallipod.h b/rbutil/rbutilqt/base/bootloaderinstallipod.h
index 7e24ae1539..622c0730ed 100644
--- a/rbutil/rbutilqt/base/bootloaderinstallipod.h
+++ b/rbutil/rbutilqt/base/bootloaderinstallipod.h
@@ -40,6 +40,7 @@ class BootloaderInstallIpod : public BootloaderInstallBase
40 40
41 private slots: 41 private slots:
42 void installStage2(void); 42 void installStage2(void);
43 void installStage3(bool mounted);
43 44
44 private: 45 private:
45 bool ipodInitialize(struct ipod_t *); 46 bool ipodInitialize(struct ipod_t *);
diff --git a/rbutil/rbutilqt/base/bootloaderinstallsansa.cpp b/rbutil/rbutilqt/base/bootloaderinstallsansa.cpp
index e57a7f9c24..48bd0053ee 100644
--- a/rbutil/rbutilqt/base/bootloaderinstallsansa.cpp
+++ b/rbutil/rbutilqt/base/bootloaderinstallsansa.cpp
@@ -134,10 +134,14 @@ void BootloaderInstallSansa::installStage2(void)
134 if(sansa_add_bootloader(&sansa, blfile.toLatin1().data(), 134 if(sansa_add_bootloader(&sansa, blfile.toLatin1().data(),
135 FILETYPE_MI4) == 0) { 135 FILETYPE_MI4) == 0) {
136 emit logItem(tr("Successfully installed bootloader"), LOGOK); 136 emit logItem(tr("Successfully installed bootloader"), LOGOK);
137 logInstall(LogAdd);
138 emit done(false);
139 sansa_close(&sansa); 137 sansa_close(&sansa);
140 return; 138#if defined(Q_OS_MACX)
139 m_remountDevice = sansa.diskname;
140 connect(this, SIGNAL(remounted(bool)), this, SLOT(installStage3(bool)));
141 waitRemount();
142#else
143 installStage3(true);
144#endif
141 } 145 }
142 else { 146 else {
143 emit logItem(tr("Failed to install bootloader"), LOGERROR); 147 emit logItem(tr("Failed to install bootloader"), LOGERROR);
@@ -149,6 +153,22 @@ void BootloaderInstallSansa::installStage2(void)
149} 153}
150 154
151 155
156void BootloaderInstallSansa::installStage3(bool mounted)
157{
158 if(mounted) {
159 logInstall(LogAdd);
160 emit logItem(tr("Bootloader Installation complete."), LOGINFO);
161 emit done(false);
162 return;
163 }
164 else {
165 emit logItem(tr("Writing log aborted"), LOGERROR);
166 emit done(true);
167 }
168 qDebug() << "version installed:" << m_blversion.toString(Qt::ISODate);
169}
170
171
152/** Uninstall the bootloader. 172/** Uninstall the bootloader.
153 */ 173 */
154bool BootloaderInstallSansa::uninstall(void) 174bool BootloaderInstallSansa::uninstall(void)
diff --git a/rbutil/rbutilqt/base/bootloaderinstallsansa.h b/rbutil/rbutilqt/base/bootloaderinstallsansa.h
index 29eaa6d603..7e49f584de 100644
--- a/rbutil/rbutilqt/base/bootloaderinstallsansa.h
+++ b/rbutil/rbutilqt/base/bootloaderinstallsansa.h
@@ -42,6 +42,7 @@ class BootloaderInstallSansa : public BootloaderInstallBase
42 42
43 private slots: 43 private slots:
44 void installStage2(void); 44 void installStage2(void);
45 void installStage3(bool);
45}; 46};
46 47
47 48