diff --git a/data/js/tomahawk.js b/data/js/tomahawk.js index 89676f821..7b4e63672 100644 --- a/data/js/tomahawk.js +++ b/data/js/tomahawk.js @@ -79,6 +79,14 @@ Tomahawk.extend = function(object, members) { }; +var TomahawkResolverCapability = { + NullCapability: 0, + Browsable: 1, + PlaylistSync: 2, + AccountFactory: 4 +}; + + // Resolver BaseObject, inherit it to implement your own resolver var TomahawkResolver = { init: function() @@ -125,6 +133,10 @@ var TomahawkResolver = { search: function( qid, searchString ) { return this.resolve( qid, "", "", searchString ); + }, + capabilities: function() + { + return TomahawkResolverCapability.NullCapability; } }; diff --git a/src/libtomahawk/ExternalResolver.h b/src/libtomahawk/ExternalResolver.h index 6a96f8acd..7cebac9aa 100644 --- a/src/libtomahawk/ExternalResolver.h +++ b/src/libtomahawk/ExternalResolver.h @@ -51,6 +51,16 @@ public: FailedToLoad }; + enum Capability + { + NullCapability = 0x0, + Browsable = 0x1, // can be represented in one or more collection tree views + PlaylistSync = 0x2, // can sync playlists + AccountFactory = 0x4 // can configure multiple accounts at the same time + }; + Q_DECLARE_FLAGS( Capabilities, Capability ) + Q_FLAGS( Capabilities ) + ExternalResolver( const QString& filePath ) { m_filePath = filePath; } virtual QString filePath() const { return m_filePath; } @@ -60,6 +70,7 @@ public: virtual void reload() {} // Reloads from file (especially useful to check if file now exists) virtual ErrorState error() const; virtual bool running() const = 0; + virtual Capabilities capabilities() const = 0; public slots: virtual void start() = 0; @@ -67,14 +78,19 @@ public slots: signals: void changed(); // if config widget was added/removed, name changed, etc + void collectionAdded( const Tomahawk::collection_ptr& collection ); + void collectionRemoved( const Tomahawk::collection_ptr& collection ); protected: void setFilePath( const QString& path ) { m_filePath = path; } + QList< Tomahawk::collection_ptr > m_collections; private: QString m_filePath; }; +Q_DECLARE_OPERATORS_FOR_FLAGS( ExternalResolver::Capabilities ) + }; //ns #endif // EXTERNALESOLVER_H diff --git a/src/libtomahawk/resolvers/QtScriptResolver.cpp b/src/libtomahawk/resolvers/QtScriptResolver.cpp index 23d8ed9cf..a01bc7078 100644 --- a/src/libtomahawk/resolvers/QtScriptResolver.cpp +++ b/src/libtomahawk/resolvers/QtScriptResolver.cpp @@ -334,6 +334,13 @@ QtScriptResolver::init() m_timeout = m.value( "timeout", 25 ).toUInt() * 1000; bool compressed = m.value( "compressed", "false" ).toString() == "true"; + bool ok = 0; + int intCap = m_engine->mainFrame()->evaluateJavaScript( "resolver.capabilities()" ).toInt( &ok ); + if ( !ok ) + m_capabilities = NullCapability; + else + m_capabilities = static_cast< Capabilities >( intCap ); + QByteArray icoData = m.value( "icon" ).toByteArray(); if( compressed ) icoData = qUncompress( QByteArray::fromBase64( icoData ) ); diff --git a/src/libtomahawk/resolvers/QtScriptResolver.h b/src/libtomahawk/resolvers/QtScriptResolver.h index 69e5e947d..1a6a5f596 100644 --- a/src/libtomahawk/resolvers/QtScriptResolver.h +++ b/src/libtomahawk/resolvers/QtScriptResolver.h @@ -129,6 +129,8 @@ public: virtual ~QtScriptResolver(); static ExternalResolver* factory( const QString& scriptPath ); + virtual Capabilities capabilities() const { return m_capabilities; } + virtual QString name() const { return m_name; } virtual QPixmap icon() const { return m_icon; } virtual unsigned int weight() const { return m_weight; } @@ -171,6 +173,7 @@ private: QString m_name; QPixmap m_icon; unsigned int m_weight, m_timeout; + Capabilities m_capabilities; bool m_ready, m_stopped; ExternalResolver::ErrorState m_error; diff --git a/src/libtomahawk/resolvers/ScriptCollection.cpp b/src/libtomahawk/resolvers/ScriptCollection.cpp index b30ea41b8..73e9752f3 100644 --- a/src/libtomahawk/resolvers/ScriptCollection.cpp +++ b/src/libtomahawk/resolvers/ScriptCollection.cpp @@ -19,16 +19,20 @@ #include "ScriptCollection.h" +#include "Source.h" + using namespace Tomahawk; ScriptCollection::ScriptCollection( const source_ptr& source, - const QString& name, QtScriptResolver* resolver, QObject* parent ) - : Collection( source, name, parent ) + : Collection( source, resolver->name(), parent ) { + Q_ASSERT( resolver != 0 ); + qDebug() << Q_FUNC_INFO << resolver->name() << source->friendlyName(); + m_resolver = resolver; } diff --git a/src/libtomahawk/resolvers/ScriptCollection.h b/src/libtomahawk/resolvers/ScriptCollection.h index a2f6d64c5..81ba3baeb 100644 --- a/src/libtomahawk/resolvers/ScriptCollection.h +++ b/src/libtomahawk/resolvers/ScriptCollection.h @@ -36,14 +36,12 @@ class DLLEXPORT ScriptCollection : public Collection public: explicit ScriptCollection( const source_ptr& source, - const QString& name, QtScriptResolver* resolver, QObject* parent = 0 ); virtual ~ScriptCollection(); - -signals: - -public slots: + +private: + QtScriptResolver* m_resolver; }; diff --git a/src/libtomahawk/resolvers/ScriptResolver.cpp b/src/libtomahawk/resolvers/ScriptResolver.cpp index 52efdd1ca..fbaed680a 100644 --- a/src/libtomahawk/resolvers/ScriptResolver.cpp +++ b/src/libtomahawk/resolvers/ScriptResolver.cpp @@ -380,6 +380,13 @@ ScriptResolver::doSetup( const QVariantMap& m ) m_timeout = m.value( "timeout", 5 ).toUInt() * 1000; bool compressed = m.value( "compressed", "false" ).toString() == "true"; + bool ok = 0; + int intCap = m.value( "capabilities" ).toInt( &ok ); + if ( !ok ) + m_capabilities = NullCapability; + else + m_capabilities = static_cast< Capabilities >( intCap ); + QByteArray icoData = m.value( "icon" ).toByteArray(); if( compressed ) icoData = qUncompress( QByteArray::fromBase64( icoData ) ); diff --git a/src/libtomahawk/resolvers/ScriptResolver.h b/src/libtomahawk/resolvers/ScriptResolver.h index a7594561f..a063b42c4 100644 --- a/src/libtomahawk/resolvers/ScriptResolver.h +++ b/src/libtomahawk/resolvers/ScriptResolver.h @@ -41,11 +41,12 @@ public: virtual ~ScriptResolver(); static ExternalResolver* factory( const QString& exe ); - virtual QString name() const { return m_name; } - virtual QPixmap icon() const { return m_icon; } - virtual unsigned int weight() const { return m_weight; } - virtual unsigned int preference() const { return m_preference; } - virtual unsigned int timeout() const { return m_timeout; } + virtual QString name() const { return m_name; } + virtual QPixmap icon() const { return m_icon; } + virtual unsigned int weight() const { return m_weight; } + virtual unsigned int preference() const { return m_preference; } + virtual unsigned int timeout() const { return m_timeout; } + virtual Capabilities capabilities() const { return m_capabilities; } virtual void setIcon( const QPixmap& icon ); @@ -87,6 +88,7 @@ private: QString m_name; QPixmap m_icon; unsigned int m_weight, m_preference, m_timeout, m_num_restarts; + Capabilities m_capabilities; QPointer< AccountConfigWidget > m_configWidget; quint32 m_msgsize;