/***************************************************************************
- * Copyright (C) 2005-2013 by the Quassel Project *
+ * Copyright (C) 2005-2014 by the Quassel Project *
* devel@quassel-irc.org *
* *
* This program is free software; you can redistribute it and/or modify *
}
-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));
}
}
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;
}
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));
}