protected override void unpack(BinaryBitReader reader) { CheckFlags flags = (CheckFlags)reader.ReadByte(); if (flags.HasFlag(CheckFlags.HasByskyToken)) { ByskyToken = new ShortGuid(reader.ReadBytes(16)); } }
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="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++; } } } }