Пример #1
0
        public Packet(Stream stream)
        {
            if (stream != null)
            {
                if (stream.CanSeek)
                {
                    stream.Position = 0;
                }
#if DEBUG
                HexFormattedData = FormatIt(stream.GetMemoryStream(0).ToArray());
                if (stream.CanSeek)
                {
                    stream.Position = 0;
                }
#endif
                _rawData = stream.GetMemoryStream(0);

                if (ThrowWhenInvalid && _rawData.Length < HeaderLength)
                {
                    throw new InvalidPacketException();
                }
                else
                {
                    if (_rawData.Length > 3) ID = _rawData.ToInt32();
                    if (ThrowWhenInvalid && ID != Connector.StandardID)
                    {
                        throw new InvalidPacketException();
                    }
                    else
                    {
                        if (_rawData.Length > 7) Length = _rawData.ToInt32();
                        if (_rawData.Length > 11) Origin = (OriginType)_rawData.ToInt32();
                        if (_rawData.Length > 15) Padding = _rawData.ToInt32();
                        if (_rawData.Length > 19) PayloadLength = _rawData.ToInt32();
                        if (_rawData.Length > 23) PacketType = (PacketType)_rawData.ToInt32();


                        int ln = Convert.ToInt32(_rawData.Length);
                        if (ln > Length)
                        {
                            ln = Length;
                        }

                        Payload = _rawData.GetMemoryStream(HeaderLength);

                        _package = BuildPackage(_rawData, HeaderLength, Type.GetType(typeof(Packet).Namespace + "." + this.PacketType.ToString()));
                                //GetPackage(byteArray);
                        int packetLength = 0;
                        if (_package != null)
                        {
                            if (_package.GetErrors().Count > 0)
                            {
                                ConversionFailed = true;
                                
                            }
                            packetLength = Convert.ToInt32(Payload.Length);
                            if (Length - HeaderLength != packetLength)
                            {
                                if (ThrowWhenInvalid)
                                {
                                    throw new InvalidPacketException();
                                }
                                else
                                {
                                    ConversionException = new InvalidPacketException();
                                    ConversionFailed = true;
                                }
                            }
                        }
                        else
                        {
                            //Unknown package found!!
                        }
                    }
                }
            }

        }