/*** core connection stuff ***/
-void Client::setConnectedToCore(QIODevice *socket, AccountId id) {
- // if the socket is an orphan, the signalProxy adopts it.
- // -> we don't need to care about it anymore
- socket->setParent(0);
- signalProxy()->addPeer(socket);
+void Client::setConnectedToCore(AccountId id, QIODevice *socket) {
+ if(socket) { // external core
+ // if the socket is an orphan, the signalProxy adopts it.
+ // -> we don't need to care about it anymore
+ socket->setParent(0);
+ signalProxy()->addPeer(socket);
+ }
_connectedToCore = true;
setCurrentCoreAccount(id);
}
-void Client::setConnectedToInternalCore() {
- _connectedToCore = true;
- setCurrentCoreAccount(AccountId());
-}
-
void Client::setSyncedToCore() {
// create buffersyncer
Q_ASSERT(!_bufferSyncer);
void coreNetworkCreated(NetworkId);
void coreNetworkRemoved(NetworkId);
- void setConnectedToCore(QIODevice *socket, AccountId id);
- void setConnectedToInternalCore();
+ void setConnectedToCore(AccountId id, QIODevice *socket = 0);
void setSyncedToCore();
void setSecuredConnection();
SignalProxy::writeDataToDevice(socket, clientInit);
}
-void ClientSyncer::useInternalCore() {
+void ClientSyncer::useInternalCore(AccountId internalAccountId) {
+ coreConnectionInfo["AccountId"] = QVariant::fromValue<AccountId>(internalAccountId);
emit startInternalCore();
emit connectToInternalCore(Client::instance()->signalProxy());
}
void ClientSyncer::internalSessionStateReceived(const QVariant &packedState) {
QVariantMap state = packedState.toMap();
emit sessionProgress(1, 1);
- Client::instance()->setConnectedToInternalCore();
+ Client::instance()->setConnectedToCore(coreConnectionInfo["AccountId"].value<AccountId>());
syncToCore(state);
}
emit sessionProgress(1, 1);
disconnect(this, SIGNAL(recvPartialItem(quint32, quint32)), this, SIGNAL(sessionProgress(quint32, quint32)));
disconnect(socket, 0, this, 0); // rest of communication happens through SignalProxy
- Client::instance()->setConnectedToCore(socket, coreConnectionInfo["AccountId"].value<AccountId>());
+ Client::instance()->setConnectedToCore(coreConnectionInfo["AccountId"].value<AccountId>(), socket);
syncToCore(state);
}
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
-#ifndef _CLIENTSYNCER_H_
-#define _CLIENTSYNCER_H_
+#ifndef CLIENTSYNCER_H_
+#define CLIENTSYNCER_H_
#include <QPointer>
#include <QString>
# include <QTcpSocket>
#endif
+#include "types.h"
+
class IrcUser;
class IrcChannel;
class SignalProxy;
void connectToCore(const QVariantMap &);
void loginToCore(const QString &user, const QString &passwd);
void disconnectFromCore();
- void useInternalCore();
+ void useInternalCore(AccountId internalAccountId);
private slots:
void coreSocketError(QAbstractSocket::SocketError);
#include "quassel.h"
CoreConnectDlg::CoreConnectDlg(bool autoconnect, QWidget *parent)
- : QDialog(parent)
+ : QDialog(parent),
+ _internalAccountId(0)
{
ui.setupUi(this);
ui.editAccount->setIcon(SmallIcon("document-properties"));
foreach(AccountId id, s.knownAccounts()) {
if(!id.isValid()) continue;
QVariantMap data = s.retrieveAccountData(id);
+ if(data.contains("InternalAccount") && data["InternalAccount"].toBool()) {
+ _internalAccountId = id;
+ continue;
+ }
data["AccountId"] = QVariant::fromValue<AccountId>(id);
accounts[id] = data;
QListWidgetItem *item = new QListWidgetItem(data["AccountName"].toString(), ui.accountList);
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;
- }
- }
+ AccountId id = findFreeAccountId();
QVariantMap data = dlg.accountData();
data["AccountId"] = QVariant::fromValue<AccountId>(id);
accounts[id] = data;
}
void CoreConnectDlg::on_useInternalCore_clicked() {
- clientSyncer->useInternalCore();
+ if(!_internalAccountId.isValid()) {
+ _internalAccountId = findFreeAccountId();
+ QVariantMap data;
+ data["InternalAccount"] = true;
+ CoreAccountSettings accountSettings;
+ accountSettings.storeAccountData(_internalAccountId, data);
+ }
+ clientSyncer->useInternalCore(_internalAccountId);
startSync();
}
}
}
+AccountId CoreConnectDlg::findFreeAccountId() {
+ for(AccountId i = 1;; i++) {
+ if(!accounts.contains(i) && i != _internalAccountId)
+ return i;
+ }
+}
+
/*****************************************************************************************
* CoreAccountEditDlg
*****************************************************************************************/
void coreNetworksProgress(quint32, quint32);
private:
+ AccountId findFreeAccountId();
+
Ui::CoreConnectDlg ui;
AccountId autoConnectAccount;
QHash<AccountId, QVariantMap> accounts;
+ AccountId _internalAccountId;
QVariantMap accountData;
AccountId account;