fixed inconsistency issues. Upgrade and Distclean is strongly recommended
authorMarcus Eggenberger <egs@quassel-irc.org>
Tue, 5 Feb 2008 11:35:42 +0000 (11:35 +0000)
committerMarcus Eggenberger <egs@quassel-irc.org>
Tue, 5 Feb 2008 11:35:42 +0000 (11:35 +0000)
src/client/networkmodel.cpp
src/client/networkmodel.h
src/common/ircchannel.cpp
src/common/ircuser.cpp
src/common/network.cpp
src/common/network.h
src/core/ircserverhandler.cpp
version.inc

index f40b726..7148046 100644 (file)
@@ -179,6 +179,13 @@ QString BufferItem::topic() const {
     return QString();
 }
 
+void BufferItem::ircUserDestroyed() {
+  // PRIVATE
+  IrcUser *ircUser = static_cast<IrcUser *>(sender());
+  removeUserFromCategory(ircUser);
+  emit dataChanged(2);
+}
+
 int BufferItem::nickCount() const {
   if(_ircChannel)
     return _ircChannel->ircUsers().count();
@@ -196,6 +203,8 @@ void BufferItem::join(IrcUser *ircUser) {
     return;
 
   addUserToCategory(ircUser);
+  connect(ircUser, SIGNAL(destroyed()),
+         this, SLOT(ircUserDestroyed()));
   emit dataChanged(2);
 }
 
@@ -222,6 +231,7 @@ void BufferItem::part(IrcUser *ircUser) {
     return;
   }
 
+  disconnect(ircUser, 0, this, 0);
   removeUserFromCategory(ircUser);
   emit dataChanged(2);
 }
@@ -460,7 +470,8 @@ QVariant UserCategoryItem::data(int column, int role) const {
 *****************************************/
 IrcUserItem::IrcUserItem(IrcUser *ircUser, AbstractTreeItem *parent)
   : PropertyMapItem(QStringList() << "nickName", parent),
-    _ircUser(ircUser)
+    _ircUser(ircUser),
+    _id(qHash(ircUser))
 {
   // we don't need to handle the ircUser's destroyed signal since it's automatically removed
   // by the IrcChannel::ircUserParted();
@@ -488,7 +499,7 @@ IrcUser *IrcUserItem::ircUser() {
 }
 
 quint64 IrcUserItem::id() const {
-  return qHash((IrcUser *)_ircUser);
+  return _id;
 }
 
 QVariant IrcUserItem::data(int column, int role) const {
index 63eb569..244b99b 100644 (file)
@@ -101,6 +101,7 @@ public slots:
                                         
 private slots:
   void ircChannelDestroyed();
+  void ircUserDestroyed();
   
 private:
   BufferInfo _bufferInfo;
@@ -203,6 +204,7 @@ private slots:
 
 private:
   QPointer<IrcUser> _ircUser;
+  quint64 _id;
 };
 
 
index edb2c71..0587697 100644 (file)
@@ -244,8 +244,8 @@ void IrcChannel::ircUserDestroyed() {
   IrcUser *ircUser = static_cast<IrcUser *>(sender());
   Q_ASSERT(ircUser);
   _userModes.remove(ircUser);
-  emit ircUserParted(ircUser);
-  //qDebug() << "DEST" << name() << ircUsers().count();
+  // no further propagation.
+  // this leads only to fuck ups.
 }
 
 void IrcChannel::ircUserNickSet(QString nick) {
index 64f5d32..223a02f 100644 (file)
@@ -280,10 +280,8 @@ void IrcUser::partChannel(const QString &channelname) {
 void IrcUser::channelDestroyed() {
   // private slot!
   IrcChannel *channel = static_cast<IrcChannel*>(sender());
-  Q_ASSERT(channel);
   if(_channels.contains(channel)) {
     _channels.remove(channel);
-    disconnect(channel, 0, this, 0);
   }
 }
 
index 17db37d..fa87a30 100644 (file)
@@ -241,7 +241,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 +378,8 @@ void Network::setCurrentServer(const QString &currentServer) {
 
 void Network::setConnected(bool connected) {
   _connected = connected;
+  if(!connected)
+    removeChansAndUsers();
   emit connectedSet(connected);
 }
 
@@ -497,6 +510,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);
index d44319c..b86b51e 100644 (file)
@@ -138,7 +138,8 @@ public slots:
   void removeSupport(const QString &param);
 
   inline void addIrcUser(const QString &hostmask) { newIrcUser(hostmask); }
-  void removeIrcUser(QString nick);
+  void removeIrcUser(const QString &nick);
+  void removeIrcChannel(const QString &channel);
   
   //init geters
   QVariantMap initSupports() const;
@@ -166,6 +167,8 @@ public slots:
 private slots:
   void channelDestroyed();
   void removeIrcUser(IrcUser *ircuser);
+  void removeIrcChannel(IrcChannel *ircChannel);
+  void removeChansAndUsers();
   void ircUserInitDone();
   void ircChannelInitDone();
 
@@ -193,6 +196,7 @@ signals:
   void ircChannelAdded(IrcChannel *);
 
   void ircUserRemoved(const QString &nick);
+  void ircChannelRemoved(const QString &channel);
 
   // needed for client sync progress
   void ircUserRemoved(QObject *);
index 09b53d3..1753880 100644 (file)
@@ -326,12 +326,6 @@ void IrcServerHandler::handlePrivmsg(QString prefix, QList<QByteArray> params) {
   // it's possible to pack multiple privmsgs into one param using ctcp
   // - > we let the ctcpHandler do the work
   networkConnection->ctcpHandler()->parse(Message::Plain, prefix, target, userDecode(ircuser->nick(), params[1]));
-//   QStringList messages = 
-
-//   foreach(QString message, messages) {
-//     emit displayMsg(Message::Plain, target, message, prefix);
-//   }
-  
 }
 
 void IrcServerHandler::handleQuit(QString prefix, QList<QByteArray> params) {
index 81cc248..31b1f4f 100644 (file)
@@ -5,14 +5,14 @@
 
   quasselVersion = "0.2.0-pre";
   quasselDate = "2008-02-05";
-  quasselBuild = 459;
+  quasselBuild = 461;
 
   //! Minimum client build number the core needs
-  clientBuildNeeded = 459;
+  clientBuildNeeded = 461;
   clientVersionNeeded = quasselVersion;
 
   //! Minimum core build number the client needs
-  coreBuildNeeded = 459;
+  coreBuildNeeded = 461;
   coreVersionNeeded = quasselVersion;
 
 }