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.
-void SignalProxy::dispatch(Peer *peer, const RpcCall &rpcCall)
+template<class T>
+void SignalProxy::dispatch(Peer *peer, const T &protoMessage)
{
if (peer && peer->isOpen())
{
if (peer && peer->isOpen())
- peer->dispatch(rpcCall);
+ peer->dispatch(protoMessage);
else
QCoreApplication::postEvent(this, new ::RemovePeerEvent(peer));
}
else
QCoreApplication::postEvent(this, new ::RemovePeerEvent(peer));
}
}
QVariant returnValue((QVariant::Type)eMeta->returnType(slotId));
}
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;
}
qWarning("SignalProxy::handleSync(): invokeMethod for \"%s\" failed ", eMeta->methodName(slotId).constData());
return;
}
params << QVariant(argTypes[i], va_arg(ap, void *));
}
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));
template<class T>
void dispatch(const T &protoMessage);
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);
void handle(Peer *peer, const Protocol::SyncMessage &syncMessage);
void handle(Peer *peer, const Protocol::RpcCall &rpcCall);