From: Marcus Eggenberger Date: Mon, 24 Aug 2009 16:42:55 +0000 (+0200) Subject: clean up X-Git-Tag: 0.5-rc1~36 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=27de4d2719454c4deb5f6e24b82bdd8991e45260 clean up --- diff --git a/src/common/signalproxy.cpp b/src/common/signalproxy.cpp index 89b434b2..a7387151 100644 --- a/src/common/signalproxy.cpp +++ b/src/common/signalproxy.cpp @@ -231,6 +231,17 @@ SignalProxy::SignalProxy(ProxyMode mode, QIODevice* device, QObject* parent) } SignalProxy::~SignalProxy() { + QList syncObjects; + QHash::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(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::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 ¶ms) { @@ -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 &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; diff --git a/src/common/signalproxy.h b/src/common/signalproxy.h index 9bae6364..357c29bb 100644 --- a/src/common/signalproxy.h +++ b/src/common/signalproxy.h @@ -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 ¶ms); @@ -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 &argTypes(int methodId) { return methodDescriptor(methodId).argTypes(); } diff --git a/src/common/syncableobject.cpp b/src/common/syncableobject.cpp index 5b158ab3..b8c8d5ba 100644 --- a/src/common/syncableobject.cpp +++ b/src/common/syncableobject.cpp @@ -49,6 +49,14 @@ SyncableObject::SyncableObject(const SyncableObject &other, QObject *parent) { } +SyncableObject::~SyncableObject() { + QList 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; + } + } +} diff --git a/src/common/syncableobject.h b/src/common/syncableobject.h index 65f575e3..d0d7a8b4 100644 --- a/src/common/syncableobject.h +++ b/src/common/syncableobject.h @@ -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);