protected override void unpack(BinaryBitReader reader)
        {
            CheckFlags flags = (CheckFlags)reader.ReadByte();

            if (flags.HasFlag(CheckFlags.HasByskyToken))
            {
                ByskyToken = new ShortGuid(reader.ReadBytes(16));
            }
        }
Example #2
0
        protected override void unpack(BinaryBitReader reader)
        {
            TargetGroup = reader.ReadByte();

            int length = reader.ReadByte();

            ResendIndexes = new byte[length];

            for (int i = 0; i < length; i++)
            {
                ResendIndexes[i] = reader.ReadByte();
            }
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="payload"></param>
        protected override void unpack(BinaryBitReader reader)
        {
            ReadLocation(reader);

            if (this.Version >= ProtocolVersion.v4__WeatherExtension)
            {
                if (reader.ReadBoolean())
                {
                    RequestLat = reader.ReadFloat(true, 7, 13);
                    RequestLon = reader.ReadFloat(true, 8, 13);
                    PointKey   = (byte)reader.ReadUInt(4);
                }
            }
        }
        protected override void unpack(BinaryBitReader reader)
        {
            Time = START.AddDays(reader.ReadUInt(14));
            Time = Time.AddHours(reader.ReadUInt(5));
            Time = Time.AddMinutes(reader.ReadUInt(2) * 15);

            if (reader.ReadBoolean())
            {
                MonthlyBegin = START.AddDays(reader.ReadUInt(14));
                MonthlyNext  = START.AddDays(reader.ReadUInt(14));
            }

            Balance = (int?)reader.ReadIntNullable(15);
            Units   = (int?)reader.ReadIntNullable(15);
            Usages  = (int?)reader.ReadIntNullable(15);
        }
Example #5
0
        protected override void unpack(BinaryBitReader reader)
        {
            Flags flags = (Flags)reader.ReadByte();

            if (flags.HasFlag(Flags.HasSubscriber))
            {
                string            number  = Read(reader);
                SubscriberNetwork network = (SubscriberNetwork)reader.ReadUInt(5);

                this.Subscriber = new Subscriber(number, network);
            }
            if (flags.HasFlag(Flags.HasId))
            {
                this.Id = reader.ReadUInt16();
            }
            if (flags.HasFlag(Flags.HasConversation))
            {
                this.Conversation = new ushort?(reader.ReadUInt16());
            }
            if (flags.HasFlag(Flags.HasSubject))
            {
                this.Subject = Read(reader);
            }
            if (flags.HasFlag(Flags.HasText))
            {
                base.Text = Read(reader);
            }
            if (flags.HasFlag(Flags.HasLocation))
            {
                ReadLocation(reader);
            }
            if (flags.HasFlag(Flags.HasByskyToken))
            {
                base.ByskyToken = new ShortGuid(reader.ReadBytes(16));
            }
            if (flags.HasFlag(Flags.HasFile))
            {
                base.FileExtension = (FileExtension)reader.ReadUInt(4);

                if (base.FileExtension.Value.IsImage())
                {
                    base.ImageQuality = (ImageQuality)reader.ReadUInt(2);
                }

                base.File = ReadBytes(reader);
            }
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="buffer"></param>
        /// <returns></returns>
        public static ProtocolVersion GetProtocolVersion(byte[] buffer)
        {
            using (MemoryStream stream = new MemoryStream(buffer))
            {
                using (BinaryBitReader reader = new BinaryBitReader((Stream)stream))
                {
                    if (!CheckSignature(reader.ReadByte()))
                    {
                        throw new FormatException("Invalid signature!");
                    }

                    reader.ReadBoolean();
                    reader.ReadBoolean();
                    return((ProtocolVersion)reader.ReadUInt(3));
                }
            }
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="reader"></param>
        protected void ReadLocation(BinaryBitReader reader)
        {
            if (Version >= ProtocolVersion.v2__LocationFix)
            {
                Lat = reader.ReadFloat(true, 7, 13);
                Lon = reader.ReadFloat(true, 8, 13);
            }
            else
            {
                Lat = reader.ReadFloat(true, 7, 9);
                Lon = reader.ReadFloat(true, 8, 9);
            }


            bool hasAlt = reader.ReadBoolean();

            if (hasAlt)
            {
                Alt = (int)reader.ReadUInt(14);
            }
        }
 protected override void unpack(BinaryBitReader reader)
 {
     SentGroup = reader.ReadByte();
 }
        /// <summary>
        ///
        /// </summary>
        /// <param name="direction"></param>
        /// <param name="buffer"></param>
        /// <returns></returns>
        public static Message Unpack(byte[] buffer, IPacketBuffer packetBuffer = null)
        {
            if (packetBuffer == null)
            {
                packetBuffer = new RealmPacketBuffer();
            }


            using (MemoryStream stream = new MemoryStream(buffer))
            {
                using (BinaryBitReader reader = new BinaryBitReader((Stream)stream))
                {
                    if (!CheckSignature(reader.ReadByte()))
                    {
                        throw new FormatException("Invalid signature!");
                    }

                    var direction = reader.ReadBoolean() ? Direction.MO : Direction.MT;
                    var composite = reader.ReadBoolean() ? Composite.Complex : Composite.Simple;
                    var version   = reader.ReadUInt(3);

                    var length = (0 + (reader.ReadBoolean() ? ((ushort)0x400) : ((ushort)0)))
                                 + (reader.ReadBoolean() ? ((ushort)0x200) : ((ushort)0))
                                 + (reader.ReadBoolean() ? ((ushort)0x100) : ((ushort)0));

                    int parts = 1;
                    int part  = 0;
                    int group = 0;

                    if (composite == Composite.Complex)
                    {
                        group = reader.ReadByte();
                        parts = reader.ReadByte();
                        part  = reader.ReadByte();
                    }

                    MessageType messageType = (MessageType)reader.ReadByte();
                    length += reader.ReadByte();

                    byte[] payload = reader.ReadBytes(length);
                    byte   sum     = reader.ReadByte();
                    int    index   = 0;

                    while (true)
                    {
                        if (index >= (stream.Length - 1L))
                        {
                            if (sum != 0)
                            {
                                throw new FormatException("Invalid checksum!");
                            }

                            var     types   = direction == Direction.MT ? KnownMTTypes : KnownMOTypes;
                            var     type    = types.Where(t => t.Key == messageType).FirstOrDefault();
                            Message message = (Message)Activator.CreateInstance(type.Value, true);

                            message.Version    = (ProtocolVersion)version;
                            message.Composite  = composite;
                            message.Group      = (byte)group;
                            message.Index      = (byte)part;
                            message.TotalParts = (byte)parts;
                            message.Payload    = payload;

                            var packet = new Packet()
                            {
                                Direction  = direction == Direction.MO ? PacketDirection.Outbound : PacketDirection.Inbound,
                                Index      = message.Index,
                                Group      = message.Group,
                                TotalParts = message.TotalParts,
                                Payload    = message.Payload,
                            };
                            packetBuffer.SavePacket(packet);

                            message.ReadyParts = (byte)packetBuffer.GetPacketCount(message.Group, packet.Direction);

                            if (message.Complete)
                            {
                                var __parts = packetBuffer
                                              .GetPackets(message.Group, packet.Direction)
                                              .OrderBy(x => x.Index)
                                              .Select(x => x.Payload)
                                              .ToList();

                                message.Payload = ByteArrayHelper.Merge(__parts);

                                using (MemoryStream stream2 = new MemoryStream(message.Payload))
                                {
                                    using (BinaryBitReader reader2 = new BinaryBitReader((Stream)stream2))
                                    {
                                        message.unpack(reader2);
                                    }
                                }

                                packetBuffer.DeletePackets(message.Group, packet.Direction);
                            }

                            return(message);
                        }

                        sum -= buffer[index];
                        index++;
                    }
                }
            }
        }
 protected abstract void unpack(BinaryBitReader reader);
Example #11
0
 protected override void unpack(BinaryBitReader reader)
 {
 }
Example #12
0
 protected override void unpack(BinaryBitReader reader)
 {
     this.Greeting = Encoding.UTF8.GetString(reader.ReadAllBytes());
 }
        /// <summary>
        ///
        /// </summary>
        /// <param name="payload"></param>
        protected override void unpack(BinaryBitReader reader)
        {
            Forecast = new i360PointForecast();

            bool extended = false;

            if (this.Version >= ProtocolVersion.v3__WeatherExtension)
            {
                extended = reader.ReadBoolean();
            }


            Forecast.TimeOffset = (int)reader.ReadUInt(5) - 12;


            var dates     = new int[16];
            var forecasts = new List <i360Forecast>();
            int month     = 0;

            for (int j = 0; j < 16; j++)
            {
                try
                {
                    var forecast = new i360Forecast();

                    ///->

                    ///Дата не изменилась?
                    bool sameDay = reader.ReadBoolean();

                    ///Если изменилась - сохраняем день от начала месяца
                    if (!sameDay)
                    {
                        dates[j] = (int)reader.ReadUInt(5);
                    }
                    else
                    {
                        dates[j] = dates[j - 1];
                    }


                    if (j > 0 && dates[j] < dates[j - 1])
                    {
                        month++;
                    }


                    int hourOffset = (int)reader.ReadUInt(5);

                    forecast.Date = new DateTime(DateTime.Now.Year, DateTime.Now.Month + month, dates[j], hourOffset, 0, 0, DateTimeKind.Utc);

                    ///->

                    forecast.Temperature = (int)reader.ReadUInt(7) - 70;

                    ///->

                    uint?_pressure = reader.ReadUIntNullable(8);

                    if (_pressure != null)
                    {
                        forecast.Pressure = (int)_pressure + 580;
                    }

                    ///->

                    uint?_cloud = reader.ReadUIntNullable(4);

                    if (_cloud != null)
                    {
                        forecast.Cloud = Math.Min(100, (int)_cloud * 15);
                    }

                    ///->
                    ///
                    uint?_precipitation = reader.ReadUIntNullable(8);

                    if (_precipitation != null)
                    {
                        forecast.Precipitation = _precipitation / 4d;
                    }

                    ///->

                    uint?_windDirection = reader.ReadUIntNullable(4);

                    if (_windDirection != null)
                    {
                        forecast.WindDirection = (int)Math.Round(_windDirection.Value * 45d);
                    }

                    ///-->

                    forecast.WindSpeed = reader.ReadUIntNullable(6);

                    ///->

                    forecast.SnowRisk = reader.ReadBoolean();

                    ///->


                    if (this.Version >= ProtocolVersion.v3__WeatherExtension && extended)
                    {
                        ///->

                        uint?_cloudHeight = reader.ReadUIntNullable(8);

                        if (_cloudHeight != null)
                        {
                            forecast.CloudHeight = (int)(_cloudHeight.Value * 70d);
                        }

                        ///->

                        uint?_visibility = reader.ReadUIntNullable(10);

                        if (_visibility != null)
                        {
                            forecast.Visibility = (int)(_visibility.Value * 10d);
                        }

                        ///->

                        forecast.WindGust = reader.ReadUIntNullable(6);

                        ///->
                    }



                    forecasts.Add(forecast);
                }
                catch (Exception e)
                {
                    Debugger.Break();
                }
            }

            Forecast.DayInfos = forecasts.GroupBy(x => x.Date.Date).Select(x => new i360DayInfo()
            {
                Date = x.Key
            }).ToList();
            Forecast.Forecasts = forecasts;

            if (this.Version >= ProtocolVersion.v4__WeatherExtension)
            {
                if (reader.ReadBoolean())
                {
                    PointKey = (byte)reader.ReadUInt(4);
                }
            }
        }
 /// <summary>
 ///
 /// </summary>
 /// <param name="payload"></param>
 protected override void unpack(BinaryBitReader reader)
 {
     this.Text = Read(reader);
 }
        protected static string Read(BinaryBitReader reader)
        {
            Page?         page    = null;
            StringBuilder builder = new StringBuilder();

            byte[] bytes = new byte[] { };

            while (true)
            {
                try
                {
                    if (page == Page.UNICODE_FORCE)
                    {
                        var b = reader.ReadByte();

                        if (b == (byte)Page.END)
                        {
                            break;
                        }

                        Array.Resize(ref bytes, bytes.Length + 1);
                        bytes[bytes.Length - 1] = b;
                    }
                    else
                    {
                        int num = (((((0 + (reader.ReadBoolean() ? 1 : 0))
                                      + ((reader.ReadBoolean() ? 1 : 0) << 1))
                                     + ((reader.ReadBoolean() ? 1 : 0) << 2))
                                    + ((reader.ReadBoolean() ? 1 : 0) << 3))
                                   + ((reader.ReadBoolean() ? 1 : 0) << 4))
                                  + ((reader.ReadBoolean() ? 1 : 0) << 5);

                        if (num < 8)
                        {
                            page = (Page?)num;

                            if (page == Page.END)
                            {
                                break;
                            }
                        }
                        else
                        {
                            switch (page)
                            {
                            case Page.SYM:
                                builder.Append(page_sym[num - 8]);
                                break;

                            case Page.EN:
                                builder.Append(page_en[num - 8]);
                                break;

                            case Page.RU:
                                builder.Append(page_ru[num - 8]);
                                break;

                            case Page.RU_EXT:
                                builder.Append(page_ru_ext[num - 8]);
                                break;

                            default:
                                throw new NotSupportedException();
                            }
                        }
                    }
                }
                catch (EndOfStreamException)
                {
                    break;
                }
                catch (Exception)
                {
                    Debugger.Break();
                }
            }


            var bb = Encoding.UTF8.GetString(bytes);

            builder.Append(bb);

            return(builder.ToString());
        }
        protected static Stream ReadBytes(BinaryBitReader reader)
        {
            var stream = new MemoryStream();

            byte?h1 = null;
            byte?h2 = null;
            byte?h3 = null;
            byte?h4 = null;
            byte?h5 = null;

            byte?b1 = null;
            byte?b2 = null;
            byte?b3 = null;
            byte?b4 = null;
            byte?b5 = null;

            byte?e1 = null;
            byte?e2 = null;
            byte?e3 = null;

            while (true)
            {
                h1 = h2;
                h2 = h3;
                h3 = h4;
                h4 = h5;
                h5 = b1;

                b1 = b2;
                b2 = b3;
                b3 = b4;
                b4 = b5;
                b5 = e1;

                e1 = e2;
                e2 = e3;
                e3 = reader.ReadByte();

                stream.WriteByte(e3.Value);


                if (e1 == 0 && e2 == 0 && e3 == 0)
                {
                    if (h1 != null && h2 != null && h3 != null && h4 != null && h5 != null)
                    {
                        var hash = Md5.Get(new byte[] { h1.Value, h2.Value, h3.Value, h4.Value, h5.Value }).Take(5).ToArray();

                        if (hash.SequenceEqual(new byte[] { b1.Value, b2.Value, b3.Value, b4.Value, b5.Value }))
                        {
                            break;
                        }
                    }
                }
            }

            ///HASH + END
            stream.SetLength(stream.Length - (5 + 3));
            stream.Capacity = (int)stream.Length;
            stream.Seek(0, SeekOrigin.Begin);
            return(stream);
        }
 protected override void unpack(BinaryBitReader reader)
 {
     this.Content = reader.ReadAllBytes();
 }