public static void Identify(IConnection connection, CodedInputStream stream) { var header = new BNetHeader(stream); var payload = new byte[header.PayloadLength]; payload = stream.ReadRawBytes((int)header.PayloadLength); var packet = new BNetPacket(header, payload); var service = Service.GetByID(header.ServiceID); if (service == null) { Logger.Error("No service exists with id: 0x{0}", header.ServiceID.ToString("X2")); return; } //var method = service.DescriptorForType.Methods[(int)header.MethodID - 1]; //Logger.Warn("METHODID: {0}, from header: {1}", (uint)method.Options[bnet.protocol.Rpc.MethodId.Descriptor], header.MethodID); var method = service.DescriptorForType.Methods.Single(m => (uint)m.Options[bnet.protocol.Rpc.MethodId.Descriptor] == header.MethodID); var proto = service.GetRequestPrototype(method); var builder = proto.WeakCreateBuilderForType(); try { var message = builder.WeakMergeFrom(CodedInputStream.CreateInstance(packet.Payload.ToArray())).WeakBuild(); lock (service) // lock the service so that it's in-context client does not get changed.. { //Logger.Debug("service-call data:{0}", message.ToString()); ((IServerService) service).Client = (IBNetClient)connection.Client; service.CallMethod(method, null, message, (msg => SendResponse(connection, header.RequestID, msg))); } } catch (NotImplementedException) { Logger.Debug("Unimplemented service method: {0} {1}", service.GetType().Name, method.Name); } catch (UninitializedMessageException e) { Logger.Debug("Failed to parse message: {0}", e.Message); } catch (Exception e) { Logger.DebugException(e, string.Empty); } }
public BNetPacket(BNetHeader header, byte[] payload) { this.Header = header; this.Payload = payload; }