Esempio n. 1
0
        private void Handle(CodedInputStream stream)
        {
            var packet = new ClientPacket(stream);

            if (packet.Service == PrevService)
            {
                //packet.Method should be 0, if there is no errors
                Callback callback = callbacks.Dequeue();
                if (callback.RequestId != packet.RequestId)
                {
                    throw new InvalidOperationException("Callback does not match!");
                }
                callback.Action(packet.ReadMessage(callback.Builder));
                return;
            }

            IService service = importedServices[packet.Service];

            MethodDescriptor method = service.DescriptorForType.Methods.Single(m => GetMethodId(m) == packet.Method);

            Action <IMessage> done =
                response =>
            {
                ServerPacket data = new ServerPacket(PrevService, (int)ErrorCode, packet.RequestId, 0).WriteMessage(response);
                Send(data);
                if (ErrorCode != AuthError.None)
                {
                    DisconnectNotification dcNotify = DisconnectNotification.CreateBuilder().SetErrorCode((uint)ErrorCode).Build();
                    ConnectionService.CreateStub(this).ForceDisconnect(null, dcNotify, r => { });
                    Disconnect();
                }
            };

            IMessage requestProto = service.GetRequestPrototype(method);

            IMessage message = packet.ReadMessage(requestProto.WeakToBuilder());

            // Logging
            Console.WriteLine(requestProto.GetType());
            Console.WriteLine("Text View:");
            Console.WriteLine(message.ToString());

            service.CallMethod(method, null, message, done);
        }