/// <summary> /// Reads a bounty from a stream. /// </summary> public static Bounty Read(InStream Stream) { return new Bounty { Base = Stream.ReadDouble(), Decay = Stream.ReadDouble() }; }
/// <summary> /// Reads a packet from a stream with the given size in bytes or returns null if the packet cannot be parsed. /// </summary> public static Packet Read(InStream Stream, int Size) { Packet packet = new Packet(); // Read flags and header if ((Size -= StreamSize.Byte + StreamSize.Int) < 0) return null; PacketFlags flags = (PacketFlags)Stream.ReadByte(); packet.SequenceNumber = Stream.ReadInt(); packet.PingRequest = (flags & PacketFlags.PingRequest) == PacketFlags.PingRequest; packet.PingResponse = (flags & PacketFlags.PingResponse) == PacketFlags.PingResponse; // Read additional information if ((flags & PacketFlags.Acknowledgement) == PacketFlags.Acknowledgement) { if ((Size -= StreamSize.Int) < 0) return null; packet.AcknowledgementNumber = Stream.ReadInt(); } if ((flags & PacketFlags.RoundTripTime) == PacketFlags.RoundTripTime) { if ((Size -= StreamSize.Double) < 0) return null; packet.RoundTripTime = Stream.ReadDouble(); } // Read chunk if any if ((flags & PacketFlags.Chunk) == PacketFlags.Chunk) { packet.ChunkInitial = (flags & PacketFlags.ChunkInitial) == PacketFlags.ChunkInitial; packet.ChunkFinal = (flags & PacketFlags.ChunkFinal) == PacketFlags.ChunkFinal; byte[] data = new byte[Size]; Stream.Read(data, 0, data.Length); packet.ChunkData = data; return packet; } else { // A packet can only be a disconnect if it does not have a chunk packet.Disconnect = (flags & PacketFlags.Disconnect) == PacketFlags.Disconnect; // Make sure this is the end of the packet if (Size == 0) return packet; else return null; } }