protected bool RegisterRpcHandler(TaskCode code, string name, RpcRequestHandler handler, UInt64 gpid) { dsn_rpc_request_handler_t cb = (req, param) => { // if handler synchnously processes the incoming request // we don't need to add_ref and set owner to true // in folloiwng two stmts // however, we don't know so we do as follows Native.dsn_msg_add_ref(req); // released by RpcReadStream var rms = new RpcReadStream(req, true); var wms = new RpcWriteStream(Native.dsn_msg_create_response(req)); handler(rms, wms); }; bool r = Native.dsn_rpc_register_handler(code, name, cb, IntPtr.Zero, gpid); Logging.dassert(r, "rpc handler registration failed for " + code.ToString()); lock (_handlers) { _handlers.Add(code, cb); } return(true); }
public IConnection Create(string connectionId, IChannelStream stream) { var jsonSerialiser = new TinyJsonSerializer(); var taskLauncher = new TaskLauncherNet35(); var channelMessageStream = new ChannelMessageStream(stream); var channelMessageSerializer = new ChannelMessageSerializer(); var channelMessageWriter = new ChannelMessageWriter(channelMessageStream, channelMessageSerializer); var rpcMessageEncoder = new RpcMessageEncoder(jsonSerialiser); var rpcMessageWriter = new RpcMessageWriter(channelMessageWriter, rpcMessageEncoder); var rpcMessageBroker = new RpcMessageBroker(rpcMessageWriter); var delegateProvider = new DuplexDelegateProvider(m_DelegateCollection, rpcMessageBroker); var rpcRequestHandler = new RpcRequestHandler(delegateProvider, jsonSerialiser); var rpcResponseMessageHandler = new RpcResponseChannelMessageHandler(rpcMessageBroker, rpcMessageEncoder); var rpcRequestMessageHandler = new RpcRequestChannelMessageHandler(rpcRequestHandler, rpcMessageEncoder, rpcMessageWriter); var pipeline = new ChannelMessagePipeline(new IChannelMessageHandler[] { rpcResponseMessageHandler, rpcRequestMessageHandler }); var channelMessageReader = new ChannelMessageReader(channelMessageStream, channelMessageSerializer, pipeline, taskLauncher); var connection = new Connection( connectionId, rpcMessageBroker, disconnectReporters: new IDisconnectReporter[] { stream }, disposeChain: new IDisposable[] { channelMessageReader, rpcMessageBroker }); rpcRequestHandler.OwningConnection = connection; channelMessageReader.Start(); return(connection); }
protected bool RegisterRpcHandler(TaskCode code, string name, RpcRequestHandler handler) { dsn_rpc_request_handler_t cb = (dsn_message_t req, IntPtr param) => { RpcReadStream rms = new RpcReadStream(req, false); RpcWriteStream wms = new RpcWriteStream(Native.dsn_msg_create_response(req), false); handler(rms, wms); }; bool r = Native.dsn_rpc_register_handler(code, name, cb, IntPtr.Zero); Logging.dassert(r, "rpc handler registration failed for " + code.ToString()); lock (_handlers) { _handlers.Add(code, cb); } return(true); }
public void HandleDelegatesToObjectFromTypeResolver() { var serialiser = MockRepository.GenerateStub <IJsonSerializer>(); var handler = MockRepository.GenerateStrictMock <ITestInterface>(); handler.Expect(h => h.VoidCall()).Repeat.Once(); var typeResolver = MockRepository.GenerateStub <IDelegateProvider>(); typeResolver.Stub(t => t.Get("TypeName")).Return(handler); var request = new RpcRequest("id", "TypeName", "VoidCall", new string[0]); var rpcRequestHandler = new RpcRequestHandler(typeResolver, serialiser); rpcRequestHandler.Handle(request); handler.VerifyAllExpectations(); }
public void HandlePolymorphicMethods() { var serialiser = MockRepository.GenerateStub <IJsonSerializer>(); serialiser.Stub(s => s.Deserialize(typeof(string), "0")).Return("0"); serialiser.Stub(s => s.Deserialize(typeof(int), "0")).Return(0); var requestDelegate = MockRepository.GenerateStrictMock <ITestInterface>(); requestDelegate.Expect(d => d.Polymorphic("0")).Repeat.Once(); requestDelegate.Expect(d => d.Polymorphic(0)).Repeat.Once(); var typeResolver = MockRepository.GenerateStub <IDelegateProvider>(); typeResolver.Stub(t => t.Get("TypeName")).Return(requestDelegate); var request1 = new RpcRequest("id", "TypeName", "Polymorphic_String", new[] { "0" }); var request2 = new RpcRequest("id", "TypeName", "Polymorphic_Int32", new[] { "0" }); var rpcRequestHandler = new RpcRequestHandler(typeResolver, serialiser); rpcRequestHandler.Handle(request1); rpcRequestHandler.Handle(request2); }