From 0268b7f62826dc48155866f7f27b2987449a29f5 Mon Sep 17 00:00:00 2001 From: Marcus Eggenberger Date: Tue, 5 Feb 2008 11:35:42 +0000 Subject: [PATCH] fixed inconsistency issues. Upgrade and Distclean is strongly recommended --- src/client/networkmodel.cpp | 15 +++++++++++++-- src/client/networkmodel.h | 2 ++ src/common/ircchannel.cpp | 4 ++-- src/common/ircuser.cpp | 2 -- src/common/network.cpp | 33 ++++++++++++++++++++++++++++++++- src/common/network.h | 6 +++++- src/core/ircserverhandler.cpp | 6 ------ version.inc | 6 +++--- 8 files changed, 57 insertions(+), 17 deletions(-) diff --git a/src/client/networkmodel.cpp b/src/client/networkmodel.cpp index f40b7268..7148046d 100644 --- a/src/client/networkmodel.cpp +++ b/src/client/networkmodel.cpp @@ -179,6 +179,13 @@ QString BufferItem::topic() const { return QString(); } +void BufferItem::ircUserDestroyed() { + // PRIVATE + IrcUser *ircUser = static_cast(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 { diff --git a/src/client/networkmodel.h b/src/client/networkmodel.h index 63eb5696..244b99b4 100644 --- a/src/client/networkmodel.h +++ b/src/client/networkmodel.h @@ -101,6 +101,7 @@ public slots: private slots: void ircChannelDestroyed(); + void ircUserDestroyed(); private: BufferInfo _bufferInfo; @@ -203,6 +204,7 @@ private slots: private: QPointer _ircUser; + quint64 _id; }; diff --git a/src/common/ircchannel.cpp b/src/common/ircchannel.cpp index edb2c710..0587697c 100644 --- a/src/common/ircchannel.cpp +++ b/src/common/ircchannel.cpp @@ -244,8 +244,8 @@ void IrcChannel::ircUserDestroyed() { IrcUser *ircUser = static_cast(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) { diff --git a/src/common/ircuser.cpp b/src/common/ircuser.cpp index 64f5d323..223a02f5 100644 --- a/src/common/ircuser.cpp +++ b/src/common/ircuser.cpp @@ -280,10 +280,8 @@ void IrcUser::partChannel(const QString &channelname) { void IrcUser::channelDestroyed() { // private slot! IrcChannel *channel = static_cast(sender()); - Q_ASSERT(channel); if(_channels.contains(channel)) { _channels.remove(channel); - disconnect(channel, 0, this, 0); } } diff --git a/src/common/network.cpp b/src/common/network.cpp index 17db37d9..fa87a30b 100644 --- a/src/common/network.cpp +++ b/src/common/network.cpp @@ -241,7 +241,18 @@ void Network::removeIrcUser(IrcUser *ircuser) { ircuser->deleteLater(); } -void Network::removeIrcUser(QString nick) { +void Network::removeChansAndUsers() { + QList users = ircUsers(); + foreach(IrcUser *user, users) { + removeIrcUser(user); + } + QList 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 ¤tServer) { 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(sender()); Q_ASSERT(channel); diff --git a/src/common/network.h b/src/common/network.h index d44319ca..b86b51e7 100644 --- a/src/common/network.h +++ b/src/common/network.h @@ -138,7 +138,8 @@ public slots: void removeSupport(const QString ¶m); 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 *); diff --git a/src/core/ircserverhandler.cpp b/src/core/ircserverhandler.cpp index 09b53d30..17538801 100644 --- a/src/core/ircserverhandler.cpp +++ b/src/core/ircserverhandler.cpp @@ -326,12 +326,6 @@ void IrcServerHandler::handlePrivmsg(QString prefix, QList 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 params) { diff --git a/version.inc b/version.inc index 81cc2488..31b1f4fd 100644 --- a/version.inc +++ b/version.inc @@ -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; } -- 2.20.1