1 /* This file is part of Clementine.
2    Copyright 2014, Chocobozzz <djidane14ff@hotmail.fr>
3    Copyright 2014, Krzysztof Sobiecki <sobkas@gmail.com>
4    Copyright 2014, David Sansome <me@davidsansome.com>
5 
6    Clementine is free software: you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation, either version 3 of the License, or
9    (at your option) any later version.
10 
11    Clementine is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15 
16    You should have received a copy of the GNU General Public License
17    along with Clementine.  If not, see <http://www.gnu.org/licenses/>.
18 */
19 
20 #include "seafilesettingspage.h"
21 
22 #include <QMessageBox>
23 #include <QNetworkReply>
24 #include <QNetworkRequest>
25 #include <QSettings>
26 #include <QtDebug>
27 
28 #include "seafileservice.h"
29 #include "internet/core/internetmodel.h"
30 #include "core/logging.h"
31 #include "core/network.h"
32 #include "ui_seafilesettingspage.h"
33 #include "ui/iconloader.h"
34 
SeafileSettingsPage(SettingsDialog * dialog)35 SeafileSettingsPage::SeafileSettingsPage(SettingsDialog* dialog)
36     : SettingsPage(dialog),
37       ui_(new Ui_SeafileSettingsPage),
38       service_(InternetModel::Service<SeafileService>()) {
39   ui_->setupUi(this);
40 
41   setWindowIcon(IconLoader::Load("seafile", IconLoader::Provider));
42 
43   connect(ui_->login_button, SIGNAL(clicked()), SLOT(Login()));
44   connect(ui_->login_state, SIGNAL(LogoutClicked()), SLOT(Logout()));
45 
46   ui_->login_state->AddCredentialField(ui_->server);
47   ui_->login_state->AddCredentialField(ui_->mail);
48   ui_->login_state->AddCredentialField(ui_->password);
49   ui_->login_state->AddCredentialGroup(ui_->account_group);
50 
51   ui_->library_box->addItem("None", "none");
52 
53   connect(service_, SIGNAL(GetLibrariesFinishedSignal(QMap<QString, QString>)),
54           this, SLOT(GetLibrariesFinished(QMap<QString, QString>)));
55 }
56 
~SeafileSettingsPage()57 SeafileSettingsPage::~SeafileSettingsPage() {}
58 
Load()59 void SeafileSettingsPage::Load() {
60   QSettings s;
61   s.beginGroup(SeafileService::kSettingsGroup);
62 
63   ui_->server->setText(s.value("server").toString());
64   ui_->mail->setText(s.value("mail").toString());
65 
66   if (service_->has_credentials()) {
67     ui_->login_state->SetLoggedIn(LoginStateWidget::LoggedIn,
68                                   ui_->mail->text());
69 
70     // If there is more than "none" library, that means that we already got the
71     // libraries
72     if (ui_->library_box->count() <= 1) {
73       service_->GetLibraries();
74     }
75   }
76 }
77 
GetLibrariesFinished(const QMap<QString,QString> & libraries)78 void SeafileSettingsPage::GetLibrariesFinished(
79     const QMap<QString, QString>& libraries) {
80   ui_->library_box->clear();
81   ui_->library_box->addItem("None", "none");
82   ui_->library_box->addItem("All (could be slow)", "all");
83 
84   // key : library's id, value : library's name
85   QMapIterator<QString, QString> library(libraries);
86   while (library.hasNext()) {
87     library.next();
88     ui_->library_box->addItem(library.value(), library.key());
89   }
90 
91   QSettings s;
92   s.beginGroup(SeafileService::kSettingsGroup);
93   QString library_id = s.value("library").toString();
94 
95   int saved_index = ui_->library_box->findData(library_id);
96   if (saved_index != -1) {
97     ui_->library_box->setCurrentIndex(saved_index);
98   }
99 }
100 
Save()101 void SeafileSettingsPage::Save() {
102   QString id =
103       ui_->library_box->itemData(ui_->library_box->currentIndex()).toString();
104 
105   QSettings s;
106   s.beginGroup(SeafileService::kSettingsGroup);
107 
108   s.setValue("mail", ui_->mail->text());
109   s.setValue("server", ui_->server->text());
110   s.setValue("library", id);
111   // Don't need to save the password
112 
113   if (service_->has_credentials()) {
114     service_->ChangeLibrary(id);
115   }
116 }
117 
Login()118 void SeafileSettingsPage::Login() {
119   ui_->login_button->setEnabled(false);
120 
121   if (service_->GetToken(ui_->mail->text(), ui_->password->text(),
122                          ui_->server->text())) {
123     Save();
124 
125     ui_->login_state->SetLoggedIn(LoginStateWidget::LoggedIn,
126                                   ui_->mail->text());
127 
128     service_->GetLibraries();
129   } else {
130     ui_->login_button->setEnabled(true);
131     QMessageBox::warning(this, tr("Unable to connect"),
132                          tr("Unable to connect"));
133   }
134 }
135 
Logout()136 void SeafileSettingsPage::Logout() {
137   // Forget the added songs by changing the library to "none"
138   service_->ChangeLibrary("none");
139   service_->ForgetCredentials();
140 
141   // We choose to keep the server
142   ui_->mail->clear();
143   ui_->password->clear();
144 
145   QSettings s;
146   s.beginGroup(SeafileService::kSettingsGroup);
147 
148   s.remove("mail");
149   s.remove("server");
150   s.remove("library");
151 
152   ui_->library_box->clear();
153   ui_->library_box->addItem("None", "none");
154 
155   ui_->login_state->SetLoggedIn(LoginStateWidget::LoggedOut);
156   ui_->login_button->setEnabled(true);
157 }
158