1
0
mirror of https://github.com/tomahawk-player/tomahawk.git synced 2025-08-17 11:30:49 +02:00

Watching for changes works at a folder granularity now

This commit is contained in:
Jeff Mitchell
2011-05-20 10:38:18 -04:00
parent cd29484d52
commit 7a86391d7b
7 changed files with 50 additions and 140 deletions

View File

@@ -39,7 +39,11 @@ DatabaseCommand_DirMtimes::execSelect( DatabaseImpl* dbi )
QMap<QString,unsigned int> 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() );
}
}

View File

@@ -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 )
{}

View File

@@ -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 );
}

View File

@@ -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<QString, unsigned int> ) ),
SLOT( setMtimes( QMap<QString, unsigned int> ) ) );
@@ -232,12 +233,9 @@ MusicScanner::listerFinished( const QMap<QString, unsigned int>& newmtimes )
{
qDebug() << "Removing stale dir:" << path;
Database::instance()->enqueue( QSharedPointer<DatabaseCommand>( 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() ) );

View File

@@ -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 );

View File

@@ -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 );
}
}

View File

@@ -26,6 +26,7 @@
#include <QWeakPointer>
#include "dllmacro.h"
#include <QSet>
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