Skip to content

Commit

Permalink
* Remember session key if requested
Browse files Browse the repository at this point in the history
* Allow Logout
* Auto logout on authentication error (ie session key has been revoked)
!! Scrobbler needs behaviour testing when changing user especially regarding scrobble cache etc
  • Loading branch information
jonocole committed Jan 21, 2010
1 parent 0060adf commit 3bba32a
Show file tree
Hide file tree
Showing 11 changed files with 153 additions and 112 deletions.
27 changes: 18 additions & 9 deletions app/audioscrobbler/Application.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,9 @@ using audioscrobbler::Application;
#define AS_TRAY_ICON ":systray_icon_rest_mac.png"
#endif

Application::Application(int& argc, char** argv) : unicorn::Application(argc, argv)
Application::Application(int& argc, char** argv)
: unicorn::Application(argc, argv),
as( 0 )
{
/// tray
tray = new QSystemTrayIcon(this);
Expand Down Expand Up @@ -100,9 +102,6 @@ Application::Application(int& argc, char** argv) : unicorn::Application(argc, ar
sc->setTagAction( m_tag_action );
sc->setShareAction( m_share_action );

/// scrobbler
as = new Audioscrobbler("ass");

/// mediator
mediator = new PlayerMediator(this);
connect(mediator, SIGNAL(activeConnectionChanged( PlayerConnection* )), SLOT(setConnection( PlayerConnection* )) );
Expand Down Expand Up @@ -140,6 +139,12 @@ Application::Application(int& argc, char** argv) : unicorn::Application(argc, ar
}


/*void
Application::onSessionChanged()
{
}*/


void
Application::setConnection(PlayerConnection*c)
{
Expand Down Expand Up @@ -185,9 +190,10 @@ Application::onTrackStarted(const Track& t, const Track& oldtrack)
m_title_action->setText( t.title() + " [" + t.durationString() + ']' );

delete watch;
as->submit();
as->nowPlaying(t);

if( as ) {
as->submit();
as->nowPlaying(t);
}
ScrobblePoint timeout(t.duration()/2);
watch = new StopWatch(timeout, connection->elapsed());
watch->resume();
Expand All @@ -198,7 +204,7 @@ void
Application::onStopWatchTimedOut()
{
Q_ASSERT(connection);
as->cache(connection->track());
if( as ) as->cache(connection->track());
}

void
Expand All @@ -225,7 +231,7 @@ Application::onStopped()
Q_ASSERT(connection);

delete watch;
as->submit();
if( as ) as->submit();
}

void
Expand Down Expand Up @@ -274,6 +280,9 @@ Application::onTrayActivated( QSystemTrayIcon::ActivationReason reason )
void
Application::onUserGotInfo()
{
/// scrobbler
as = new Audioscrobbler("ass");

/*QNetworkReply* reply = qobject_cast<QNetworkReply*>(sender());
Q_ASSERT( reply );
Expand Down
4 changes: 3 additions & 1 deletion app/radio/Application.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include "lib/unicorn/QMessageBoxBuilder.h"
#include "Radio.h"
#include "ScrobSocket.h"
#include <QDebug>

using moralistfad::Application;

Expand All @@ -37,7 +38,8 @@ Application::onWsError( lastfm::ws::Error e )
switch (e)
{
case lastfm::ws::InvalidSessionKey:
logout();
if(!logout())
quit();
break;
default:
break;
Expand Down
39 changes: 26 additions & 13 deletions app/radio/MainWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include "widgets/MultiStarterWidget.h"
#include "widgets/PlaybackControlsWidget.h"
#include "widgets/NowPlayingWidget.h"
#include "lib/unicorn/UnicornApplication.h"
#include "lib/unicorn/qtwin.h"
#include "lib/unicorn/AnimatedStatusBar.h"
#include "lib/unicorn/widgets/MessageBar.h"
Expand All @@ -47,34 +48,46 @@ MainWindow::MainWindow()
status->addWidget( pcw, 1 );
setStatusBar( status );

MainWidget* mw;

QWidget* w = new QWidget();

new QVBoxLayout( w );
w->layout()->setContentsMargins( 0, 0, 0, 0 );
w->layout()->addWidget(mw = new MainWidget());
w->layout()->addWidget(m_mainWidget = new MainWidget());

connect( mw, SIGNAL( widgetChanged(QWidget*)), SLOT( onWidgetChanged( QWidget* )));
layout()->setSizeConstraint( QLayout::SetFixedSize );

m_messageBar = new MessageBar( w );

connect(mw, SIGNAL(startRadio(RadioStation)), SIGNAL(startRadio(RadioStation)));

AuthenticatedUser user;
connect(user.getFriends(), SIGNAL(finished()), mw, SLOT(onUserGotFriends()));
connect(user.getTopTags(), SIGNAL(finished()), mw, SLOT(onUserGotTopTags()));
connect(user.getPlaylists(), SIGNAL(finished()), mw, SLOT(onUserGotPlaylists()));
connect(user.getRecentStations(), SIGNAL(finished()), mw, SLOT(onUserGotRecentStations()));
connect(m_mainWidget, SIGNAL(startRadio(RadioStation)), SIGNAL(startRadio(RadioStation)));

connect(pcw, SIGNAL(startRadio(RadioStation)), mw, SLOT(onStartRadio(RadioStation)));
connect(pcw, SIGNAL(startRadio(RadioStation)), m_mainWidget, SLOT(onStartRadio(RadioStation)));

connect(radio, SIGNAL(stopped()), status, SLOT(hideAnimated()));
connect(radio, SIGNAL(tuningIn( const RadioStation&)), status, SLOT(showAnimated()));

connect( qApp, SIGNAL( sessionChanged( Session, Session )), SLOT( onSessionChanged( Session, Session )));

//if we've got this far we must already have a session so use
//the current session to start things rolling.
onSessionChanged( qobject_cast<unicorn::Application*>(qApp)->currentSession(), Session());

setCentralWidget( w );

finishUi();

//todo: bury this:
menuBar()->addMenu("Normania")->addAction( tr("RQL"), mw, SLOT(rawrql()), QKeySequence(tr("Ctrl+r")) );
menuBar()->addMenu("Normania")->addAction( tr("RQL"), m_mainWidget, SLOT(rawrql()), QKeySequence(tr("Ctrl+r")) );
}

void
MainWindow::onSessionChanged( const unicorn::Session& s, const unicorn::Session& )
{
AuthenticatedUser user;
qDebug() << "fetching friends, tags, playlists and recent stations for" << user;
connect(user.getFriends(), SIGNAL(finished()), m_mainWidget, SLOT(onUserGotFriends()));
connect(user.getTopTags(), SIGNAL(finished()), m_mainWidget, SLOT(onUserGotTopTags()));
connect(user.getPlaylists(), SIGNAL(finished()), m_mainWidget, SLOT(onUserGotPlaylists()));
connect(user.getRecentStations(), SIGNAL(finished()), m_mainWidget, SLOT(onUserGotRecentStations()));
}

void
Expand Down
6 changes: 6 additions & 0 deletions app/radio/MainWindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
#include "lib/unicorn/UnicornMainWindow.h"
#include <lastfm/RadioStation>

namespace unicorn{ class Session; }
using unicorn::Session;
class MessageBar;

class MainWindow : public unicorn::MainWindow
Expand All @@ -38,7 +40,11 @@ class MainWindow : public unicorn::MainWindow
public slots:
void onRadioError(int code, const QVariant& data);

protected slots:
void onSessionChanged( const Session& s, const Session& );

private:
class MainWidget* m_mainWidget;
MessageBar* m_messageBar;
};

Expand Down
33 changes: 16 additions & 17 deletions lib/unicorn/UnicornApplication.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -94,29 +94,31 @@ unicorn::Application::Application( int& argc, char** argv ) throw( StubbornUserE
#ifdef __APPLE__
setQuitOnLastWindowClosed( false );
#endif
QTimer::singleShot( 0, this, SLOT( init()));

initiateLogin();

}

void
unicorn::Application::initiateLogin( bool forceLogout ) throw( StubbornUserException )
{
if( m_bus.isSigningIn() ) {
if( !SignalBlocker( &m_bus, SIGNAL( sessionChanged(Session)), -1 ).start())
{
quit();
}
} else {

SignalBlocker( &m_bus, SIGNAL( sessionChanged(Session)), -1 ).start();
} else if( !forceLogout ) {
Session busSession = m_bus.getSession();

if( busSession.isValid() )
m_currentSession = busSession;
}

if( !m_currentSession.isValid() )
if( forceLogout || !m_currentSession.isValid() )
{
m_signingIn = true;
LoginDialog d( m_currentSession.username() );
connect( &m_bus, SIGNAL( signingInQuery( QString)), &d, SLOT( raise()));
if (d.exec() == QDialog::Accepted)
{
m_currentSession = d.session();
changeSession( d.session());
QByteArray* ba = new QByteArray("");
QDataStream ds( ba, QIODevice::WriteOnly | QIODevice::Truncate);
ds << QByteArray( "SESSIONCHANGED" );
Expand All @@ -126,17 +128,10 @@ unicorn::Application::Application( int& argc, char** argv ) throw( StubbornUserE
}
else
{
quit();
throw StubbornUserException();
}
}
m_signingIn = false;
connect( AuthenticatedUser().getInfo(), SIGNAL(finished()), SLOT(onUserGotInfo()) );
}


void
unicorn::Application::init()
{
}


Expand Down Expand Up @@ -233,6 +228,10 @@ unicorn::Application::changeSession( const Session& newSession )
{
Session oldSession = currentSession();
m_currentSession = newSession;
lastfm::ws::Username = m_currentSession.username();
lastfm::ws::SessionKey = m_currentSession.sessionKey();

connect( AuthenticatedUser().getInfo(), SIGNAL(finished()), SLOT(onUserGotInfo()) );
emit sessionChanged( currentSession(), oldSession );
}

Expand Down
14 changes: 9 additions & 5 deletions lib/unicorn/UnicornApplication.h
Original file line number Diff line number Diff line change
Expand Up @@ -111,13 +111,18 @@ namespace unicorn
static unicorn::Application* instance(){ return (unicorn::Application*)qApp; }

public slots:
void logout()
bool logout()
{
m_logoutAtQuit = true;
quit();
try {
initiateLogin( true );
} catch( const StubbornUserException& ) {
return false;
}
return true;
}

private:
void initiateLogin( bool forceLogout = false ) throw( StubbornUserException );
void translate();
void changeSession( const Session& newSession );
QString m_styleSheet;
Expand All @@ -126,15 +131,14 @@ namespace unicorn
bool m_signingIn;

private slots:
void init();
void onUserGotInfo();
void onSigningInQuery( const QString& );
void onBusSessionQuery( const QString& );
void onBusSessionChanged( const Session& );

signals:
void userGotInfo( QNetworkReply* );
void sessionChanged( const Session& newSession, const Session oldSession );
void sessionChanged( const Session& newSession, const Session& oldSession );
};
}

Expand Down
19 changes: 10 additions & 9 deletions lib/unicorn/UnicornMainWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,10 +56,9 @@ unicorn::MainWindow::finishUi()
ui.account = menuBar()->addMenu( AuthenticatedUser().name() );
ui.profile = ui.account->addAction( tr("Visit &Profile"), this, SLOT(visitProfile()) );
ui.account->addSeparator();
ui.account->addAction( tr("Log &Out && Quit"), qApp, SLOT(logout()) );
#ifndef __APPLE__
ui.account->addAction( tr("&Quit"), qApp, SLOT(quit()) );
#endif
ui.account->addAction( tr("Log &Out"), qApp, SLOT(logout()) );
QAction* quit = ui.account->addAction( tr("&Quit"), qApp, SLOT(quit()) );
quit->setMenuRole( QAction::QuitRole );

menuBar()->insertMenu( menuBar()->actions().first(), ui.account );
QMenu* help = menuBar()->addMenu( tr("Help") );
Expand All @@ -77,6 +76,7 @@ unicorn::MainWindow::finishUi()
void
unicorn::MainWindow::onUserGotInfo( QNetworkReply* reply )
{
ui.account->setTitle( AuthenticatedUser());
QString const text = AuthenticatedUser::getInfoString( reply );
if (text.size() && ui.account) {
QAction* a = ui.account->addAction( text );
Expand Down Expand Up @@ -134,16 +134,17 @@ unicorn::MainWindow::eventFilter( QObject* o, QEvent* event )
{
case QEvent::MouseButtonPress:
m_dragHandleMouseDownPos[ obj ] = e->globalPos() - pos();
break;
return true;

case QEvent::MouseButtonRelease:
m_dragHandleMouseDownPos[ obj ] = QPoint();
break;
return true;

case QEvent::MouseMove:
if (m_dragHandleMouseDownPos.contains( obj ) && !m_dragHandleMouseDownPos[ obj ].isNull())
move( e->globalPos() - m_dragHandleMouseDownPos[ obj ]);
break;
if (m_dragHandleMouseDownPos.contains( obj ) && !m_dragHandleMouseDownPos[ obj ].isNull()) {
move( e->globalPos() - m_dragHandleMouseDownPos[ obj ] );
return true;
}
}

return false;
Expand Down
6 changes: 2 additions & 4 deletions lib/unicorn/UnicornSession.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,12 +37,12 @@ Session::Session()
s.beginGroup( username );

if( s.contains( "SessionKey" )) {
init( username, s.value( "SessionKey" ).toString(), s.value("subscription", false).toBool());
init( username, s.value( "SessionKey" ).toString(), s.value("Subscriber", false).toBool());
}

}

Session::Session( QNetworkReply* reply ) throw( lastfm::ws::Error )
Session::Session( QNetworkReply* reply ) throw( lastfm::ws::ParseError )
:d( 0 )
{
lastfm::XmlQuery lfm = lastfm::ws::parse( reply );
Expand Down Expand Up @@ -101,8 +101,6 @@ Session::init( const QString& username, const QString& sessionKey, const bool is
d->isSubscriber = isSubscriber;
d->remember = false;

lastfm::ws::Username = username;
lastfm::ws::SessionKey = sessionKey;
}

}
Expand Down
2 changes: 1 addition & 1 deletion lib/unicorn/UnicornSession.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ class UNICORN_DLLEXPORT Session
public:
Session();
Session( const Session& other );
Session( QNetworkReply* reply ) throw( lastfm::ws::Error );
Session( QNetworkReply* reply ) throw( lastfm::ws::ParseError );

bool isValid() const
{
Expand Down
1 change: 1 addition & 0 deletions lib/unicorn/widgets/LoginDialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ LoginDialog::onAuthenticated()

try {
m_session = unicorn::Session( reply );
m_session.setRememberSession( ui.remember->isChecked());
accept();
}
catch (lastfm::ws::ParseError& e)
Expand Down
Loading

0 comments on commit 3bba32a

Please sign in to comment.