Allow restoring a null objectId by passing None to restore

This commit is contained in:
Jason Paryani
2014-04-09 17:06:34 -07:00
parent cba4378d1f
commit ba4e5e46cb
3 changed files with 23 additions and 6 deletions

View File

@@ -25,6 +25,7 @@ cdef extern from "../helpers/capabilityHelper.h":
VoidPromise convert_to_voidpromise(PyPromise&) VoidPromise convert_to_voidpromise(PyPromise&)
cdef extern from "../helpers/rpcHelper.h": cdef extern from "../helpers/rpcHelper.h":
Capability.Client restoreHelper(RpcSystem&)
Capability.Client restoreHelper(RpcSystem&, MessageBuilder&) Capability.Client restoreHelper(RpcSystem&, MessageBuilder&)
Capability.Client restoreHelper(RpcSystem&, MessageReader&) Capability.Client restoreHelper(RpcSystem&, MessageReader&)
Capability.Client restoreHelper(RpcSystem&, AnyPointer.Reader&) Capability.Client restoreHelper(RpcSystem&, AnyPointer.Reader&)

View File

@@ -1,6 +1,7 @@
#pragma once #pragma once
#include "capnp/dynamic.h" #include "capnp/dynamic.h"
#include <capnp/rpc.capnp.h>
#include "capnp/rpc-twoparty.h" #include "capnp/rpc-twoparty.h"
#include "Python.h" #include "Python.h"
#include "capabilityHelper.h" #include "capabilityHelper.h"
@@ -33,29 +34,42 @@ private:
PyObject * py_restorer; PyObject * py_restorer;
}; };
capnp::Capability::Client restoreHelper(capnp::RpcSystem<capnp::rpc::twoparty::SturdyRefHostId>& client, capnp::MessageBuilder & objectId) { capnp::MallocMessageBuilder hostIdMessage(8); capnp::Capability::Client restoreHelper(capnp::RpcSystem<capnp::rpc::twoparty::SturdyRefHostId>& client, capnp::MessageBuilder & objectId) {
capnp::MallocMessageBuilder hostIdMessage(8);
auto hostId = hostIdMessage.initRoot<capnp::rpc::twoparty::SturdyRefHostId>(); auto hostId = hostIdMessage.initRoot<capnp::rpc::twoparty::SturdyRefHostId>();
hostId.setSide(capnp::rpc::twoparty::Side::SERVER); hostId.setSide(capnp::rpc::twoparty::Side::SERVER);
return client.restore(hostId, objectId.getRoot<capnp::AnyPointer>()); return client.restore(hostId, objectId.getRoot<capnp::AnyPointer>());
} }
capnp::Capability::Client restoreHelper(capnp::RpcSystem<capnp::rpc::twoparty::SturdyRefHostId>& client, capnp::MessageReader & objectId) {
capnp::Capability::Client restoreHelper(capnp::RpcSystem<capnp::rpc::twoparty::SturdyRefHostId>& client, capnp::MessageReader & objectId) { capnp::MallocMessageBuilder hostIdMessage(8); capnp::MallocMessageBuilder hostIdMessage(8);
auto hostId = hostIdMessage.initRoot<capnp::rpc::twoparty::SturdyRefHostId>(); auto hostId = hostIdMessage.initRoot<capnp::rpc::twoparty::SturdyRefHostId>();
hostId.setSide(capnp::rpc::twoparty::Side::SERVER); hostId.setSide(capnp::rpc::twoparty::Side::SERVER);
return client.restore(hostId, objectId.getRoot<capnp::AnyPointer>()); return client.restore(hostId, objectId.getRoot<capnp::AnyPointer>());
} }
capnp::Capability::Client restoreHelper(capnp::RpcSystem<capnp::rpc::twoparty::SturdyRefHostId>& client, capnp::AnyPointer::Reader & objectId) { capnp::MallocMessageBuilder hostIdMessage(8);
capnp::Capability::Client restoreHelper(capnp::RpcSystem<capnp::rpc::twoparty::SturdyRefHostId>& client, capnp::AnyPointer::Reader & objectId) {
capnp::MallocMessageBuilder hostIdMessage(8);
auto hostId = hostIdMessage.initRoot<capnp::rpc::twoparty::SturdyRefHostId>(); auto hostId = hostIdMessage.initRoot<capnp::rpc::twoparty::SturdyRefHostId>();
hostId.setSide(capnp::rpc::twoparty::Side::SERVER); hostId.setSide(capnp::rpc::twoparty::Side::SERVER);
return client.restore(hostId, objectId); return client.restore(hostId, objectId);
} }
capnp::Capability::Client restoreHelper(capnp::RpcSystem<capnp::rpc::twoparty::SturdyRefHostId>& client, capnp::AnyPointer::Builder & objectId) { capnp::MallocMessageBuilder hostIdMessage(8);
capnp::Capability::Client restoreHelper(capnp::RpcSystem<capnp::rpc::twoparty::SturdyRefHostId>& client, capnp::AnyPointer::Builder & objectId) {
capnp::MallocMessageBuilder hostIdMessage(8);
auto hostId = hostIdMessage.initRoot<capnp::rpc::twoparty::SturdyRefHostId>(); auto hostId = hostIdMessage.initRoot<capnp::rpc::twoparty::SturdyRefHostId>();
hostId.setSide(capnp::rpc::twoparty::Side::SERVER); hostId.setSide(capnp::rpc::twoparty::Side::SERVER);
return client.restore(hostId, objectId); return client.restore(hostId, objectId);
} }
capnp::Capability::Client restoreHelper(capnp::RpcSystem<capnp::rpc::twoparty::SturdyRefHostId>& client) {
capnp::MallocMessageBuilder message;
capnp::rpc::SturdyRef::Builder ref = message.getRoot<capnp::rpc::SturdyRef>();
auto hostId = ref.getHostId().initAs<capnp::rpc::twoparty::SturdyRefHostId>();
hostId.setSide(capnp::rpc::twoparty::Side::SERVER);
return client.restore(hostId, ref.getObjectId());
}
template <typename SturdyRefHostId, typename ProvisionId, template <typename SturdyRefHostId, typename ProvisionId,
typename RecipientId, typename ThirdPartyCapId, typename JoinAnswer> typename RecipientId, typename ThirdPartyCapId, typename JoinAnswer>
capnp::RpcSystem<SturdyRefHostId> makeRpcClientWithRestorer( capnp::RpcSystem<SturdyRefHostId> makeRpcClientWithRestorer(

View File

@@ -1856,7 +1856,9 @@ cdef class TwoPartyClient:
cdef _DynamicObjectBuilder object_builder cdef _DynamicObjectBuilder object_builder
cdef _DynamicObjectReader object_reader cdef _DynamicObjectReader object_reader
if type(objectId) is _DynamicObjectBuilder: if objectId is None:
return _CapabilityClient()._init(helpers.restoreHelper(deref(self.thisptr)), self)
elif type(objectId) is _DynamicObjectBuilder:
object_builder = objectId object_builder = objectId
return _CapabilityClient()._init(helpers.restoreHelper(deref(self.thisptr), deref(object_builder.thisptr)), self) return _CapabilityClient()._init(helpers.restoreHelper(deref(self.thisptr), deref(object_builder.thisptr)), self)
elif type(objectId) is _DynamicObjectReader: elif type(objectId) is _DynamicObjectReader: