From: Manuel Nickschas Date: Fri, 27 Dec 2013 20:24:43 +0000 (+0100) Subject: Make the PeerPtr trick work with sync calls as well X-Git-Tag: 0.10-beta1~68 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=2a89d1b0c473f92c5cf9fb803d99e8b51b2c68e7 Make the PeerPtr trick work with sync calls as well The mechanics for replacing a PeerPtr as first argument by the sending peer (and using it as a filter for the other direction) are already in place; with just some tweaks we can also make it work for sync calls in addition to RPC calls, which allows for selectively calling methods in your sync partner. --- diff --git a/src/common/signalproxy.cpp b/src/common/signalproxy.cpp index e65f09ff..f4ca5c15 100644 --- a/src/common/signalproxy.cpp +++ b/src/common/signalproxy.cpp @@ -507,10 +507,11 @@ void SignalProxy::dispatch(const T &protoMessage) } -void SignalProxy::dispatch(Peer *peer, const RpcCall &rpcCall) +template +void SignalProxy::dispatch(Peer *peer, const T &protoMessage) { if (peer && peer->isOpen()) - peer->dispatch(rpcCall); + peer->dispatch(protoMessage); else QCoreApplication::postEvent(this, new ::RemovePeerEvent(peer)); } @@ -539,7 +540,7 @@ void SignalProxy::handle(Peer *peer, const SyncMessage &syncMessage) } QVariant returnValue((QVariant::Type)eMeta->returnType(slotId)); - if (!invokeSlot(receiver, slotId, syncMessage.params, returnValue)) { + if (!invokeSlot(receiver, slotId, syncMessage.params, returnValue, peer)) { qWarning("SignalProxy::handleSync(): invokeMethod for \"%s\" failed ", eMeta->methodName(slotId).constData()); return; } @@ -740,7 +741,11 @@ void SignalProxy::sync_call__(const SyncableObject *obj, SignalProxy::ProxyMode params << QVariant(argTypes[i], va_arg(ap, void *)); } - dispatch(SyncMessage(eMeta->metaObject()->className(), obj->objectName(), QByteArray(funcname), params)); + if (argTypes.size() >= 1 && argTypes[0] == qMetaTypeId() && proxyMode() == SignalProxy::Server) { + Peer *peer = params[0].value(); + dispatch(peer, SyncMessage(eMeta->metaObject()->className(), obj->objectName(), QByteArray(funcname), params)); + } else + dispatch(SyncMessage(eMeta->metaObject()->className(), obj->objectName(), QByteArray(funcname), params)); } diff --git a/src/common/signalproxy.h b/src/common/signalproxy.h index 410d48cc..9297ae81 100644 --- a/src/common/signalproxy.h +++ b/src/common/signalproxy.h @@ -118,7 +118,8 @@ private: template void dispatch(const T &protoMessage); - void dispatch(Peer *peer, const Protocol::RpcCall &rpcCall); + template + void dispatch(Peer *peer, const T &protoMessage); void handle(Peer *peer, const Protocol::SyncMessage &syncMessage); void handle(Peer *peer, const Protocol::RpcCall &rpcCall);