X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcommon%2Fsignalproxy.cpp;h=82b428ac6545bc4090158a4c6c269b84860a238e;hp=08cdc7dce8eba57ca4b035556d6bddf7aa88f385;hb=5432a429749c8cfa295d0f26e30e7e590873f51c;hpb=2a00e8f57d66d9913a10c30408b89676a74010a1 diff --git a/src/common/signalproxy.cpp b/src/common/signalproxy.cpp index 08cdc7dc..82b428ac 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,15 +401,14 @@ 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); @@ -424,9 +435,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 +478,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 +498,6 @@ void SignalProxy::synchronize(SyncableObject *obj) { } void SignalProxy::detachObject(QObject *obj) { - stopSync(obj); detachSignals(obj); detachSlots(obj); } @@ -509,7 +516,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 +527,7 @@ void SignalProxy::stopSync(QObject *obj) { } classIter++; } + obj->stopSynchronize(this); } void SignalProxy::dispatchSignal(const RequestType &requestType, const QVariantList ¶ms) { @@ -570,7 +578,7 @@ void SignalProxy::receivePeerSignal(AbstractPeer *sender, const RequestType &req } } - qDebug() << "SignalProxy::receivePeerSignal)" << requestType << params; + // qDebug() << "SignalProxy::receivePeerSignal)" << requestType << params; switch(requestType) { case RpcCall: if(params.empty()) @@ -986,20 +994,18 @@ void SignalProxy::customEvent(QEvent *event) { } } -void SignalProxy::syncCall(const SyncableObject *obj, SignalProxy::ProxyMode modeType, const char *funcname, va_list ap) { - qDebug() << obj << modeType << "(" << _proxyMode << ")" << funcname; +void SignalProxy::sync_call__(const SyncableObject *obj, SignalProxy::ProxyMode modeType, const char *funcname, va_list ap) { + // qDebug() << obj << modeType << "(" << _proxyMode << ")" << funcname; if(modeType != _proxyMode) return; 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 +1020,8 @@ void SignalProxy::syncCall(const SyncableObject *obj, SignalProxy::ProxyMode mod dispatchSignal(Sync, params); } + + void SignalProxy::disconnectDevice(QIODevice *dev, const QString &reason) { if(!reason.isEmpty()) qWarning() << qPrintable(reason); @@ -1065,7 +1073,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()")) { @@ -1077,6 +1085,9 @@ SignalProxy::ExtendedMetaObject::ExtendedMetaObject(const QMetaObject *meta) continue; // skip methods with ptr params QByteArray method = methodName(_meta->method(i)); + if(method.startsWith("init")) + continue; // skip initializers + if(_methodIds.contains(method)) { /* funny... moc creates for methods containing default parameters multiple metaMethod with separate methodIds. we don't care... we just need the full fledged version @@ -1096,8 +1107,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; @@ -1156,7 +1169,6 @@ const QHash &SignalProxy::ExtendedMetaObject::receiveMap() { if(receiverId != -1) { receiveMap[i] = receiverId; - qDebug() << requestSlot.signature() << _meta->method(receiverId).signature() << "---" << i << receiverId; } } _receiveMap = receiveMap;