From 7a86391d7bb7959872d6732675a4a8450b3c5f73 Mon Sep 17 00:00:00 2001 From: Jeff Mitchell Date: Fri, 20 May 2011 10:38:18 -0400 Subject: [PATCH] Watching for changes works at a folder granularity now --- .../database/databasecommand_dirmtimes.cpp | 6 +- .../database/databasecommand_dirmtimes.h | 2 +- src/libtomahawk/infosystem/infosystem.cpp | 4 +- src/musicscanner.cpp | 18 +-- src/musicscanner.h | 2 - src/scanmanager.cpp | 143 ++++-------------- src/scanmanager.h | 15 +- 7 files changed, 50 insertions(+), 140 deletions(-) diff --git a/src/libtomahawk/database/databasecommand_dirmtimes.cpp b/src/libtomahawk/database/databasecommand_dirmtimes.cpp index c0ef4ffc5..d2a878f94 100644 --- a/src/libtomahawk/database/databasecommand_dirmtimes.cpp +++ b/src/libtomahawk/database/databasecommand_dirmtimes.cpp @@ -39,7 +39,11 @@ DatabaseCommand_DirMtimes::execSelect( DatabaseImpl* dbi ) QMap mtimes; TomahawkSqlQuery query = dbi->newquery(); if( m_prefix.isEmpty() && m_prefixes.isEmpty() ) + { query.exec( "SELECT name, mtime FROM dirs_scanned" ); + while( query.next() ) + mtimes.insert( query.value( 0 ).toString(), query.value( 1 ).toUInt() ); + } else if( m_prefixes.isEmpty() ) execSelectPath( dbi, m_prefix, mtimes ); else @@ -64,9 +68,7 @@ DatabaseCommand_DirMtimes::execSelectPath( DatabaseImpl *dbi, const QDir& path, query.exec(); while( query.next() ) - { mtimes.insert( query.value( 0 ).toString(), query.value( 1 ).toUInt() ); - } } diff --git a/src/libtomahawk/database/databasecommand_dirmtimes.h b/src/libtomahawk/database/databasecommand_dirmtimes.h index 9677a2317..1b7d6b81b 100644 --- a/src/libtomahawk/database/databasecommand_dirmtimes.h +++ b/src/libtomahawk/database/databasecommand_dirmtimes.h @@ -38,7 +38,7 @@ public: : DatabaseCommand( parent ), m_prefix( prefix ), m_update( false ) {} - explicit DatabaseCommand_DirMtimes( const QStringList& prefixes = QStringList(), QObject* parent = 0 ) + explicit DatabaseCommand_DirMtimes( const QStringList& prefixes, QObject* parent = 0 ) : DatabaseCommand( parent ), m_prefixes( prefixes ), m_update( false ) {} diff --git a/src/libtomahawk/infosystem/infosystem.cpp b/src/libtomahawk/infosystem/infosystem.cpp index d0ca69cfa..50a814f67 100644 --- a/src/libtomahawk/infosystem/infosystem.cpp +++ b/src/libtomahawk/infosystem/infosystem.cpp @@ -89,7 +89,7 @@ InfoSystem::~InfoSystem() QMetaObject::invokeMethod( m_worker.data(), "deleteLater", Qt::QueuedConnection ); while( !m_worker.isNull() ) { - qDebug() << Q_FUNC_INFO << " worker not deleted, processing events"; + qDebug() << Q_FUNC_INFO << " worker not deleted"; TomahawkUtils::Sleep::msleep( 50 ); } @@ -100,7 +100,7 @@ InfoSystem::~InfoSystem() { while( !m_infoSystemWorkerThreadController->isFinished() ) { - qDebug() << Q_FUNC_INFO << " worker thread controller not finished, processing events"; + qDebug() << Q_FUNC_INFO << " worker thread controller not finished"; TomahawkUtils::Sleep::msleep( 50 ); } diff --git a/src/musicscanner.cpp b/src/musicscanner.cpp index 8472dcade..1076c93a6 100644 --- a/src/musicscanner.cpp +++ b/src/musicscanner.cpp @@ -139,9 +139,8 @@ MusicScanner::~MusicScanner() QMetaObject::invokeMethod( m_dirLister.data(), "deleteLater", Qt::QueuedConnection ); while( !m_dirLister.isNull() ) { - qDebug() << Q_FUNC_INFO << " scanner not deleted, processing events"; - QCoreApplication::processEvents( QEventLoop::AllEvents, 200 ); - TomahawkUtils::Sleep::msleep( 100 ); + qDebug() << Q_FUNC_INFO << " scanner not deleted"; + TomahawkUtils::Sleep::msleep( 50 ); } if ( m_dirListerThreadController ) @@ -151,9 +150,8 @@ MusicScanner::~MusicScanner() { while( !m_dirListerThreadController->isFinished() ) { - qDebug() << Q_FUNC_INFO << " scanner thread controller not finished, processing events"; - QCoreApplication::processEvents( QEventLoop::AllEvents, 200 ); - TomahawkUtils::Sleep::msleep( 100 ); + qDebug() << Q_FUNC_INFO << " scanner thread controller not finished"; + TomahawkUtils::Sleep::msleep( 50 ); } delete m_dirListerThreadController; @@ -171,7 +169,10 @@ MusicScanner::startScan() m_skippedFiles.clear(); // trigger the scan once we've loaded old mtimes for dirs below our path - DatabaseCommand_DirMtimes* cmd = new DatabaseCommand_DirMtimes( TomahawkSettings::instance()->scannerPaths() ); + //FIXME: For multiple collection support make sure the right prefix gets passed in...or not... + //bear in mind that simply passing in the top-level of a defined collection means it will not return items that need + //to be removed that aren't in that root any longer -- might have to do the filtering in setMTimes based on strings + DatabaseCommand_DirMtimes* cmd = new DatabaseCommand_DirMtimes(); connect( cmd, SIGNAL( done( QMap ) ), SLOT( setMtimes( QMap ) ) ); @@ -232,12 +233,9 @@ MusicScanner::listerFinished( const QMap& newmtimes ) { qDebug() << "Removing stale dir:" << path; Database::instance()->enqueue( QSharedPointer( new DatabaseCommand_DeleteFiles( path, SourceList::instance()->getLocal() ) ) ); - emit removeWatchedDir( path ); } } - emit addWatchedDirs( newmtimes.keys() ); - // save mtimes, then quit thread DatabaseCommand_DirMtimes* cmd = new DatabaseCommand_DirMtimes( newmtimes ); connect( cmd, SIGNAL( finished() ), SLOT( deleteLister() ) ); diff --git a/src/musicscanner.h b/src/musicscanner.h index 3fd79ab62..29da62d7e 100644 --- a/src/musicscanner.h +++ b/src/musicscanner.h @@ -86,8 +86,6 @@ signals: //void fileScanned( QVariantMap ); void finished(); void batchReady( const QVariantList& ); - void addWatchedDirs( const QStringList & ); - void removeWatchedDir( const QString & ); private: QVariant readFile( const QFileInfo& fi ); diff --git a/src/scanmanager.cpp b/src/scanmanager.cpp index cf12153c9..e4caffe6f 100644 --- a/src/scanmanager.cpp +++ b/src/scanmanager.cpp @@ -45,37 +45,26 @@ ScanManager::ScanManager( QObject* parent ) : QObject( parent ) , m_musicScannerThreadController( 0 ) , m_currScannerPaths() - , m_dirWatcher( 0 ) - , m_queuedScanTimer( 0 ) - , m_deferredScanTimer( 0 ) - , m_queuedChangedDirs() - , m_deferredDirs() { s_instance = this; - m_queuedScanTimer = new QTimer( this ); - m_queuedScanTimer->setSingleShot( true ); - m_deferredScanTimer = new QTimer( this ); - m_deferredScanTimer->setSingleShot( false ); - m_deferredScanTimer->setInterval( 1000 ); - m_dirWatcher = new QFileSystemWatcher( this ); + m_scanTimer = new QTimer( this ); + m_scanTimer->setSingleShot( false ); + m_scanTimer->setInterval( 10000 ); connect( TomahawkSettings::instance(), SIGNAL( changed() ), SLOT( onSettingsChanged() ) ); - connect( m_queuedScanTimer, SIGNAL( timeout() ), SLOT( queuedScanTimeout() ) ); - connect( m_deferredScanTimer, SIGNAL( timeout() ), SLOT( deferredScanTimeout() ) ); - connect( m_dirWatcher, SIGNAL( directoryChanged( const QString & ) ), SLOT( handleChangedDir( const QString & ) ) ); + connect( m_scanTimer, SIGNAL( timeout() ), SLOT( scanTimerTimeout() ) ); // FIXME: Disable this until we find something nondeprecated and working (e.g. not QFileSystemWatcher) - TomahawkSettings::instance()->setWatchForChanges( false ); + //TomahawkSettings::instance()->setWatchForChanges( true ); if ( TomahawkSettings::instance()->hasScannerPaths() ) { m_currScannerPaths = TomahawkSettings::instance()->scannerPaths(); + m_scanTimer->start(); if ( TomahawkSettings::instance()->watchForChanges() ) QTimer::singleShot( 1000, this, SLOT( runStartupScan() ) ); } - - m_deferredScanTimer->start(); } @@ -88,9 +77,8 @@ ScanManager::~ScanManager() QMetaObject::invokeMethod( m_scanner.data(), "deleteLater", Qt::QueuedConnection ); while( !m_scanner.isNull() ) { - qDebug() << Q_FUNC_INFO << " scanner not deleted, processing events"; - QCoreApplication::processEvents( QEventLoop::AllEvents, 200 ); - TomahawkUtils::Sleep::msleep( 100 ); + qDebug() << Q_FUNC_INFO << " scanner not delete"; + TomahawkUtils::Sleep::msleep( 50 ); } if ( m_musicScannerThreadController ) @@ -100,9 +88,8 @@ ScanManager::~ScanManager() { while( !m_musicScannerThreadController->isFinished() ) { - qDebug() << Q_FUNC_INFO << " scanner thread controller not finished, processing events"; - QCoreApplication::processEvents( QEventLoop::AllEvents, 200 ); - TomahawkUtils::Sleep::msleep( 100 ); + qDebug() << Q_FUNC_INFO << " scanner thread controller not finished"; + TomahawkUtils::Sleep::msleep( 50 ); } delete m_musicScannerThreadController; @@ -115,21 +102,23 @@ ScanManager::~ScanManager() void ScanManager::onSettingsChanged() { + if ( !TomahawkSettings::instance()->watchForChanges() && m_scanTimer->isActive() ) + m_scanTimer->stop(); + if ( TomahawkSettings::instance()->hasScannerPaths() && m_currScannerPaths != TomahawkSettings::instance()->scannerPaths() ) { m_currScannerPaths = TomahawkSettings::instance()->scannerPaths(); - m_dirWatcher->removePaths( m_dirWatcher->directories() ); runManualScan( m_currScannerPaths ); } - if( TomahawkSettings::instance()->watchForChanges() && - !m_queuedChangedDirs.isEmpty() ) - runManualScan( m_queuedChangedDirs, false ); + if ( TomahawkSettings::instance()->watchForChanges() && !m_scanTimer->isActive() ) + m_scanTimer->start(); } -void ScanManager::runStartupScan() +void +ScanManager::runStartupScan() { qDebug() << Q_FUNC_INFO; if( !Database::instance() || ( Database::instance() && !Database::instance()->isReady() ) ) @@ -140,7 +129,18 @@ void ScanManager::runStartupScan() void -ScanManager::runManualScan( const QStringList& paths, bool recursive ) +ScanManager::scanTimerTimeout() +{ + qDebug() << Q_FUNC_INFO; + if( !Database::instance() || ( Database::instance() && !Database::instance()->isReady() ) ) + return; + else + runManualScan( m_currScannerPaths ); +} + + +void +ScanManager::runManualScan( const QStringList& paths ) { qDebug() << Q_FUNC_INFO; @@ -150,97 +150,16 @@ ScanManager::runManualScan( const QStringList& paths, bool recursive ) if ( !m_musicScannerThreadController && m_scanner.isNull() ) //still running if these are not zero { m_musicScannerThreadController = new QThread( this ); - QStringList allPaths = paths; - foreach( QString path, m_deferredDirs[recursive] ) - { - if( !allPaths.contains( path ) ) - allPaths << path; - } - m_scanner = QWeakPointer< MusicScanner>( new MusicScanner( paths, recursive ) ); + m_scanner = QWeakPointer< MusicScanner>( new MusicScanner( paths ) ); m_scanner.data()->moveToThread( m_musicScannerThreadController ); connect( m_scanner.data(), SIGNAL( finished() ), SLOT( scannerFinished() ) ); - connect( m_scanner.data(), SIGNAL( addWatchedDirs( const QStringList & ) ), SLOT( addWatchedDirs( const QStringList & ) ) ); - connect( m_scanner.data(), SIGNAL( removeWatchedDir( const QString & ) ), SLOT( removeWatchedDir( const QString & ) ) ); m_musicScannerThreadController->start( QThread::IdlePriority ); QMetaObject::invokeMethod( m_scanner.data(), "startScan" ); - m_deferredDirs[recursive].clear(); } else { - qDebug() << "Could not run manual scan, old scan still running; deferring paths"; - foreach( QString path, paths ) - { - if( !m_deferredDirs[recursive].contains( path ) ) - { - qDebug() << "Deferring path " << path; - m_deferredDirs[recursive] << path; - } - } - } -} - - -void -ScanManager::addWatchedDirs( const QStringList& paths ) -{ - qDebug() << Q_FUNC_INFO; - if ( !TomahawkSettings::instance()->watchForChanges() ) + qDebug() << "Could not run manual scan, old scan still running"; return; - - QStringList currentWatchedPaths = m_dirWatcher->directories(); - foreach ( QString path, paths ) - { - if ( !currentWatchedPaths.contains( path ) ) - { - qDebug() << "adding " << path << " to watched dirs"; - m_dirWatcher->addPath( path ); - } - } -} - - -void -ScanManager::removeWatchedDir( const QString& path ) -{ - qDebug() << Q_FUNC_INFO; - qDebug() << "removing " << path << " from watched dirs"; - m_dirWatcher->removePath( path ); -} - - -void -ScanManager::handleChangedDir( const QString& path ) -{ - qDebug() << Q_FUNC_INFO; - qDebug() << "Dir changed: " << path; - if( !m_queuedChangedDirs.contains( path ) ) - m_queuedChangedDirs << path; - if( TomahawkSettings::instance()->watchForChanges() ) - m_queuedScanTimer->start( 10000 ); -} - - -void -ScanManager::queuedScanTimeout() -{ - qDebug() << Q_FUNC_INFO; - runManualScan( m_queuedChangedDirs, false ); - m_queuedChangedDirs.clear(); -} - - -void -ScanManager::deferredScanTimeout() -{ - if( !m_deferredDirs[true].isEmpty() ) - { - qDebug() << "Running scan for deferred recursive paths"; - runManualScan( m_deferredDirs[true], true ); - } - else if( !m_deferredDirs[false].isEmpty() ) - { - qDebug() << "Running scan for deferred non-recursive paths"; - runManualScan( m_deferredDirs[false], false ); } } diff --git a/src/scanmanager.h b/src/scanmanager.h index 67895c728..cf99fae39 100644 --- a/src/scanmanager.h +++ b/src/scanmanager.h @@ -26,6 +26,7 @@ #include #include "dllmacro.h" +#include class MusicScanner; class QThread; @@ -46,17 +47,13 @@ signals: void finished(); public slots: - void runManualScan( const QStringList& paths, bool recursive = true ); - void handleChangedDir( const QString& path ); - void addWatchedDirs( const QStringList& paths ); - void removeWatchedDir( const QString& path ); + void runManualScan( const QStringList& paths ); private slots: void scannerFinished(); void runStartupScan(); - void queuedScanTimeout(); - void deferredScanTimeout(); + void scanTimerTimeout(); void onSettingsChanged(); @@ -66,12 +63,8 @@ private: QWeakPointer< MusicScanner > m_scanner; QThread* m_musicScannerThreadController; QStringList m_currScannerPaths; - QFileSystemWatcher* m_dirWatcher; - QTimer* m_queuedScanTimer; - QTimer* m_deferredScanTimer; - QStringList m_queuedChangedDirs; - QHash< bool, QStringList > m_deferredDirs; + QTimer* m_scanTimer; }; #endif