From 2a89d1b0c473f92c5cf9fb803d99e8b51b2c68e7 Mon Sep 17 00:00:00 2001 From: Manuel Nickschas Date: Fri, 27 Dec 2013 21:24:43 +0100 Subject: [PATCH] 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. --- src/common/signalproxy.cpp | 13 +++++++++---- src/common/signalproxy.h | 3 ++- 2 files changed, 11 insertions(+), 5 deletions(-) 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); -- 2.20.1