- _coreInfo(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->attachSignal(this, SIGNAL(displayMsg(Message)));
- p->attachSignal(this, SIGNAL(displayStatusMsg(QString, QString)));
- p->attachSignal(this, SIGNAL(bufferInfoUpdated(BufferInfo)));
-
- 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();
- initScriptEngine();
-
- // init BufferSyncer
- 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)));
- connect(this, SIGNAL(bufferRenamed(BufferId, QString)), _bufferSyncer, SLOT(renameBuffer(BufferId, QString)));
- p->synchronize(_bufferSyncer);
-
-
- // 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();
-
- emit initialized();
-}
-
-CoreSession::~CoreSession() {
- saveSessionState();
- foreach(NetworkConnection *conn, _connections.values()) {
- delete conn;
- }
- foreach(CoreNetwork *net, _networks.values()) {
- delete net;
- }
-}
-
-UserId CoreSession::user() const {
- return _user;
-}
-
-CoreNetwork *CoreSession::network(NetworkId id) const {
- if(_networks.contains(id)) return _networks[id];
- return 0;
-}
-
-NetworkConnection *CoreSession::networkConnection(NetworkId id) const {
- if(_connections.contains(id)) return _connections[id];
- return 0;
-}
-
-Identity *CoreSession::identity(IdentityId id) const {
- if(_identities.contains(id)) return _identities[id];
- return 0;
-}
-
-void CoreSession::loadSettings() {
- CoreUserSettings s(user());
-
- foreach(IdentityId id, s.identityIds()) {
- Identity *i = new Identity(s.identity(id), this);
- if(!i->isValid()) {
- quWarning() << "Invalid identity! Removing...";
- s.removeIdentity(id);
- delete i;
- continue;
- }
- if(_identities.contains(i->id())) {
- quWarning() << "Duplicate identity, ignoring!";
- delete i;
- continue;
+ _networkConfig(new CoreNetworkConfig("GlobalNetworkConfig", this)),
+ _coreInfo(new CoreInfo(this)),
+ _transferManager(new CoreTransferManager(this)),
+ _eventManager(new CoreEventManager(this)),
+ _eventStringifier(new EventStringifier(this)),
+ _sessionEventProcessor(new CoreSessionEventProcessor(this)),
+ _ctcpParser(new CtcpParser(this)),
+ _ircParser(new IrcParser(this)),
+ scriptEngine(new QScriptEngine(this)),
+ _processMessages(false),
+ _ignoreListManager(this),
+ _highlightRuleManager(this)
+{
+ SignalProxy *p = signalProxy();
+ p->setHeartBeatInterval(30);
+ p->setMaxHeartBeatCount(60); // 30 mins until we throw a dead socket out
+
+ connect(p, &SignalProxy::peerRemoved, this, &CoreSession::removeClient);
+
+ connect(p, &SignalProxy::connected, this, &CoreSession::clientsConnected);
+ connect(p, &SignalProxy::disconnected, this, &CoreSession::clientsDisconnected);
+
+ p->attachSlot(SIGNAL(sendInput(BufferInfo, QString)), this, SLOT(msgFromClient(BufferInfo, QString)));
+ p->attachSignal(this, SIGNAL(displayMsg(Message)));
+ p->attachSignal(this, SIGNAL(displayStatusMsg(QString, QString)));
+
+ p->attachSignal(this, SIGNAL(identityCreated(const Identity &)));
+ p->attachSignal(this, SIGNAL(identityRemoved(IdentityId)));
+ p->attachSlot(SIGNAL(createIdentity(const Identity &, const QVariantMap &)), this, SLOT(createIdentity(const Identity &, const QVariantMap &)));
+ 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 &, const QStringList &)), this, SLOT(createNetwork(const NetworkInfo &, const QStringList &)));
+ p->attachSlot(SIGNAL(removeNetwork(NetworkId)), this, SLOT(removeNetwork(NetworkId)));
+
+ p->attachSlot(SIGNAL(changePassword(PeerPtr,QString,QString,QString)), this, SLOT(changePassword(PeerPtr,QString,QString,QString)));
+ p->attachSignal(this, SIGNAL(passwordChanged(PeerPtr,bool)));
+
+ p->attachSlot(SIGNAL(kickClient(int)), this, SLOT(kickClient(int)));
+ p->attachSignal(this, SIGNAL(disconnectFromCore()));
+
+ QVariantMap data;
+ data["quasselVersion"] = Quassel::buildInfo().fancyVersionString;
+ data["quasselBuildDate"] = Quassel::buildInfo().commitDate; // "BuildDate" for compatibility
+ data["startTime"] = Core::instance()->startTime();
+ data["sessionConnectedClients"] = 0;
+ _coreInfo->setCoreData(data);
+
+ loadSettings();
+ initScriptEngine();
+
+ eventManager()->registerObject(ircParser(), EventManager::NormalPriority);
+ eventManager()->registerObject(sessionEventProcessor(), EventManager::HighPriority); // needs to process events *before* the stringifier!
+ eventManager()->registerObject(ctcpParser(), EventManager::NormalPriority);
+ eventManager()->registerObject(eventStringifier(), EventManager::NormalPriority);
+ eventManager()->registerObject(this, EventManager::LowPriority); // for sending MessageEvents to the client
+ // some events need to be handled after msg generation
+ eventManager()->registerObject(sessionEventProcessor(), EventManager::LowPriority, "lateProcess");
+ eventManager()->registerObject(ctcpParser(), EventManager::LowPriority, "send");
+
+ // periodically save our session state
+ connect(Core::instance()->syncTimer(), &QTimer::timeout, this, &CoreSession::saveSessionState);
+
+ p->synchronize(_bufferSyncer);
+ p->synchronize(&aliasManager());
+ p->synchronize(_backlogManager);
+ p->synchronize(dccConfig());
+ p->synchronize(ircListHelper());
+ p->synchronize(networkConfig());
+ p->synchronize(_coreInfo);
+ p->synchronize(&_ignoreListManager);
+ p->synchronize(&_highlightRuleManager);
+ // Listen to network removed events
+ connect(this, &CoreSession::networkRemoved,
+ &_highlightRuleManager, &HighlightRuleManager::networkRemoved);
+ p->synchronize(transferManager());
+ // Restore session state
+ if (restoreState)
+ restoreSessionState();
+
+ emit initialized();
+}
+
+
+void CoreSession::shutdown()
+{
+ saveSessionState();
+
+ // Request disconnect from all connected networks in parallel, and wait until every network
+ // has emitted the disconnected() signal before deleting the session itself
+ for (CoreNetwork *net : _networks.values()) {
+ if (net->socketState() != QAbstractSocket::UnconnectedState) {
+ _networksPendingDisconnect.insert(net->networkId());
+ connect(net, SIGNAL(disconnected(NetworkId)), this, SLOT(onNetworkDisconnected(NetworkId)));
+ net->shutdown();
+ }