X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcommon%2Fsignalproxy.cpp;h=d7d2c5c74fdfc6ab2fbbd10c4f3f7fce16bf3698;hp=d9943b2b21db8be6900e785c19bb316285b78315;hb=e89cfe68c0b4d117ce79d0d38fcc085de77a3083;hpb=c7724e5b1404e82ce3b0d5a96b7e1f260e7dc212 diff --git a/src/common/signalproxy.cpp b/src/common/signalproxy.cpp index d9943b2b..d7d2c5c7 100644 --- a/src/common/signalproxy.cpp +++ b/src/common/signalproxy.cpp @@ -195,8 +195,8 @@ void SignalProxy::SignalRelay::attachSignal(QObject *sender, int signalId, const if(!funcName.isEmpty()) { fn = QMetaObject::normalizedSignature(funcName); } else { - fn = SIGNAL(); - fn += sender->metaObject()->method(signalId).signature(); + fn = SIGNAL(fakeMethodSignature()); + fn = fn.replace("fakeMethodSignature()", sender->metaObject()->method(signalId).signature()); } _slots[slotId] = Signal(sender, signalId, fn); @@ -583,6 +583,8 @@ void SignalProxy::synchronize(SyncableObject *obj) { else requestInit(obj); } + + obj->synchronize(this); } void SignalProxy::detachObject(QObject *obj) { @@ -660,6 +662,17 @@ void SignalProxy::receivePackedFunc(AbstractPeer *sender, const QVariant &packed } void SignalProxy::receivePeerSignal(AbstractPeer *sender, const RequestType &requestType, const QVariantList ¶ms) { + switch(requestType) { + // list all RequestTypes that shouldnot trigger a heartbeat counter reset here + case HeartBeatReply: + break; + default: + if(sender->type() == AbstractPeer::IODevicePeer) { + IODevicePeer *ioPeer = static_cast(sender); + ioPeer->sentHeartBeats = 0; + } + } + switch(requestType) { case RpcCall: if(params.empty()) @@ -925,6 +938,9 @@ void SignalProxy::writeDataToDevice(QIODevice *dev, const QVariant &item, bool c } bool SignalProxy::readDataFromDevice(QIODevice *dev, quint32 &blockSize, QVariant &item, bool compressed) { + if(!dev) + return false; + QDataStream in(dev); in.setVersion(QDataStream::Qt_4_2); @@ -1066,6 +1082,31 @@ void SignalProxy::customEvent(QEvent *event) { } } +void SignalProxy::syncCall(const SyncableObject *obj, SignalProxy::ProxyMode modeType, const char *funcname, va_list ap) { + 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++) { + if(argTypes[i] == 0) { + qWarning() << Q_FUNC_INFO << "received invalid data for argument number" << i << "of signal" << QString("%1::%2").arg(eMeta->metaObject()->className()).arg(funcname); + qWarning() << " - make sure all your data types are known by the Qt MetaSystem"; + return; + } + params << QVariant(argTypes[i], va_arg(ap, void *)); + } +} + void SignalProxy::disconnectDevice(QIODevice *dev, const QString &reason) { if(!reason.isEmpty()) qWarning() << qPrintable(reason); @@ -1154,14 +1195,14 @@ const QList &SignalProxy::ExtendedMetaObject::argTypes(int methodId) { return _argTypes[methodId]; } -const int &SignalProxy::ExtendedMetaObject::returnType(int methodId) { +int SignalProxy::ExtendedMetaObject::returnType(int methodId) { if(!_returnType.contains(methodId)) { _returnType[methodId] = QMetaType::type(_meta->method(methodId).typeName()); } return _returnType[methodId]; } -const int &SignalProxy::ExtendedMetaObject::minArgCount(int methodId) { +int SignalProxy::ExtendedMetaObject::minArgCount(int methodId) { if(!_minArgCount.contains(methodId)) { QString signature(_meta->method(methodId).signature()); _minArgCount[methodId] = _meta->method(methodId).parameterTypes().count() - signature.count("="); @@ -1176,6 +1217,21 @@ const QByteArray &SignalProxy::ExtendedMetaObject::methodName(int methodId) { return _methodNames[methodId]; } +int SignalProxy::ExtendedMetaObject::methodId(const QByteArray &methodName) { + if(_methodIds.contains(methodName)) { + return _methodIds[methodName]; + } else { + for(int i = _meta->methodOffset(); i < _meta->methodCount(); i++) { + if(ExtendedMetaObject::methodName(_meta->method(i)) == methodName) { + _methodIds[methodName] = i; + return i; + } + } + } + Q_ASSERT(false); + return -1; +} + const QHash &SignalProxy::ExtendedMetaObject::syncMap() { if(_syncMap.isEmpty()) { QHash syncMap;