[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