diff --git a/src/libtomahawk/filemetadata/MusicScanner.cpp b/src/libtomahawk/filemetadata/MusicScanner.cpp index a083291d5..5ecb1403a 100644 --- a/src/libtomahawk/filemetadata/MusicScanner.cpp +++ b/src/libtomahawk/filemetadata/MusicScanner.cpp @@ -124,12 +124,12 @@ DirListerThreadController::run() QMetaObject::invokeMethod( m_dirLister.data(), "go", Qt::QueuedConnection ); exec(); - if( !m_dirLister.isNull() ) + if ( !m_dirLister.isNull() ) delete m_dirLister.data(); } -MusicScanner::MusicScanner( ScanManager::ScanMode scanMode, const QStringList& paths, quint32 bs ) +MusicScanner::MusicScanner( MusicScanner::ScanMode scanMode, const QStringList& paths, quint32 bs ) : QObject() , m_scanMode( scanMode ) , m_paths( paths ) @@ -204,7 +204,7 @@ MusicScanner::scan() connect( this, SIGNAL( batchReady( QVariantList, QVariantList ) ), SLOT( commitBatch( QVariantList, QVariantList ) ), Qt::DirectConnection ); - if ( m_scanMode == ScanManager::FileScan ) + if ( m_scanMode == MusicScanner::FileScan ) { scanFilePaths(); return; @@ -236,7 +236,7 @@ MusicScanner::postOps() { tDebug( LOGVERBOSE ) << Q_FUNC_INFO; - if ( m_scanMode == ScanManager::DirScan ) + if ( m_scanMode == MusicScanner::DirScan ) { // any remaining stuff that wasnt emitted as a batch: foreach( const QString& key, m_filemtimes.keys() ) diff --git a/src/libtomahawk/filemetadata/MusicScanner.h b/src/libtomahawk/filemetadata/MusicScanner.h index 1190cd1c4..fa2eee9ba 100644 --- a/src/libtomahawk/filemetadata/MusicScanner.h +++ b/src/libtomahawk/filemetadata/MusicScanner.h @@ -23,8 +23,6 @@ #include "TomahawkSettings.h" #include "database/DatabaseCommand.h" -#include "ScanManager.h" - /* taglib */ #include #include @@ -100,7 +98,10 @@ class MusicScanner : public QObject Q_OBJECT public: - MusicScanner( ScanManager::ScanMode scanMode, const QStringList& paths, quint32 bs = 0 ); + enum ScanMode { DirScan, FileScan }; + enum ScanType { None, Full, Normal, File }; + + MusicScanner( MusicScanner::ScanMode scanMode, const QStringList& paths, quint32 bs = 0 ); ~MusicScanner(); signals: @@ -125,7 +126,7 @@ private slots: private: void scanFilePaths(); - ScanManager::ScanMode m_scanMode; + MusicScanner::ScanMode m_scanMode; QStringList m_paths; QMap m_ext2mime; // eg: mp3 -> audio/mpeg unsigned int m_scanned; diff --git a/src/libtomahawk/filemetadata/ScanManager.cpp b/src/libtomahawk/filemetadata/ScanManager.cpp index 32a60e6fc..ba804971b 100644 --- a/src/libtomahawk/filemetadata/ScanManager.cpp +++ b/src/libtomahawk/filemetadata/ScanManager.cpp @@ -35,6 +35,35 @@ #include #include + +MusicScannerThreadController::MusicScannerThreadController( QObject* parent ) + : QThread( parent ) + , m_bs( 0 ) +{ + tDebug() << Q_FUNC_INFO; +} + + +MusicScannerThreadController::~MusicScannerThreadController() +{ + tDebug() << Q_FUNC_INFO; +} + + +void +MusicScannerThreadController::run() +{ + m_musicScanner = QPointer< MusicScanner >( new MusicScanner( m_mode, m_paths, m_bs ) ); + connect( m_musicScanner.data(), SIGNAL( finished() ), parent(), SLOT( scannerFinished() ), Qt::QueuedConnection ); + QMetaObject::invokeMethod( m_musicScanner.data(), "startScan", Qt::QueuedConnection ); + + exec(); + + if ( !m_musicScanner.isNull() ) + delete m_musicScanner.data(); +} + + ScanManager* ScanManager::s_instance = 0; @@ -50,7 +79,7 @@ ScanManager::ScanManager( QObject* parent ) , m_musicScannerThreadController( 0 ) , m_currScannerPaths() , m_cachedScannerDirs() - , m_queuedScanType( None ) + , m_queuedScanType( MusicScanner::None ) , m_updateGUI( true ) { s_instance = this; @@ -76,12 +105,11 @@ ScanManager::~ScanManager() { qDebug() << Q_FUNC_INFO; - if ( !m_scanner.isNull() ) + if ( m_musicScannerThreadController ) { m_musicScannerThreadController->quit(); m_musicScannerThreadController->wait( 60000 ); - delete m_scanner.data(); delete m_musicScannerThreadController; m_musicScannerThreadController = 0; } @@ -157,17 +185,17 @@ ScanManager::runNormalScan( bool manualFull ) tDebug( LOGVERBOSE ) << Q_FUNC_INFO; - if ( m_musicScannerThreadController || !m_scanner.isNull() ) //still running if these are not zero + if ( m_musicScannerThreadController ) //still running if these are not zero { - if ( m_queuedScanType != Full ) - m_queuedScanType = manualFull ? Full : Normal; + if ( m_queuedScanType != MusicScanner::Full ) + m_queuedScanType = manualFull ? MusicScanner::Full : MusicScanner::Normal; tDebug( LOGVERBOSE ) << "Could not run dir scan, old scan still running"; return; } m_scanTimer->stop(); - m_musicScannerThreadController = new QThread( this ); - m_currScanMode = DirScan; + m_musicScannerThreadController = new MusicScannerThreadController( this ); + m_currScanMode = MusicScanner::DirScan; if ( manualFull ) { @@ -204,17 +232,17 @@ ScanManager::runFileScan( const QStringList& paths, bool updateGUI ) foreach( const QString& path, paths ) m_currScannerPaths.insert( path ); - if ( m_musicScannerThreadController || !m_scanner.isNull() ) //still running if these are not zero + if ( m_musicScannerThreadController ) //still running if these are not zero { - if ( m_queuedScanType == None ) - m_queuedScanType = File; + if ( m_queuedScanType == MusicScanner::None ) + m_queuedScanType = MusicScanner::File; tDebug( LOGVERBOSE ) << "Could not run file scan, old scan still running"; return; } m_scanTimer->stop(); - m_musicScannerThreadController = new QThread( this ); - m_currScanMode = FileScan; + m_musicScannerThreadController = new MusicScannerThreadController( this ); + m_currScanMode = MusicScanner::FileScan; m_updateGUI = updateGUI; QMetaObject::invokeMethod( this, "runScan", Qt::QueuedConnection ); @@ -224,7 +252,7 @@ ScanManager::runFileScan( const QStringList& paths, bool updateGUI ) void ScanManager::fileMtimesCheck( const QMap< QString, QMap< unsigned int, unsigned int > >& mtimes ) { - if ( !mtimes.isEmpty() && m_currScanMode == DirScan && TomahawkSettings::instance()->scannerPaths().isEmpty() ) + if ( !mtimes.isEmpty() && m_currScanMode == MusicScanner::DirScan && TomahawkSettings::instance()->scannerPaths().isEmpty() ) { DatabaseCommand_DeleteFiles *cmd = new DatabaseCommand_DeleteFiles( SourceList::instance()->getLocal() ); connect( cmd, SIGNAL( finished() ), SLOT( filesDeleted() ) ); @@ -253,14 +281,9 @@ ScanManager::runScan() QStringList paths = m_currScannerPaths.empty() ? TomahawkSettings::instance()->scannerPaths() : m_currScannerPaths.toList(); - if ( m_musicScannerThreadController && m_scanner.isNull() ) - { - m_scanner = QPointer< MusicScanner >( new MusicScanner( m_currScanMode, paths ) ); - m_scanner.data()->moveToThread( m_musicScannerThreadController ); - connect( m_scanner.data(), SIGNAL( finished() ), SLOT( scannerFinished() ) ); - m_musicScannerThreadController->start( QThread::IdlePriority ); - QMetaObject::invokeMethod( m_scanner.data(), "startScan" ); - } + m_musicScannerThreadController->setScanMode( m_currScanMode ); + m_musicScannerThreadController->setPaths( paths ); + m_musicScannerThreadController->start( QThread::IdlePriority ); } @@ -268,14 +291,11 @@ void ScanManager::scannerFinished() { tLog( LOGVERBOSE ) << Q_FUNC_INFO; - if ( !m_scanner.isNull() || m_musicScannerThreadController ) + if ( m_musicScannerThreadController ) { m_musicScannerThreadController->quit(); m_musicScannerThreadController->wait( 60000 ); - if ( !m_scanner.isNull() ) - delete m_scanner.data(); - delete m_musicScannerThreadController; m_musicScannerThreadController = 0; } @@ -284,21 +304,21 @@ ScanManager::scannerFinished() m_updateGUI = true; emit finished(); - if ( m_queuedScanType != File ) + if ( m_queuedScanType != MusicScanner::File ) m_currScannerPaths.clear(); switch ( m_queuedScanType ) { - case Full: - case Normal: - QMetaObject::invokeMethod( this, "runNormalScan", Qt::QueuedConnection, Q_ARG( bool, m_queuedScanType == Full ) ); + case MusicScanner::Full: + case MusicScanner::Normal: + QMetaObject::invokeMethod( this, "runNormalScan", Qt::QueuedConnection, Q_ARG( bool, m_queuedScanType == MusicScanner::Full ) ); break; - case File: + case MusicScanner::File: QMetaObject::invokeMethod( this, "", Qt::QueuedConnection, Q_ARG( QStringList, QStringList() ) ); break; default: break; } - m_queuedScanType = None; + m_queuedScanType = MusicScanner::None; m_scanTimer->start(); } diff --git a/src/libtomahawk/filemetadata/ScanManager.h b/src/libtomahawk/filemetadata/ScanManager.h index 564b64f8d..fbae62b25 100644 --- a/src/libtomahawk/filemetadata/ScanManager.h +++ b/src/libtomahawk/filemetadata/ScanManager.h @@ -23,26 +23,44 @@ #include "Typedefs.h" #include "DllMacro.h" -#include -#include -#include -#include -#include -#include +#include "MusicScanner.h" + +#include +#include +#include +#include +#include +#include +#include -class MusicScanner; -class QThread; class QFileSystemWatcher; class QTimer; +class MusicScannerThreadController : public QThread +{ + Q_OBJECT + +public: + MusicScannerThreadController( QObject* parent ); + virtual ~MusicScannerThreadController(); + + void setScanMode( MusicScanner::ScanMode mode ) { m_mode = mode; } + void setPaths( const QStringList& paths ) { m_paths = paths; } + void run(); + +private: + QPointer< MusicScanner > m_musicScanner; + MusicScanner::ScanMode m_mode; + QStringList m_paths; + quint32 m_bs; +}; + + class DLLEXPORT ScanManager : public QObject { Q_OBJECT public: - enum ScanMode { DirScan, FileScan }; - enum ScanType { None, Full, Normal, File }; - static ScanManager* instance(); explicit ScanManager( QObject* parent = 0 ); @@ -71,14 +89,13 @@ private slots: private: static ScanManager* s_instance; - ScanMode m_currScanMode; - QPointer< MusicScanner > m_scanner; - QThread* m_musicScannerThreadController; + MusicScanner::ScanMode m_currScanMode; + MusicScannerThreadController* m_musicScannerThreadController; QSet< QString > m_currScannerPaths; QStringList m_cachedScannerDirs; QTimer* m_scanTimer; - ScanType m_queuedScanType; + MusicScanner::ScanType m_queuedScanType; bool m_updateGUI; };