X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fclient%2Fclient.cpp;h=ab543118b84e1a37cfec9d5febc2a0fbc49bc659;hp=e78fc17e5acd1d27ef8bdc87111510718cc9d23f;hb=cf28e7152c5d940aec586be1b29fbf8ddc99f087;hpb=e008cd12ef319c4b5f9fe5a8cc1524829551771d diff --git a/src/client/client.cpp b/src/client/client.cpp index e78fc17e..ab543118 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -21,21 +21,21 @@ #include "client.h" #include "bufferinfo.h" -#include "buffertreemodel.h" #include "global.h" +#include "identity.h" #include "ircchannel.h" #include "ircuser.h" #include "message.h" #include "networkinfo.h" +#include "networkmodel.h" #include "quasselui.h" #include "signalproxy.h" #include "util.h" QPointer Client::instanceptr = 0; -// ============================== -// public Static Methods -// ============================== +/*** Initialization/destruction ***/ + Client *Client::instance() { if(!instanceptr) instanceptr = new Client(); @@ -51,6 +51,76 @@ void Client::init(AbstractUi *ui) { instance()->init(); } +Client::Client(QObject *parent) + : QObject(parent), + socket(0), + _signalProxy(new SignalProxy(SignalProxy::Client, this)), + mainUi(0), + _networkModel(0), + connectedToCore(false) +{ + +} + +Client::~Client() { + +} + +void Client::init() { + blockSize = 0; + + _networkModel = new NetworkModel(this); + + connect(this, SIGNAL(bufferSelected(Buffer *)), + _networkModel, SLOT(selectBuffer(Buffer *))); + connect(this, SIGNAL(bufferUpdated(Buffer *)), + _networkModel, SLOT(bufferUpdated(Buffer *))); + connect(this, SIGNAL(bufferActivity(Buffer::ActivityLevel, Buffer *)), + _networkModel, SLOT(bufferActivity(Buffer::ActivityLevel, Buffer *))); + + SignalProxy *p = signalProxy(); + p->attachSignal(this, SIGNAL(sendSessionData(const QString &, const QVariant &)), + SIGNAL(clientSessionDataChanged(const QString &, const QVariant &))); + p->attachSlot(SIGNAL(coreSessionDataChanged(const QString &, const QVariant &)), + this, SLOT(recvSessionData(const QString &, const QVariant &))); + p->attachSlot(SIGNAL(coreState(const QVariant &)), + this, SLOT(recvCoreState(const QVariant &))); + p->attachSlot(SIGNAL(networkConnected(uint)), + this, SLOT(networkConnected(uint))); + p->attachSlot(SIGNAL(networkDisconnected(uint)), + this, SLOT(networkDisconnected(uint))); + p->attachSlot(SIGNAL(displayMsg(const Message &)), + this, SLOT(recvMessage(const Message &))); + p->attachSlot(SIGNAL(displayStatusMsg(QString, QString)), + this, SLOT(recvStatusMsg(QString, QString))); + + + p->attachSlot(SIGNAL(backlogData(BufferInfo, const QVariantList &, bool)), this, SLOT(recvBacklogData(BufferInfo, const QVariantList &, bool))); + p->attachSlot(SIGNAL(bufferInfoUpdated(BufferInfo)), this, SLOT(updateBufferInfo(BufferInfo))); + 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(requestUpdateIdentity(const Identity &)), SIGNAL(updateIdentity(const Identity &))); + 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))); + + 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())); + + layoutTimer = new QTimer(this); + layoutTimer->setInterval(0); + layoutTimer->setSingleShot(false); + connect(layoutTimer, SIGNAL(timeout()), this, SLOT(layoutMsg())); + +} + +/*** public static methods ***/ + + QList Client::networkInfos() { return instance()->_networkInfo.values(); } @@ -118,76 +188,61 @@ BufferInfo Client::statusBufferInfo(QString net) { return bufferInfo(net, ""); } -BufferTreeModel *Client::bufferModel() { - return instance()->_bufferModel; +NetworkModel *Client::networkModel() { + return instance()->_networkModel; } SignalProxy *Client::signalProxy() { return instance()->_signalProxy; } -// ============================== -// Constructor / Decon -// ============================== -Client::Client(QObject *parent) - : QObject(parent), - socket(0), - _signalProxy(new SignalProxy(SignalProxy::Client, this)), - mainUi(0), - _bufferModel(0), - connectedToCore(false) -{ -} -Client::~Client() { - +/*** Identity handling ***/ + +QList Client::identityIds() { + return instance()->_identities.keys(); } -void Client::init() { - blockSize = 0; +const Identity * Client::identity(IdentityId id) { + if(instance()->_identities.contains(id)) return instance()->_identities[id]; + else return 0; +} - _bufferModel = new BufferTreeModel(this); - connect(this, SIGNAL(bufferSelected(Buffer *)), - _bufferModel, SLOT(selectBuffer(Buffer *))); - connect(this, SIGNAL(bufferUpdated(Buffer *)), - _bufferModel, SLOT(bufferUpdated(Buffer *))); - connect(this, SIGNAL(bufferActivity(Buffer::ActivityLevel, Buffer *)), - _bufferModel, SLOT(bufferActivity(Buffer::ActivityLevel, Buffer *))); +void Client::createIdentity(const Identity &id) { + emit instance()->requestCreateIdentity(id); +} - SignalProxy *p = signalProxy(); - p->attachSignal(this, SIGNAL(sendSessionData(const QString &, const QVariant &)), - SIGNAL(clientSessionDataChanged(const QString &, const QVariant &))); - p->attachSlot(SIGNAL(coreSessionDataChanged(const QString &, const QVariant &)), - this, SLOT(recvSessionData(const QString &, const QVariant &))); - p->attachSlot(SIGNAL(coreState(const QVariant &)), - this, SLOT(recvCoreState(const QVariant &))); - p->attachSlot(SIGNAL(networkConnected(uint)), - this, SLOT(networkConnected(uint))); - p->attachSlot(SIGNAL(networkDisconnected(uint)), - this, SLOT(networkDisconnected(uint))); - p->attachSlot(SIGNAL(displayMsg(const Message &)), - this, SLOT(recvMessage(const Message &))); - p->attachSlot(SIGNAL(displayStatusMsg(QString, QString)), - this, SLOT(recvStatusMsg(QString, QString))); +void Client::updateIdentity(const Identity &id) { + emit instance()->requestUpdateIdentity(id); +} +void Client::removeIdentity(IdentityId id) { + emit instance()->requestRemoveIdentity(id); +} - p->attachSlot(SIGNAL(backlogData(BufferInfo, const QVariantList &, bool)), this, SLOT(recvBacklogData(BufferInfo, const QVariantList &, bool))); - p->attachSlot(SIGNAL(bufferInfoUpdated(BufferInfo)), this, SLOT(updateBufferInfo(BufferInfo))); - p->attachSignal(this, SIGNAL(sendInput(BufferInfo, QString))); - p->attachSignal(this, SIGNAL(requestNetworkStates())); +void Client::coreIdentityCreated(const Identity &other) { + if(!_identities.contains(other.id())) { + Identity *identity = new Identity(other, this); + _identities[other.id()] = identity; + identity->setInitialized(); + signalProxy()->synchronize(identity); + emit identityCreated(other.id()); + } else { + qWarning() << tr("Identity already exists in client!"); + } +} - 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())); +void Client::coreIdentityRemoved(IdentityId id) { + if(_identities.contains(id)) { + emit identityRemoved(id); + Identity *i = _identities.take(id); + i->deleteLater(); + } +} - layoutTimer = new QTimer(this); - layoutTimer->setInterval(0); - layoutTimer->setSingleShot(false); - connect(layoutTimer, SIGNAL(timeout()), this, SLOT(layoutMsg())); +/*** ***/ -} bool Client::isConnected() { return instance()->connectedToCore; @@ -259,11 +314,12 @@ void Client::coreSocketConnected() { void Client::coreSocketDisconnected() { instance()->connectedToCore = false; emit disconnected(); + emit coreConnectionStateChanged(false); socket->deleteLater(); blockSize = 0; /* Clear internal data. Hopefully nothing relies on it at this point. */ - _bufferModel->clear(); + _networkModel->clear(); QHash::iterator bufferIter = _buffers.begin(); while(bufferIter != _buffers.end()) { @@ -312,6 +368,14 @@ void Client::syncToCore(const QVariant &coreState) { foreach(QString key, sessData.keys()) recvSessionData(key, sessData[key]); + // create identities + foreach(QVariant vid, sessionState["Identities"].toList()) { + Identity *id = new Identity(vid.value(), this); + _identities[id->id()] = id; + signalProxy()->synchronize(id); + qDebug() << "received identity" << id->identityName(); + } + // store Buffer details QVariantList coreBuffers = sessionState["Buffers"].toList(); /* make lookups by id faster */ @@ -382,6 +446,7 @@ void Client::updateCoreConnectionProgress() { emit coreConnectionProgress(1,1); emit connected(); + emit coreConnectionStateChanged(true); foreach(NetworkInfo *net, networkInfos()) { disconnect(net, 0, this, SLOT(updateCoreConnectionProgress())); } @@ -444,7 +509,7 @@ void Client::networkConnected(uint netid) { NetworkInfo *netinfo = new NetworkInfo(netid, this); netinfo->setProxy(signalProxy()); - bufferModel()->attachNetworkInfo(netinfo); + networkModel()->attachNetworkInfo(netinfo); if(!isConnected()) { connect(netinfo, SIGNAL(initDone()), this, SLOT(updateCoreConnectionProgress()));