Пример #1
0
 /// <summary>
 /// Reads a bounty from a stream.
 /// </summary>
 public static Bounty Read(InStream Stream)
 {
     return new Bounty
     {
         Base = Stream.ReadDouble(),
         Decay = Stream.ReadDouble()
     };
 }
Пример #2
0
        /// <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;
            }
        }