diff --git a/rbutil/rbutilqt/base/autodetection.cpp b/rbutil/rbutilqt/base/autodetection.cpp index aa74419..cc8cae3 100644 --- a/rbutil/rbutilqt/base/autodetection.cpp +++ b/rbutil/rbutilqt/base/autodetection.cpp @@ -25,7 +25,6 @@ #if defined(Q_OS_LINUX) || defined(Q_OS_MACX) #include -#include #endif #if defined(Q_OS_LINUX) #include diff --git a/rbutil/rbutilqt/base/bootloaderinstallbase.cpp b/rbutil/rbutilqt/base/bootloaderinstallbase.cpp index 4282837..5141dc5 100644 --- a/rbutil/rbutilqt/base/bootloaderinstallbase.cpp +++ b/rbutil/rbutilqt/base/bootloaderinstallbase.cpp @@ -23,6 +23,15 @@ #include "bootloaderinstallbase.h" #include "utils.h" +#if defined(Q_OS_LINUX) +#include +#endif +#if defined(Q_OS_MACX) +#include +#include +#include +#endif + BootloaderInstallBase::BootloaderType BootloaderInstallBase::installed(void) { return BootloaderUnknown; @@ -185,3 +194,51 @@ QString BootloaderInstallBase::postinstallHints(QString model) return QString(""); } + +#if defined(Q_OS_MACX) +void BootloaderInstallBase::waitRemount() +{ + m_remountTries = 600; + emit logItem(tr("Waiting for system to remount player"), LOGINFO); + + QTimer::singleShot(500, this, SLOT(checkRemount())); +} +#endif + + +void BootloaderInstallBase::checkRemount() +{ +#if defined(Q_OS_MACX) + if(m_remountTries--) { + int status = 0; + // check if device has been remounted + QCoreApplication::processEvents(); +#if defined(Q_OS_MACX) || defined(Q_OS_OPENBSD) + int num; + struct statfs *mntinf; + + num = getmntinfo(&mntinf, MNT_WAIT); + while(num--) { + if(QString(mntinf->f_mntfromname).startsWith(m_remountDevice) + && QString(mntinf->f_fstypename).contains("vfat", Qt::CaseInsensitive)) + status = 1; + mntinf++; + } +#endif + if(!status) { + // still not remounted, restart timer. + QTimer::singleShot(500, this, SLOT(checkRemount())); + qDebug() << "player not remounted yet" << m_remountDevice; + } + else { + emit logItem(tr("Player remounted"), LOGINFO); + emit remounted(true); + } + } + else { + emit logItem(tr("Timeout on remount"), LOGERROR); + emit remounted(false); + } +#endif +} + diff --git a/rbutil/rbutilqt/base/bootloaderinstallbase.h b/rbutil/rbutilqt/base/bootloaderinstallbase.h index 0916935..1965161 100644 --- a/rbutil/rbutilqt/base/bootloaderinstallbase.h +++ b/rbutil/rbutilqt/base/bootloaderinstallbase.h @@ -63,6 +63,10 @@ class BootloaderInstallBase : public QObject void downloadReqFinished(int id, bool error); void downloadBlFinish(bool error); void installBlfile(void); + + // NOTE: we need to keep this slot even on targets that don't need it + // -- using the preprocessor here confused moc. + void checkRemount(void); protected: enum LogMode { LogAdd, LogRemove }; @@ -76,12 +80,22 @@ class BootloaderInstallBase : public QObject QUrl m_blurl; //! bootloader download URL QTemporaryFile m_tempfile; //! temporary file for download QDateTime m_blversion; //! download timestamp used for version information +#if defined(Q_OS_MACX) + void waitRemount(void); + + int m_remountTries; + QString m_remountDevice; +#endif signals: void downloadDone(void); //! internal signal sent when download finished. void done(bool); void logItem(QString, int); //! set logger item void logProgress(int, int); //! set progress bar. + + // NOTE: we need to keep this signal even on targets that don't need it + // -- using the preprocessor here confused moc. + void remounted(bool); }; Q_DECLARE_OPERATORS_FOR_FLAGS(BootloaderInstallBase::Capabilities) diff --git a/rbutil/rbutilqt/base/bootloaderinstallipod.cpp b/rbutil/rbutilqt/base/bootloaderinstallipod.cpp index 82c6495..9f45258 100644 --- a/rbutil/rbutilqt/base/bootloaderinstallipod.cpp +++ b/rbutil/rbutilqt/base/bootloaderinstallipod.cpp @@ -121,10 +121,14 @@ void BootloaderInstallIpod::installStage2(void) m_tempfile.close(); if(add_bootloader(&ipod, blfile.toLatin1().data(), FILETYPE_DOT_IPOD) == 0) { emit logItem(tr("Successfull added bootloader"), LOGOK); - logInstall(LogAdd); - emit done(false); ipod_close(&ipod); - return; +#if defined(Q_OS_MACX) + m_remountDevice = ipod.diskname; + connect(this, SIGNAL(remounted(bool)), this, SLOT(installStage3(bool))); + waitRemount(); +#else + installStage3(true); +#endif } else { emit logItem(tr("Failed to add bootloader"), LOGERROR); @@ -132,6 +136,21 @@ void BootloaderInstallIpod::installStage2(void) emit done(true); return; } +} + + +void BootloaderInstallIpod::installStage3(bool mounted) +{ + if(mounted) { + logInstall(LogAdd); + emit logItem(tr("Bootloader Installation complete."), LOGINFO); + emit done(false); + return; + } + else { + emit logItem(tr("Writing log aborted"), LOGERROR); + emit done(true); + } qDebug() << "version installed:" << m_blversion.toString(Qt::ISODate); } diff --git a/rbutil/rbutilqt/base/bootloaderinstallipod.h b/rbutil/rbutilqt/base/bootloaderinstallipod.h index 5867b75..c9bed87 100644 --- a/rbutil/rbutilqt/base/bootloaderinstallipod.h +++ b/rbutil/rbutilqt/base/bootloaderinstallipod.h @@ -40,6 +40,7 @@ class BootloaderInstallIpod : public BootloaderInstallBase private slots: void installStage2(void); + void installStage3(bool mounted); private: bool ipodInitialize(struct ipod_t *); diff --git a/rbutil/rbutilqt/base/bootloaderinstallsansa.cpp b/rbutil/rbutilqt/base/bootloaderinstallsansa.cpp index 4679c2e..125f643 100644 --- a/rbutil/rbutilqt/base/bootloaderinstallsansa.cpp +++ b/rbutil/rbutilqt/base/bootloaderinstallsansa.cpp @@ -145,10 +145,14 @@ void BootloaderInstallSansa::installStage2(void) if(sansa_add_bootloader(&sansa, blfile.toLatin1().data(), FILETYPE_MI4) == 0) { emit logItem(tr("Successfully installed bootloader"), LOGOK); - logInstall(LogAdd); - emit done(false); sansa_close(&sansa); - return; +#if defined(Q_OS_MACX) + m_remountDevice = sansa.diskname; + connect(this, SIGNAL(remounted(bool)), this, SLOT(installStage3(bool))); + waitRemount(); +#else + installStage3(true); +#endif } else { emit logItem(tr("Failed to install bootloader"), LOGERROR); @@ -160,6 +164,22 @@ void BootloaderInstallSansa::installStage2(void) } +void BootloaderInstallSansa::installStage3(bool mounted) +{ + if(mounted) { + logInstall(LogAdd); + emit logItem(tr("Bootloader Installation complete."), LOGINFO); + emit done(false); + return; + } + else { + emit logItem(tr("Writing log aborted"), LOGERROR); + emit done(true); + } + qDebug() << "version installed:" << m_blversion.toString(Qt::ISODate); +} + + /** Uninstall the bootloader. */ bool BootloaderInstallSansa::uninstall(void) diff --git a/rbutil/rbutilqt/base/bootloaderinstallsansa.h b/rbutil/rbutilqt/base/bootloaderinstallsansa.h index a391105..9dd04b6 100644 --- a/rbutil/rbutilqt/base/bootloaderinstallsansa.h +++ b/rbutil/rbutilqt/base/bootloaderinstallsansa.h @@ -41,6 +41,7 @@ class BootloaderInstallSansa : public BootloaderInstallBase private slots: void installStage2(void); + void installStage3(bool); };