Example #1
0
        void HandlePacket(CodedInputStream reader)
        {
            var service_id = reader.ReadRawByte();
            var method_id  = reader.ReadInt32() - 1;
            var request_id = reader.ReadFixedUInt16();

            Debug.WriteLine("Received packet [service_id: 0x{0:X2}, method_id: {1}, request_id: {2}]", service_id, method_id, request_id);
            // Handle RPC responses
            if (service_id == RESPONSE_SERVICE_ID)
            {
                Debug.WriteLine("  received response");
                HandleResponse(request_id, reader);
            }
            else
            {
                var listener_id = reader.ReadInt64();
                Debug.WriteLine("  listener_id: {0}", listener_id);

                IService service;
                if (!exportedServices.TryGetValue(service_id, out service))
                {
                    throw new ArgumentException("No service bound on index " + service_id);
                }

                // Load correct descriptor for the requested method
                var method_descriptor = service.DescriptorForType.Methods[method_id];
                // Create a prototype of the request message
                var message_prototype = service.GetRequestPrototype(method_descriptor);
                // And create a builder for that message
                var builder = message_prototype.WeakCreateBuilderForType();
                // Read the message into the correct builder
                var message = ReadMessage(reader, builder);

                Debug.WriteLine("  passing RPC to {0}::{1}", method_descriptor.Service.Name, method_descriptor.Name);
                Debug.WriteLine(message.ToString());

                // Response callback sends the repsponse
                service.CallMethod(method_descriptor, null, message, m => SendResponse(request_id, m));
            }
        }