Hooked up LoginStateWidget for Subsonic settings

This commit is contained in:
Alan Briolat 2011-12-08 20:00:50 +00:00
parent ebc97e03c5
commit 76b0ffb1f2
4 changed files with 78 additions and 9 deletions

View File

@ -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_);
}

View File

@ -19,6 +19,7 @@ class SubsonicService : public InternetService
LoginState_BadCredentials,
LoginState_Unlicensed,
LoginState_OtherError,
LoginState_Unknown,
};
typedef QMap<QString, QString> RequestOptions;
@ -40,7 +41,7 @@ class SubsonicService : public InternetService
static const char* kApiClientName;
signals:
void LoginStateChanged();
void LoginStateChanged(SubsonicService::LoginState newstate);
protected:
QModelIndex GetCurrentIndex();

View File

@ -1,16 +1,26 @@
#include "subsonicsettingspage.h"
#include "ui_subsonicsettingspage.h"
#include "subsonicservice.h"
#include "internetmodel.h"
#include <QSettings>
SubsonicSettingsPage::SubsonicSettingsPage(SettingsDialog *dialog)
: SettingsPage(dialog),
ui_(new Ui_SubsonicSettingsPage)
ui_(new Ui_SubsonicSettingsPage),
service_(InternetModel::Service<SubsonicService>())
{
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("");
}

View File

@ -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_;