X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcommon%2Fsignalproxy.cpp;h=756e63c3b7834c7468c647b2403215de324a76f4;hp=89b434b2d3977d1fb068daca59994b20d8ead666;hb=39eb2fda3eaef2de78a8134556015ff86e9b85d4;hpb=f6b9eeda207d42c99fc3e9085631722cf2ec83dc diff --git a/src/common/signalproxy.cpp b/src/common/signalproxy.cpp index 89b434b2..756e63c3 100644 --- a/src/common/signalproxy.cpp +++ b/src/common/signalproxy.cpp @@ -231,6 +231,18 @@ SignalProxy::SignalProxy(ProxyMode mode, QIODevice* device, QObject* parent) } SignalProxy::~SignalProxy() { + QHash::iterator classIter = _syncSlave.begin(); + while(classIter != _syncSlave.end()) { + ObjectId::iterator objIter = classIter->begin(); + while(objIter != classIter->end()) { + SyncableObject *obj = objIter.value(); + objIter = classIter->erase(objIter); + obj->stopSynchronize(this); + } + classIter++; + } + _syncSlave.clear(); + removeAllPeers(); } @@ -389,21 +401,23 @@ 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) { + 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; @@ -1159,7 +1172,6 @@ const QHash &SignalProxy::ExtendedMetaObject::receiveMap() { if(receiverId != -1) { receiveMap[i] = receiverId; - qDebug() << requestSlot.signature() << _meta->method(receiverId).signature() << "---" << i << receiverId; } } _receiveMap = receiveMap;