diff --git a/src/libtomahawk/source.cpp b/src/libtomahawk/source.cpp index c4157154b..32543e2f8 100644 --- a/src/libtomahawk/source.cpp +++ b/src/libtomahawk/source.cpp @@ -213,8 +213,6 @@ Source::setOnline() void Source::dbLoaded( unsigned int id, const QString& fname ) { - qDebug() << Q_FUNC_INFO << id << fname; - m_id = id; setFriendlyName( fname ); @@ -252,6 +250,7 @@ void Source::onStateChanged( DBSyncConnection::State newstate, DBSyncConnection::State oldstate, const QString& info ) { Q_UNUSED( oldstate ); + QString msg; switch( newstate ) { diff --git a/src/musicscanner.cpp b/src/musicscanner.cpp index 6829c3337..bead3ba74 100644 --- a/src/musicscanner.cpp +++ b/src/musicscanner.cpp @@ -141,7 +141,7 @@ MusicScanner::startScan() //to be removed that aren't in that root any longer -- might have to do the filtering in setMTimes based on strings DatabaseCommand_FileMtimes *cmd = new DatabaseCommand_FileMtimes(); connect( cmd, SIGNAL( done( QMap< QString, QMap< unsigned int, unsigned int > > ) ), - SLOT( setFileMtimes( QMap< QString, QMap< unsigned int, unsigned int > > ) ) ); + SLOT( setFileMtimes( QMap< QString, QMap< unsigned int, unsigned int > > ) ) ); Database::instance()->enqueue( QSharedPointer< DatabaseCommand >( cmd ) ); return; @@ -195,13 +195,16 @@ MusicScanner::listerFinished() m_scannedfiles.clear(); m_filesToDelete.clear(); - tDebug( LOGINFO ) << "Scanning complete, saving to database. " - "( scanned" << m_scanned << "skipped" << m_skipped << ")"; - + tDebug( LOGINFO ) << "Scanning complete, saving to database. ( scanned" << m_scanned << "skipped" << m_skipped << ")"; tDebug( LOGEXTRA ) << "Skipped the following files (no tags / no valid audio):"; foreach ( const QString& s, m_skippedFiles ) tDebug( LOGEXTRA ) << s; +} + +void +MusicScanner::cleanup() +{ if ( !m_dirLister.isNull() ) { m_dirListerThreadController->quit();; @@ -223,25 +226,42 @@ MusicScanner::commitBatch( const QVariantList& tracks, const QVariantList& delet { tDebug( LOGINFO ) << Q_FUNC_INFO << "deleting" << deletethese.length() << "tracks"; source_ptr localsrc = SourceList::instance()->getLocal(); - Database::instance()->enqueue( - QSharedPointer( new DatabaseCommand_DeleteFiles( deletethese, SourceList::instance()->getLocal() ) ) - ); + executeCommand( QSharedPointer( new DatabaseCommand_DeleteFiles( deletethese, SourceList::instance()->getLocal() ) ) ); } + if ( tracks.length() ) { tDebug( LOGINFO ) << Q_FUNC_INFO << "adding" << tracks.length() << "tracks"; source_ptr localsrc = SourceList::instance()->getLocal(); - Database::instance()->enqueue( - QSharedPointer( new DatabaseCommand_AddFiles( tracks, localsrc ) ) - ); + executeCommand( QSharedPointer( new DatabaseCommand_AddFiles( tracks, localsrc ) ) ); } } +void +MusicScanner::executeCommand( QSharedPointer< DatabaseCommand > cmd ) +{ + m_cmdQueue << cmd.data(); + connect( cmd.data(), SIGNAL( finished() ), SLOT( commandFinished() ) ); + Database::instance()->enqueue( cmd ); +} + + +void +MusicScanner::commandFinished() +{ + DatabaseCommand* cmd = qobject_cast< DatabaseCommand* >( sender() ); + m_cmdQueue.removeAll( cmd ); + + if ( m_cmdQueue.isEmpty() ) + cleanup(); +} + + void MusicScanner::scanFile( const QFileInfo& fi ) { - tDebug() << Q_FUNC_INFO << " scanning file: " << fi.canonicalFilePath(); + tDebug() << Q_FUNC_INFO << "scanning file:" << fi.canonicalFilePath(); if ( m_filemtimes.contains( "file://" + fi.canonicalFilePath() ) ) { if ( fi.lastModified().toUTC().toTime_t() == m_filemtimes.value( "file://" + fi.canonicalFilePath() ).values().first() ) diff --git a/src/musicscanner.h b/src/musicscanner.h index 27e02b0aa..f2a2a862d 100644 --- a/src/musicscanner.h +++ b/src/musicscanner.h @@ -19,7 +19,8 @@ #ifndef MUSICSCANNER_H #define MUSICSCANNER_H -#include +#include "tomahawksettings.h" +#include "database/databasecommand.h" /* taglib */ #include @@ -34,6 +35,7 @@ #include #include #include +#include // descend dir tree comparing dir mtimes to last known mtime // emit signal for any dir with new content, so we can scan it. @@ -90,6 +92,7 @@ signals: private: QVariant readFile( const QFileInfo& fi ); + void executeCommand( QSharedPointer< DatabaseCommand > cmd ); private slots: void listerFinished(); @@ -97,7 +100,9 @@ private slots: void setFileMtimes( const QMap< QString, QMap< unsigned int, unsigned int > >& m ); void startScan(); void scan(); + void cleanup(); void commitBatch( const QVariantList& tracks, const QVariantList& deletethese ); + void commandFinished(); private: QStringList m_dirs; @@ -106,9 +111,10 @@ private: unsigned int m_skipped; QList m_skippedFiles; - QMap > m_filemtimes; + QList m_cmdQueue; + QVariantList m_scannedfiles; QVariantList m_filesToDelete; quint32 m_batchsize; diff --git a/src/scanmanager.cpp b/src/scanmanager.cpp index 0b633c7ad..397e6572e 100644 --- a/src/scanmanager.cpp +++ b/src/scanmanager.cpp @@ -80,7 +80,7 @@ ScanManager::~ScanManager() delete m_musicScannerThreadController; m_musicScannerThreadController = 0; } - qDebug() << Q_FUNC_INFO << " scanner thread controller finished, exiting ScanManager"; + qDebug() << Q_FUNC_INFO << "scanner thread controller finished, exiting ScanManager"; } @@ -141,7 +141,7 @@ ScanManager::runScan( bool manualFull ) { DatabaseCommand_DeleteFiles *cmd = new DatabaseCommand_DeleteFiles( SourceList::instance()->getLocal() ); connect( cmd, SIGNAL( done( const QStringList&, const Tomahawk::collection_ptr& ) ), - SLOT( filesDeleted( const QStringList&, const Tomahawk::collection_ptr& ) ) ); + SLOT( filesDeleted( const QStringList&, const Tomahawk::collection_ptr& ) ) ); Database::instance()->enqueue( QSharedPointer< DatabaseCommand >( cmd ) ); return; @@ -149,7 +149,7 @@ ScanManager::runScan( bool manualFull ) DatabaseCommand_FileMtimes *cmd = new DatabaseCommand_FileMtimes( true ); connect( cmd, SIGNAL( done( const QMap< QString, QMap< unsigned int, unsigned int > >& ) ), - SLOT( fileMtimesCheck( const QMap< QString, QMap< unsigned int, unsigned int > >& ) ) ); + SLOT( fileMtimesCheck( const QMap< QString, QMap< unsigned int, unsigned int > >& ) ) ); Database::instance()->enqueue( QSharedPointer< DatabaseCommand >( cmd ) ); } @@ -168,7 +168,7 @@ ScanManager::fileMtimesCheck( const QMap< QString, QMap< unsigned int, unsigned { DatabaseCommand_DeleteFiles *cmd = new DatabaseCommand_DeleteFiles( SourceList::instance()->getLocal() ); connect( cmd, SIGNAL( done( const QStringList&, const Tomahawk::collection_ptr& ) ), - SLOT( filesDeleted( const QStringList&, const Tomahawk::collection_ptr& ) ) ); + SLOT( filesDeleted( const QStringList&, const Tomahawk::collection_ptr& ) ) ); Database::instance()->enqueue( QSharedPointer< DatabaseCommand >( cmd ) ); return; @@ -202,7 +202,7 @@ ScanManager::runDirScan() { m_scanTimer->stop(); m_musicScannerThreadController = new QThread( this ); - m_scanner = QWeakPointer< MusicScanner>( new MusicScanner( paths ) ); + m_scanner = QWeakPointer< MusicScanner >( new MusicScanner( paths ) ); m_scanner.data()->moveToThread( m_musicScannerThreadController ); connect( m_scanner.data(), SIGNAL( finished() ), SLOT( scannerFinished() ) ); m_musicScannerThreadController->start( QThread::IdlePriority ); @@ -228,6 +228,7 @@ ScanManager::scannerFinished() delete m_musicScannerThreadController; m_musicScannerThreadController = 0; } + m_scanTimer->start(); SourceList::instance()->getLocal()->scanningFinished( 0 ); emit finished();