[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [amarok/spotify] src/core-impl/collections/spotifycollection: Fix issues listed in review 105285
From:       Edward Hades <edward.hades () gmail ! com>
Date:       2012-10-28 11:19:59
Message-ID: 20121028111959.D9C55A6104 () git ! kde ! org
[Download RAW message or body]

Git commit 4c00d7d8009f8cda9c31ef876873fca064df6822 by Edward Hades, on behalf of \
Ryan Feng. Committed on 15/08/2012 at 05:57.
Pushed by hades into branch 'spotify'.

Fix issues listed in review 105285

This commit fixes issues listed in https://git.reviewboard.kde.org/r/105285/
Other changes:
Add a m_loggedIn flag for Controller to track login status.

M  +8    -21   src/core-impl/collections/spotifycollection/SpotifyCollection.cpp
M  +19   -32   src/core-impl/collections/spotifycollection/SpotifyConfig.cpp
M  +3    -7    src/core-impl/collections/spotifycollection/SpotifyConfig.h
M  +0    -2    src/core-impl/collections/spotifycollection/SpotifyPlaylist.cpp
M  +10   -10   src/core-impl/collections/spotifycollection/SpotifyQueryMaker.cpp
M  +3    -5    src/core-impl/collections/spotifycollection/SpotifyQueryMaker.h
M  +37   -29   src/core-impl/collections/spotifycollection/SpotifySettings.cpp
M  +5    -4    src/core-impl/collections/spotifycollection/SpotifySettings.h
M  +44   -65   src/core-impl/collections/spotifycollection/support/Controller.cpp
M  +12   -7    src/core-impl/collections/spotifycollection/support/Controller.h
M  +14   -10   src/core-impl/collections/spotifycollection/support/Query.cpp
M  +6    -6    src/core-impl/collections/spotifycollection/support/Query.h
M  +2    -2    src/core-impl/collections/spotifycollection/support/TrackProxy.cpp
M  +2    -2    src/core-impl/collections/spotifycollection/support/TrackProxy.h

http://commits.kde.org/amarok/4c00d7d8009f8cda9c31ef876873fca064df6822

diff --git a/src/core-impl/collections/spotifycollection/SpotifyCollection.cpp \
b/src/core-impl/collections/spotifycollection/SpotifyCollection.cpp index \
                60662bd..e0c845f 100644
--- a/src/core-impl/collections/spotifycollection/SpotifyCollection.cpp
+++ b/src/core-impl/collections/spotifycollection/SpotifyCollection.cpp
@@ -18,6 +18,9 @@
 #define DEBUG_PREFIX "SpotifyCollection"
 
 #include "SpotifyCollection.h"
+#include "SpotifyQueryMaker.h"
+#include "support/Controller.h"
+#include "support/TrackProxy.h"
 
 #include "core/collections/Collection.h"
 #include "core-impl/collections/support/MemoryCollection.h"
@@ -25,14 +28,8 @@
 #include "core-impl/collections/support/CollectionManager.h"
 #include "core/capabilities/ActionsCapability.h"
 #include "core-impl/meta/proxy/MetaProxy.h"
-#include "SpotifyQueryMaker.h"
-#include "support/Controller.h"
-#include "support/TrackProxy.h"
-#include <KIcon>
 
-#include <QApplication>
-#include <QObject>
-#include <QString>
+#include <KIcon>
 #include <QTimer>
 
 namespace Collections
@@ -54,8 +51,9 @@ namespace Collections
     {
         DEBUG_BLOCK
         delete m_collection.data();
-        m_controller->deleteLater();
 
+        if( m_controller )
+            m_controller->deleteLater();
     }
 
     void
@@ -76,7 +74,6 @@ namespace Collections
 
         m_collection = new SpotifyCollection( m_controller );
         connect( m_collection.data(), SIGNAL(remove()), this, \
                SLOT(collectionRemoved()) );
-        CollectionManager::instance()->addTrackProvider( m_collection.data() );
 
         // Register collection in CollectionManager
         emit newCollection( m_collection.data() );
@@ -102,10 +99,7 @@ namespace Collections
             connect( m_collection.data(), SIGNAL(remove()), this, \
SLOT(collectionRemoved()) );  }
 
-        if( !m_collectionIsManaged )
-        {
-            m_collectionIsManaged = true;
-        }
+        m_collectionIsManaged = true;
 
         m_controller->setFilePath( m_config.resolverPath() );
         if( !m_config.username().isEmpty() && !m_config.password().isEmpty() )
@@ -119,12 +113,10 @@ namespace Collections
     {
         // DEBUG_BLOCK
 
-        if( error == Spotify::Controller::ErrorState( 1 ) )
+        if( error == Spotify::Controller::ResolverNotFound )
         {
             if( m_collection && !m_collectionIsManaged )
                 CollectionManager::instance()->removeTrackProvider( \
                m_collection.data() );
-
-            QTimer::singleShot( 10 * 60 * 1000, this, SLOT( checkStatus() ) );
         }
     }
 
@@ -134,7 +126,6 @@ namespace Collections
         DEBUG_BLOCK
 
         m_collectionIsManaged = false;
-        QTimer::singleShot( 10000, this, SLOT( checkStatus() ) );
     }
 
     SpotifyCollection::SpotifyCollection( Spotify::Controller *controller )
@@ -154,10 +145,6 @@ namespace Collections
     SpotifyCollection::~SpotifyCollection()
     {
         DEBUG_BLOCK
-        if( m_configureAction )
-        {
-            delete m_configureAction;
-        }
     }
 
     Spotify::Controller*
diff --git a/src/core-impl/collections/spotifycollection/SpotifyConfig.cpp \
b/src/core-impl/collections/spotifycollection/SpotifyConfig.cpp index \
                106002e..92c35b4 100644
--- a/src/core-impl/collections/spotifycollection/SpotifyConfig.cpp
+++ b/src/core-impl/collections/spotifycollection/SpotifyConfig.cpp
@@ -13,7 +13,9 @@
  * You should have received a copy of the GNU General Public License along with      \
                *
  * this program.  If not, see <http://www.gnu.org/licenses/>.                        \
                *
  ****************************************************************************************/
 +#include "SpotifyConfig.h"
 #include "core/support/Debug.h"
+
 #include <sys/utsname.h>
 #include <KWallet/Wallet>
 #include <KMessageBox>
@@ -21,14 +23,12 @@
 #include <KConfigGroup>
 #include <KStandardDirs>
 #include "App.h"
-#include "SpotifyConfig.h"
 
 const QString SpotifyConfig::m_resolverDownloadUrl = "http://ofan.me/";
 
 SpotifyConfig::SpotifyConfig()
 : m_username ()
 , m_password ()
-, m_apikey ()
 , m_resolverPath ()
 , m_highQuality( false )
 , m_wallet ( 0 )
@@ -88,23 +88,12 @@ SpotifyConfig::load()
             m_username = QString::fromUtf8( rawUsername );
         }
 
-        QByteArray base64_apikey;
-        if( m_wallet->readEntry( "spotify_apikey", base64_apikey ) > 0 )
-        {
-            debug() << "Cannot get Spotify apikey from KWallet.";
-        }
-        else
-        {
-            m_apikey = QByteArray::fromBase64( base64_apikey );
-        }
-
     }
     else
     {
         m_username = config.readEntry( "username", QString() );
         m_resolverPath = config.readEntry( "resolver", QString() );
         m_password = QByteArray::fromBase64( config.readEntry( "password", QString() \
                ).toLocal8Bit() );
-        m_apikey = QByteArray::fromBase64( config.readEntry( "apikey", QString() \
).toLocal8Bit() );  }
 
     m_highQuality = config.readEntry( "highquality", false );
@@ -118,34 +107,41 @@ SpotifyConfig::save()
 
     KConfigGroup config = KGlobal::config()->group( configSectionName() );
 
-    config.writeEntry( "highquality", m_highQuality );
 
     if( !m_wallet )
     {
         // KWallet not loaded, tell user that we won't save the password
-        int result = KMessageBox::questionYesNo( (QWidget*)this,
+        int result = KMessageBox::questionYesNoCancel( (QWidget*)this,
                 i18n( "Cannot find KWallet, credentials will be saved in plaintext, \
continue?" ),  i18n( "Spotify credentials" ) );
 
         if( result == KMessageBox::Cancel )
         {
+            // Don't save anything
             return;
         }
 
         QByteArray base64_password;
-        QByteArray base64_apikey;
         base64_password.append( m_password.toLocal8Bit() );
-        base64_apikey.append( m_apikey );
 
         config.writeEntry( "username", m_username );
-        config.writeEntry( "password", base64_password.toBase64() );
-        config.writeEntry( "apikey", base64_apikey.toBase64() );
+
+        // Stores password using KConfig if user approved this
+        if( result != KMessageBox::No )
+            config.writeEntry( "password", base64_password.toBase64() );
+
+        // Set default resolver path
+        if( m_resolverPath.isEmpty() )
+            m_resolverPath = KStandardDirs::locateLocal( "exe", \
defaultResolverName() ); +
         config.writeEntry( "resolver", m_resolverPath );
 
         config.sync();
     }
     else
     {
+        // KWallet found
+
         if( m_wallet->writePassword( "spotify_password", m_password ) > 0 )
         {
             warning() << "Failed to save Spotify password to KWallet.";
@@ -155,17 +151,9 @@ SpotifyConfig::save()
         {
             warning() << "Falied to save Spotify username to KWallet.";
         }
-
-        if( m_wallet->writeEntry( "spotify_apikey", m_apikey.toBase64() ) > 0 )
-        {
-            warning() << "Failed to save Spotify API key to KWallet.";
-        }
-
-        if( m_wallet->writeEntry( "spotify_resolver", QByteArray( \
                m_resolverPath.toLocal8Bit() ) ) > 0 )
-        {
-            warning() << "Failed to save Spotify resolver path to KWallet.";
-        }
     }
+
+    config.writeEntry( "highquality", m_highQuality );
 }
 
 void
@@ -176,13 +164,12 @@ SpotifyConfig::reset()
     m_username = "";
     m_password = "";
     // Use the the API key embedded in Spotify resolver
-    m_apikey = "";
-    m_resolverPath = KStandardDirs::locateLocal( "exe", resolverName() );
+    m_resolverPath = KStandardDirs::locateLocal( "exe", defaultResolverName() );
     debug() << "Resolver path: " << m_resolverPath;
 }
 
 const QString
-SpotifyConfig::resolverName()
+SpotifyConfig::defaultResolverName()
 {
     utsname buf;
     int res = uname( &buf );
diff --git a/src/core-impl/collections/spotifycollection/SpotifyConfig.h \
b/src/core-impl/collections/spotifycollection/SpotifyConfig.h index ab8c447..5646f06 \
                100644
--- a/src/core-impl/collections/spotifycollection/SpotifyConfig.h
+++ b/src/core-impl/collections/spotifycollection/SpotifyConfig.h
@@ -17,8 +17,8 @@
 #define SPOTIFYCONFIG_H_
 
 #include <QObject>
-#include <QString>
 
+class QString;
 namespace KWallet { class Wallet; }
 
 class KDialog;
@@ -31,7 +31,7 @@ public:
     ~SpotifyConfig();
 
     static const char *configSectionName() { return "Collection_Spotify"; }
-    static const QString resolverName();
+    static const QString defaultResolverName();
     void load();
     void save();
     void reset();
@@ -42,13 +42,10 @@ public:
     const QString password() const { return m_password; }
     void setPassword( const QString& password ) { m_password = password; }
 
-    const QByteArray apikey() const { return m_apikey; }
-    void setApiKey( const QString base64 ) { m_apikey = QByteArray::fromBase64( \
                QByteArray( base64.toAscii() ) ); }
-
     const QString resolverPath() const { return m_resolverPath; }
     void setResolverPath( const QString& path ) { m_resolverPath = path; }
 
-    const QString resolverDownloadUrl() const { return m_resolverDownloadUrl + \
resolverName(); } +    const QString resolverDownloadUrl() const { return \
m_resolverDownloadUrl + defaultResolverName(); }  
     bool highQuality() const { return m_highQuality; }
     void setHighQuality( const bool highquality ) { m_highQuality = highquality; }
@@ -56,7 +53,6 @@ public:
 private:
     QString m_username;
     QString m_password;
-    QByteArray m_apikey;
     QString m_resolverPath;
     bool m_highQuality;
     const static QString m_resolverDownloadUrl;
diff --git a/src/core-impl/collections/spotifycollection/SpotifyPlaylist.cpp \
b/src/core-impl/collections/spotifycollection/SpotifyPlaylist.cpp index \
                abdc672..bb9521e 100644
--- a/src/core-impl/collections/spotifycollection/SpotifyPlaylist.cpp
+++ b/src/core-impl/collections/spotifycollection/SpotifyPlaylist.cpp
@@ -18,7 +18,6 @@
 using Playlists;
 
 SpotifyPlaylist::SpotifyPlaylist( Collections::SpotifyCollection* collection, \
                SpotifyPlaylistProvider* provider)
-    :QObject( 0 )
 , m_name( i18n("New playlist") )
 , m_sync( true )
 , m_collection( collection )
@@ -29,7 +28,6 @@ SpotifyPlaylist::SpotifyPlaylist( Collections::SpotifyCollection* \
collection, Sp  
 SpotifyPlaylist::SpotifyPlaylist( const QString& name, const Meta::SpotifyTracklist& \
                tracks,
                                   Collections::SpotifyCollection* collection, \
                SpotifyPlaylistProvider* provider, const sync = true )
-    :QObject( 0 )
 , m_name( name )
 , m_sync( sync )
 , m_collection( collection )
diff --git a/src/core-impl/collections/spotifycollection/SpotifyQueryMaker.cpp \
b/src/core-impl/collections/spotifycollection/SpotifyQueryMaker.cpp index \
                a7e521e..f4cf26a 100644
--- a/src/core-impl/collections/spotifycollection/SpotifyQueryMaker.cpp
+++ b/src/core-impl/collections/spotifycollection/SpotifyQueryMaker.cpp
@@ -68,7 +68,7 @@ namespace Collections
         connect( m_memoryQueryMaker.data(), SIGNAL( newResultReady( Meta::LabelList \
) ),  this, SIGNAL( newResultReady( Meta::LabelList ) ) );
         connect( m_memoryQueryMaker.data(), SIGNAL( queryDone() ),
-                 this, SLOT( memoryQueryDone() ) );
+                 this, SLOT( slotMemoryQueryDone() ) );
         m_memoryQueryMaker.data()->setAutoDelete( true );
     }
 
@@ -123,9 +123,9 @@ namespace Collections
                 connect( this, SIGNAL( queryAborted() ),
                          query, SLOT( abortQuery()) );
                 connect( query, SIGNAL(newTrackList( Meta::SpotifyTrackList ) ),
-                         this, SLOT(collectResults( Meta::SpotifyTrackList ) ) );
+                         this, SLOT(slotCollectResults( Meta::SpotifyTrackList ) ) \
                );
                 connect( query, \
                SIGNAL(queryDone(Spotify::Query*,Meta::SpotifyTrackList)),
-                         this, \
SLOT(aQueryEnded(Spotify::Query*,Meta::SpotifyTrackList))); +                         \
this, SLOT(slotQueryDone(Spotify::Query*,Meta::SpotifyTrackList)));  
                 m_controller.data()->resolve( query );
             }
@@ -142,8 +142,8 @@ namespace Collections
         DEBUG_BLOCK
 
         m_memoryQueryMaker.data()->abortQuery();
-        m_controller.data()->disconnect( this, \
                SLOT(collectResults(Meta::SpotifyTrackList)) );
-        m_controller.data()->disconnect( this, \
SLOT(aQueryEnded(Spotify::Query*,Meta::SpotifyTrackList)) ); +        \
m_controller.data()->disconnect( this, \
SLOT(slotCollectResults(Meta::SpotifyTrackList)) ); +        \
m_controller.data()->disconnect( this, \
SLOT(slotQueryDone(Spotify::Query*,Meta::SpotifyTrackList)) );  
         if( m_querySent )
         {
@@ -508,7 +508,7 @@ namespace Collections
     }
 
     void
-    SpotifyQueryMaker::collectResults( const Meta::SpotifyTrackList& trackList )
+    SpotifyQueryMaker::slotCollectResults( const Meta::SpotifyTrackList& trackList )
     {
         DEBUG_BLOCK
 
@@ -526,7 +526,7 @@ namespace Collections
     }
 
     void
-    SpotifyQueryMaker::aQueryEnded( Spotify::Query *query, const \
Meta::SpotifyTrackList trackList ) +    SpotifyQueryMaker::slotQueryDone( \
Spotify::Query *query, const Meta::SpotifyTrackList trackList )  {
         DEBUG_BLOCK
 
@@ -534,7 +534,7 @@ namespace Collections
         Q_UNUSED( trackList );
 
         query->disconnect( this, SLOT(spotifyError(Spotify::Controller::ErrorState)) \
                );
-        query->disconnect( this, \
SLOT(aQueryEnded(Spotify::Query*,Meta::SpotifyTrackList)) ); +        \
query->disconnect( this, SLOT(slotQueryDone(Spotify::Query*,Meta::SpotifyTrackList)) \
);  
         m_activeQueryCount--;
         m_querySent = false;
@@ -556,7 +556,7 @@ namespace Collections
     }
 
     void
-    SpotifyQueryMaker::memoryQueryDone()
+    SpotifyQueryMaker::slotMemoryQueryDone()
     {
         DEBUG_BLOCK
 
@@ -600,7 +600,7 @@ namespace Collections
         connect( m_memoryQueryMaker.data(), SIGNAL( newResultReady( Meta::LabelList \
) ),  this, SIGNAL( newResultReady( Meta::LabelList ) ) );
         connect( m_memoryQueryMaker.data(), SIGNAL( queryDone() ),
-                 this, SLOT( memoryQueryDone() ) );
+                 this, SLOT( slotMemoryQueryDone() ) );
         m_memoryQueryMaker.data()->setAutoDelete( true );
 
         foreach( CurriedQMFunction *funPtr, m_queryMakerFunctions )
diff --git a/src/core-impl/collections/spotifycollection/SpotifyQueryMaker.h \
b/src/core-impl/collections/spotifycollection/SpotifyQueryMaker.h index \
                ba32742..201ab63 100644
--- a/src/core-impl/collections/spotifycollection/SpotifyQueryMaker.h
+++ b/src/core-impl/collections/spotifycollection/SpotifyQueryMaker.h
@@ -19,7 +19,6 @@
 
 #include "SpotifyMeta.h"
 #include "SpotifyCollection.h"
-
 #include "support/Controller.h"
 #include "support/Query.h"
 #include "support/QMFunctionTypes.h"
@@ -29,7 +28,6 @@
 #include "core/collections/QueryMaker.h"
 
 #include <QMap>
-#include <QStack>
 
 namespace Collections
 {
@@ -94,9 +92,9 @@ namespace Collections
 
         public Q_SLOTS:
             void slotSpotifyError( const Spotify::Controller::ErrorState error );
-            void collectResults( const Meta::SpotifyTrackList &track );
-            void aQueryEnded( Spotify::Query* query, const Meta::SpotifyTrackList \
                trackList );
-            void memoryQueryDone();
+            void slotCollectResults( const Meta::SpotifyTrackList &track );
+            void slotQueryDone( Spotify::Query* query, const Meta::SpotifyTrackList \
trackList ); +            void slotMemoryQueryDone();
 
         private:
             QueryType m_queryType;
diff --git a/src/core-impl/collections/spotifycollection/SpotifySettings.cpp \
b/src/core-impl/collections/spotifycollection/SpotifySettings.cpp index \
                a2bc228..3afeb25 100644
--- a/src/core-impl/collections/spotifycollection/SpotifySettings.cpp
+++ b/src/core-impl/collections/spotifycollection/SpotifySettings.cpp
@@ -14,16 +14,16 @@
  * this program.  If not, see <http://www.gnu.org/licenses/>.                        \
                *
  ****************************************************************************************/
  #define DEBUG_PREFIX "SpotifySettings"
-#include <QtGlobal>
-#include <QFile>
-#include <KLocale>
-#include <KMessageBox>
-#include <stdlib.h>
-#include "core/support/Debug.h"
+
 #include "SpotifySettings.h"
+#include "core/support/Debug.h"
 #include "support/Controller.h"
 #include "ui_SpotifyConfigWidget.h"
 
+#include <KLocale>
+#include <KMessageBox>
+#include <QtGlobal>
+#include <QFile>
 
 SpotifySettings::SpotifySettings( QWidget* parent, const QVariantList& args )
 : KDialog( parent )
@@ -48,20 +48,20 @@ SpotifySettings::SpotifySettings( QWidget* parent, const \
QVariantList& args )  setMainWidget( w );
 
     connect( this, SIGNAL( okClicked() ),
-            this, SLOT( tryLogin() ) );
+            this, SLOT( slotTryLogin() ) );
     connect( this, SIGNAL( cancelClicked() ),
-            this, SLOT( cancel() ) );
+            this, SLOT( slotCancel() ) );
     connect( this, SIGNAL( applyClicked() ),
-            this, SLOT( tryLogin() ) );
+            this, SLOT( slotTryLogin() ) );
     connect( this, SIGNAL( defaultClicked() ),
             this, SLOT( defaults() ) );
 
     connect( m_configWidget->lineUsername, SIGNAL( textChanged( const QString& ) ),
-            this, SLOT( settingsChanged() ) );
+            this, SLOT( slotSettingsChanged() ) );
     connect( m_configWidget->linePassword, SIGNAL( textChanged( const QString& ) ),
-            this, SLOT( settingsChanged() ) );
+            this, SLOT( slotSettingsChanged() ) );
     connect( m_configWidget->checkHighQuality, SIGNAL( clicked() ),
-            this, SLOT( settingsChanged() ) );
+            this, SLOT( slotSettingsChanged() ) );
 
     connect( this, SIGNAL( changed( bool ) ), this, SLOT( enableButtonApply( bool ) \
) );  
@@ -72,7 +72,9 @@ SpotifySettings::SpotifySettings( QWidget* parent, const \
QVariantList& args )  if( !QFile::exists( m_config.resolverPath() ) )
     {
         int res = KMessageBox::questionYesNo( this,
-i18n( "Spotify resolver is a program required by Spotify collection,it's missing or \
not installed correctly on your system, you want to download and install it now?" ), \
+                    i18n( "Spotify resolver is missing or not installed correctly on \
your system." +                          "This program is required by Spotify \
collection." +                          "Do you want to download and install it now?" \
),  i18n( "Spotify resolver" ) );
         if( res == KMessageBox::Yes )
         {
@@ -81,7 +83,7 @@ i18n( "Spotify resolver is a program required by Spotify \
collection,it's missing  else
         {
             // Close config dialog
-            cancel();
+            slotCancel();
         }
     }
 }
@@ -121,7 +123,7 @@ SpotifySettings::defaults()
 }
 
 void
-SpotifySettings::tryLogin()
+SpotifySettings::slotTryLogin()
 {
     DEBUG_BLOCK
     Spotify::Controller* controller = The::SpotifyController();
@@ -186,7 +188,7 @@ SpotifySettings::slotDownloadError( QNetworkReply::NetworkError \
error )  
     KMessageBox::error( this, i18n( "Error occured while downloading Spotify \
resolver." ));  
-    cancel();
+    slotCancel();
 }
 
 void
@@ -201,6 +203,19 @@ void
 SpotifySettings::slotDownloadFinished()
 {
     DEBUG_BLOCK
+
+    if( m_downloadReply->error() != QNetworkReply::NoError )
+    {
+        debug() << "Downloading is interrupted due to " << \
m_downloadReply->errorString(); +        KMessageBox::warningYesNo( this,
+                i18n( "Error occured while downloading Spotify resolver,"
+                      "please check your internet connection and try again later." ) \
); +
+        // Don't show the settings dialog
+        deleteLater();
+        return;
+    }
+
     debug() << "Download finished.";
 
     m_configWidget->progDownload->hide();
@@ -212,21 +227,14 @@ SpotifySettings::slotDownloadFinished()
     }
     else
     {
-        while( m_downloadReply->bytesAvailable() )
-        {
-            file.write( m_downloadReply->read( 102400 ) );
-        }
+        file.write( m_downloadReply->readAll() );
 
+        // Set execution permission
+        file.setPermissions( file.permissions() | QFile::ExeUser );
         file.close();
-
-#if defined(Q_WS_X11) || defined(Q_WS_MAC)
-        // Grant execution permission for *nix systems
-        QString cmd = QString("chmod +x '%1'").arg(m_config.resolverPath());
-        system(qPrintable(cmd));
-#endif
     }
 
-    // Restore
+    // Restore widgets
     m_configWidget->progDownload->hide();
     m_configWidget->frameMain->show();
     m_configWidget->lblNote->show();
@@ -236,13 +244,13 @@ SpotifySettings::slotDownloadFinished()
 }
 
 void
-SpotifySettings::settingsChanged()
+SpotifySettings::slotSettingsChanged()
 {
     emit changed( true );
 }
 
 void
-SpotifySettings::cancel()
+SpotifySettings::slotCancel()
 {
     close();
 
diff --git a/src/core-impl/collections/spotifycollection/SpotifySettings.h \
b/src/core-impl/collections/spotifycollection/SpotifySettings.h index \
                f3dcf6d..c1d868d 100644
--- a/src/core-impl/collections/spotifycollection/SpotifySettings.h
+++ b/src/core-impl/collections/spotifycollection/SpotifySettings.h
@@ -16,10 +16,11 @@
 #ifndef SPOTIFYSETTINGS_H_
 #define SPOTIFYSETTINGS_H_
 
-#include <KDialog>
 #include "SpotifyConfig.h"
 #include "network/NetworkAccessManagerProxy.h"
 
+#include <KDialog>
+
 namespace Ui { class SpotifyConfigWidget; }
 
 class SpotifySettings: public KDialog
@@ -37,11 +38,11 @@ public Q_SLOTS:
     virtual void save();
     virtual void load();
     virtual void defaults();
-    void settingsChanged();
-    void cancel();
+    void slotSettingsChanged();
+    void slotCancel();
 
 private Q_SLOTS:
-    void tryLogin();
+    void slotTryLogin();
     void slotDownloadError( QNetworkReply::NetworkError error );
     void slotDownloadProgress( qint64 current, qint64 total );
     void slotDownloadFinished();
diff --git a/src/core-impl/collections/spotifycollection/support/Controller.cpp \
b/src/core-impl/collections/spotifycollection/support/Controller.cpp index \
                f2c41fd..6d3b4ce 100644
--- a/src/core-impl/collections/spotifycollection/support/Controller.cpp
+++ b/src/core-impl/collections/spotifycollection/support/Controller.cpp
@@ -20,18 +20,13 @@
 #include "Controller.h"
 #include "../SpotifyMeta.h"
 #include "core/support/Debug.h"
-#include <QDebug>
-#include <QFile>
-#include <QFileInfo>
+
 #include <QtEndian>
-#include <QTimer>
 #include <KLocale>
-#include "core/support/Amarok.h"
-#include "core/support/Components.h"
-#include "core/interfaces/Logger.h"
 
 
-#define ShowMessage(x) Amarok::Components::logger()->shortMessage( x )
+class QFile;
+class QFileInfo;
 
 namespace Spotify
 {
@@ -69,6 +64,7 @@ namespace Spotify
 Controller::Controller( const QString& exec )
 : QObject(0)
 , m_filePath( exec )
+, m_lastUsername( QString() )
 , m_msgSize( 0 )
 , m_timeout ( 5 )
 , m_ready( false )
@@ -76,6 +72,7 @@ Controller::Controller( const QString& exec )
 , m_loaded( false )
 , m_deleting( false )
 , m_configSent( false )
+, m_loggedIn( false )
 , m_queryCounter( 0 )
 {
     qDebug() << Q_FUNC_INFO << "Spotify Controller created: " << exec;
@@ -114,6 +111,7 @@ Controller::unload()
     }
 
     m_loaded = false;
+    m_loggedIn = false;
 }
 
 void
@@ -205,7 +203,7 @@ Controller::sendMessage( const QVariantMap& map )
 
 void Controller::readStderr()
 {
-    debug() << "SCRIPT_STDERR" << filePath() << m_proc.readAllStandardError();
+    debug() << "SCRIPT_STDERR" << resolverPath() << m_proc.readAllStandardError();
 }
 
 void
@@ -213,15 +211,19 @@ Controller::login(const QString &username, const QString \
&password, const bool h  {
     DEBUG_BLOCK
 
+    if( loggedIn() && username == m_lastUsername )
+        return;
+
     QString msg = i18n( "Trying to login to Spotify..." );
-    ShowMessage( msg );
+    showMessage( msg );
+
     QVariantMap map;
     map["_msgtype"] = "login";
     map["username"] = username;
     map["password"] = password;
     map["highQuality"] = highQuality;
 
-    sendMessage(map);
+    sendMessage( map );
 }
 
 void
@@ -250,7 +252,7 @@ Controller::readStdout()
 
         if( m_proc.bytesAvailable() )
         {
-            QTimer::singleShot( 0, this, SLOT( readStdout() ) );
+            readStdout();
         }
     }
     else
@@ -264,6 +266,8 @@ Controller::makeQuery( Collections::SpotifyCollection* \
collection, const QString  {
     DEBUG_BLOCK
     QString qid = QString::number( m_queryCounter++ );
+    // Queryies will be deleted after the results are received or times out
+    // see Query::queryDone and Controller::removeQueryFromCache
     return new Query( collection, qid, title, artist, album, genre );
 }
 
@@ -408,14 +412,15 @@ Controller::procExited( int code, QProcess::ExitStatus status )
 {
     DEBUG_BLOCK
     m_ready = false;
-    qDebug() << Q_FUNC_INFO << "RESOVER EXITED, code" << code << "status" << status \
<< filePath(); +    m_loaded = false;
+    m_loggedIn = false;
+    qDebug() << Q_FUNC_INFO << "RESOVER EXITED, code" << code << "status" << status \
<< resolverPath();  
     emit changed();
 
     if( m_stopped )
     {
         qDebug() << "*** Resolver stopped ";
-        m_loaded = false;
         emit terminated();
         return;
     }
@@ -435,7 +440,7 @@ Controller::doSetup( const QVariantMap& m )
     m_name = m.value( "name" ).toString();
     m_timeout = m.value( "timeout", 5 ).toUInt() * 1000;
 
-    debug() << "RESOLVER" << filePath() << "READY," << "name" << m_name << "timeout" \
<< m_timeout; +    debug() << "RESOLVER" << resolverPath() << "READY," << "name" << \
m_name << "timeout" << m_timeout;  
     m_ready = true;
     m_configSent = false;
@@ -447,53 +452,17 @@ void
 Controller::startProcess()
 {
     DEBUG_BLOCK
-    if( !QFile::exists( filePath() ) )
+    if( !QFile::exists( resolverPath() ) )
     {
-        debug() << "*** Cannot find file" << filePath() << ", starting process \
failed"; +        debug() << "*** Cannot find file" << resolverPath() << ", starting \
process failed";  // TODO: Set error message
         return;
     }
 
-    debug() << "Starting " << filePath();
-    QFileInfo fi( filePath() );
-    QString interpreter;
-    QString runPath = filePath();
+    debug() << "Starting " << resolverPath();
+    QString runPath = resolverPath();
 
-#ifdef Q_OS_WIN
-    if( fi.suffix().toLower() != "exe" )
-    {
-        DWORD dwSize = MAX_PATH;
-
-        wchar_t path[MAX_PATH] = { 0 };
-        wchar_t *ext = (wchar_t *) ("." + fi.suffix()).utf16();
-
-        HRESULT hr = AssocQueryStringW(
-                (ASSOCF) 0,
-                ASSOCSTR_EXECUTABLE,
-                ext,
-                L"open",
-                path,
-                &dwSize
-        );
-
-        if ( ! FAILED( hr ) )
-        {
-            interpreter = QString( "\"%1\"" ).arg(QString::fromUtf16((const ushort \
                *) path));
-        }
-    }
-    else
-    {
-        runPath = QString( "\"%1\"" ).arg( filePath() );
-    }
-#endif // Q_OS_WIN
-    if( interpreter.isEmpty() )
-    {
-        m_proc.start( runPath );
-    }
-    else
-    {
-        m_proc.start( interpreter, QStringList() << filePath() );
-    }
+    m_proc.start( runPath );
 
     m_loaded = true;
 
@@ -519,6 +488,8 @@ Controller::handlePlaylistReceived( const QVariantMap& map )
     QString plId = map["id"].toString();
     QString plName = map["name"].toString();
     bool plSync = map["sync"].toBool();
+    Q_UNUSED( plSync )
+    // TODO: Implement playlist sync
     QVariantList tracks = map["tracks"].toList();
 
     // Get tracks in the playlist
@@ -542,42 +513,42 @@ Controller::handlePlaylistReceived( const QVariantMap& map )
         trackList << track ;
     }
 
-//    Playlists::SpotifyPlaylist* playlist =
-//        new Plaulists::SpotifyPlaylist( plName, trackList, collection );
-//    m_queryResults[qid] = playlist;
-
-    // Notify the collection to retrive query result
-    //emit queryDone( qid );
 }
 
 void
 Controller::handlePlaylistRenamed( const QVariantMap& map )
 {
+    Q_UNUSED( map )
 }
 
 void
 Controller::handlePlaylistDeleted( const QVariantMap& map )
 {
+    Q_UNUSED( map )
 }
 
 void
 Controller::handleTracksAdded( const QVariantMap& map )
 {
+    Q_UNUSED( map )
 }
 
 void
 Controller::handleTracksDeleted( const QVariantMap& map )
 {
+    Q_UNUSED( map )
 }
 
 void
 Controller::handleTracksMoved( const QVariantMap& map )
 {
+    Q_UNUSED( map )
 }
 
 void
 Controller::handleTracksRemoved( const QVariantMap& map )
 {
+    Q_UNUSED( map )
 }
 
 void
@@ -587,44 +558,52 @@ Controller::handleLoginResponse( const QVariantMap& map )
     QString user = map["username"].toString();
     if( success )
     {
-        ShowMessage( i18n( "Logged in to Spotify as %1" ).arg( user ) );
+        showMessage( i18n( "Logged in to Spotify as %1" ).arg( user ) );
         emit loginSuccess( user );
     }
     else
     {
-        ShowMessage( i18n( "Spotify login failed" ) );
+        showMessage( i18n( "Spotify login failed" ) );
         emit loginFailed();
     }
+
+    m_loggedIn = success;
 }
 
 void
 Controller::handleCredentialsReceived( const QVariantMap& map )
 {
+    Q_UNUSED( map )
 }
 
 void
 Controller::handleSettingsReceived( const QVariantMap& map )
 {
+    Q_UNUSED( map )
 }
 
 void
 Controller::handleAllPlaylists( const QVariantMap& map )
 {
+    Q_UNUSED( map )
 }
 
 void
 Controller::handleUserchanged( const QVariantMap& map )
 {
+    Q_UNUSED( map )
 }
 
 void
 Controller::handleSpotifyError( const QVariantMap& map )
 {
+    Q_UNUSED( map )
 }
 
 void
 Controller::handleQueryResponse( const QVariantMap& map )
 {
+    Q_UNUSED( map )
 }
 
 void
@@ -670,7 +649,7 @@ Controller::handleSearchResults( const QVariantMap& map )
         trackList << track;
     }
 
-    queryPtr->tracksAdded( trackList );
+    queryPtr->slotTracksAdded( trackList );
 }
 
 } // namespace Spotify
diff --git a/src/core-impl/collections/spotifycollection/support/Controller.h \
b/src/core-impl/collections/spotifycollection/support/Controller.h index \
                8ce08f6..f9fd86b 100644
--- a/src/core-impl/collections/spotifycollection/support/Controller.h
+++ b/src/core-impl/collections/spotifycollection/support/Controller.h
@@ -20,16 +20,18 @@
 #ifndef SCRIPTRESOLVER_H
 #define SCRIPTRESOLVER_H
 
-#include <QProcess>
+#include "../SpotifyMeta.h"
+#include "./Query.h"
+#include "core/support/Amarok.h"
+#include "core/support/Components.h"
+#include "core/interfaces/Logger.h"
 
+#include <QProcess>
 #include <QVariantMap>
-
 #include <qjson/parser.h>
 #include <qjson/serializer.h>
 #include <qjson/qobjecthelper.h>
 
-#include "../SpotifyMeta.h"
-#include "./Query.h"
 
 class QObject;
 
@@ -43,7 +45,7 @@ namespace Spotify { class Controller; }
 
 namespace The
 {
-    extern Spotify::Controller* SpotifyController( const QString& resolverPath = \
QString() ); +    Spotify::Controller* SpotifyController( const QString& resolverPath \
= QString() );  }
 
 namespace Spotify
@@ -64,9 +66,10 @@ public:
     virtual unsigned int timeout() const { return m_timeout; }
     virtual void setTimeout( const unsigned int timeout ) { m_timeout = timeout; }
     virtual QString name() const { return m_name; }
-    virtual QString filePath() const { return m_filePath; }
+    virtual QString resolverPath() const { return m_filePath; }
     virtual void setFilePath( const QString& resolverPath ) { m_filePath = \
                resolverPath; }
     virtual void login(const QString& username, const QString& password, const bool \
highQuality = false); +    virtual bool loggedIn() const { return m_loggedIn; }
     virtual bool running() const;
     virtual bool loaded() const;
 
@@ -80,7 +83,6 @@ public:
      */
     virtual Spotify::Query* makeQuery( Collections::SpotifyCollection* collection, \
const QString& title = QString(), const QString& artist = QString(), const QString& \
album = QString(), const QString& genre = QString());  virtual void resolve( Query \
                *query );
-//    virtual void search( const QueryPtr queryPtr );
 
     /* Get playlist
      */
@@ -154,6 +156,7 @@ private slots:
 
 private:
     // Core private methods
+    inline void showMessage( const QString& msg ) { \
Amarok::Components::logger()->shortMessage( msg ); }  /* Send raw bytes to Spotify \
                resolver,
      * the difference between sendRaw and sendMsg is,
      * sendRaw only sends raw data, that it, msg should contain the message header \
which is the length of the message body, @@ -209,6 +212,7 @@ private:
     QProcess  m_proc;
     QString   m_name;
     QString   m_filePath;
+    QString   m_lastUsername;
 
     quint32     m_msgSize;
     quint32     m_timeout;
@@ -219,6 +223,7 @@ private:
     bool m_loaded;
     bool m_deleting;
     bool m_configSent;
+    bool m_loggedIn;
 
     QJson::Parser      m_parser;
     QJson::Serializer  m_serializer;
diff --git a/src/core-impl/collections/spotifycollection/support/Query.cpp \
b/src/core-impl/collections/spotifycollection/support/Query.cpp index \
                0074731..53c3718 100644
--- a/src/core-impl/collections/spotifycollection/support/Query.cpp
+++ b/src/core-impl/collections/spotifycollection/support/Query.cpp
@@ -16,23 +16,29 @@
 #include "Query.h"
 #include "core/support/Debug.h"
 
+#include <QTimer>
+
 namespace Spotify{
 
-Query::Query( Collections::SpotifyCollection* collection, const QString& qid, const \
QString& title, const QString& artist, const QString& album, const QString& genre ) \
+Query::Query( Collections::SpotifyCollection* collection, const QString& qid, +      \
const QString& title, const QString& artist, const QString& album, +              \
const QString& genre )  :QObject( 0 )
 , m_qid( qid )
 , m_title( title )
 , m_artist( artist )
 , m_album( album )
 , m_genre( genre )
+, m_timeout( 3000 ) // Default timeout is 3 seconds
 , m_collection( collection )
 {
+    // Set timeout, the query will be deleted automatically after timedout
+    QTimer::singleShot( m_timeout, this, SLOT( slotTimedout() ) );
 }
 
 Query::~Query()
 {
     DEBUG_BLOCK
-    emit queryDone( qid() );
 }
 
 QString
@@ -73,7 +79,7 @@ Query::getFullQueryString() const
 }
 
 void
-Query::tracksAdded( const Meta::SpotifyTrackList& trackList )
+Query::slotTracksAdded( const Meta::SpotifyTrackList& trackList )
 {
     DEBUG_BLOCK
     m_results = trackList;
@@ -88,23 +94,21 @@ Query::tracksAdded( const Meta::SpotifyTrackList& trackList )
     }
 
     emit newTrackList( trackList );
-    emit queryDone( this, trackList );
-
+    emit queryDone( qid() );
 }
 
 void
-Query::timedOut()
+Query::slotTimedout()
 {
     emit queryError( QueryError ( ETimedOut, QString( "Query(%1) timed out!" ).arg( \
qid() ) ) ); +    emit queryDone( qid() );
 
-    // Auto delete self
-    deleteLater();
 }
 
 void
-Query::abortQuery()
+Query::slotAbortQuery()
 {
-    deleteLater();
+    emit queryDone( qid() );
 }
 
 } // namespace Spotify
diff --git a/src/core-impl/collections/spotifycollection/support/Query.h \
b/src/core-impl/collections/spotifycollection/support/Query.h index c5c73ed..d664e1d \
                100644
--- a/src/core-impl/collections/spotifycollection/support/Query.h
+++ b/src/core-impl/collections/spotifycollection/support/Query.h
@@ -87,18 +87,16 @@ class Query: public QObject, public QSharedData
         QString errorMsg() const { return m_error.verbose; }
 
     public slots:
-        void tracksAdded( const Meta::SpotifyTrackList &trackList );
-        /* Abort current query if timed out
-         */
-        void abortQuery();
-        void timedOut();
+        void slotTracksAdded( const Meta::SpotifyTrackList &trackList );
+        // Abort current query if timed out
+        void slotAbortQuery();
+        void slotTimedout();
         void setError( const Spotify::QueryError& error ) { m_error = error; }
 
     signals:
         void queryError( const Spotify::QueryError& error );
         void newTrackList( const Meta::SpotifyTrackList& trackList );
         void queryDone( const QString& qid );
-        void queryDone( Spotify::Query*, const Meta::SpotifyTrackList& );
 
     private:
         QString m_qid;
@@ -107,6 +105,8 @@ class Query: public QObject, public QSharedData
         QString m_album;
         QString m_genre;
 
+        int m_timeout;
+
         Collections::SpotifyCollection* m_collection;
 
         bool m_solved;
diff --git a/src/core-impl/collections/spotifycollection/support/TrackProxy.cpp \
b/src/core-impl/collections/spotifycollection/support/TrackProxy.cpp index \
                ab9097e..f24a145 100644
--- a/src/core-impl/collections/spotifycollection/support/TrackProxy.cpp
+++ b/src/core-impl/collections/spotifycollection/support/TrackProxy.cpp
@@ -32,7 +32,7 @@ void TrackProxy::slotSpotifyError( Spotify::Controller::ErrorState \
e )  deleteLater();
 }
 
-void TrackProxy::trackResolved( const Meta::SpotifyTrackList& trackList )
+void TrackProxy::slotTrackResolved( const Meta::SpotifyTrackList& trackList )
 {
     if( trackList.isEmpty() )
         return;
@@ -50,7 +50,7 @@ void TrackProxy::trackResolved( const Meta::SpotifyTrackList& \
trackList )  m_proxyTrackPtr->updateTrack( realTrack );
 }
 
-void TrackProxy::queryDone( Spotify::Query* query, const Meta::SpotifyTrackList& \
trackList ) +void TrackProxy::slotQueryDone( Spotify::Query* query, const \
Meta::SpotifyTrackList& trackList )  {
     Q_UNUSED( query );
     Q_UNUSED( trackList );
diff --git a/src/core-impl/collections/spotifycollection/support/TrackProxy.h \
b/src/core-impl/collections/spotifycollection/support/TrackProxy.h index \
                100f264..5b1b09c 100644
--- a/src/core-impl/collections/spotifycollection/support/TrackProxy.h
+++ b/src/core-impl/collections/spotifycollection/support/TrackProxy.h
@@ -21,8 +21,8 @@ class TrackProxy : public QObject
 
     private slots:
         void slotSpotifyError( Spotify::Controller::ErrorState );
-        void trackResolved( const Meta::SpotifyTrackList& trackList );
-        void queryDone( Spotify::Query* query, const Meta::SpotifyTrackList& \
trackList ); +        void slotTrackResolved( const Meta::SpotifyTrackList& trackList \
); +        void slotQueryDone( Spotify::Query* query, const Meta::SpotifyTrackList& \
trackList );  
     private:
         QPointer< Collections::SpotifyCollection > m_collection;


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic