コード例 #1
0
ファイル: Serverlet.cs プロジェクト: zmyer/rDSN
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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();
        }
コード例 #5
0
        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);
        }