clean up
authorMarcus Eggenberger <egs@quassel-irc.org>
Mon, 24 Aug 2009 16:42:55 +0000 (18:42 +0200)
committerMarcus Eggenberger <egs@quassel-irc.org>
Mon, 24 Aug 2009 19:54:07 +0000 (21:54 +0200)
src/common/signalproxy.cpp
src/common/signalproxy.h
src/common/syncableobject.cpp
src/common/syncableobject.h

index 89b434b..a738715 100644 (file)
@@ -231,6 +231,17 @@ SignalProxy::SignalProxy(ProxyMode mode, QIODevice* device, QObject* parent)
 }
 
 SignalProxy::~SignalProxy() {
+  QList<SyncableObject *> syncObjects;
+  QHash<QByteArray, ObjectId>::iterator classIter = _syncSlave.begin();
+  while(classIter != _syncSlave.end()) {
+    syncObjects << classIter->values();
+    classIter++;
+  }
+  _syncSlave.clear();
+  foreach(SyncableObject *obj, syncObjects) {
+    obj->stopSynchronize(this);
+  }
+
   removeAllPeers();
 }
 
@@ -389,21 +400,24 @@ void SignalProxy::removePeerBySender() {
   removePeer(sender());
 }
 
-void SignalProxy::objectRenamed(const QString &newname, const QString &oldname) {
-  SyncableObject *syncObject = qobject_cast<SyncableObject *>(sender());
-  const QMetaObject *meta = syncObject->syncMetaObject();
-  const QByteArray className(meta->className());
-  objectRenamed(className, newname, oldname);
-
+void SignalProxy::renameObject(const SyncableObject *obj, const QString &newname, const QString &oldname) {
   if(proxyMode() == Client)
     return;
 
+  const QMetaObject *meta = obj->syncMetaObject();
+  const QByteArray className(meta->className());
+  objectRenamed(className, newname, oldname);
+
   QVariantList params;
   params << "__objectRenamed__" << className << newname << oldname;
   dispatchSignal(RpcCall, params);
 }
 
 void SignalProxy::objectRenamed(const QByteArray &classname, const QString &newname, const QString &oldname) {
+  qDebug() << "SignalProxy::objectRenamed" << classname << newname << oldname;
+  if(proxyMode() == Server)
+    return;
+
   if(_syncSlave.contains(classname) && _syncSlave[classname].contains(oldname) && oldname != newname) {
     SyncableObject *obj = _syncSlave[classname][newname] = _syncSlave[classname].take(oldname);
     requestInit(obj);
@@ -424,9 +438,9 @@ SignalProxy::ExtendedMetaObject *SignalProxy::extendedMetaObject(const QMetaObje
     return 0;
 }
 
-SignalProxy::ExtendedMetaObject *SignalProxy::createExtendedMetaObject(const QMetaObject *meta) {
+SignalProxy::ExtendedMetaObject *SignalProxy::createExtendedMetaObject(const QMetaObject *meta, bool checkConflicts) {
   if(!_extendedMetaObjects.contains(meta)) {
-    _extendedMetaObjects[meta] = new ExtendedMetaObject(meta);
+    _extendedMetaObjects[meta] = new ExtendedMetaObject(meta, checkConflicts);
   }
   return _extendedMetaObjects[meta];
 }
@@ -467,16 +481,13 @@ bool SignalProxy::attachSlot(const QByteArray& sigName, QObject* recv, const cha
 }
 
 void SignalProxy::synchronize(SyncableObject *obj) {
-  createExtendedMetaObject(obj);
+  createExtendedMetaObject(obj, true);
 
   // attaching as slave to receive sync Calls
   QByteArray className(obj->syncMetaObject()->className());
   _syncSlave[className][obj->objectName()] = obj;
-  disconnect(obj, SIGNAL(destroyed(QObject *)), this, SLOT(detachObject(QObject *)));
-  connect(obj, SIGNAL(destroyed(QObject *)), this, SLOT(detachObject(QObject *)));
 
   if(proxyMode() == Server) {
-    connect(obj, SIGNAL(objectRenamed(QString, QString)), this, SLOT(objectRenamed(QString, QString)));
     obj->setInitialized();
     emit objectInitialized(obj);
   } else {
@@ -490,7 +501,6 @@ void SignalProxy::synchronize(SyncableObject *obj) {
 }
 
 void SignalProxy::detachObject(QObject *obj) {
-  stopSync(obj);
   detachSignals(obj);
   detachSlots(obj);
 }
@@ -509,7 +519,7 @@ void SignalProxy::detachSlots(QObject* receiver) {
   }
 }
 
-void SignalProxy::stopSync(QObject *obj) {
+void SignalProxy::stopSynchronize(SyncableObject *obj) {
   // we can't use a className here, since it might be effed up, if we receive the call as a result of a decon
   // gladly the objectName() is still valid. So we have only to iterate over the classes not each instance! *sigh*
   QHash<QByteArray, ObjectId>::iterator classIter = _syncSlave.begin();
@@ -520,6 +530,7 @@ void SignalProxy::stopSync(QObject *obj) {
     }
     classIter++;
   }
+  obj->stopSynchronize(this);
 }
 
 void SignalProxy::dispatchSignal(const RequestType &requestType, const QVariantList &params) {
@@ -994,12 +1005,10 @@ void SignalProxy::sync_call__(const SyncableObject *obj, SignalProxy::ProxyMode
   ExtendedMetaObject *eMeta = extendedMetaObject(obj);
 
   QVariantList params;
-
   params << eMeta->metaObject()->className()
          << obj->objectName()
          << QByteArray(funcname);
 
-
   const QList<int> &argTypes = eMeta->argTypes(eMeta->methodId(QByteArray(funcname)));
 
   for(int i = 0; i < argTypes.size(); i++) {
@@ -1014,6 +1023,8 @@ void SignalProxy::sync_call__(const SyncableObject *obj, SignalProxy::ProxyMode
   dispatchSignal(Sync, params);
 }
 
+
+
 void SignalProxy::disconnectDevice(QIODevice *dev, const QString &reason) {
   if(!reason.isEmpty())
     qWarning() << qPrintable(reason);
@@ -1065,7 +1076,7 @@ void SignalProxy::updateSecureState() {
 // ==================================================
 //  ExtendedMetaObject
 // ==================================================
-SignalProxy::ExtendedMetaObject::ExtendedMetaObject(const QMetaObject *meta)
+SignalProxy::ExtendedMetaObject::ExtendedMetaObject(const QMetaObject *meta, bool checkConflicts)
   : _meta(meta),
     _updatedRemotelyId(_meta->indexOfSignal("updatedRemotely()"))
 {
@@ -1099,8 +1110,10 @@ SignalProxy::ExtendedMetaObject::ExtendedMetaObject(const QMetaObject *meta)
           continue;
         }
       }
-      qWarning() << "class" << meta->className() << "contains overloaded methods which is currently not supported!";
-      qWarning() << " - " << _meta->method(i).signature() << "conflicts with" << _meta->method(_methodIds[method]).signature();
+      if(checkConflicts) {
+        qWarning() << "class" << meta->className() << "contains overloaded methods which is currently not supported!";
+        qWarning() << " - " << _meta->method(i).signature() << "conflicts with" << _meta->method(_methodIds[method]).signature();
+      }
       continue;
     }
     _methodIds[method] = i;
index 9bae636..357c29b 100644 (file)
@@ -85,6 +85,7 @@ public:
   bool attachSlot(const QByteArray& sigName, QObject *recv, const char *slot);
 
   void synchronize(SyncableObject *obj);
+  void stopSynchronize(SyncableObject *obj);
 
   //! Writes a QVariant to a device.
   /** The data item is prefixed with the resulting blocksize,
@@ -101,9 +102,9 @@ public:
 
   class ExtendedMetaObject;
   ExtendedMetaObject *extendedMetaObject(const QMetaObject *meta) const;
-  ExtendedMetaObject *createExtendedMetaObject(const QMetaObject *meta);
+  ExtendedMetaObject *createExtendedMetaObject(const QMetaObject *meta, bool checkConflicts = false);
   inline ExtendedMetaObject *extendedMetaObject(const QObject *obj) const { return extendedMetaObject(metaObject(obj)); }
-  inline ExtendedMetaObject *createExtendedMetaObject(const QObject *obj) { return createExtendedMetaObject(metaObject(obj)); }
+  inline ExtendedMetaObject *createExtendedMetaObject(const QObject *obj, bool checkConflicts = false) { return createExtendedMetaObject(metaObject(obj), checkConflicts); }
 
   bool isSecure() const { return _secure; }
   void dumpProxyStats();
@@ -112,16 +113,15 @@ public slots:
   void detachObject(QObject *obj);
   void detachSignals(QObject *sender);
   void detachSlots(QObject *receiver);
-  void stopSync(QObject *obj);
 
 protected:
   void customEvent(QEvent *event);
   void sync_call__(const SyncableObject *obj, ProxyMode modeType, const char *funcname, va_list ap);
+  void renameObject(const SyncableObject *obj, const QString &newname, const QString &oldname);
 
 private slots:
   void dataAvailable();
   void removePeerBySender();
-  void objectRenamed(const QString &newname, const QString &oldname);
   void objectRenamed(const QByteArray &classname, const QString &newname, const QString &oldname);
   void sendHeartBeat();
   void receiveHeartBeat(AbstractPeer *peer, const QVariantList &params);
@@ -227,7 +227,7 @@ class SignalProxy::ExtendedMetaObject {
   };
 
 public:
-  ExtendedMetaObject(const QMetaObject *meta);
+  ExtendedMetaObject(const QMetaObject *meta, bool checkConflicts);
 
   inline const QByteArray &methodName(int methodId) { return methodDescriptor(methodId).methodName(); }
   inline const QList<int> &argTypes(int methodId) { return methodDescriptor(methodId).argTypes(); }
index 5b158ab..b8c8d5b 100644 (file)
@@ -49,6 +49,14 @@ SyncableObject::SyncableObject(const SyncableObject &other, QObject *parent)
 {
 }
 
+SyncableObject::~SyncableObject() {
+  QList<SignalProxy *> proxies = _signalProxies;
+  _signalProxies.clear();
+  for(int i = 0; i < proxies.count(); i++) {
+    proxies[i]->stopSynchronize(this);
+  }
+}
+
 SyncableObject &SyncableObject::operator=(const SyncableObject &other) {
   if(this == &other)
     return *this;
@@ -140,7 +148,9 @@ void SyncableObject::renameObject(const QString &newName) {
   const QString oldName = objectName();
   if(oldName != newName) {
     setObjectName(newName);
-    emit objectRenamed(newName, oldName);
+    foreach(SignalProxy *proxy, _signalProxies) {
+      proxy->renameObject(this, newName, oldName);
+    }
   }
 }
 
@@ -171,3 +181,12 @@ void SyncableObject::synchronize(SignalProxy *proxy) {
     return;
   _signalProxies << proxy;
 }
+
+void SyncableObject::stopSynchronize(SignalProxy *proxy) {
+  for(int i = 0; i < _signalProxies.count(); i++) {
+    if(_signalProxies[i] == proxy) {
+      _signalProxies.removeAt(i);
+      break;
+    }
+  }
+}
index 65f575e..d0d7a8b 100644 (file)
@@ -35,6 +35,7 @@ public:
   SyncableObject(QObject *parent = 0);
   SyncableObject(const QString &objectName, QObject *parent = 0);
   SyncableObject(const SyncableObject &other, QObject *parent = 0);
+  ~SyncableObject();
 
   //! Stores the object's state into a QVariantMap.
   /** The default implementation takes dynamic properties as well as getters that have
@@ -77,10 +78,10 @@ signals:
   void updatedRemotely();
   void updated(const QVariantMap &properties);
   void updateRequested(const QVariantMap &properties);
-  void objectRenamed(QString newName, QString oldName);
 
 private:
   void synchronize(SignalProxy *proxy);
+  void stopSynchronize(SignalProxy *proxy);
 
   bool setInitValue(const QString &property, const QVariant &value);