X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtopia%2Fcoreconnectdlg.cpp;h=9f09d91892113a3dc390ea483425f4978105716f;hp=860f43e8102879ca2aa9adbc84d12dfa4fbaeb40;hb=906789f761e5d1b37b46b5a05a2f649e28900e36;hpb=b09ee01a3e5fafe8ca5fa50b672f119a82d6aa69 diff --git a/src/qtopia/coreconnectdlg.cpp b/src/qtopia/coreconnectdlg.cpp index 860f43e8..9f09d918 100644 --- a/src/qtopia/coreconnectdlg.cpp +++ b/src/qtopia/coreconnectdlg.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-07 by the Quassel IRC Team * + * Copyright (C) 2005-08 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -17,13 +17,14 @@ * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ - +#define DEVELMODE #include #include #include "coreconnectdlg.h" #include "client.h" #include "clientsettings.h" +#include "clientsyncer.h" #include "global.h" CoreConnectDlg::CoreConnectDlg(QWidget *parent, bool /*doAutoConnect*/) : QDialog(parent) { @@ -32,7 +33,14 @@ CoreConnectDlg::CoreConnectDlg(QWidget *parent, bool /*doAutoConnect*/) : QDialo setAttribute(Qt::WA_DeleteOnClose); setModal(true); - coreState = 0; + clientSyncer = new ClientSyncer(this); + connect(clientSyncer, SIGNAL(socketStateChanged(QAbstractSocket::SocketState)),this, SLOT(initPhaseSocketState(QAbstractSocket::SocketState))); + connect(clientSyncer, SIGNAL(connectionError(const QString &)), this, SLOT(initPhaseError(const QString &))); + connect(clientSyncer, SIGNAL(connectionMsg(const QString &)), this, SLOT(initPhaseMsg(const QString &))); + connect(clientSyncer, SIGNAL(startLogin()), this, SLOT(startLogin())); + connect(clientSyncer, SIGNAL(loginFailed(const QString &)), this, SLOT(loginFailed(const QString &))); + connect(clientSyncer, SIGNAL(loginSuccess()), this, SLOT(startSync())); + //connect(clientSyncer, SIGNAL(startCoreSetup(const QVariantList &)), this, SLOT(startCoreConfig(const QVariantList &))); QMenu *menu = new QMenu(this); newAccAction = new QAction(QIcon(":icon/new"), tr("New"), this); @@ -55,22 +63,20 @@ CoreConnectDlg::CoreConnectDlg(QWidget *parent, bool /*doAutoConnect*/) : QDialo ui.accountList->setSelectionMode(QAbstractItemView::SingleSelection); ui.accountList->setSortingEnabled(true); - AccountSettings s; - ui.accountList->addItems(s.knownAccounts()); - // if empty, create a test account - /* disabled for the moment - if(!ui.accountList->count()) { - QVariantMap accData; - accData["User"] = "testuser"; - accData["Host"] = ""; - accData["Port"] = 4242; - accData["Password"] = ""; - s.setValue("Test Account", "AccountData", accData); - ui.accountList->addItems(s.knownAccounts()); + CoreAccountSettings s; + AccountId lastacc = s.lastAccount(); + autoConnectAccount = s.autoConnectAccount(); + QListWidgetItem *currentItem = 0; + foreach(AccountId id, s.knownAccounts()) { + if(!id.isValid()) continue; + QVariantMap data = s.retrieveAccountData(id); + accounts[id] = data; + QListWidgetItem *item = new QListWidgetItem(data["AccountName"].toString(), ui.accountList); + item->setData(Qt::UserRole, QVariant::fromValue(id)); + if(id == lastacc) currentItem = item; } - */ - // end test account - if(ui.accountList->count()) ui.accountList->item(0)->setSelected(true); + if(currentItem) ui.accountList->setCurrentItem(currentItem); + else ui.accountList->setCurrentRow(0); setWidgetStates(); #ifdef DEVELMODE doConnect(); // shortcut for development @@ -88,68 +94,151 @@ void CoreConnectDlg::setWidgetStates() { } void CoreConnectDlg::createAccount() { - editAccount(""); + QStringList existing; + for(int i = 0; i < ui.accountList->count(); i++) existing << ui.accountList->item(i)->text(); + CoreAccountEditDlg dlg(0, QVariantMap(), existing, this); + if(dlg.exec() == QDialog::Accepted) { + // find free ID + AccountId id = accounts.count() + 1; + for(AccountId i = 1; i <= accounts.count(); i++) { + if(!accounts.keys().contains(i)) { + id = i; + break; + } + } + QVariantMap data = dlg.accountData(); + data["AccountId"] = QVariant::fromValue(id); + accounts[id] = data; + CoreAccountSettings s; + s.storeAccountData(id, data); + QListWidgetItem *item = new QListWidgetItem(data["AccountName"].toString(), ui.accountList); + item->setData(Qt::UserRole, QVariant::fromValue(id)); + ui.accountList->setCurrentItem(item); + } } void CoreConnectDlg::editAccount() { - if(!ui.accountList->selectedItems().count()) return; - QString acc = ui.accountList->selectedItems()[0]->text(); - editAccount(acc); -} - -void CoreConnectDlg::editAccount(QString acc) { - EditCoreAcctDlg *dlg = new EditCoreAcctDlg(acc, this); - dlg->showMaximized(); - int res = dlg->exec(); - if(res == QDialog::Accepted) { - AccountSettings s; - ui.accountList->clear(); - ui.accountList->addItems(s.knownAccounts()); - QList list = ui.accountList->findItems(dlg->accountName(), Qt::MatchExactly); - Q_ASSERT(list.count() == 1); - list[0]->setSelected(true); - setWidgetStates(); + QStringList existing; + for(int i = 0; i < ui.accountList->count(); i++) existing << ui.accountList->item(i)->text(); + AccountId id = ui.accountList->currentItem()->data(Qt::UserRole).value(); + QVariantMap acct = accounts[id]; + CoreAccountEditDlg dlg(id, acct, existing, this); + if(dlg.exec() == QDialog::Accepted) { + QVariantMap data = dlg.accountData(); + ui.accountList->currentItem()->setText(data["AccountName"].toString()); + accounts[id] = data; + CoreAccountSettings s; + s.storeAccountData(id, data); } - dlg->deleteLater(); } void CoreConnectDlg::removeAccount() { - if(ui.accountList->selectedItems().count()) { - QListWidgetItem *item = ui.accountList->selectedItems()[0]; - int res = QMessageBox::warning(this, tr("Delete account?"), tr("Do you really want to delete the data for the account '%1'?
" - "Note that this only affects your local account settings and will not remove " - "any data from the core.").arg(item->text()), QMessageBox::Yes|QMessageBox::No, QMessageBox::No); - if(res == QMessageBox::Yes) { - AccountSettings s; - s.removeAccount(item->text()); - item = ui.accountList->takeItem(ui.accountList->row(item)); - delete item; - setWidgetStates(); - } + AccountId id = ui.accountList->currentItem()->data(Qt::UserRole).value(); + int ret = QMessageBox::question(this, tr("Remove Account Settings"), + tr("Do you really want to remove your local settings for this Quassel Core account?
" + "Note: This will not remove or change any data on the Core itself!"), + QMessageBox::Yes|QMessageBox::No, QMessageBox::No); + if(ret == QMessageBox::Yes) { + int idx = ui.accountList->currentRow(); + delete ui.accountList->takeItem(idx); + ui.accountList->setCurrentRow(qMin(idx, ui.accountList->count()-1)); + CoreAccountSettings s; + s.removeAccount(id); + setWidgetStates(); } } void CoreConnectDlg::doConnect() { - if(!ui.accountList->selectedItems().count()) return; - QString acc = ui.accountList->selectedItems()[0]->text(); - AccountSettings s; - QVariantMap connInfo = s.value(acc, "AccountData").toMap(); - connInfo["AccountName"] = acc; - - progressDlg = new CoreConnectProgressDlg(this); + // save accounts + CoreAccountSettings s; + foreach(QVariantMap acct, accounts.values()) { + AccountId id = acct["AccountId"].value(); + if(acct.contains("Delete")) { + s.removeAccount(id); + } else { + s.storeAccountData(id, acct); + } + } + s.setAutoConnectAccount(autoConnectAccount); + + //ui.stackedWidget->setCurrentWidget(ui.loginPage); + account = ui.accountList->currentItem()->data(Qt::UserRole).value(); + accountData = accounts[account]; + s.setLastAccount(account); + + clientSyncer->connectToCore(accountData); +// qDebug() << "logging in " << accountData["User"].toString() << accountData["Password"].toString(); +// clientSyncer->loginToCore(accountData["User"].toString(), accountData["Password"].toString()); +// qDebug() << "logged in"; + //connectToCore(); + //if(!ui.accountList->selectedItems().count()) return; +// AccountSettings s; +// QVariantMap connInfo; // = s.value(acc, "AccountData").toMap(); + //connInfo["AccountName"] = acc; + + progressDlg = new CoreConnectProgressDlg(clientSyncer, this); connect(progressDlg, SIGNAL(accepted()), this, SLOT(connectionSuccess())); connect(progressDlg, SIGNAL(rejected()), this, SLOT(connectionFailure())); progressDlg->showMaximized(); - progressDlg->connectToCore(connInfo); + // progressDlg->connectToCore(connInfo); +} + +void CoreConnectDlg::initPhaseError(const QString &error) { + qDebug() << "connection error:" << error; +} + +void CoreConnectDlg::initPhaseMsg(const QString &msg) { + +} + +void CoreConnectDlg::initPhaseSocketState(QAbstractSocket::SocketState state) { + /* + QString s; + QString host = accountData["Host"].toString(); + switch(state) { + case QAbstractSocket::UnconnectedState: s = tr("Not connected to %1.").arg(host); break; + case QAbstractSocket::HostLookupState: s = tr("Looking up %1...").arg(host); break; + case QAbstractSocket::ConnectingState: s = tr("Connecting to %1...").arg(host); break; + case QAbstractSocket::ConnectedState: s = tr("Connected to %1").arg(host); break; + default: s = tr("Unknown connection state to %1"); break; + } + ui.connectLabel->setText(s); + */ +} + +void CoreConnectDlg::restartPhaseNull() { + clientSyncer->disconnectFromCore(); +} + +/********************************************************* + * Phase Two: Login + *********************************************************/ + +void CoreConnectDlg::startLogin() { + clientSyncer->loginToCore(accountData["User"].toString(), accountData["Password"].toString()); +} + + +void CoreConnectDlg::loginFailed(const QString &error) { + } +void CoreConnectDlg::startSync() { + + +} + + void CoreConnectDlg::connectionSuccess() { + /* if(progressDlg->isConnected()) { progressDlg->deleteLater(); accept(); } else { connectionFailure(); } + */ + accept(); } void CoreConnectDlg::connectionFailure() { @@ -158,39 +247,44 @@ void CoreConnectDlg::connectionFailure() { } QVariant CoreConnectDlg::getCoreState() { - return coreState; +// return coreState; } + /****************************************************************************************************/ -EditCoreAcctDlg::EditCoreAcctDlg(QString accname, QDialog *parent) : QDialog(parent), accName(accname) { +CoreAccountEditDlg::CoreAccountEditDlg(AccountId id, const QVariantMap &acct, const QStringList &_existing, QWidget *parent) : QDialog(parent), account(acct) { ui.setupUi(this); setModal(true); - - ui.accountEdit->setText(accountName()); - if(accName.isEmpty()) { - ui.port->setValue(DEFAULT_PORT); - ui.accountEdit->setFocus(); - } else { + showMaximized(); + + existing = _existing; + account = acct; + if(id.isValid()) { + existing.removeAll(acct["AccountName"].toString()); + ui.hostEdit->setText(acct["Host"].toString()); + ui.port->setValue(acct["Port"].toUInt()); + ui.accountEdit->setText(acct["AccountName"].toString()); + ui.userEdit->setText(acct["User"].toString()); + ui.passwdEdit->setText(acct["Password"].toString()); ui.hostEdit->setFocus(); - AccountSettings s; - QVariantMap data = s.value(accName, "AccountData").toMap(); - ui.hostEdit->setText(data["Host"].toString()); - ui.port->setValue(data["Port"].toUInt()); - ui.userEdit->setText(data["User"].toString()); - //if(data.contains("Password")) { - ui.passwdEdit->setText(data["Password"].toString()); - // ui.rememberPasswd->setChecked(true); - //} else ui.rememberPasswd->setChecked(false); + } else { + ui.port->setValue(Global::defaultPort); + ui.accountEdit->setFocus(); + setWindowTitle(tr("Add Core Account")); } } -QString EditCoreAcctDlg::accountName() const { - return accName; +QVariantMap CoreAccountEditDlg::accountData() { + account["AccountName"] = ui.accountEdit->text().trimmed(); + account["Host"] = ui.hostEdit->text().trimmed(); + account["Port"] = ui.port->value(); + account["User"] = ui.userEdit->text(); + account["Password"] = ui.passwdEdit->text(); + return account; } -void EditCoreAcctDlg::accept() { - AccountSettings s; +void CoreAccountEditDlg::accept() { if(ui.userEdit->text().isEmpty() || ui.hostEdit->text().isEmpty() || ui.accountEdit->text().isEmpty()) { int res = QMessageBox::warning(this, tr("Missing information"), tr("Please enter all required information or discard changes to return to account selection."), @@ -198,7 +292,8 @@ void EditCoreAcctDlg::accept() { if(res != QMessageBox::Retry) reject(); return; } - if(ui.accountEdit->text() != accountName() && s.knownAccounts().contains(ui.accountEdit->text())) { + + if(existing.contains(ui.accountEdit->text())) { int res = QMessageBox::warning(this, tr("Non-unique account name"), tr("Account names need to be unique. Please enter a different name or discard all changes to " "return to account selection."), @@ -208,56 +303,76 @@ void EditCoreAcctDlg::accept() { ui.accountEdit->setFocus(); return; } - if(accountName() != ui.accountEdit->text()) { - s.removeAccount(accountName()); - accName = ui.accountEdit->text(); - } - QVariantMap accData; - accData["User"] = ui.userEdit->text(); - accData["Host"] = ui.hostEdit->text(); - accData["Port"] = ui.port->value(); - accData["Password"] = ui.passwdEdit->text(); - s.setValue(accountName(), "AccountData", accData); QDialog::accept(); } /********************************************************************************************/ -CoreConnectProgressDlg::CoreConnectProgressDlg(QDialog *parent) : QDialog(parent) { +CoreConnectProgressDlg::CoreConnectProgressDlg(ClientSyncer *clientSyncer, QDialog *parent) : QDialog(parent) { ui.setupUi(this); setModal(true); - connectsuccess = false; - - connect(Client::instance(), SIGNAL(coreConnectionMsg(const QString &)), ui.connectionStatus, SLOT(setText(const QString &))); - connect(Client::instance(), SIGNAL(coreConnectionProgress(uint, uint)), this, SLOT(updateProgressBar(uint, uint))); - connect(Client::instance(), SIGNAL(coreConnectionError(QString)), this, SLOT(coreConnectionError(QString))); - connect(Client::instance(), SIGNAL(connected()), this, SLOT(coreConnected())); - + connect(clientSyncer, SIGNAL(sessionProgress(quint32, quint32)), this, SLOT(coreSessionProgress(quint32, quint32))); + connect(clientSyncer, SIGNAL(networksProgress(quint32, quint32)), this, SLOT(coreNetworksProgress(quint32, quint32))); + connect(clientSyncer, SIGNAL(channelsProgress(quint32, quint32)), this, SLOT(coreChannelsProgress(quint32, quint32))); + connect(clientSyncer, SIGNAL(ircUsersProgress(quint32, quint32)), this, SLOT(coreIrcUsersProgress(quint32, quint32))); + connect(clientSyncer, SIGNAL(syncFinished()), this, SLOT(syncFinished())); + + ui.sessionProgress->setRange(0, 1); + ui.sessionProgress->setValue(0); + ui.networksProgress->setRange(0, 1); + ui.networksProgress->setValue(0); + ui.channelsProgress->setRange(0, 1); + ui.channelsProgress->setValue(0); + ui.ircUsersProgress->setRange(0, 1); + ui.ircUsersProgress->setValue(0); } -bool CoreConnectProgressDlg::isConnected() const { - return connectsuccess; -} +void CoreConnectProgressDlg::coreSessionProgress(quint32 val, quint32 max) { + ui.sessionProgress->setRange(0, max); + ui.sessionProgress->setValue(val); -void CoreConnectProgressDlg::connectToCore(QVariantMap connInfo) { - Client::instance()->connectToCore(connInfo); +} +void CoreConnectProgressDlg::coreNetworksProgress(quint32 val, quint32 max) { + if(max == 0) { + ui.networksProgress->setFormat("0/0"); + ui.networksProgress->setRange(0, 1); + ui.networksProgress->setValue(1); + } else { + ui.networksProgress->setFormat("%v/%m"); + ui.networksProgress->setRange(0, max); + ui.networksProgress->setValue(val); + } } -void CoreConnectProgressDlg::coreConnected() { - connectsuccess = true; - accept(); +void CoreConnectProgressDlg::coreChannelsProgress(quint32 val, quint32 max) { + if(max == 0) { + ui.channelsProgress->setFormat("0/0"); + ui.channelsProgress->setRange(0, 1); + ui.channelsProgress->setValue(1); + } else { + ui.channelsProgress->setFormat("%v/%m"); + ui.channelsProgress->setRange(0, max); + ui.channelsProgress->setValue(val); + } } -void CoreConnectProgressDlg::coreConnectionError(QString err) { - QMessageBox::warning(this, tr("Connection Error"), tr("Could not connect to Quassel Core!
\n") + err, QMessageBox::Ok); - reject(); +void CoreConnectProgressDlg::coreIrcUsersProgress(quint32 val, quint32 max) { + if(max == 0) { + ui.ircUsersProgress->setFormat("0/0"); + ui.ircUsersProgress->setRange(0, 1); + ui.ircUsersProgress->setValue(1); + } else { + if(val % 100) return; + ui.ircUsersProgress->setFormat("%v/%m"); + ui.ircUsersProgress->setRange(0, max); + ui.ircUsersProgress->setValue(val); + } } -void CoreConnectProgressDlg::updateProgressBar(uint partial, uint total) { - ui.connectionProgress->setMaximum(total); - ui.connectionProgress->setValue(partial); +void CoreConnectProgressDlg::syncFinished() { + accept(); }