1
0
mirror of https://github.com/tomahawk-player/tomahawk.git synced 2025-07-31 11:20:22 +02:00

Working query-stores-its-own-pointer behavior

This commit is contained in:
Jeff Mitchell
2012-01-15 14:51:16 -05:00
parent 4d7945291e
commit 14fd0424a1
2 changed files with 16 additions and 20 deletions

View File

@@ -36,10 +36,6 @@
using namespace Tomahawk; using namespace Tomahawk;
static QHash< QString, QWeakPointer< Query > > s_queries;
static QMutex s_mutex;
query_ptr query_ptr
Query::get( const QString& artist, const QString& track, const QString& album, const QID& qid, bool autoResolve ) Query::get( const QString& artist, const QString& track, const QString& album, const QID& qid, bool autoResolve )
{ {
@@ -47,11 +43,11 @@ Query::get( const QString& artist, const QString& track, const QString& album, c
autoResolve = false; autoResolve = false;
query_ptr q = query_ptr( new Query( artist, track, album, qid, autoResolve ) ); query_ptr q = query_ptr( new Query( artist, track, album, qid, autoResolve ) );
QMutexLocker lock( &s_mutex ); q->setWeakRef( q.toWeakRef() );
s_queries.insert( q->id(), q );
if ( autoResolve ) if ( autoResolve )
Pipeline::instance()->resolve( q ); Pipeline::instance()->resolve( q );
return q; return q;
} }
@@ -59,10 +55,13 @@ Query::get( const QString& artist, const QString& track, const QString& album, c
query_ptr query_ptr
Query::get( const QString& query, const QID& qid ) Query::get( const QString& query, const QID& qid )
{ {
query_ptr q = query_ptr( new Query( query, qid ) ); query_ptr q = query_ptr( new Query( query, qid ) );
q->setWeakRef( q.toWeakRef() );
if ( !qid.isEmpty() ) if ( !qid.isEmpty() )
Pipeline::instance()->resolve( q ); Pipeline::instance()->resolve( q );
return q; return q;
} }
@@ -102,14 +101,7 @@ Query::Query( const QString& query, const QID& qid )
Query::~Query() Query::~Query()
{ {
QMutexLocker lock( &s_mutex ); m_ownRef.clear();
if ( !id().isEmpty() )
{
if ( s_queries.contains( id() ) )
{
s_queries.remove( id() );
}
}
} }
@@ -206,9 +198,9 @@ Query::refreshResults()
if ( m_resolveFinished ) if ( m_resolveFinished )
{ {
m_resolveFinished = false; m_resolveFinished = false;
QMutexLocker lock( &s_mutex ); query_ptr q = m_ownRef.toStrongRef();
if ( s_queries.contains( id() ) && !s_queries[ id() ].isNull() ) if ( q )
Pipeline::instance()->resolve( s_queries.value( id() ) ); Pipeline::instance()->resolve( q );
} }
} }

View File

@@ -51,9 +51,6 @@ public:
static query_ptr get( const QString& artist, const QString& track, const QString& album, const QID& qid = QString(), bool autoResolve = true ); static query_ptr get( const QString& artist, const QString& track, const QString& album, const QID& qid = QString(), bool autoResolve = true );
static query_ptr get( const QString& query, const QID& qid ); static query_ptr get( const QString& query, const QID& qid );
explicit Query( const QString& artist, const QString& track, const QString& album, const QID& qid, bool autoResolve );
explicit Query( const QString& query, const QID& qid );
virtual ~Query(); virtual ~Query();
/// returns list of all results so far /// returns list of all results so far
@@ -105,6 +102,9 @@ public:
void setResolveFinished( bool resolved ) { m_resolveFinished = resolved; } void setResolveFinished( bool resolved ) { m_resolveFinished = resolved; }
void setPlayedBy( const Tomahawk::source_ptr& source, unsigned int playtime ); void setPlayedBy( const Tomahawk::source_ptr& source, unsigned int playtime );
QWeakPointer< Tomahawk::Query > weakRef() { return m_ownRef; }
void setWeakRef( QWeakPointer< Tomahawk::Query > weakRef ) { m_ownRef = weakRef; }
signals: signals:
void resultsAdded( const QList<Tomahawk::result_ptr>& ); void resultsAdded( const QList<Tomahawk::result_ptr>& );
void resultsRemoved( const Tomahawk::result_ptr& ); void resultsRemoved( const Tomahawk::result_ptr& );
@@ -137,6 +137,8 @@ private slots:
private: private:
Query(); Query();
explicit Query( const QString& artist, const QString& track, const QString& album, const QID& qid, bool autoResolve );
explicit Query( const QString& query, const QID& qid );
void init(); void init();
@@ -172,6 +174,8 @@ private:
QList< QWeakPointer< Tomahawk::Resolver > > m_resolvers; QList< QWeakPointer< Tomahawk::Resolver > > m_resolvers;
mutable QMutex m_mutex; mutable QMutex m_mutex;
QWeakPointer< Tomahawk::Query > m_ownRef;
}; };
}; //ns }; //ns