From 76b0ffb1f2537b935907d4e46eaa0a0aecff3c84 Mon Sep 17 00:00:00 2001 From: Alan Briolat Date: Thu, 8 Dec 2011 20:00:50 +0000 Subject: [PATCH] Hooked up LoginStateWidget for Subsonic settings --- src/internet/subsonicservice.cpp | 10 +++-- src/internet/subsonicservice.h | 3 +- src/internet/subsonicsettingspage.cpp | 65 +++++++++++++++++++++++++-- src/internet/subsonicsettingspage.h | 9 +++- 4 files changed, 78 insertions(+), 9 deletions(-) diff --git a/src/internet/subsonicservice.cpp b/src/internet/subsonicservice.cpp index efd8ef224..b2aaa8609 100644 --- a/src/internet/subsonicservice.cpp +++ b/src/internet/subsonicservice.cpp @@ -44,7 +44,6 @@ void SubsonicService::ReloadSettings() username_ = s.value("username").toString(); password_ = s.value("password").toString(); - // TODO: Move this? Login(); } @@ -52,7 +51,9 @@ void SubsonicService::Login() { // Forget session ID network_->setCookieJar(new QNetworkCookieJar(network_)); - // Ping is enough to authenticate + // Forget login state whilst waiting + login_state_ = LoginState_Unknown; + // Ping is enough to check credentials Ping(); } @@ -82,7 +83,6 @@ QUrl SubsonicService::BuildRequestUrl(const QString &view, const RequestOptions QUrl url(server_ + "rest/" + view + ".view"); url.addQueryItem("v", kApiVersion); url.addQueryItem("c", kApiClientName); - // TODO: only send username/password for login url.addQueryItem("u", username_); url.addQueryItem("p", password_); if (options) @@ -119,6 +119,8 @@ void SubsonicService::onPingFinished() int error = reader.attributes().value("code").toString().toInt(); switch (error) { + // "Parameter missing" for "ping" is always blank username or password + case ApiError_ParameterMissing: case ApiError_BadCredentials: login_state_ = LoginState_BadCredentials; break; @@ -132,5 +134,5 @@ void SubsonicService::onPingFinished() } } qLog(Debug) << "Login state changed: " << login_state_; - emit LoginStateChanged(); + emit LoginStateChanged(login_state_); } diff --git a/src/internet/subsonicservice.h b/src/internet/subsonicservice.h index 1eff20614..418d1e5d6 100644 --- a/src/internet/subsonicservice.h +++ b/src/internet/subsonicservice.h @@ -19,6 +19,7 @@ class SubsonicService : public InternetService LoginState_BadCredentials, LoginState_Unlicensed, LoginState_OtherError, + LoginState_Unknown, }; typedef QMap RequestOptions; @@ -40,7 +41,7 @@ class SubsonicService : public InternetService static const char* kApiClientName; signals: - void LoginStateChanged(); + void LoginStateChanged(SubsonicService::LoginState newstate); protected: QModelIndex GetCurrentIndex(); diff --git a/src/internet/subsonicsettingspage.cpp b/src/internet/subsonicsettingspage.cpp index b8d6788a6..ec0768d6b 100644 --- a/src/internet/subsonicsettingspage.cpp +++ b/src/internet/subsonicsettingspage.cpp @@ -1,16 +1,26 @@ #include "subsonicsettingspage.h" #include "ui_subsonicsettingspage.h" -#include "subsonicservice.h" +#include "internetmodel.h" #include SubsonicSettingsPage::SubsonicSettingsPage(SettingsDialog *dialog) : SettingsPage(dialog), - ui_(new Ui_SubsonicSettingsPage) + ui_(new Ui_SubsonicSettingsPage), + service_(InternetModel::Service()) { ui_->setupUi(this); - setWindowIcon(QIcon(":/providers/subsonic-32.png")); + + connect(ui_->login, SIGNAL(clicked()), SLOT(Login())); + connect(ui_->login_state, SIGNAL(LogoutClicked()), SLOT(Logout())); + connect(service_, SIGNAL(LoginStateChanged(SubsonicService::LoginState)), + SLOT(LoginStateChanged(SubsonicService::LoginState))); + + ui_->login_state->AddCredentialField(ui_->server); + ui_->login_state->AddCredentialField(ui_->username); + ui_->login_state->AddCredentialField(ui_->password); + ui_->login_state->AddCredentialGroup(ui_->server_group); } SubsonicSettingsPage::~SubsonicSettingsPage() @@ -26,6 +36,9 @@ void SubsonicSettingsPage::Load() ui_->server->setText(s.value("server").toString()); ui_->username->setText(s.value("username").toString()); ui_->password->setText(s.value("password").toString()); + + // "Login" with the existing settings to see if they work + Login(); } void SubsonicSettingsPage::Save() @@ -37,3 +50,49 @@ void SubsonicSettingsPage::Save() s.setValue("username", ui_->username->text()); s.setValue("password", ui_->password->text()); } + +void SubsonicSettingsPage::LoginStateChanged(SubsonicService::LoginState newstate) +{ + const bool logged_in = newstate == SubsonicService::LoginState_Loggedin; + + ui_->login_state->SetLoggedIn(logged_in ? LoginStateWidget::LoggedIn + : LoginStateWidget::LoggedOut, + QString("%1 (%2)") + .arg(ui_->username->text()) + .arg(ui_->server->text())); + ui_->login_state->SetAccountTypeVisible(!logged_in); + + switch (newstate) + { + case SubsonicService::LoginState_BadServer: + ui_->login_state->SetAccountTypeText(tr("Unable to contact Subsonic server - check server URL.")); + break; + + case SubsonicService::LoginState_BadCredentials: + ui_->login_state->SetAccountTypeText(tr("Your username or password was incorrect.")); + break; + + case SubsonicService::LoginState_Unlicensed: + ui_->login_state->SetAccountTypeText(tr("The Subsonic API is only available on licensed servers.")); + break; + + case SubsonicService::LoginState_OtherError: + ui_->login_state->SetAccountTypeText(tr("An unspecified error occurred.")); + break; + + default: + break; + } +} + +void SubsonicSettingsPage::Login() +{ + ui_->login_state->SetLoggedIn(LoginStateWidget::LoginInProgress); + service_->Login(ui_->server->text(), ui_->username->text(), ui_->password->text()); +} + +void SubsonicSettingsPage::Logout() +{ + ui_->username->setText(""); + ui_->password->setText(""); +} diff --git a/src/internet/subsonicsettingspage.h b/src/internet/subsonicsettingspage.h index acc4f021c..fda78c4dd 100644 --- a/src/internet/subsonicsettingspage.h +++ b/src/internet/subsonicsettingspage.h @@ -2,9 +2,9 @@ #define SUBSONICSETTINGSPAGE_H #include "ui/settingspage.h" +#include "subsonicservice.h" class Ui_SubsonicSettingsPage; -class SubsonicService; class SubsonicSettingsPage : public SettingsPage { @@ -17,6 +17,13 @@ class SubsonicSettingsPage : public SettingsPage void Load(); void Save(); + public slots: + void LoginStateChanged(SubsonicService::LoginState newstate); + + private slots: + void Login(); + void Logout(); + private: Ui_SubsonicSettingsPage* ui_; SubsonicService* service_;