#include "core.h"
#include "coresession.h"
#include "networkconnection.h"
+#include "userinputhandler.h"
#include "signalproxy.h"
#include "buffersyncer.h"
+#include "corebacklogmanager.h"
+#include "corebufferviewmanager.h"
+#include "coreirclisthelper.h"
#include "storage.h"
-#include "network.h"
+#include "corenetwork.h"
#include "ircuser.h"
#include "ircchannel.h"
#include "identity.h"
#include "util.h"
#include "coreusersettings.h"
-CoreSession::CoreSession(UserId uid, bool restoreState, QObject *parent) : QObject(parent),
+CoreSession::CoreSession(UserId uid, bool restoreState, QObject *parent)
+ : QObject(parent),
_user(uid),
_signalProxy(new SignalProxy(SignalProxy::Server, 0, this)),
_bufferSyncer(new BufferSyncer(this)),
+ _backlogManager(new CoreBacklogManager(this)),
+ _bufferViewManager(new CoreBufferViewManager(_signalProxy, this)),
+ _ircListHelper(new CoreIrcListHelper(this)),
scriptEngine(new QScriptEngine(this))
{
SignalProxy *p = signalProxy();
-
+ connect(p, SIGNAL(peerRemoved(QIODevice *)), this, SLOT(removeClient(QIODevice *)));
+
//p->attachSlot(SIGNAL(disconnectFromNetwork(NetworkId)), this, SLOT(disconnectFromNetwork(NetworkId))); // FIXME
p->attachSlot(SIGNAL(sendInput(BufferInfo, QString)), this, SLOT(msgFromClient(BufferInfo, QString)));
- p->attachSlot(SIGNAL(requestBacklog(BufferInfo, QVariant, QVariant)), this, SLOT(sendBacklog(BufferInfo, QVariant, QVariant)));
p->attachSignal(this, SIGNAL(displayMsg(Message)));
p->attachSignal(this, SIGNAL(displayStatusMsg(QString, QString)));
- p->attachSignal(this, SIGNAL(backlogData(BufferInfo, QVariantList, bool)));
p->attachSignal(this, SIGNAL(bufferInfoUpdated(BufferInfo)));
p->attachSignal(this, SIGNAL(identityCreated(const Identity &)));
connect(this, SIGNAL(bufferRenamed(BufferId, QString)), _bufferSyncer, SLOT(renameBuffer(BufferId, QString)));
p->synchronize(_bufferSyncer);
+
+ // init BacklogManager;
+ p->synchronize(_backlogManager);
+
+ // init IrcListHelper;
+ p->synchronize(ircListHelper());
+
// Restore session state
if(restoreState) restoreSessionState();
foreach(NetworkConnection *conn, _connections.values()) {
delete conn;
}
- foreach(Network *net, _networks.values()) {
+ foreach(CoreNetwork *net, _networks.values()) {
delete net;
}
}
return _user;
}
-Network *CoreSession::network(NetworkId id) const {
+CoreNetwork *CoreSession::network(NetworkId id) const {
if(_networks.contains(id)) return _networks[id];
return 0;
}
}
void CoreSession::connectToNetwork(NetworkId id) {
- Network *net = network(id);
+ CoreNetwork *net = network(id);
if(!net) {
qWarning() << "Connect to unknown network requested! net:" << id << "user:" << user();
return;
//signalProxy()->attachSignal(conn, SIGNAL(connected(NetworkId)), SIGNAL(networkConnected(NetworkId)));
//signalProxy()->attachSignal(conn, SIGNAL(disconnected(NetworkId)), SIGNAL(networkDisconnected(NetworkId)));
- connect(conn, SIGNAL(displayMsg(Message::Type, BufferInfo::Type, QString, QString, QString, quint8)),
- this, SLOT(recvMessageFromServer(Message::Type, BufferInfo::Type, QString, QString, QString, quint8)));
+ connect(conn, SIGNAL(displayMsg(Message::Type, BufferInfo::Type, QString, QString, QString, Message::Flags)),
+ this, SLOT(recvMessageFromServer(Message::Type, BufferInfo::Type, QString, QString, QString, Message::Flags)));
connect(conn, SIGNAL(displayStatusMsg(QString)), this, SLOT(recvStatusMsgFromServer(QString)));
connect(conn, SIGNAL(nickChanged(const NetworkId &, const QString &, const QString &)),
}
void CoreSession::disconnectFromNetwork(NetworkId id) {
- if(!_connections.contains(id)) return;
- _connections[id]->disconnectFromIrc();
+ if(!_connections.contains(id))
+ return;
+
+ //_connections[id]->disconnectFromIrc();
+ _connections[id]->userInputHandler()->handleQuit(BufferInfo(), QString());
}
void CoreSession::networkStateRequested() {
}
}
+void CoreSession::removeClient(QIODevice *iodev) {
+ // no checks for validity check - privateslot...
+ QTcpSocket *socket = qobject_cast<QTcpSocket *>(iodev);
+ if(socket)
+ qDebug() << qPrintable(tr("Client")) << qPrintable(socket->peerAddress().toString()) << qPrintable(tr("disconnected (UserId: %1).").arg(user().toInt()));
+ else
+ qDebug() << "Local client disconnedted.";
+ disconnect(socket, 0, this, 0);
+ socket->deleteLater();
+}
+
SignalProxy *CoreSession::signalProxy() const {
return _signalProxy;
}
// called now only on /quit and requested disconnects, not on normal disconnects!
void CoreSession::networkDisconnected(NetworkId networkid) {
- Core::setNetworkConnected(user(), networkid, false);
- if(_connections.contains(networkid)) _connections.take(networkid)->deleteLater();
+ // if the network has already been removed, we don't have a networkconnection left either, so we don't do anything
+ // make sure to not depend on the network still existing when calling this function!
+ if(_connections.contains(networkid)) {
+ Core::setNetworkConnected(user(), networkid, false);
+ _connections.take(networkid)->deleteLater();
+ }
}
void CoreSession::channelJoined(NetworkId id, const QString &channel, const QString &key) {
if(conn) {
conn->userInput(bufinfo, msg);
} else {
- qWarning() << "Trying to send to unconnected network!";
+ qWarning() << "Trying to send to unconnected network:" << msg;
}
}
// ALL messages coming pass through these functions before going to the GUI.
// So this is the perfect place for storing the backlog and log stuff.
-void CoreSession::recvMessageFromServer(Message::Type type, BufferInfo::Type bufferType, QString target, QString text, QString sender, quint8 flags) {
+void CoreSession::recvMessageFromServer(Message::Type type, BufferInfo::Type bufferType,
+ QString target, QString text, QString sender, Message::Flags flags) {
NetworkConnection *netCon = qobject_cast<NetworkConnection*>(this->sender());
Q_ASSERT(netCon);
-
+
BufferInfo bufferInfo = Core::bufferInfo(user(), netCon->networkId(), bufferType, target);
Message msg(bufferInfo, type, text, sender, flags);
msg.setMsgId(Core::storeMessage(msg));
Core::setBufferLastSeenMsg(user(), buffer, msgId);
}
-void CoreSession::sendBacklog(BufferInfo id, QVariant v1, QVariant v2) {
- QList<QVariant> log;
- QList<Message> msglist;
- if(v1.type() == QVariant::DateTime) {
-
-
- } else {
- msglist = Core::requestMsgs(id, v1.toInt(), v2.toInt());
- }
-
- // Send messages out in smaller packages - we don't want to make the signal data too large!
- for(int i = 0; i < msglist.count(); i++) {
- log.append(qVariantFromValue(msglist[i]));
- if(log.count() >= 5) {
- emit backlogData(id, log, i >= msglist.count() - 1);
- log.clear();
- }
- }
- if(log.count() > 0) emit backlogData(id, log, true);
-}
-
-
void CoreSession::initScriptEngine() {
signalProxy()->attachSlot(SIGNAL(scriptRequest(QString)), this, SLOT(scriptRequest(QString)));
signalProxy()->attachSignal(this, SIGNAL(scriptResult(QString)));
if(!info.networkId.isValid())
Core::createNetwork(user(), info);
- Q_ASSERT(info.networkId.isValid());
+ if(!info.networkId.isValid()) {
+ qWarning() << qPrintable(tr("CoreSession::createNetwork(): Got invalid networkId from Core when trying to create network %1!").arg(info.networkName));
+ return;
+ }
id = info.networkId.toInt();
- Q_ASSERT(!_networks.contains(id));
-
- Network *net = new Network(id, this);
- connect(net, SIGNAL(connectRequested(NetworkId)), this, SLOT(connectToNetwork(NetworkId)));
- connect(net, SIGNAL(disconnectRequested(NetworkId)), this, SLOT(disconnectFromNetwork(NetworkId)));
- net->setNetworkInfo(info);
- net->setProxy(signalProxy());
- _networks[id] = net;
- signalProxy()->synchronize(net);
- emit networkCreated(id);
+ if(!_networks.contains(id)) {
+ CoreNetwork *net = new CoreNetwork(id, this);
+ connect(net, SIGNAL(connectRequested(NetworkId)), this, SLOT(connectToNetwork(NetworkId)));
+ connect(net, SIGNAL(disconnectRequested(NetworkId)), this, SLOT(disconnectFromNetwork(NetworkId)));
+ net->setNetworkInfo(info);
+ net->setProxy(signalProxy());
+ _networks[id] = net;
+ signalProxy()->synchronize(net);
+ emit networkCreated(id);
+ } else {
+ qWarning() << qPrintable(tr("CoreSession::createNetwork(): Trying to create a network that already exists, updating instead!"));
+ updateNetwork(info);
+ }
}
+// FIXME: move to CoreNetwork
void CoreSession::updateNetwork(const NetworkInfo &info) {
if(!_networks.contains(info.networkId)) {
qWarning() << "Update request for unknown network received!";
}
void CoreSession::destroyNetwork(NetworkId id) {
- Q_ASSERT(!_connections.contains(id));
+ if(_connections.contains(id)) {
+ // this can happen if the network was reconnecting while being removed
+ _connections.take(id)->deleteLater();
+ }
+ QList<BufferId> removedBuffers = Core::requestBufferIdsForNetwork(user(), id);
Network *net = _networks.take(id);
if(net && Core::removeNetwork(user(), id)) {
+ foreach(BufferId bufferId, removedBuffers) {
+ _bufferSyncer->removeBuffer(bufferId);
+ }
emit networkRemoved(id);
net->deleteLater();
}
}
if(bufferInfo.type() == BufferInfo::ChannelBuffer) {
- Network *net = network(bufferInfo.networkId());
- Q_ASSERT(net);
+ CoreNetwork *net = network(bufferInfo.networkId());
+ if(!net) {
+ qWarning() << "CoreSession::removeBufferRequested(): Received BufferInfo with unknown networkId!";
+ return;
+ }
IrcChannel *chan = net->ircChannel(bufferInfo.bufferName());
if(chan) {
qWarning() << "CoreSession::removeBufferRequested(): Unable to remove Buffer for joined Channel:" << bufferInfo.bufferName();