X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fcoresession.cpp;h=b57685420a27cdd65a1e45c3945bb4b29719b631;hp=94cf39eb8fa8bb2a62f4024f74c8b2f099e478cc;hb=ef12cc4010e853348474b4ea15c383dd596d4858;hpb=464a20552a20ff976ef4d696f69bc73b389886ad diff --git a/src/core/coresession.cpp b/src/core/coresession.cpp index 94cf39eb..b5768542 100644 --- a/src/core/coresession.cpp +++ b/src/core/coresession.cpp @@ -248,8 +248,12 @@ void CoreSession::networkConnected(NetworkId networkid) { // 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) { @@ -392,19 +396,25 @@ void CoreSession::createNetwork(const NetworkInfo &info_) { 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)) { + 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); + } else { + qWarning() << qPrintable(tr("CoreSession::createNetwork(): Trying to create a network that already exists, updating instead!")); + updateNetwork(info); + } } void CoreSession::updateNetwork(const NetworkInfo &info) { @@ -433,7 +443,10 @@ void CoreSession::removeNetwork(NetworkId id) { } 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(); + } Network *net = _networks.take(id); if(net && Core::removeNetwork(user(), id)) { emit networkRemoved(id); @@ -455,7 +468,10 @@ void CoreSession::removeBufferRequested(BufferId bufferId) { if(bufferInfo.type() == BufferInfo::ChannelBuffer) { Network *net = network(bufferInfo.networkId()); - Q_ASSERT(net); + 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();