diff --git a/src/libtomahawk/resolvers/JSResolverHelper.cpp b/src/libtomahawk/resolvers/JSResolverHelper.cpp index 353612573..fb2d27fe7 100644 --- a/src/libtomahawk/resolvers/JSResolverHelper.cpp +++ b/src/libtomahawk/resolvers/JSResolverHelper.cpp @@ -29,6 +29,7 @@ #include "network/Servent.h" #include "utils/Closure.h" #include "utils/NetworkAccessManager.h" +#include "utils/NetworkReply.h" #include "utils/Logger.h" #include "config.h" @@ -595,9 +596,9 @@ void JSResolverHelper::returnStreamUrl( const QString& streamUrl, const QMap& headers, boost::function< void( QSharedPointer< QIODevice >& ) > callback ) { - QSharedPointer< QIODevice > sp; if ( streamUrl.isEmpty() ) { + QSharedPointer< QIODevice > sp; callback( sp ); return; } @@ -608,10 +609,21 @@ JSResolverHelper::returnStreamUrl( const QString& streamUrl, const QMapget( req ); + NetworkReply* reply = new NetworkReply( Tomahawk::Utils::nam()->get( req ) ); + + NewClosure( QSharedPointer( reply ) , SIGNAL( finalUrlReached ), this, SLOT( gotStreamUrl() ), callback ); +} + +void +JSResolverHelper::gotStreamUrl( boost::function< void( QSharedPointer< QIODevice >& ) > callback ) +{ + NetworkReply* reply = (NetworkReply*) sender(); //boost::functions cannot accept temporaries as parameters - sp = QSharedPointer< QIODevice >( reply, &QObject::deleteLater ); + QSharedPointer< QIODevice > sp = QSharedPointer< QIODevice >( reply->reply(), &QObject::deleteLater ); + reply->disconnectFromReply(); + reply->deleteLater(); + callback( sp ); } diff --git a/src/libtomahawk/resolvers/JSResolverHelper.h b/src/libtomahawk/resolvers/JSResolverHelper.h index 20e9939ed..1a2c34d0d 100644 --- a/src/libtomahawk/resolvers/JSResolverHelper.h +++ b/src/libtomahawk/resolvers/JSResolverHelper.h @@ -31,6 +31,7 @@ #include class JSResolver; +Q_DECLARE_METATYPE( boost::function< void( QSharedPointer< QIODevice >& ) > ) class DLLEXPORT JSResolverHelper : public QObject { @@ -81,6 +82,7 @@ public slots: void reportCapabilities( const QVariant& capabilities ); private slots: + void gotStreamUrl( boost::function< void( QSharedPointer< QIODevice >& ) > callback ); void tracksAdded( const QList& tracks, const Tomahawk::ModelMode, const Tomahawk::collection_ptr& collection ); void pltemplateTracksLoadedForUrl( const QString& url, const Tomahawk::playlisttemplate_ptr& pltemplate ); diff --git a/src/libtomahawk/utils/NetworkReply.cpp b/src/libtomahawk/utils/NetworkReply.cpp index 5e9d94d7f..3da99ac47 100644 --- a/src/libtomahawk/utils/NetworkReply.cpp +++ b/src/libtomahawk/utils/NetworkReply.cpp @@ -51,6 +51,14 @@ NetworkReply::blacklistHostFromRedirection( const QString& host ) } +void +NetworkReply::disconnectFromReply() +{ + disconnectReplySignals(); + m_reply = NULL; +} + + void NetworkReply::deletedByParent() { diff --git a/src/libtomahawk/utils/NetworkReply.h b/src/libtomahawk/utils/NetworkReply.h index 3600f3848..083556aa8 100644 --- a/src/libtomahawk/utils/NetworkReply.h +++ b/src/libtomahawk/utils/NetworkReply.h @@ -37,6 +37,7 @@ public: void blacklistHostFromRedirection( const QString& host ); QNetworkReply* reply() const { return m_reply; } + void disconnectFromReply(); static const int maxRedirects = 100; static const int maxSameRedirects = 5;