diff --git a/src/libtomahawk/database/databaseresolver.h b/src/libtomahawk/database/databaseresolver.h index ff929efad..fa553a118 100644 --- a/src/libtomahawk/database/databaseresolver.h +++ b/src/libtomahawk/database/databaseresolver.h @@ -18,7 +18,7 @@ public: virtual QString name() const; virtual unsigned int weight() const { return m_weight; } virtual unsigned int preference() const { return 100; } - virtual unsigned int timeout() const { return 1000; } + virtual unsigned int timeout() const { return 2500; } virtual void resolve( const Tomahawk::query_ptr& query ); diff --git a/src/scriptresolver.cpp b/src/scriptresolver.cpp index 2c6583abb..1dd0b68b1 100644 --- a/src/scriptresolver.cpp +++ b/src/scriptresolver.cpp @@ -6,6 +6,7 @@ #include "album.h" #include "pipeline.h" #include "sourcelist.h" +#include "functimeout.h" ScriptResolver::ScriptResolver( const QString& exe ) @@ -104,10 +105,19 @@ ScriptResolver::handleMsg( const QByteArray& msg ) if( msgtype == "results" ) { - QList< Tomahawk::result_ptr > results; const QString qid = m.value( "qid" ).toString(); + if ( !m_queryState.contains( qid ) ) + { + //FIXME: We should always accept results, even if they arrive too late. Needs some work in Pipeline. + qDebug() << "Ignoring results for" << qid << "- arrived after timeout."; + return; + } + m_queryState.remove( qid ); + + QList< Tomahawk::result_ptr > results; const QVariantList reslist = m.value( "results" ).toList(); Tomahawk::collection_ptr coll = SourceList::instance()->getLocal()->collection(); + foreach( const QVariant& rv, reslist ) { QVariantMap m = rv.toMap(); @@ -127,6 +137,7 @@ ScriptResolver::handleMsg( const QByteArray& msg ) rp->setCollection( coll ); results << rp; } + Tomahawk::Pipeline::instance()->reportResults( qid, results ); } } @@ -172,6 +183,9 @@ ScriptResolver::resolve( const Tomahawk::query_ptr& query ) const QByteArray msg = m_serializer.serialize( QVariant( m ) ); qDebug() << "ASKING SCRIPT RESOLVER TO RESOLVE:" << msg; sendMsg( msg ); + + m_queryState.insert( query->id(), 1 ); + new Tomahawk::FuncTimeout( m_timeout, boost::bind( &ScriptResolver::onTimeout, this, query ) ); } @@ -201,3 +215,16 @@ ScriptResolver::stop() m_proc.kill(); } + +void +ScriptResolver::onTimeout( const Tomahawk::query_ptr& query ) +{ + // check if this query has already been processed + if ( !m_queryState.contains( query->id() ) ) + return; + + // if not, it's time to emit an empty result list + m_queryState.remove( query->id() ); + QList< Tomahawk::result_ptr > results; + Tomahawk::Pipeline::instance()->reportResults( query->id(), results ); +} diff --git a/src/scriptresolver.h b/src/scriptresolver.h index 6a43199d6..c349936ff 100644 --- a/src/scriptresolver.h +++ b/src/scriptresolver.h @@ -40,6 +40,8 @@ private slots: void readStdout(); void cmdExited( int code, QProcess::ExitStatus status ); + void onTimeout( const Tomahawk::query_ptr& query ); + private: void handleMsg( const QByteArray& msg ); void sendMsg( const QByteArray& msg ); @@ -54,6 +56,8 @@ private: bool m_ready, m_stopped; + QHash< QString /* QID */, unsigned int /* state */ > m_queryState; + QJson::Parser m_parser; QJson::Serializer m_serializer; };