Breaking protocol with alpha2.... and it won't be the last one...
authorMarcus Eggenberger <egs@quassel-irc.org>
Sat, 1 Mar 2008 18:12:43 +0000 (18:12 +0000)
committerMarcus Eggenberger <egs@quassel-irc.org>
Sat, 1 Mar 2008 18:12:43 +0000 (18:12 +0000)
- Minor improvements to the SignalProxy (renaming of objects)
- IrcUser objects are now killed, as soon as the user leaves our scope (no common channel)

src/common/ircuser.cpp
src/common/ircuser.h
src/common/network.cpp
src/common/network.h
src/common/signalproxy.cpp
src/common/signalproxy.h
src/common/syncableobject.cpp
src/common/syncableobject.h
version.inc

index c3c2d0c..efa7541 100644 (file)
@@ -226,12 +226,7 @@ void IrcUser::setNick(const QString &nick) {
 }
 
 void IrcUser::updateObjectName() {
-  QString newName = QString::number(network()->networkId().toInt()) + "/" + _nick;
-  QString oldName = objectName();
-  if(oldName != newName) {
-    setObjectName(newName);
-    emit renameObject(oldName, newName);
-  }
+  renameObject(QString::number(network()->networkId().toInt()) + "/" + _nick);
 }
 
 void IrcUser::updateHostmask(const QString &mask) {
@@ -264,6 +259,8 @@ void IrcUser::partChannel(IrcChannel *channel) {
     disconnect(channel, 0, this, 0);
     channel->part(this);
     emit channelParted(channel->name());
+    if(_channels.isEmpty())
+      deleteLater();
   }
 }
 
index 077cc6d..3235158 100644 (file)
@@ -129,8 +129,6 @@ signals:
   void userModeAdded(QString mode);
   void userModeRemoved(QString mode);
 
-  void renameObject(QString oldname, QString newname);
-
 //   void setUsermodes(const QSet<QString> &usermodes);
 //   QSet<QString> usermodes() const;
 
index c0de22e..c7343ca 100644 (file)
@@ -301,6 +301,21 @@ IrcUser *Network::newIrcUser(const QByteArray &hostmask) {
   return newIrcUser(decodeServerString(hostmask));
 }
 
+void Network::ircUserDestroyed() {
+  IrcUser *ircUser = static_cast<IrcUser *>(sender());
+  if(!ircUser)
+    return;
+
+  QHash<QString, IrcUser *>::iterator ircUserIter = _ircUsers.begin();
+  while(ircUserIter != _ircUsers.end()) {
+    if(ircUser == *ircUserIter) {
+      ircUserIter = _ircUsers.erase(ircUserIter);
+      break;
+    }
+    ircUserIter++;
+  }
+}
+
 void Network::removeIrcUser(IrcUser *ircuser) {
   QString nick = _ircUsers.key(ircuser);
   if(nick.isNull())
@@ -313,6 +328,12 @@ void Network::removeIrcUser(IrcUser *ircuser) {
   ircuser->deleteLater();
 }
 
+void Network::removeIrcUser(const QString &nick) {
+  IrcUser *ircuser;
+  if((ircuser = ircUser(nick)) != 0)
+    removeIrcUser(ircuser);
+}
+
 void Network::removeChansAndUsers() {
   QList<IrcUser *> users = ircUsers();
   foreach(IrcUser *user, users) {
@@ -324,12 +345,6 @@ void Network::removeChansAndUsers() {
   }
 }
 
-void Network::removeIrcUser(const QString &nick) {
-  IrcUser *ircuser;
-  if((ircuser = ircUser(nick)) != 0)
-    removeIrcUser(ircuser);
-}
-
 IrcUser *Network::ircUser(QString nickname) const {
   nickname = nickname.toLower();
   if(_ircUsers.contains(nickname))
index 29d5749..2bdda21 100644 (file)
@@ -208,6 +208,7 @@ public slots:
   void emitConnectionError(const QString &);
 
 private slots:
+  void ircUserDestroyed();
   void channelDestroyed();
   void removeIrcUser(IrcUser *ircuser);
   void removeIrcChannel(IrcChannel *ircChannel);
index f4fe0fb..794e878 100644 (file)
@@ -269,38 +269,9 @@ bool SignalProxy::addPeer(QIODevice* iodev) {
   return true;
 }
 
-void SignalProxy::removePeerBySender() {
-  // OK we're brutal here... but since it's a private slot we know what we've got connected to it...
-  QIODevice *ioDev = (QIODevice *)(sender());
-  removePeer(ioDev);
-  qDebug() << "Client disconnected.";
-}
-
-void SignalProxy::objectRenamed(QString oldname, QString newname) {
-  const QMetaObject *meta = sender()->metaObject();
-  const QByteArray className(meta->className());
-  objectRenamed(className, oldname, newname);
-
-  if(proxyMode() == Client)
-    return;
-  
-  QVariantList params;
-  params << "__objectRenamed__" << className << oldname << newname;
-  dispatchSignal(RpcCall, params);
-}
-
-void SignalProxy::objectRenamed(QByteArray classname, QString oldname, QString newname) {
-  if(_syncSlave.contains(classname) && _syncSlave[classname].contains(oldname) && oldname != newname) {
-    SyncableObject *obj = _syncSlave[classname][newname] = _syncSlave[classname].take(oldname);
-    if(!obj->isInitialized())
-      requestInit(obj);
-  }
-}
-
-
 void SignalProxy::removePeer(QIODevice* iodev) {
   if(_peerByteCount.isEmpty()) {
-    qWarning() << "SignalProxy: No peers in use!";
+    qWarning() << "SignalProxy::removePeer(): No peers in use!";
     return;
   }
 
@@ -321,14 +292,6 @@ void SignalProxy::removePeer(QIODevice* iodev) {
     return;
   }
 
-  // take a last gasp
-  while(true) {
-    QVariant var;
-    if(readDataFromDevice(iodev, _peerByteCount[iodev], var))
-      receivePeerSignal(iodev, var);
-    else
-      break;
-  }
   _peerByteCount.remove(iodev);
 
   disconnect(iodev, 0, this, 0);
@@ -338,6 +301,33 @@ void SignalProxy::removePeer(QIODevice* iodev) {
     emit disconnected();
 }
 
+void SignalProxy::removePeerBySender() {
+  // OK we're brutal here... but since it's a private slot we know what we've got connected to it...
+  QIODevice *ioDev = (QIODevice *)(sender());
+  removePeer(ioDev);
+  qDebug() << "Client disconnected.";
+}
+
+void SignalProxy::objectRenamed(const QString &newname, const QString &oldname) {
+  const QMetaObject *meta = sender()->metaObject();
+  const QByteArray className(meta->className());
+  objectRenamed(className, oldname, newname);
+
+  if(proxyMode() == Client)
+    return;
+  
+  QVariantList params;
+  params << "__objectRenamed__" << className << newname << oldname;
+  dispatchSignal(RpcCall, params);
+}
+
+void SignalProxy::objectRenamed(const QByteArray &classname, const QString &newname, const QString &oldname) {
+  if(_syncSlave.contains(classname) && _syncSlave[classname].contains(oldname) && oldname != newname) {
+    SyncableObject *obj = _syncSlave[classname][newname] = _syncSlave[classname].take(oldname);
+    requestInit(obj);
+  }
+}
+
 void SignalProxy::setArgTypes(QObject* obj, int methodId) {
   const QMetaObject *meta = obj->metaObject();
   QList<QByteArray> p = meta->method(methodId).parameterTypes();
@@ -507,9 +497,7 @@ void SignalProxy::synchronize(SyncableObject *obj) {
   _syncSlave[className][obj->objectName()] = obj;
 
   if(proxyMode() == Server) {
-    if(obj->metaObject()->indexOfSignal(QMetaObject::normalizedSignature("renameObject(QString, QString)")) != -1)
-      connect(obj, SIGNAL(renameObject(QString, QString)), this, SLOT(objectRenamed(QString, QString)));
-
+    connect(obj, SIGNAL(objectRenamed(QString, QString)), this, SLOT(objectRenamed(QString, QString)));
     setInitialized(obj);
   } else {
     requestInit(obj);
index e5bd0f6..f4d6166 100644 (file)
@@ -113,8 +113,8 @@ private slots:
   void dataAvailable();
   void detachSender();
   void removePeerBySender();
-  void objectRenamed(QString oldname, QString newname);
-  void objectRenamed(QByteArray classname, QString oldname, QString newname);
+  void objectRenamed(const QString &newname, const QString &oldname);
+  void objectRenamed(const QByteArray &classname, const QString &newname, const QString &oldname);
   void sendHeartBeat();
 
 signals:
index 668f61c..ee871b8 100644 (file)
@@ -96,3 +96,11 @@ bool SyncableObject::setInitValue(const QString &property, const QVariant &value
   QGenericArgument param(value.typeName(), value.constData());
   return QMetaObject::invokeMethod(this, handlername.toAscii(), param);
 }
+
+void SyncableObject::renameObject(const QString &newName) {
+  const QString oldName = objectName();
+  if(oldName != newName) {
+    setObjectName(newName);
+    emit objectRenamed(newName, oldName);
+  }
+}
index 04ba44b..1eb8ed4 100644 (file)
 class SyncableObject : public QObject {
   Q_OBJECT
 
-  public:
-    SyncableObject(QObject *parent = 0);
-    SyncableObject(const SyncableObject &other, QObject *parent = 0);
+public:
+  SyncableObject(QObject *parent = 0);
+  SyncableObject(const SyncableObject &other, QObject *parent = 0);
 
-    //! Stores the object's state into a QVariantMap.
-    /** The default implementation takes dynamic properties as well as getters that have
-     *  names starting with "init" and stores them in a QVariantMap. Override this method in
-     *  derived classes in order to store the object state in a custom form.
-     *  \note  This is used by SignalProxy to transmit the state of the object to clients
-     *         that request the initial object state. Later updates use a different mechanism
-     *         and assume that the state is completely covered by properties and init* getters.
-     *         DO NOT OVERRIDE THIS unless you know exactly what you do!
-     *
-     *  \return The object's state in a QVariantMap
-     */
-    virtual QVariantMap toVariantMap();
+  //! Stores the object's state into a QVariantMap.
+  /** The default implementation takes dynamic properties as well as getters that have
+   *  names starting with "init" and stores them in a QVariantMap. Override this method in
+   *  derived classes in order to store the object state in a custom form.
+   *  \note  This is used by SignalProxy to transmit the state of the object to clients
+   *         that request the initial object state. Later updates use a different mechanism
+   *         and assume that the state is completely covered by properties and init* getters.
+   *         DO NOT OVERRIDE THIS unless you know exactly what you do!
+   *
+   *  \return The object's state in a QVariantMap
+   */
+  virtual QVariantMap toVariantMap();
+  
+  //! Initialize the object's state from a given QVariantMap.
+  /** \see toVariantMap() for important information concerning this method.
+   */
+  virtual void fromVariantMap(const QVariantMap &map);
 
-    //! Initialize the object's state from a given QVariantMap.
-    /** \see toVariantMap() for important information concerning this method.
-     */
-    virtual void fromVariantMap(const QVariantMap &map);
+  virtual bool isInitialized() const;
 
-    virtual bool isInitialized() const;
+public slots:
+  virtual void setInitialized();
 
-  public slots:
-    virtual void setInitialized();
+protected:
+  void renameObject(const QString &newName);
+  
+signals:
+  void initDone();
+  void updatedRemotely();
+  void objectRenamed(QString newName, QString oldName);
 
-  signals:
-    void initDone();
-    void updatedRemotely();
-
-  private:
-    bool setInitValue(const QString &property, const QVariant &value);
-
-    bool _initialized;
+private:
+  bool setInitValue(const QString &property, const QVariant &value);
+  
+  bool _initialized;
 
 };
 
index 5112603..a8db9df 100644 (file)
@@ -3,16 +3,16 @@
 
 { using namespace Global;
 
-  quasselVersion = "0.2.0-alpha2";
+  quasselVersion = "0.2.0-alpha3-pre";
   quasselDate = "2008-03-01";
-  quasselBuild = 603;
+  quasselBuild = 605;
 
   //! Minimum client build number the core needs
-  clientBuildNeeded = 563;
+  clientBuildNeeded = 605;
   clientVersionNeeded = quasselVersion;
 
   //! Minimum core build number the client needs
-  coreBuildNeeded = 563;
+  coreBuildNeeded = 605;
   coreVersionNeeded = quasselVersion;
 
 }