Networks can now be removed even when they're connected.
[quassel.git] / src / common / network.cpp
index 17db37d..0d367af 100644 (file)
@@ -51,6 +51,7 @@ Network::Network(const NetworkId &networkid, QObject *parent) : SyncableObject(p
 // I think this is unnecessary since IrcUsers have us as their daddy :)
 
 Network::~Network() {
+  emit aboutToBeDestroyed();
 //  QHashIterator<QString, IrcUser *> ircuser(_ircUsers);
 //  while (ircuser.hasNext()) {
 //    ircuser.next();
@@ -241,7 +242,18 @@ void Network::removeIrcUser(IrcUser *ircuser) {
   ircuser->deleteLater();
 }
 
-void Network::removeIrcUser(QString nick) {
+void Network::removeChansAndUsers() {
+  QList<IrcUser *> users = ircUsers();
+  foreach(IrcUser *user, users) {
+    removeIrcUser(user);
+  }
+  QList<IrcChannel *> channels = ircChannels();
+  foreach(IrcChannel *channel, channels) {
+    removeIrcChannel(channel);
+  }
+}
+
+void Network::removeIrcUser(const QString &nick) {
   IrcUser *ircuser;
   if((ircuser = ircUser(nick)) != 0)
     removeIrcUser(ircuser);
@@ -367,6 +379,8 @@ void Network::setCurrentServer(const QString &currentServer) {
 
 void Network::setConnected(bool connected) {
   _connected = connected;
+  if(!connected)
+    removeChansAndUsers();
   emit connectedSet(connected);
 }
 
@@ -497,6 +511,24 @@ void Network::ircChannelInitDone() {
   emit ircChannelInitDone(ircchannel);
 }
 
+void Network::removeIrcChannel(IrcChannel *channel) {
+  QString chanName = _ircChannels.key(channel);
+  if(chanName.isNull())
+    return;
+  
+  _ircChannels.remove(chanName);
+  disconnect(channel, 0, this, 0);
+  emit ircChannelRemoved(chanName);
+  emit ircChannelRemoved(channel);
+  channel->deleteLater();
+}
+
+void Network::removeIrcChannel(const QString &channel) {
+  IrcChannel *chan;
+  if((chan = ircChannel(channel)) != 0)
+    removeIrcChannel(chan);
+}
+
 void Network::channelDestroyed() {
   IrcChannel *channel = static_cast<IrcChannel *>(sender());
   Q_ASSERT(channel);