#include "buffersyncer.h"
#include "corebacklogmanager.h"
#include "corebufferviewmanager.h"
+#include "coreirclisthelper.h"
#include "storage.h"
#include "corenetwork.h"
#include "util.h"
#include "coreusersettings.h"
+#include "logger.h"
CoreSession::CoreSession(UserId uid, bool restoreState, QObject *parent)
: QObject(parent),
_user(uid),
_signalProxy(new SignalProxy(SignalProxy::Server, 0, this)),
+ _aliasManager(this),
_bufferSyncer(new BufferSyncer(this)),
_backlogManager(new CoreBacklogManager(this)),
_bufferViewManager(new CoreBufferViewManager(_signalProxy, this)),
+ _ircListHelper(new CoreIrcListHelper(this)),
+ _coreInfo(this),
scriptEngine(new QScriptEngine(this))
{
SignalProxy *p = signalProxy();
connect(p, SIGNAL(peerRemoved(QIODevice *)), this, SLOT(removeClient(QIODevice *)));
-
+
+ connect(p, SIGNAL(connected()), this, SLOT(clientsConnected()));
+ connect(p, SIGNAL(disconnected()), this, SLOT(clientsDisconnected()));
+
//p->attachSlot(SIGNAL(disconnectFromNetwork(NetworkId)), this, SLOT(disconnectFromNetwork(NetworkId))); // FIXME
p->attachSlot(SIGNAL(sendInput(BufferInfo, QString)), this, SLOT(msgFromClient(BufferInfo, QString)));
p->attachSignal(this, SIGNAL(displayMsg(Message)));
p->attachSignal(this, SIGNAL(identityCreated(const Identity &)));
p->attachSignal(this, SIGNAL(identityRemoved(IdentityId)));
p->attachSlot(SIGNAL(createIdentity(const Identity &)), this, SLOT(createIdentity(const Identity &)));
- p->attachSlot(SIGNAL(updateIdentity(const Identity &)), this, SLOT(updateIdentity(const Identity &)));
p->attachSlot(SIGNAL(removeIdentity(IdentityId)), this, SLOT(removeIdentity(IdentityId)));
p->attachSignal(this, SIGNAL(networkCreated(NetworkId)));
p->attachSignal(this, SIGNAL(networkRemoved(NetworkId)));
p->attachSlot(SIGNAL(createNetwork(const NetworkInfo &)), this, SLOT(createNetwork(const NetworkInfo &)));
- p->attachSlot(SIGNAL(updateNetwork(const NetworkInfo &)), this, SLOT(updateNetwork(const NetworkInfo &)));
p->attachSlot(SIGNAL(removeNetwork(NetworkId)), this, SLOT(removeNetwork(NetworkId)));
loadSettings();
QHash<BufferId, MsgId> lastSeenHash = Core::bufferLastSeenMsgIds(user());
foreach(BufferId id, lastSeenHash.keys())
_bufferSyncer->requestSetLastSeenMsg(id, lastSeenHash[id]);
-
+
connect(_bufferSyncer, SIGNAL(lastSeenMsgSet(BufferId, MsgId)), this, SLOT(storeBufferLastSeenMsg(BufferId, MsgId)));
connect(_bufferSyncer, SIGNAL(removeBufferRequested(BufferId)), this, SLOT(removeBufferRequested(BufferId)));
connect(this, SIGNAL(bufferRemoved(BufferId)), _bufferSyncer, SLOT(removeBuffer(BufferId)));
p->synchronize(_bufferSyncer);
- // init BacklogManager;
+ // init alias manager
+ p->synchronize(&aliasManager());
+
+ // init BacklogManager
p->synchronize(_backlogManager);
-
+
+ // init IrcListHelper
+ p->synchronize(ircListHelper());
+
+ // init CoreInfo
+ p->synchronize(&_coreInfo);
+
// Restore session state
if(restoreState) restoreSessionState();
}
}
-UserId CoreSession::user() const {
- return _user;
-}
-
CoreNetwork *CoreSession::network(NetworkId id) const {
if(_networks.contains(id)) return _networks[id];
return 0;
foreach(IdentityId id, s.identityIds()) {
Identity *i = new Identity(s.identity(id), this);
if(!i->isValid()) {
- qWarning() << QString("Invalid identity! Removing...");
+ qWarning() << "Invalid identity! Removing...";
s.removeIdentity(id);
delete i;
continue;
delete i;
continue;
}
+ connect(i, SIGNAL(updated(const QVariantMap &)), this, SLOT(identityUpdated(const QVariantMap &)));
_identities[i->id()] = i;
signalProxy()->synchronize(i);
}
void CoreSession::disconnectFromNetwork(NetworkId id) {
if(!_connections.contains(id))
return;
-
+
//_connections[id]->disconnectFromIrc();
_connections[id]->userInputHandler()->handleQuit(BufferInfo(), QString());
}
void CoreSession::networkStateRequested() {
}
-void CoreSession::addClient(QObject *dev) { // this is QObject* so we can use it in signal connections
- QIODevice *device = qobject_cast<QIODevice *>(dev);
+void CoreSession::addClient(QIODevice *device) {
if(!device) {
- qWarning() << "Invoking CoreSession::addClient with a QObject that is not a QIODevice!";
+ qCritical() << "Invoking CoreSession::addClient with a QObject that is not a QIODevice!";
} else {
+ // if the socket is an orphan, the signalProxy adopts it.
+ // -> we don't need to care about it anymore
+ device->setParent(0);
signalProxy()->addPeer(device);
QVariantMap reply;
reply["MsgType"] = "SessionInit";
}
}
+void CoreSession::addClient(SignalProxy *proxy) {
+ signalProxy()->addPeer(proxy);
+ emit sessionState(sessionState());
+}
+
void CoreSession::removeClient(QIODevice *iodev) {
- // no checks for validity check - privateslot...
QTcpSocket *socket = qobject_cast<QTcpSocket *>(iodev);
if(socket)
- qDebug() << qPrintable(tr("Client %1 disconnected (UserId: %2).").arg(socket->peerAddress().toString()).arg(user().toInt()));
- else
- qDebug() << "Local client disconnedted.";
- disconnect(socket, 0, this, 0);
- socket->deleteLater();
+ quInfo() << qPrintable(tr("Client")) << qPrintable(socket->peerAddress().toString()) << qPrintable(tr("disconnected (UserId: %1).").arg(user().toInt()));
}
SignalProxy *CoreSession::signalProxy() const {
signalProxy()->synchronize(newId);
CoreUserSettings s(user());
s.storeIdentity(*newId);
+ connect(newId, SIGNAL(updated(const QVariantMap &)), this, SLOT(identityUpdated(const QVariantMap &)));
emit identityCreated(*newId);
}
-void CoreSession::updateIdentity(const Identity &id) {
- if(!_identities.contains(id.id())) {
- qWarning() << "Update request for unknown identity received!";
- return;
- }
- _identities[id.id()]->update(id);
-
- CoreUserSettings s(user());
- s.storeIdentity(id);
-}
-
void CoreSession::removeIdentity(IdentityId id) {
Identity *i = _identities.take(id);
if(i) {
}
}
+void CoreSession::identityUpdated(const QVariantMap &data) {
+ IdentityId id = data.value("identityId", 0).value<IdentityId>();
+ if(!id.isValid() || !_identities.contains(id)) {
+ qWarning() << "Update request for unknown identity received!";
+ return;
+ }
+ CoreUserSettings s(user());
+ s.storeIdentity(*_identities.value(id));
+}
+
/*** Network Handling ***/
void CoreSession::createNetwork(const NetworkInfo &info_) {
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!";
- return;
+ _networks[info.networkId]->requestSetNetworkInfo(info);
}
- _networks[info.networkId]->setNetworkInfo(info);
- Core::updateNetwork(user(), info);
}
void CoreSession::removeNetwork(NetworkId 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();
}
qWarning() << "CoreSession::removeBufferRequested(): invalid BufferId:" << bufferId << "for User:" << user();
return;
}
-
+
if(bufferInfo.type() == BufferInfo::StatusBuffer) {
qWarning() << "CoreSession::removeBufferRequested(): Status Buffers cannot be removed!";
return;
}
-
+
if(bufferInfo.type() == BufferInfo::ChannelBuffer) {
CoreNetwork *net = network(bufferInfo.networkId());
if(!net) {
emit bufferRenamed(bufferId, newName);
}
}
+
+void CoreSession::clientsConnected() {
+ QHash<NetworkId, NetworkConnection *>::iterator conIter = _connections.begin();
+ Identity *identity = 0;
+ NetworkConnection *con = 0;
+ Network *network = 0;
+ IrcUser *me = 0;
+ QString awayReason;
+ while(conIter != _connections.end()) {
+ con = *conIter;
+ conIter++;
+
+ if(!con->isConnected())
+ continue;
+ identity = con->identity();
+ if(!identity)
+ continue;
+ network = con->network();
+ if(!network)
+ continue;
+ me = network->me();
+ if(!me)
+ continue;
+
+ if(identity->detachAwayEnabled() && me->isAway()) {
+ con->userInputHandler()->handleAway(BufferInfo(), QString());
+ }
+ }
+}
+
+void CoreSession::clientsDisconnected() {
+ QHash<NetworkId, NetworkConnection *>::iterator conIter = _connections.begin();
+ Identity *identity = 0;
+ NetworkConnection *con = 0;
+ Network *network = 0;
+ IrcUser *me = 0;
+ QString awayReason;
+ while(conIter != _connections.end()) {
+ con = *conIter;
+ conIter++;
+
+ if(!con->isConnected())
+ continue;
+ identity = con->identity();
+ if(!identity)
+ continue;
+ network = con->network();
+ if(!network)
+ continue;
+ me = network->me();
+ if(!me)
+ continue;
+
+ if(identity->detachAwayEnabled() && !me->isAway()) {
+ if(identity->detachAwayReasonEnabled())
+ awayReason = identity->detachAwayReason();
+ else
+ awayReason = identity->awayReason();
+ network->setAutoAwayActive(true);
+ con->userInputHandler()->handleAway(BufferInfo(), awayReason);
+ }
+ }
+}