Make the PeerPtr trick work with sync calls as well
authorManuel Nickschas <sputnick@quassel-irc.org>
Fri, 27 Dec 2013 20:24:43 +0000 (21:24 +0100)
committerManuel Nickschas <sputnick@quassel-irc.org>
Wed, 1 Jan 2014 22:15:03 +0000 (23:15 +0100)
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
src/common/signalproxy.h

index e65f09f..f4ca5c1 100644 (file)
@@ -507,10 +507,11 @@ void SignalProxy::dispatch(const T &protoMessage)
 }
 
 
-void SignalProxy::dispatch(Peer *peer, const RpcCall &rpcCall)
+template<class T>
+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<PeerPtr>() && proxyMode() == SignalProxy::Server) {
+        Peer *peer = params[0].value<PeerPtr>();
+        dispatch(peer, SyncMessage(eMeta->metaObject()->className(), obj->objectName(), QByteArray(funcname), params));
+    } else
+        dispatch(SyncMessage(eMeta->metaObject()->className(), obj->objectName(), QByteArray(funcname), params));
 }
 
 
index 410d48c..9297ae8 100644 (file)
@@ -118,7 +118,8 @@ private:
 
     template<class T>
     void dispatch(const T &protoMessage);
-    void dispatch(Peer *peer, const Protocol::RpcCall &rpcCall);
+    template<class T>
+    void dispatch(Peer *peer, const T &protoMessage);
 
     void handle(Peer *peer, const Protocol::SyncMessage &syncMessage);
     void handle(Peer *peer, const Protocol::RpcCall &rpcCall);