figured this would probably be a good Idea for the ircusers too
authorMarcus Eggenberger <egs@quassel-irc.org>
Fri, 30 Nov 2007 13:15:30 +0000 (13:15 +0000)
committerMarcus Eggenberger <egs@quassel-irc.org>
Fri, 30 Nov 2007 13:15:30 +0000 (13:15 +0000)
src/common/ircuser.cpp
src/common/ircuser.h
src/common/networkinfo.cpp
src/common/networkinfo.h

index a6146c5..01bc963 100644 (file)
@@ -70,7 +70,12 @@ QString IrcUser::userModes() const {
 }
 
 QStringList IrcUser::channels() const {
 }
 
 QStringList IrcUser::channels() const {
-  return _channels.toList();
+  QStringList chanList;
+  IrcChannel *channel;
+  foreach(channel, _channels) {
+    chanList << channel->name();
+  }
+  return chanList;
 }
 
 // ====================
 }
 
 // ====================
@@ -118,22 +123,45 @@ void IrcUser::updateHostmask(const QString &mask) {
   setHost(host);
 }
 
   setHost(host);
 }
 
-void IrcUser::joinChannel(const QString &channel) {
+void IrcUser::joinChannel(IrcChannel *channel) {
+  Q_ASSERT(channel);
   if(!_channels.contains(channel)) {
   if(!_channels.contains(channel)) {
+    channel->join(this);
+    connect(channel, SIGNAL(destroyed()), this, SLOT(channelDestroyed()));
     _channels.insert(channel);
     _channels.insert(channel);
-    networkInfo->newIrcChannel(channel)->join(this);
-    emit channelJoined(channel);
+    emit channelJoined(channel->name());
   }
 }
 
   }
 }
 
-void IrcUser::partChannel(const QString &channel) {
+void IrcUser::joinChannel(const QString &channelname) {
+  joinChannel(networkInfo->newIrcChannel(channelname));
+}
+
+void IrcUser::partChannel(IrcChannel *channel) {
   if(_channels.contains(channel)) {
     _channels.remove(channel);
   if(_channels.contains(channel)) {
     _channels.remove(channel);
+    disconnect(channel, 0, this, 0);
+    channel->part(this);
+    emit channelParted(channel->name());
+  }
+}
 
 
-    Q_ASSERT(networkInfo->ircChannel(channel));
-    networkInfo->ircChannel(channel)->part(this);
-    
-    emit channelParted(channel);
+void IrcUser::partChannel(const QString &channelname) {
+  IrcChannel *channel = networkInfo->ircChannel(channelname);
+  if(channel == 0) {
+    qWarning() << "IrcUser::partChannel(): received part for unknown Channel" << channelname;
+  } else {
+    partChannel(channel);
+  }
+}
+
+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 cba3d03..e933fb6 100644 (file)
@@ -63,9 +63,11 @@ public slots:
   void updateHostmask(const QString &mask);
 
   void setUserModes(const QString &modes);
   void updateHostmask(const QString &mask);
 
   void setUserModes(const QString &modes);
-
-  void joinChannel(const QString &channel);
-  void partChannel(const QString &channel);
+  
+  void joinChannel(IrcChannel *channel);
+  void joinChannel(const QString &channelname);
+  void partChannel(IrcChannel *channel);
+  void partChannel(const QString &channelname);
 
   void addUserMode(const QString &mode);
   void removeUserMode(const QString &mode);
 
   void addUserMode(const QString &mode);
   void removeUserMode(const QString &mode);
@@ -81,7 +83,6 @@ signals:
   void nickSet(QString newnick);
   void hostmaskUpdated(QString mask);
   
   void nickSet(QString newnick);
   void hostmaskUpdated(QString mask);
   
-  void channelsSet(QStringList channels);
   void userModesSet(QString modes);
   
   void channelJoined(QString channel);
   void userModesSet(QString modes);
   
   void channelJoined(QString channel);
@@ -99,6 +100,7 @@ signals:
 
 private slots:
   void updateObjectName();
 
 private slots:
   void updateObjectName();
+  void channelDestroyed();
   
 private:
   inline bool operator==(const IrcUser &ircuser2) {
   
 private:
   inline bool operator==(const IrcUser &ircuser2) {
@@ -115,7 +117,8 @@ private:
   QString _user;
   QString _host;
 
   QString _user;
   QString _host;
 
-  QSet<QString> _channels;
+  // QSet<QString> _channels;
+  QSet<IrcChannel *> _channels;
   QString _userModes;
   
   NetworkInfo *networkInfo;
   QString _userModes;
   
   NetworkInfo *networkInfo;
index 918be51..6fc8359 100644 (file)
@@ -163,7 +163,7 @@ QString NetworkInfo::support(const QString &param) const {
 }
 
 IrcUser *NetworkInfo::newIrcUser(const QString &hostmask) {
 }
 
 IrcUser *NetworkInfo::newIrcUser(const QString &hostmask) {
-  QString nick(nickFromMask(hostmask));
+  QString nick(nickFromMask(hostmask).toLower());
   if(!_ircUsers.contains(nick)) {
     IrcUser *ircuser = new IrcUser(hostmask, this);
     // mark IrcUser as already initialized to keep the SignalProxy from requesting initData
   if(!_ircUsers.contains(nick)) {
     IrcUser *ircuser = new IrcUser(hostmask, this);
     // mark IrcUser as already initialized to keep the SignalProxy from requesting initData
@@ -180,7 +180,7 @@ IrcUser *NetworkInfo::newIrcUser(const QString &hostmask) {
     _ircUsers[nick] = ircuser;
     emit ircUserAdded(hostmask);
   }
     _ircUsers[nick] = ircuser;
     emit ircUserAdded(hostmask);
   }
-  return  _ircUsers[nick];
+  return _ircUsers[nick];
 }
 
 void NetworkInfo::removeIrcUser(IrcUser *ircuser) {
 }
 
 void NetworkInfo::removeIrcUser(IrcUser *ircuser) {
@@ -199,7 +199,8 @@ void NetworkInfo::removeIrcUser(QString nick) {
     removeIrcUser(ircuser);
 }
 
     removeIrcUser(ircuser);
 }
 
-IrcUser *NetworkInfo::ircUser(const QString &nickname) const {
+IrcUser *NetworkInfo::ircUser(QString nickname) const {
+  nickname = nickname.toLower();
   if(_ircUsers.contains(nickname))
     return _ircUsers[nickname];
   else
   if(_ircUsers.contains(nickname))
     return _ircUsers[nickname];
   else
@@ -210,9 +211,8 @@ QList<IrcUser *> NetworkInfo::ircUsers() const {
   return _ircUsers.values();
 }
 
   return _ircUsers.values();
 }
 
-IrcChannel *NetworkInfo::newIrcChannel(QString channelname) {
-  channelname = channelname.toLower();
-  if(!_ircChannels.contains(channelname)) {
+IrcChannel *NetworkInfo::newIrcChannel(const QString &channelname) {
+  if(!_ircChannels.contains(channelname.toLower())) {
     IrcChannel *channel = new IrcChannel(channelname, this);
     // mark IrcUser as already initialized to keep the SignalProxy from requesting initData
     if(initialized())
     IrcChannel *channel = new IrcChannel(channelname, this);
     // mark IrcUser as already initialized to keep the SignalProxy from requesting initData
     if(initialized())
@@ -225,10 +225,10 @@ IrcChannel *NetworkInfo::newIrcChannel(QString channelname) {
 
     connect(channel, SIGNAL(initDone()), this, SIGNAL(ircChannelInitDone()));
     connect(channel, SIGNAL(destroyed()), this, SLOT(channelDestroyed()));
 
     connect(channel, SIGNAL(initDone()), this, SIGNAL(ircChannelInitDone()));
     connect(channel, SIGNAL(destroyed()), this, SLOT(channelDestroyed()));
-    _ircChannels[channelname] = channel;
+    _ircChannels[channelname.toLower()] = channel;
     emit ircChannelAdded(channelname);
   }
     emit ircChannelAdded(channelname);
   }
-  return _ircChannels[channelname];
+  return _ircChannels[channelname.toLower()];
 }
 
 
 }
 
 
index 278053d..e27c66b 100644 (file)
@@ -73,10 +73,10 @@ public:
   QString support(const QString &param) const;
   
   IrcUser *newIrcUser(const QString &hostmask);
   QString support(const QString &param) const;
   
   IrcUser *newIrcUser(const QString &hostmask);
-  IrcUser *ircUser(const QString &nickname) const;
+  IrcUser *ircUser(QString nickname) const;
   QList<IrcUser *> ircUsers() const;
   
   QList<IrcUser *> ircUsers() const;
   
-  IrcChannel *newIrcChannel(QString channelname);
+  IrcChannel *newIrcChannel(const QString &channelname);
   IrcChannel *ircChannel(QString channelname);
   QList<IrcChannel *> ircChannels() const;
 
   IrcChannel *ircChannel(QString channelname);
   QList<IrcChannel *> ircChannels() const;