mirror of
https://github.com/tomahawk-player/tomahawk.git
synced 2025-08-09 15:47:38 +02:00
* Keep resolving queries if a ScriptResolver can't find any results.
This commit is contained in:
@@ -18,7 +18,7 @@ public:
|
|||||||
virtual QString name() const;
|
virtual QString name() const;
|
||||||
virtual unsigned int weight() const { return m_weight; }
|
virtual unsigned int weight() const { return m_weight; }
|
||||||
virtual unsigned int preference() const { return 100; }
|
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 );
|
virtual void resolve( const Tomahawk::query_ptr& query );
|
||||||
|
|
||||||
|
@@ -6,6 +6,7 @@
|
|||||||
#include "album.h"
|
#include "album.h"
|
||||||
#include "pipeline.h"
|
#include "pipeline.h"
|
||||||
#include "sourcelist.h"
|
#include "sourcelist.h"
|
||||||
|
#include "functimeout.h"
|
||||||
|
|
||||||
|
|
||||||
ScriptResolver::ScriptResolver( const QString& exe )
|
ScriptResolver::ScriptResolver( const QString& exe )
|
||||||
@@ -104,10 +105,19 @@ ScriptResolver::handleMsg( const QByteArray& msg )
|
|||||||
|
|
||||||
if( msgtype == "results" )
|
if( msgtype == "results" )
|
||||||
{
|
{
|
||||||
QList< Tomahawk::result_ptr > results;
|
|
||||||
const QString qid = m.value( "qid" ).toString();
|
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();
|
const QVariantList reslist = m.value( "results" ).toList();
|
||||||
Tomahawk::collection_ptr coll = SourceList::instance()->getLocal()->collection();
|
Tomahawk::collection_ptr coll = SourceList::instance()->getLocal()->collection();
|
||||||
|
|
||||||
foreach( const QVariant& rv, reslist )
|
foreach( const QVariant& rv, reslist )
|
||||||
{
|
{
|
||||||
QVariantMap m = rv.toMap();
|
QVariantMap m = rv.toMap();
|
||||||
@@ -127,6 +137,7 @@ ScriptResolver::handleMsg( const QByteArray& msg )
|
|||||||
rp->setCollection( coll );
|
rp->setCollection( coll );
|
||||||
results << rp;
|
results << rp;
|
||||||
}
|
}
|
||||||
|
|
||||||
Tomahawk::Pipeline::instance()->reportResults( qid, results );
|
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 ) );
|
const QByteArray msg = m_serializer.serialize( QVariant( m ) );
|
||||||
qDebug() << "ASKING SCRIPT RESOLVER TO RESOLVE:" << msg;
|
qDebug() << "ASKING SCRIPT RESOLVER TO RESOLVE:" << msg;
|
||||||
sendMsg( 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();
|
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 );
|
||||||
|
}
|
||||||
|
@@ -40,6 +40,8 @@ private slots:
|
|||||||
void readStdout();
|
void readStdout();
|
||||||
void cmdExited( int code, QProcess::ExitStatus status );
|
void cmdExited( int code, QProcess::ExitStatus status );
|
||||||
|
|
||||||
|
void onTimeout( const Tomahawk::query_ptr& query );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void handleMsg( const QByteArray& msg );
|
void handleMsg( const QByteArray& msg );
|
||||||
void sendMsg( const QByteArray& msg );
|
void sendMsg( const QByteArray& msg );
|
||||||
@@ -54,6 +56,8 @@ private:
|
|||||||
|
|
||||||
bool m_ready, m_stopped;
|
bool m_ready, m_stopped;
|
||||||
|
|
||||||
|
QHash< QString /* QID */, unsigned int /* state */ > m_queryState;
|
||||||
|
|
||||||
QJson::Parser m_parser;
|
QJson::Parser m_parser;
|
||||||
QJson::Serializer m_serializer;
|
QJson::Serializer m_serializer;
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user