1
0
mirror of https://github.com/tomahawk-player/tomahawk.git synced 2025-08-05 13:47:26 +02:00

Allow async streamUrl reports for custom IODeviceFactory resolvers.

This commit is contained in:
Teo Mrnjavac
2013-03-14 18:56:24 +01:00
parent 230fbdcef9
commit 918545eddc
2 changed files with 53 additions and 9 deletions

View File

@@ -57,6 +57,7 @@
QtScriptResolverHelper::QtScriptResolverHelper( const QString& scriptPath, QtScriptResolver* parent ) QtScriptResolverHelper::QtScriptResolverHelper( const QString& scriptPath, QtScriptResolver* parent )
: QObject( parent ) : QObject( parent )
, m_urlCallbackIsAsync( false )
{ {
m_scriptPath = scriptPath; m_scriptPath = scriptPath;
m_resolver = parent; m_resolver = parent;
@@ -291,8 +292,12 @@ QtScriptResolverHelper::md5( const QByteArray& input )
void void
QtScriptResolverHelper::addCustomUrlHandler( const QString& protocol, const QString& callbackFuncName ) QtScriptResolverHelper::addCustomUrlHandler( const QString& protocol,
const QString& callbackFuncName,
const QString& async )
{ {
m_urlCallbackIsAsync = ( async.toLower() == "true" ) ? true : false;
boost::function< void( const Tomahawk::result_ptr&, boost::function< void( const Tomahawk::result_ptr&,
boost::function< void( QSharedPointer< QIODevice >& ) > )> fac = boost::function< void( QSharedPointer< QIODevice >& ) > )> fac =
boost::bind( &QtScriptResolverHelper::customIODeviceFactory, this, _1, _2 ); boost::bind( &QtScriptResolverHelper::customIODeviceFactory, this, _1, _2 );
@@ -319,21 +324,56 @@ QtScriptResolverHelper::base64Decode( const QByteArray& input )
void void
QtScriptResolverHelper::customIODeviceFactory( const Tomahawk::result_ptr& result, QtScriptResolverHelper::customIODeviceFactory( const Tomahawk::result_ptr& result,
boost::function< void( QSharedPointer< QIODevice >& ) > callback ) boost::function< void( QSharedPointer< QIODevice >& ) > callback )
{
//can be sync or async
QString origResultUrl = QString( QUrl( result->url() ).toEncoded() );
if ( m_urlCallbackIsAsync )
{
QString qid = uuid();
QString getUrl = QString( "Tomahawk.resolver.instance.%1( '%2', '%3' );" ).arg( m_urlCallback )
.arg( qid )
.arg( origResultUrl );
m_streamCallbacks.insert( qid, callback );
m_resolver->m_engine->mainFrame()->evaluateJavaScript( getUrl );
}
else
{ {
QString getUrl = QString( "Tomahawk.resolver.instance.%1( '%2' );" ).arg( m_urlCallback ) QString getUrl = QString( "Tomahawk.resolver.instance.%1( '%2' );" ).arg( m_urlCallback )
.arg( QString( QUrl( result->url() ).toEncoded() ) ); .arg( origResultUrl );
QString urlStr = m_resolver->m_engine->mainFrame()->evaluateJavaScript( getUrl ).toString(); QString urlStr = m_resolver->m_engine->mainFrame()->evaluateJavaScript( getUrl ).toString();
QSharedPointer< QIODevice > sp; returnStreamUrl( urlStr, callback );
if ( urlStr.isEmpty() ) }
{ }
void
QtScriptResolverHelper::reportStreamUrl( const QString& qid,
const QString& streamUrl )
{
if ( !m_streamCallbacks.contains( qid ) )
return;
boost::function< void( QSharedPointer< QIODevice >& ) > callback = m_streamCallbacks.take( qid );
returnStreamUrl( streamUrl, callback );
}
void
QtScriptResolverHelper::returnStreamUrl( const QString& streamUrl, boost::function< void( QSharedPointer< QIODevice >& ) > callback )
{
QSharedPointer< QIODevice > sp;
if ( streamUrl.isEmpty() )
{
callback( sp ); callback( sp );
return; return;
} }
QUrl url = QUrl::fromEncoded( urlStr.toUtf8() ); QUrl url = QUrl::fromEncoded( streamUrl.toUtf8() );
QNetworkRequest req( url ); QNetworkRequest req( url );
tDebug() << "Creating a QNetowrkReply with url:" << req.url().toString(); tDebug() << "Creating a QNetowrkReply with url:" << req.url().toString();
QNetworkReply* reply = TomahawkUtils::nam()->get( req ); QNetworkReply* reply = TomahawkUtils::nam()->get( req );

View File

@@ -54,7 +54,8 @@ public:
Q_INVOKABLE QString hmac( const QByteArray& key, const QByteArray& input ); Q_INVOKABLE QString hmac( const QByteArray& key, const QByteArray& input );
Q_INVOKABLE QString md5( const QByteArray& input ); Q_INVOKABLE QString md5( const QByteArray& input );
Q_INVOKABLE void addCustomUrlHandler( const QString& protocol, const QString& callbackFuncName ); Q_INVOKABLE void addCustomUrlHandler( const QString& protocol, const QString& callbackFuncName, const QString& async = "false" );
Q_INVOKABLE void reportStreamUrl( const QString& origResultUrl, const QString& streamUrl );
Q_INVOKABLE QByteArray base64Encode( const QByteArray& input ); Q_INVOKABLE QByteArray base64Encode( const QByteArray& input );
Q_INVOKABLE QByteArray base64Decode( const QByteArray& input ); Q_INVOKABLE QByteArray base64Decode( const QByteArray& input );
@@ -82,7 +83,10 @@ public slots:
void reportCapabilities( const QVariant& capabilities ); void reportCapabilities( const QVariant& capabilities );
private: private:
void returnStreamUrl( const QString& streamUrl, boost::function< void( QSharedPointer< QIODevice >& ) > callback );
QString m_scriptPath, m_urlCallback; QString m_scriptPath, m_urlCallback;
QHash< QString, boost::function< void( QSharedPointer< QIODevice >& ) > > m_streamCallbacks;
bool m_urlCallbackIsAsync;
QVariantMap m_resolverConfig; QVariantMap m_resolverConfig;
QtScriptResolver* m_resolver; QtScriptResolver* m_resolver;
#ifdef QCA2_FOUND #ifdef QCA2_FOUND