diff options
author | Dominik Riebeling <Dominik.Riebeling@gmail.com> | 2009-11-22 22:13:25 +0000 |
---|---|---|
committer | Dominik Riebeling <Dominik.Riebeling@gmail.com> | 2009-11-22 22:13:25 +0000 |
commit | 38dde55c27a3f5171a1b7235c8729c4bc8502779 (patch) | |
tree | 2a5b32aea0a122ac0d3276b3d5638870296636cc | |
parent | 46e56582b02f833983c7c9244f3b597424089559 (diff) | |
download | rockbox-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.cpp | 1 | ||||
-rw-r--r-- | rbutil/rbutilqt/base/bootloaderinstallbase.cpp | 52 | ||||
-rw-r--r-- | rbutil/rbutilqt/base/bootloaderinstallbase.h | 15 | ||||
-rw-r--r-- | rbutil/rbutilqt/base/bootloaderinstallipod.cpp | 27 | ||||
-rw-r--r-- | rbutil/rbutilqt/base/bootloaderinstallipod.h | 1 | ||||
-rw-r--r-- | rbutil/rbutilqt/base/bootloaderinstallsansa.cpp | 26 | ||||
-rw-r--r-- | rbutil/rbutilqt/base/bootloaderinstallsansa.h | 1 |
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 | |||
26 | BootloaderInstallBase::BootloaderType BootloaderInstallBase::installed(void) | 32 | BootloaderInstallBase::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) | ||
199 | void 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 | |||
209 | void 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. |
194 | void BootloaderInstallBase::setBlFile(QStringList sl) | 246 | void 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 | ||
98 | Q_DECLARE_OPERATORS_FOR_FLAGS(BootloaderInstallBase::Capabilities) | 113 | Q_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 | |||
150 | void 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 | ||
156 | void 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 | */ |
154 | bool BootloaderInstallSansa::uninstall(void) | 174 | bool 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 | ||