/***************************************************************************
- * Copyright (C) 2005-08 by the Quassel Project *
+ * Copyright (C) 2005-09 by the Quassel Project *
* devel@quassel-irc.org *
* *
* This program is free software; you can redistribute it and/or modify *
#include "client.h"
#include "abstractmessageprocessor.h"
+#include "abstractui.h"
#include "bufferinfo.h"
#include "buffermodel.h"
#include "buffersettings.h"
#include "buffersyncer.h"
-#include "bufferviewmanager.h"
+#include "bufferviewconfig.h"
#include "clientbacklogmanager.h"
+#include "clientbufferviewmanager.h"
#include "clientirclisthelper.h"
-#include "identity.h"
+#include "clientidentity.h"
#include "ircchannel.h"
#include "ircuser.h"
#include "message.h"
#include "network.h"
#include "networkmodel.h"
#include "quassel.h"
-#include "quasselui.h"
#include "signalproxy.h"
#include "util.h"
void Client::destroy() {
if(instanceptr) {
- delete instanceptr->mainUi;
+ delete instanceptr->mainUi();
instanceptr->deleteLater();
instanceptr = 0;
}
}
void Client::init(AbstractUi *ui) {
- instance()->mainUi = ui;
+ instance()->_mainUi = ui;
instance()->init();
}
Client::Client(QObject *parent)
: QObject(parent),
_signalProxy(new SignalProxy(SignalProxy::Client, this)),
- mainUi(0),
+ _mainUi(0),
_networkModel(0),
_bufferModel(0),
_bufferSyncer(0),
_messageProcessor(0),
_connectedToCore(false),
_syncedToCore(false),
+ _internalCore(false),
_debugLog(&_debugLogBuffer)
{
_signalProxy->synchronize(_ircListHelper);
_networkModel, SLOT(networkRemoved(NetworkId)));
_bufferModel = new BufferModel(_networkModel);
- _messageModel = mainUi->createMessageModel(this);
- _messageProcessor = mainUi->createMessageProcessor(this);
+ _messageModel = mainUi()->createMessageModel(this);
+ _messageProcessor = mainUi()->createMessageProcessor(this);
SignalProxy *p = signalProxy();
p->attachSignal(this, SIGNAL(sendInput(BufferInfo, QString)));
p->attachSignal(this, SIGNAL(requestNetworkStates()));
- p->attachSignal(this, SIGNAL(requestCreateIdentity(const Identity &)), SIGNAL(createIdentity(const Identity &)));
+ p->attachSignal(this, SIGNAL(requestCreateIdentity(const Identity &, const QVariantMap &)), SIGNAL(createIdentity(const Identity &, const QVariantMap &)));
p->attachSignal(this, SIGNAL(requestRemoveIdentity(IdentityId)), SIGNAL(removeIdentity(IdentityId)));
p->attachSlot(SIGNAL(identityCreated(const Identity &)), this, SLOT(coreIdentityCreated(const Identity &)));
p->attachSlot(SIGNAL(identityRemoved(IdentityId)), this, SLOT(coreIdentityRemoved(IdentityId)));
- p->attachSignal(this, SIGNAL(requestCreateNetwork(const NetworkInfo &)), SIGNAL(createNetwork(const NetworkInfo &)));
+ p->attachSignal(this, SIGNAL(requestCreateNetwork(const NetworkInfo &, const QStringList &)), SIGNAL(createNetwork(const NetworkInfo &, const QStringList &)));
p->attachSignal(this, SIGNAL(requestRemoveNetwork(NetworkId)), SIGNAL(removeNetwork(NetworkId)));
p->attachSlot(SIGNAL(networkCreated(NetworkId)), this, SLOT(coreNetworkCreated(NetworkId)));
p->attachSlot(SIGNAL(networkRemoved(NetworkId)), this, SLOT(coreNetworkRemoved(NetworkId)));
connect(p, SIGNAL(disconnected()), this, SLOT(disconnectedFromCore()));
- //connect(mainUi, SIGNAL(connectToCore(const QVariantMap &)), this, SLOT(connectToCore(const QVariantMap &)));
- connect(mainUi, SIGNAL(disconnectFromCore()), this, SLOT(disconnectFromCore()));
- connect(this, SIGNAL(connected()), mainUi, SLOT(connectedToCore()));
- connect(this, SIGNAL(disconnected()), mainUi, SLOT(disconnectedFromCore()));
+ //connect(mainUi(), SIGNAL(connectToCore(const QVariantMap &)), this, SLOT(connectToCore(const QVariantMap &)));
+ connect(mainUi(), SIGNAL(disconnectFromCore()), this, SLOT(disconnectFromCore()));
+ connect(this, SIGNAL(connected()), mainUi(), SLOT(connectedToCore()));
+ connect(this, SIGNAL(disconnected()), mainUi(), SLOT(disconnectedFromCore()));
// attach backlog manager
p->synchronize(backlogManager());
/*** public static methods ***/
+AbstractUi *Client::mainUi() {
+ return instance()->_mainUi;
+}
+
AccountId Client::currentCoreAccount() {
return _currentCoreAccount;
}
else return 0;
}
-void Client::createNetwork(const NetworkInfo &info) {
- emit instance()->requestCreateNetwork(info);
+void Client::createNetwork(const NetworkInfo &info, const QStringList &persistentChannels) {
+ emit instance()->requestCreateNetwork(info, persistentChannels);
}
void Client::removeNetwork(NetworkId id) {
return instance()->_identities.keys();
}
-const Identity * Client::identity(IdentityId id) {
+const Identity *Client::identity(IdentityId id) {
if(instance()->_identities.contains(id)) return instance()->_identities[id];
else return 0;
}
-void Client::createIdentity(const Identity &id) {
- emit instance()->requestCreateIdentity(id);
+void Client::createIdentity(const CertIdentity &id) {
+ QVariantMap additional;
+#ifdef HAVE_SSL
+ additional["KeyPem"] = id.sslKey().toPem();
+ additional["CertPem"] = id.sslCert().toPem();
+#endif
+ emit instance()->requestCreateIdentity(id, additional);
}
void Client::updateIdentity(IdentityId id, const QVariantMap &ser) {
/*** 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);
+ }
+ _internalCore = !socket;
_connectedToCore = true;
setCurrentCoreAccount(id);
}
-void Client::setConnectedToInternalCore() {
- _connectedToCore = true;
- setCurrentCoreAccount(AccountId());
-}
-
void Client::setSyncedToCore() {
// create buffersyncer
Q_ASSERT(!_bufferSyncer);
connect(bufferSyncer(), SIGNAL(lastSeenMsgSet(BufferId, MsgId)), _networkModel, SLOT(setLastSeenMsgId(BufferId, MsgId)));
connect(bufferSyncer(), SIGNAL(bufferRemoved(BufferId)), this, SLOT(bufferRemoved(BufferId)));
connect(bufferSyncer(), SIGNAL(bufferRenamed(BufferId, QString)), this, SLOT(bufferRenamed(BufferId, QString)));
+ connect(bufferSyncer(), SIGNAL(buffersPermanentlyMerged(BufferId, BufferId)), this, SLOT(buffersPermanentlyMerged(BufferId, BufferId)));
+ connect(bufferSyncer(), SIGNAL(buffersPermanentlyMerged(BufferId, BufferId)), _messageModel, SLOT(buffersPermanentlyMerged(BufferId, BufferId)));
+ connect(bufferSyncer(), SIGNAL(initDone()), this, SLOT(requestInitialBacklog()));
+ connect(networkModel(), SIGNAL(setLastSeenMsg(BufferId, MsgId)), bufferSyncer(), SLOT(requestSetLastSeenMsg(BufferId, const MsgId &)));
signalProxy()->synchronize(bufferSyncer());
// create a new BufferViewManager
- _bufferViewManager = new BufferViewManager(signalProxy(), this);
+ Q_ASSERT(!_bufferViewManager);
+ _bufferViewManager = new ClientBufferViewManager(signalProxy(), this);
+ connect(bufferViewManager(), SIGNAL(initDone()), this, SLOT(requestInitialBacklog()));
+ connect(bufferViewManager(), SIGNAL(initDone()), this, SLOT(createDefaultBufferView()));
_syncedToCore = true;
emit connected();
emit coreConnectionStateChanged(true);
}
-void Client::setSecuredConnection() {
- emit securedConnection();
+void Client::requestInitialBacklog() {
+ if(bufferViewManager()->isInitialized() && bufferSyncer()->isInitialized())
+ Client::backlogManager()->requestInitialBacklog();
+}
+
+void Client::createDefaultBufferView() {
+ if(bufferViewManager()->bufferViewConfigs().isEmpty()) {
+ BufferViewConfig config(-1);
+ config.setBufferViewName(tr("All Buffers"));
+ config.initSetBufferList(networkModel()->allBufferIdsSorted());
+ bufferViewManager()->requestCreateBufferView(config.toVariantMap());
+ }
}
void Client::disconnectFromCore() {
}
Q_ASSERT(_networks.isEmpty());
- QHash<IdentityId, Identity*>::iterator idIter = _identities.begin();
+ QHash<IdentityId, Identity *>::iterator idIter = _identities.begin();
while(idIter != _identities.end()) {
+ emit identityRemoved(idIter.key());
Identity *id = idIter.value();
- emit identityRemoved(id->id());
idIter = _identities.erase(idIter);
id->deleteLater();
}
bufferSyncer()->requestRemoveBuffer(id);
}
+void Client::renameBuffer(BufferId bufferId, const QString &newName) {
+ if(!bufferSyncer())
+ return;
+ bufferSyncer()->requestRenameBuffer(bufferId, newName);
+}
+
+void Client::mergeBuffersPermanently(BufferId bufferId1, BufferId bufferId2) {
+ if(!bufferSyncer())
+ return;
+ bufferSyncer()->requestMergeBuffersPermanently(bufferId1, bufferId2);
+}
+
+void Client::purgeKnownBufferIds() {
+ if(!bufferSyncer())
+ return;
+ bufferSyncer()->requestPurgeBufferIds();
+}
+
void Client::bufferRemoved(BufferId bufferId) {
// select a sane buffer (status buffer)
/* we have to manually select a buffer because otherwise inconsitent changes
}
}
+void Client::buffersPermanentlyMerged(BufferId bufferId1, BufferId bufferId2) {
+ QModelIndex idx = networkModel()->bufferIndex(bufferId1);
+ bufferModel()->setCurrentIndex(bufferModel()->mapFromSource(idx));
+ networkModel()->removeBuffer(bufferId2);
+}
+
void Client::logMessage(QtMsgType type, const char *msg) {
fprintf(stderr, "%s\n", msg);
fflush(stderr);