~ubuntu-branches/ubuntu/saucy/quassel/saucy-proposed

« back to all changes in this revision

Viewing changes to src/qtui/coreconnectdlg.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Scott Kitterman
  • Date: 2010-02-17 12:49:50 UTC
  • mfrom: (1.1.33 upstream)
  • Revision ID: james.westby@ubuntu.com-20100217124950-0x7pm4evjvhf2rki
Tags: 0.6~beta1-0ubuntu1
* New upstream beta release
  - Update debian/quassel-data.install for hicolor icons moving to
    debian/tmp/usr/share/icons/hicolor
  - Update debian/quassel-data.install for Quassel Oxygen icons no longer
    being shipped
  - Add qt4-dev-tools to build-depends to provide lconvert for translations
* Fix debian/copyright to use the correct © symbol and update for the new
  year

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/***************************************************************************
2
 
 *   Copyright (C) 2005-09 by the Quassel Project                          *
 
2
 *   Copyright (C) 2009 by the Quassel Project                             *
3
3
 *   devel@quassel-irc.org                                                 *
4
4
 *                                                                         *
5
5
 *   This program is free software; you can redistribute it and/or modify  *
18
18
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
19
19
 ***************************************************************************/
20
20
 
 
21
#include <QDialogButtonBox>
 
22
#include <QVBoxLayout>
 
23
 
21
24
#include "coreconnectdlg.h"
22
25
 
23
 
#include <QDebug>
24
 
#include <QFormLayout>
25
 
#include <QMessageBox>
26
 
#include <QNetworkProxy>
27
 
 
28
 
#ifdef HAVE_SSL
29
 
#include <QSslSocket>
30
 
#include <QSslCertificate>
31
 
#endif
32
 
 
33
 
#include "client.h"
 
26
#include "iconloader.h"
34
27
#include "clientsettings.h"
35
 
#include "clientsyncer.h"
36
 
#include "coreconfigwizard.h"
37
 
#include "iconloader.h"
38
 
#include "quassel.h"
39
 
#include "util.h"
40
 
 
41
 
CoreConnectDlg::CoreConnectDlg(bool autoconnect, QWidget *parent)
 
28
#include "coreaccountsettingspage.h"
 
29
 
 
30
CoreConnectDlg::CoreConnectDlg(QWidget *parent) : QDialog(parent) {
 
31
  _settingsPage = new CoreAccountSettingsPage(this);
 
32
  _settingsPage->setStandAlone(true);
 
33
  _settingsPage->load();
 
34
 
 
35
  CoreAccountSettings s;
 
36
  AccountId lastAccount = s.lastAccount();
 
37
  if(lastAccount.isValid())
 
38
    _settingsPage->setSelectedAccount(lastAccount);
 
39
 
 
40
  setWindowTitle(tr("Connect to Core"));
 
41
  setWindowIcon(SmallIcon("network-disconnect"));
 
42
 
 
43
  QVBoxLayout *layout = new QVBoxLayout(this);
 
44
  layout->addWidget(_settingsPage);
 
45
 
 
46
  QDialogButtonBox *buttonBox = new QDialogButtonBox(this);
 
47
  buttonBox->setStandardButtons(QDialogButtonBox::Ok|QDialogButtonBox::Cancel);
 
48
  layout->addWidget(buttonBox);
 
49
 
 
50
  connect(_settingsPage, SIGNAL(connectToCore(AccountId)), SLOT(accept()));
 
51
  connect(buttonBox, SIGNAL(accepted()), SLOT(accept()));
 
52
  connect(buttonBox, SIGNAL(rejected()), SLOT(reject()));
 
53
}
 
54
 
 
55
AccountId CoreConnectDlg::selectedAccount() const {
 
56
  return _settingsPage->selectedAccount();
 
57
}
 
58
 
 
59
void CoreConnectDlg::accept() {
 
60
  _settingsPage->save();
 
61
  QDialog::accept();
 
62
}
 
63
 
 
64
/******** CoreConnectAuthDlg ****************************************************************/
 
65
 
 
66
CoreConnectAuthDlg::CoreConnectAuthDlg(CoreAccount *account, QWidget *parent)
42
67
  : QDialog(parent),
43
 
    _internalAccountId(0)
44
 
{
45
 
  ui.setupUi(this);
46
 
  ui.editAccount->setIcon(SmallIcon("document-properties"));
47
 
  ui.addAccount->setIcon(SmallIcon("list-add"));
48
 
  ui.deleteAccount->setIcon(SmallIcon("list-remove"));
49
 
  ui.connectIcon->setPixmap(BarIcon("network-disconnect"));
50
 
  ui.secureConnection->setPixmap(SmallIcon("document-encrypt"));
51
 
 
52
 
  if(Quassel::runMode() != Quassel::Monolithic) {
53
 
    ui.useInternalCore->hide();
54
 
  }
55
 
 
56
 
  // make it look more native under Mac OS X:
57
 
  setWindowFlags(Qt::Sheet);
58
 
 
59
 
  clientSyncer = new ClientSyncer(this);
60
 
  Client::registerClientSyncer(clientSyncer);
61
 
 
62
 
  wizard = 0;
63
 
 
64
 
  doingAutoConnect = false;
65
 
 
66
 
  ui.stackedWidget->setCurrentWidget(ui.accountPage);
67
 
 
68
 
  CoreAccountSettings s;
69
 
  AccountId lastacc = s.lastAccount();
70
 
  autoConnectAccount = s.autoConnectAccount();
71
 
  QListWidgetItem *currentItem = 0;
72
 
  foreach(AccountId id, s.knownAccounts()) {
73
 
    if(!id.isValid()) continue;
74
 
    QVariantMap data = s.retrieveAccountData(id);
75
 
    if(data.contains("InternalAccount") && data["InternalAccount"].toBool()) {
76
 
      _internalAccountId = id;
77
 
      continue;
78
 
    }
79
 
    data["AccountId"] = QVariant::fromValue<AccountId>(id);
80
 
    accounts[id] = data;
81
 
    QListWidgetItem *item = new QListWidgetItem(data["AccountName"].toString(), ui.accountList);
82
 
    item->setData(Qt::UserRole, QVariant::fromValue<AccountId>(id));
83
 
    if(id == lastacc) currentItem = item;
84
 
  }
85
 
  if(currentItem) ui.accountList->setCurrentItem(currentItem);
86
 
  else ui.accountList->setCurrentRow(0);
87
 
 
88
 
  setAccountWidgetStates();
89
 
 
90
 
  ui.accountButtonBox->button(QDialogButtonBox::Ok)->setFocus();
91
 
  //ui.accountButtonBox->button(QDialogButtonBox::Ok)->setAutoDefault(true);
92
 
 
93
 
  connect(clientSyncer, SIGNAL(socketStateChanged(QAbstractSocket::SocketState)),this, SLOT(initPhaseSocketState(QAbstractSocket::SocketState)));
94
 
  connect(clientSyncer, SIGNAL(connectionError(const QString &)), this, SLOT(initPhaseError(const QString &)));
95
 
  connect(clientSyncer, SIGNAL(connectionWarnings(const QStringList &)), this, SLOT(initPhaseWarnings(const QStringList &)));
96
 
  connect(clientSyncer, SIGNAL(connectionMsg(const QString &)), this, SLOT(initPhaseMsg(const QString &)));
97
 
  connect(clientSyncer, SIGNAL(startLogin()), this, SLOT(startLogin()));
98
 
  connect(clientSyncer, SIGNAL(loginFailed(const QString &)), this, SLOT(loginFailed(const QString &)));
99
 
  connect(clientSyncer, SIGNAL(loginSuccess()), this, SLOT(startSync()));
100
 
  connect(clientSyncer, SIGNAL(startCoreSetup(const QVariantList &)), this, SLOT(startCoreConfig(const QVariantList &)));
101
 
  connect(clientSyncer, SIGNAL(sessionProgress(quint32, quint32)), this, SLOT(coreSessionProgress(quint32, quint32)));
102
 
  connect(clientSyncer, SIGNAL(networksProgress(quint32, quint32)), this, SLOT(coreNetworksProgress(quint32, quint32)));
103
 
  connect(clientSyncer, SIGNAL(syncFinished()), this, SLOT(syncFinished()));
104
 
  connect(clientSyncer, SIGNAL(encrypted()), ui.secureConnection, SLOT(show()));
105
 
 
106
 
  connect(ui.user, SIGNAL(textChanged(const QString &)), this, SLOT(setLoginWidgetStates()));
107
 
  connect(ui.password, SIGNAL(textChanged(const QString &)), this, SLOT(setLoginWidgetStates()));
108
 
 
109
 
  connect(ui.loginButtonBox, SIGNAL(rejected()), this, SLOT(restartPhaseNull()));
110
 
  connect(ui.syncButtonBox->button(QDialogButtonBox::Abort), SIGNAL(clicked()), this, SLOT(restartPhaseNull()));
111
 
 
112
 
  if(autoconnect && ui.accountList->count() && autoConnectAccount.isValid()
113
 
     && autoConnectAccount == ui.accountList->currentItem()->data(Qt::UserRole).value<AccountId>()) {
114
 
    doingAutoConnect = true;
115
 
    on_accountButtonBox_accepted();
116
 
  }
117
 
}
118
 
 
119
 
CoreConnectDlg::~CoreConnectDlg() {
120
 
  if(ui.accountList->selectedItems().count()) {
121
 
    CoreAccountSettings s;
122
 
    s.setLastAccount(ui.accountList->selectedItems()[0]->data(Qt::UserRole).value<AccountId>());
123
 
  }
124
 
}
125
 
 
126
 
 
127
 
/****************************************************
128
 
 * Account Management
129
 
 ***************************************************/
130
 
 
131
 
void CoreConnectDlg::on_accountList_itemSelectionChanged() {
132
 
  setAccountWidgetStates();
133
 
}
134
 
 
135
 
void CoreConnectDlg::setAccountWidgetStates() {
136
 
  QList<QListWidgetItem *> selectedItems = ui.accountList->selectedItems();
137
 
  ui.editAccount->setEnabled(selectedItems.count());
138
 
  ui.deleteAccount->setEnabled(selectedItems.count());
139
 
  ui.autoConnect->setEnabled(selectedItems.count());
140
 
  if(selectedItems.count()) {
141
 
    ui.autoConnect->setChecked(selectedItems[0]->data(Qt::UserRole).value<AccountId>() == autoConnectAccount);
142
 
  }
143
 
  ui.accountButtonBox->button(QDialogButtonBox::Ok)->setEnabled(ui.accountList->count());
144
 
}
145
 
 
146
 
void CoreConnectDlg::on_autoConnect_clicked(bool state) {
147
 
  if(!state) {
148
 
    autoConnectAccount = 0;
149
 
  } else {
150
 
    if(ui.accountList->selectedItems().count()) {
151
 
      autoConnectAccount = ui.accountList->selectedItems()[0]->data(Qt::UserRole).value<AccountId>();
152
 
    } else {
153
 
      qWarning() << "Checked auto connect without an enabled item!";  // should never happen!
154
 
      autoConnectAccount = 0;
155
 
    }
156
 
  }
157
 
  setAccountWidgetStates();
158
 
}
159
 
 
160
 
void CoreConnectDlg::on_addAccount_clicked() {
161
 
  QStringList existing;
162
 
  for(int i = 0; i < ui.accountList->count(); i++) existing << ui.accountList->item(i)->text();
163
 
  CoreAccountEditDlg dlg(0, QVariantMap(), existing, this);
164
 
  if(dlg.exec() == QDialog::Accepted) {
165
 
    AccountId id = findFreeAccountId();
166
 
    QVariantMap data = dlg.accountData();
167
 
    data["AccountId"] = QVariant::fromValue<AccountId>(id);
168
 
    accounts[id] = data;
169
 
    QListWidgetItem *item = new QListWidgetItem(data["AccountName"].toString(), ui.accountList);
170
 
    item->setData(Qt::UserRole, QVariant::fromValue<AccountId>(id));
171
 
    ui.accountList->setCurrentItem(item);
172
 
  }
173
 
}
174
 
 
175
 
void CoreConnectDlg::on_editAccount_clicked() {
176
 
  QStringList existing;
177
 
  for(int i = 0; i < ui.accountList->count(); i++) existing << ui.accountList->item(i)->text();
178
 
  AccountId id = ui.accountList->currentItem()->data(Qt::UserRole).value<AccountId>();
179
 
  QVariantMap acct = accounts[id];
180
 
  CoreAccountEditDlg dlg(id, acct, existing, this);
181
 
  if(dlg.exec() == QDialog::Accepted) {
182
 
    QVariantMap data = dlg.accountData();
183
 
    ui.accountList->currentItem()->setText(data["AccountName"].toString());
184
 
    accounts[id] = data;
185
 
  }
186
 
}
187
 
 
188
 
void CoreConnectDlg::on_deleteAccount_clicked() {
189
 
  AccountId id = ui.accountList->currentItem()->data(Qt::UserRole).value<AccountId>();
190
 
  int ret = QMessageBox::question(this, tr("Remove Account Settings"),
191
 
                                  tr("Do you really want to remove your local settings for this Quassel Core account?<br>"
192
 
                                  "Note: This will <em>not</em> remove or change any data on the Core itself!"),
193
 
                                  QMessageBox::Yes|QMessageBox::No, QMessageBox::No);
194
 
  if(ret == QMessageBox::Yes) {
195
 
    int idx = ui.accountList->currentRow();
196
 
    delete ui.accountList->takeItem(idx);
197
 
    ui.accountList->setCurrentRow(qMin(idx, ui.accountList->count()-1));
198
 
    accounts[id]["Delete"] = true;  // we only flag this here, actual deletion happens on accept!
199
 
    setAccountWidgetStates();
200
 
  }
201
 
}
202
 
 
203
 
void CoreConnectDlg::on_accountList_itemDoubleClicked(QListWidgetItem *item) {
204
 
  Q_UNUSED(item);
205
 
  on_accountButtonBox_accepted();
206
 
}
207
 
 
208
 
void CoreConnectDlg::on_accountButtonBox_accepted() {
209
 
  // save accounts
210
 
  CoreAccountSettings s;
211
 
  foreach(QVariantMap acct, accounts.values()) {
212
 
    AccountId id = acct["AccountId"].value<AccountId>();
213
 
    if(acct.contains("Delete")) {
214
 
      s.removeAccount(id);
215
 
    } else {
216
 
      s.storeAccountData(id, acct);
217
 
    }
218
 
  }
219
 
  s.setAutoConnectAccount(autoConnectAccount);
220
 
 
221
 
  ui.stackedWidget->setCurrentWidget(ui.loginPage);
222
 
  account = ui.accountList->currentItem()->data(Qt::UserRole).value<AccountId>();
223
 
  accountData = accounts[account];
224
 
  s.setLastAccount(account);
225
 
  connectToCore();
226
 
}
227
 
 
228
 
void CoreConnectDlg::on_useInternalCore_clicked() {
229
 
  clientSyncer->useInternalCore();
230
 
  ui.loginButtonBox->setStandardButtons(QDialogButtonBox::Cancel);
231
 
}
232
 
 
233
 
/*****************************************************
234
 
 * Connecting to the Core
235
 
 ****************************************************/
236
 
 
237
 
/*** Phase One: initializing the core connection ***/
238
 
 
239
 
void CoreConnectDlg::connectToCore() {
240
 
  ui.secureConnection->hide();
241
 
  ui.connectIcon->setPixmap(BarIcon("network-disconnect"));
242
 
  ui.connectLabel->setText(tr("Connect to %1").arg(accountData["Host"].toString()));
243
 
  ui.coreInfoLabel->setText("");
244
 
  ui.loginStack->setCurrentWidget(ui.loginEmptyPage);
245
 
  ui.loginButtonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok);
246
 
  ui.loginButtonBox->button(QDialogButtonBox::Ok)->setDefault(true);
247
 
  ui.loginButtonBox->button(QDialogButtonBox::Ok)->setDisabled(true);
248
 
  disconnect(ui.loginButtonBox, 0, this, 0);
249
 
  connect(ui.loginButtonBox, SIGNAL(rejected()), this, SLOT(restartPhaseNull()));
250
 
 
251
 
  clientSyncer->connectToCore(accountData);
252
 
}
253
 
 
254
 
void CoreConnectDlg::initPhaseError(const QString &error) {
255
 
  doingAutoConnect = false;
256
 
  ui.secureConnection->hide();
257
 
  ui.connectIcon->setPixmap(BarIcon("dialog-error"));
258
 
  //ui.connectLabel->setBrush(QBrush("red"));
259
 
  ui.connectLabel->setText(tr("<div style=color:red;>Connection to %1 failed!</div>").arg(accountData["Host"].toString()));
260
 
  ui.coreInfoLabel->setText(error);
261
 
  ui.loginButtonBox->setStandardButtons(QDialogButtonBox::Retry|QDialogButtonBox::Cancel);
262
 
  ui.loginButtonBox->button(QDialogButtonBox::Retry)->setFocus();
263
 
  disconnect(ui.loginButtonBox, 0, this, 0);
264
 
  connect(ui.loginButtonBox, SIGNAL(accepted()), this, SLOT(restartPhaseNull()));
265
 
  connect(ui.loginButtonBox, SIGNAL(rejected()), this, SLOT(reject()));
266
 
}
267
 
 
268
 
void CoreConnectDlg::initPhaseWarnings(const QStringList &warnings) {
269
 
  doingAutoConnect = false;
270
 
  ui.secureConnection->hide();
271
 
  ui.connectIcon->setPixmap(BarIcon("dialog-warning"));
272
 
  ui.connectLabel->setText(tr("<div>Errors occurred while connecting to \"%1\":</div>").arg(accountData["Host"].toString()));
273
 
  QStringList warningItems;
274
 
  foreach(QString warning, warnings) {
275
 
    warningItems << QString("<li>%1</li>").arg(warning);
276
 
  }
277
 
  ui.coreInfoLabel->setText(QString("<ul>%1</ul>").arg(warningItems.join("")));
278
 
  ui.loginStack->setCurrentWidget(ui.connectionWarningsPage);
279
 
  ui.loginButtonBox->setStandardButtons(QDialogButtonBox::Cancel);
280
 
  ui.loginButtonBox->button(QDialogButtonBox::Cancel)->setFocus();
281
 
  disconnect(ui.loginButtonBox, 0, this, 0);
282
 
  connect(ui.loginButtonBox, SIGNAL(rejected()), this, SLOT(restartPhaseNull()));
283
 
}
284
 
 
285
 
void CoreConnectDlg::on_viewSslCertButton_clicked() {
286
 
#ifdef HAVE_SSL
287
 
  const QSslSocket *socket = qobject_cast<const QSslSocket *>(clientSyncer->currentDevice());
288
 
  if(!socket)
289
 
    return;
290
 
 
291
 
  SslCertDisplayDialog dialog(socket->peerName(), socket->peerCertificate());
292
 
  dialog.exec();
293
 
#endif
294
 
}
295
 
 
296
 
void CoreConnectDlg::on_ignoreWarningsButton_clicked() {
297
 
  clientSyncer->ignoreWarnings(ui.ignoreWarningsPermanently->isChecked());
298
 
}
299
 
 
300
 
 
301
 
void CoreConnectDlg::initPhaseMsg(const QString &msg) {
302
 
  ui.coreInfoLabel->setText(msg);
303
 
}
304
 
 
305
 
void CoreConnectDlg::initPhaseSocketState(QAbstractSocket::SocketState state) {
306
 
  QString s;
307
 
  QString host = accountData["Host"].toString();
308
 
  switch(state) {
309
 
    case QAbstractSocket::UnconnectedState: s = tr("Not connected to %1.").arg(host); break;
310
 
    case QAbstractSocket::HostLookupState: s = tr("Looking up %1...").arg(host); break;
311
 
    case QAbstractSocket::ConnectingState: s = tr("Connecting to %1...").arg(host); break;
312
 
    case QAbstractSocket::ConnectedState: s = tr("Connected to %1").arg(host); break;
313
 
    default: s = tr("Unknown connection state to %1"); break;
314
 
  }
315
 
  ui.connectLabel->setText(s);
316
 
}
317
 
 
318
 
void CoreConnectDlg::restartPhaseNull() {
319
 
  doingAutoConnect = false;
320
 
  ui.stackedWidget->setCurrentWidget(ui.accountPage);
321
 
  clientSyncer->disconnectFromCore();
322
 
}
323
 
 
324
 
/*********************************************************
325
 
 * Phase Two: Login
326
 
 *********************************************************/
327
 
 
328
 
void CoreConnectDlg::startLogin() {
329
 
  ui.connectIcon->setPixmap(BarIcon("network-connect"));
330
 
  ui.loginStack->setCurrentWidget(ui.loginCredentialsPage);
331
 
  //ui.loginStack->setMinimumSize(ui.loginStack->sizeHint()); ui.loginStack->updateGeometry();
332
 
  ui.loginButtonBox->setStandardButtons(QDialogButtonBox::Ok|QDialogButtonBox::Cancel);
333
 
  ui.loginButtonBox->button(QDialogButtonBox::Ok)->setDefault(true);
334
 
  ui.loginButtonBox->button(QDialogButtonBox::Ok)->setFocus();
335
 
  if(!accountData["User"].toString().isEmpty()) {
336
 
    ui.user->setText(accountData["User"].toString());
337
 
    if(accountData["RememberPasswd"].toBool()) {
338
 
      ui.password->setText(accountData["Password"].toString());
339
 
      ui.rememberPasswd->setChecked(true);
340
 
      ui.loginButtonBox->button(QDialogButtonBox::Ok)->setFocus();
341
 
    } else {
342
 
      ui.rememberPasswd->setChecked(false);
343
 
      ui.password->setFocus();
344
 
    }
345
 
  } else ui.user->setFocus();
346
 
  disconnect(ui.loginButtonBox, 0, this, 0);
347
 
  connect(ui.loginButtonBox, SIGNAL(accepted()), this, SLOT(doLogin()));
348
 
  connect(ui.loginButtonBox, SIGNAL(rejected()), this, SLOT(restartPhaseNull()));
349
 
  if(doingAutoConnect) doLogin();
350
 
}
351
 
 
352
 
void CoreConnectDlg::doLogin() {
353
 
  QVariantMap loginData;
354
 
  loginData["User"] = ui.user->text();
355
 
  loginData["Password"] = ui.password->text();
356
 
  loginData["RememberPasswd"] = ui.rememberPasswd->isChecked();
357
 
  doLogin(loginData);
358
 
}
359
 
 
360
 
void CoreConnectDlg::doLogin(const QVariantMap &loginData) {
361
 
  disconnect(ui.loginButtonBox, 0, this, 0);
362
 
  connect(ui.loginButtonBox, SIGNAL(accepted()), this, SLOT(doLogin()));
363
 
  connect(ui.loginButtonBox, SIGNAL(rejected()), this, SLOT(restartPhaseNull()));
364
 
  ui.loginStack->setCurrentWidget(ui.loginCredentialsPage);
365
 
  ui.loginGroup->setTitle(tr("Logging in..."));
366
 
  ui.user->setDisabled(true);
367
 
  ui.password->setDisabled(true);
368
 
  ui.rememberPasswd->setDisabled(true);
369
 
  ui.loginButtonBox->button(QDialogButtonBox::Ok)->setDisabled(true);
370
 
  accountData["User"] = loginData["User"];
371
 
  accountData["RememberPasswd"] = loginData["RememberPasswd"];
372
 
  if(loginData["RememberPasswd"].toBool()) accountData["Password"] = loginData["Password"];
373
 
  else accountData.remove("Password");
374
 
  ui.user->setText(loginData["User"].toString());
375
 
  ui.password->setText(loginData["Password"].toString());
376
 
  ui.rememberPasswd->setChecked(loginData["RememberPasswd"].toBool());
377
 
  CoreAccountSettings s;
378
 
  s.storeAccountData(account, accountData);
379
 
  clientSyncer->loginToCore(loginData["User"].toString(), loginData["Password"].toString());
380
 
}
381
 
 
382
 
void CoreConnectDlg::setLoginWidgetStates() {
383
 
  ui.loginButtonBox->button(QDialogButtonBox::Ok)->setDisabled(ui.user->text().isEmpty() || ui.password->text().isEmpty());
384
 
}
385
 
 
386
 
void CoreConnectDlg::loginFailed(const QString &error) {
387
 
  if(wizard) {
388
 
    wizard->reject();
389
 
  }
390
 
  ui.connectIcon->setPixmap(BarIcon("dialog-error"));
391
 
  ui.loginStack->setCurrentWidget(ui.loginCredentialsPage);
392
 
  ui.loginGroup->setTitle(tr("Login"));
393
 
  ui.user->setEnabled(true);
394
 
  ui.password->setEnabled(true);
395
 
  ui.rememberPasswd->setEnabled(true);
396
 
  ui.coreInfoLabel->setText(error);
397
 
  ui.loginButtonBox->button(QDialogButtonBox::Ok)->setEnabled(true);
398
 
  ui.password->setFocus();
399
 
  doingAutoConnect = false;
400
 
}
401
 
 
402
 
void CoreConnectDlg::startCoreConfig(const QVariantList &backends) {
403
 
  storageBackends = backends;
404
 
  ui.loginStack->setCurrentWidget(ui.coreConfigPage);
405
 
 
406
 
  //on_launchCoreConfigWizard_clicked();
407
 
 
408
 
}
409
 
 
410
 
void CoreConnectDlg::on_launchCoreConfigWizard_clicked() {
411
 
  Q_ASSERT(!wizard);
412
 
  wizard = new CoreConfigWizard(storageBackends, this);
413
 
  connect(wizard, SIGNAL(setupCore(const QVariant &)), clientSyncer, SLOT(doCoreSetup(const QVariant &)));
414
 
  connect(wizard, SIGNAL(loginToCore(const QVariantMap &)), this, SLOT(doLogin(const QVariantMap &)));
415
 
  connect(clientSyncer, SIGNAL(coreSetupSuccess()), wizard, SLOT(coreSetupSuccess()));
416
 
  connect(clientSyncer, SIGNAL(coreSetupFailed(const QString &)), wizard, SLOT(coreSetupFailed(const QString &)));
417
 
  connect(wizard, SIGNAL(accepted()), this, SLOT(configWizardAccepted()));
418
 
  connect(wizard, SIGNAL(rejected()), this, SLOT(configWizardRejected()));
419
 
  connect(clientSyncer, SIGNAL(loginSuccess()), wizard, SLOT(loginSuccess()));
420
 
  connect(clientSyncer, SIGNAL(syncFinished()), wizard, SLOT(syncFinished()));
421
 
  wizard->show();
422
 
}
423
 
 
424
 
void CoreConnectDlg::configWizardAccepted() {
425
 
 
426
 
  wizard->deleteLater();
427
 
  wizard = 0;
428
 
}
429
 
 
430
 
void CoreConnectDlg::configWizardRejected() {
431
 
 
432
 
  wizard->deleteLater();
433
 
  wizard = 0;
434
 
  //exit(1); // FIXME
435
 
}
436
 
 
437
 
 
438
 
/************************************************************
439
 
 * Phase Three: Syncing
440
 
 ************************************************************/
441
 
 
442
 
void CoreConnectDlg::startSync() {
443
 
  ui.sessionProgress->setRange(0, 1);
444
 
  ui.sessionProgress->setValue(0);
445
 
  ui.networksProgress->setRange(0, 1);
446
 
  ui.networksProgress->setValue(0);
447
 
 
448
 
  ui.stackedWidget->setCurrentWidget(ui.syncPage);
449
 
  // clean up old page
450
 
  ui.loginGroup->setTitle(tr("Login"));
451
 
  ui.user->setEnabled(true);
452
 
  ui.password->setEnabled(true);
453
 
  ui.rememberPasswd->setEnabled(true);
454
 
  if(ui.loginButtonBox->standardButtons() & QDialogButtonBox::Ok) // in mono mode we don't show an Ok Button
455
 
    ui.loginButtonBox->button(QDialogButtonBox::Ok)->setEnabled(true);
456
 
}
457
 
 
458
 
void CoreConnectDlg::coreSessionProgress(quint32 val, quint32 max) {
459
 
  ui.sessionProgress->setRange(0, max);
460
 
  ui.sessionProgress->setValue(val);
461
 
 
462
 
}
463
 
 
464
 
void CoreConnectDlg::coreNetworksProgress(quint32 val, quint32 max) {
465
 
  if(max == 0) {
466
 
    ui.networksProgress->setFormat("0/0");
467
 
    ui.networksProgress->setRange(0, 1);
468
 
    ui.networksProgress->setValue(1);
469
 
  } else {
470
 
    ui.networksProgress->setFormat("%v/%m");
471
 
    ui.networksProgress->setRange(0, max);
472
 
    ui.networksProgress->setValue(val);
473
 
  }
474
 
}
475
 
 
476
 
void CoreConnectDlg::syncFinished() {
477
 
  if(!wizard) accept();
478
 
  else {
479
 
    hide();
480
 
    disconnect(wizard, 0, this, 0);
481
 
    connect(wizard, SIGNAL(finished(int)), this, SLOT(accept()));
482
 
  }
483
 
}
484
 
 
485
 
AccountId CoreConnectDlg::findFreeAccountId() {
486
 
  for(AccountId i = 1;; i++) {
487
 
    if(!accounts.contains(i) && i != _internalAccountId)
488
 
      return i;
489
 
  }
490
 
}
491
 
 
492
 
/*****************************************************************************************
493
 
 * CoreAccountEditDlg
494
 
 *****************************************************************************************/
495
 
CoreAccountEditDlg::CoreAccountEditDlg(AccountId id, const QVariantMap &acct, const QStringList &_existing, QWidget *parent)
496
 
  : QDialog(parent)
497
 
{
498
 
  ui.setupUi(this);
499
 
  ui.useSsl->setIcon(SmallIcon("document-encrypt"));
500
 
 
501
 
  existing = _existing;
502
 
  if(id.isValid()) {
503
 
    account = acct;
504
 
 
505
 
    existing.removeAll(acct["AccountName"].toString());
506
 
    ui.host->setText(acct["Host"].toString());
507
 
    ui.port->setValue(acct["Port"].toUInt());
508
 
    ui.accountName->setText(acct["AccountName"].toString());
509
 
#ifdef HAVE_SSL
510
 
    ui.useSsl->setChecked(acct["useSsl"].toBool());
511
 
#else
512
 
    ui.useSsl->setChecked(false);
513
 
    ui.useSsl->setEnabled(false);
514
 
#endif
515
 
    ui.useProxy->setChecked(acct["useProxy"].toBool());
516
 
    ui.proxyHost->setText(acct["proxyHost"].toString());
517
 
    ui.proxyPort->setValue(acct["proxyPort"].toUInt());
518
 
    ui.proxyType->setCurrentIndex(acct["proxyType"].toInt() == QNetworkProxy::Socks5Proxy ? 0 : 1);
519
 
    ui.proxyUser->setText(acct["proxyUser"].toString());
520
 
    ui.proxyPassword->setText(acct["proxyPassword"].toString());
521
 
  } else {
522
 
    setWindowTitle(tr("Add Core Account"));
523
 
#ifndef HAVE_SSL
524
 
    ui.useSsl->setChecked(false);
525
 
    ui.useSsl->setEnabled(false);
526
 
#endif
527
 
  }
528
 
}
529
 
 
530
 
QVariantMap CoreAccountEditDlg::accountData() {
531
 
  account["AccountName"] = ui.accountName->text().trimmed();
532
 
  account["Host"] = ui.host->text().trimmed();
533
 
  account["Port"] = ui.port->value();
534
 
  account["useSsl"] = ui.useSsl->isChecked();
535
 
  account["useProxy"] = ui.useProxy->isChecked();
536
 
  account["proxyHost"] = ui.proxyHost->text().trimmed();
537
 
  account["proxyPort"] = ui.proxyPort->value();
538
 
  account["proxyType"] = ui.proxyType->currentIndex() == 0 ? QNetworkProxy::Socks5Proxy : QNetworkProxy::HttpProxy;
539
 
  account["proxyUser"] = ui.proxyUser->text().trimmed();
540
 
  account["proxyPassword"] = ui.proxyPassword->text().trimmed();
541
 
  return account;
542
 
}
543
 
 
544
 
void CoreAccountEditDlg::setWidgetStates() {
545
 
  bool ok = !ui.accountName->text().trimmed().isEmpty() && !existing.contains(ui.accountName->text()) && !ui.host->text().isEmpty();
546
 
  ui.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(ok);
547
 
}
548
 
 
549
 
void CoreAccountEditDlg::on_host_textChanged(const QString &text) {
550
 
  Q_UNUSED(text);
551
 
  setWidgetStates();
552
 
}
553
 
 
554
 
void CoreAccountEditDlg::on_accountName_textChanged(const QString &text) {
555
 
  Q_UNUSED(text);
556
 
  setWidgetStates();
557
 
}
558
 
 
559
 
 
560
 
 
561
 
// ========================================
562
 
//  SslCertDisplayDialog
563
 
// ========================================
564
 
#ifdef HAVE_SSL
565
 
SslCertDisplayDialog::SslCertDisplayDialog(const QString &host, const QSslCertificate &cert, QWidget *parent)
566
 
  : QDialog(parent)
567
 
{
568
 
  setWindowTitle(tr("SSL Certificate used by %1").arg(host));
569
 
 
570
 
  QVBoxLayout *mainLayout = new QVBoxLayout(this);
571
 
 
572
 
  QGroupBox *issuerBox = new QGroupBox(tr("Issuer Info"), this);
573
 
  QFormLayout *issuerLayout = new QFormLayout(issuerBox);
574
 
  issuerLayout->addRow(tr("Organization:"), new QLabel(cert.issuerInfo(QSslCertificate::Organization), this));
575
 
  issuerLayout->addRow(tr("Locality Name:"), new QLabel(cert.issuerInfo(QSslCertificate::LocalityName), this));
576
 
  issuerLayout->addRow(tr("Organizational Unit Name:"), new QLabel(cert.issuerInfo(QSslCertificate::OrganizationalUnitName), this));
577
 
  issuerLayout->addRow(tr("Country Name:"), new QLabel(cert.issuerInfo(QSslCertificate::CountryName), this));
578
 
  issuerLayout->addRow(tr("State or Province Name:"), new QLabel(cert.issuerInfo(QSslCertificate::StateOrProvinceName), this));
579
 
  mainLayout->addWidget(issuerBox);
580
 
 
581
 
  QGroupBox *subjectBox = new QGroupBox(tr("Subject Info"), this);
582
 
  QFormLayout *subjectLayout = new QFormLayout(subjectBox);
583
 
  subjectLayout->addRow(tr("Organization:"), new QLabel(cert.subjectInfo(QSslCertificate::Organization), this));
584
 
  subjectLayout->addRow(tr("Locality Name:"), new QLabel(cert.subjectInfo(QSslCertificate::LocalityName), this));
585
 
  subjectLayout->addRow(tr("Organizational Unit Name:"), new QLabel(cert.subjectInfo(QSslCertificate::OrganizationalUnitName), this));
586
 
  subjectLayout->addRow(tr("Country Name:"), new QLabel(cert.subjectInfo(QSslCertificate::CountryName), this));
587
 
  subjectLayout->addRow(tr("State or Province Name:"), new QLabel(cert.subjectInfo(QSslCertificate::StateOrProvinceName), this));
588
 
  mainLayout->addWidget(subjectBox);
589
 
 
590
 
  QGroupBox *additionalBox = new QGroupBox(tr("Additional Info"), this);
591
 
  QFormLayout *additionalLayout = new QFormLayout(additionalBox);
592
 
  additionalLayout->addRow(tr("Valid From:"), new QLabel(cert.effectiveDate().toString(), this));
593
 
  additionalLayout->addRow(tr("Valid To:"), new QLabel(cert.expiryDate().toString(), this));
594
 
  QStringList hostnames = cert.alternateSubjectNames().values(QSsl::DnsEntry);
595
 
  for(int i = 0; i < hostnames.count(); i++) {
596
 
    additionalLayout->addRow(tr("Hostname %1:").arg(i + 1), new QLabel(hostnames[i], this));
597
 
  }
598
 
  QStringList mailaddresses = cert.alternateSubjectNames().values(QSsl::EmailEntry);
599
 
  for(int i = 0; i < mailaddresses.count(); i++) {
600
 
    additionalLayout->addRow(tr("E-Mail Address %1:").arg(i + 1), new QLabel(mailaddresses[i], this));
601
 
  }
602
 
  additionalLayout->addRow(tr("Digest:"), new QLabel(QString(prettyDigest(cert.digest()))));
603
 
  mainLayout->addWidget(additionalBox);
604
 
 
605
 
 
606
 
  QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok, Qt::Horizontal, this);
607
 
  mainLayout->addWidget(buttonBox);
608
 
 
609
 
  connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept()));
610
 
  connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
611
 
}
612
 
#endif
 
68
  _account(account)
 
69
{
 
70
  ui.setupUi(this);
 
71
 
 
72
  connect(ui.user, SIGNAL(textChanged(QString)), SLOT(setButtonStates()));
 
73
  connect(ui.password, SIGNAL(textChanged(QString)), SLOT(setButtonStates()));
 
74
 
 
75
  ui.label->setText(tr("Please enter your credentials for %1:").arg(account->accountName()));
 
76
  ui.user->setText(account->user());
 
77
  ui.password->setText(account->password());
 
78
  ui.rememberPasswd->setChecked(account->storePassword());
 
79
 
 
80
  if(ui.user->text().isEmpty())
 
81
    ui.user->setFocus();
 
82
  else
 
83
    ui.password->setFocus();
 
84
}
 
85
 
 
86
void CoreConnectAuthDlg::accept() {
 
87
  _account->setUser(ui.user->text());
 
88
  _account->setPassword(ui.password->text());
 
89
  _account->setStorePassword(ui.rememberPasswd->isChecked());
 
90
 
 
91
  QDialog::accept();
 
92
}
 
93
 
 
94
void CoreConnectAuthDlg::setButtonStates() {
 
95
  bool valid = !(ui.user->text().isEmpty() || ui.password->text().isEmpty());
 
96
  ui.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(valid);
 
97
}