public object Deserialize(byte[] data)
        {
            PayloadReader pr = new PayloadReader(data);
            ObjectTypes   Id = (ObjectTypes)pr.ReadByte();

            switch (Id)
            {
            case ObjectTypes.Null: return(null);

            case ObjectTypes.Other:
            {
                BinaryFormatter bf = new BinaryFormatter();
                bf.Binder = new DeserializationBinder();
                return(bf.Deserialize(new MemoryStream(pr.ReadBytes(pr.Length - pr.Offset))));
            }

            case ObjectTypes.Byte: return(pr.ReadByte());

            case ObjectTypes.Short: return(pr.ReadShort());

            case ObjectTypes.UShort: return(pr.ReadUShort());

            case ObjectTypes.Int: return(pr.ReadInteger());

            case ObjectTypes.UINT: return(pr.ReadUInteger());

            case ObjectTypes.Long: return(pr.ReadLong());

            case ObjectTypes.Bool: return(pr.ReadByte() == 1);

            case ObjectTypes.String: return(pr.ReadString());

            case ObjectTypes.SolidBrush: return(new SolidBrush(Color.FromArgb(pr.ReadByte(), pr.ReadByte(), pr.ReadByte(), pr.ReadByte())));

            case ObjectTypes.Rectangle: return(new Rectangle(pr.ReadInteger(), pr.ReadInteger(), pr.ReadInteger(), pr.ReadInteger()));

            case ObjectTypes.Size: return(new Size(pr.ReadInteger(), pr.ReadInteger()));

            case ObjectTypes.ByteArray: return(pr.ReadBytes(pr.ReadInteger()));

            case ObjectTypes.Bitmap:
            {
                using (MemoryStream stream = new MemoryStream(pr.Buffer, pr.Offset, pr.Length - pr.Offset))
                {
                    long   oldPos = stream.Position;
                    Bitmap bmp    = (Bitmap)Bitmap.FromStream(stream);
                    pr.Offset += (int)(stream.Position - oldPos);
                    return(bmp);
                }
            }

            default: throw new Exception("Error deserializing");
            }
        }
Example #2
0
        public PacketHeader(byte[] header, int offset, Connection connection)
        {
            this.connection = connection;
            PayloadReader pr = new PayloadReader(header);

            pr.Offset += offset;

            PacketSize     = pr.ReadThreeByteInteger();
            isCompressed   = pr.ReadBool();
            isCached       = pr.ReadBool();
            PacketID       = (PacketId)pr.ReadByte();
            MessageId      = pr.ReadUInteger();
            PluginId       = pr.ReadULong();
            isPluginPacket = pr.ReadBool();
            CurPacketId    = pr.ReadUShort();
            Hash           = pr.ReadUInteger();
            ChannelId      = pr.ReadUInteger();
            PeerId         = pr.ReadUInteger();
        }
        private void onPacketTaskQueue(IMessage message)
        {
            MsgPacketQueue msgPacketQueue = message as MsgPacketQueue;

            if (msgPacketQueue == null)
            {
                //client is behaving strange
                Client.Disconnect(DisconnectReason.StrangeBehaviorDetected);
                return;
            }

            PayloadReader pr = new PayloadReader(msgPacketQueue.Data);

            while (pr.Offset < pr.Length)
            {
                PacketId packetId   = (PacketId)pr.ReadByte();
                byte     Duplicates = pr.ReadByte();
                bool     isPlugin   = pr.ReadBool();

                ulong PluginId  = isPlugin ? pr.ReadULong() : 0;
                bool  isChannel = pr.ReadBool();

                uint ChannelConnectionId = isChannel ? pr.ReadUInteger() : 0;
                uint MessageId           = pr.ReadUInteger();

                byte[] data        = pr.ReadBytes(pr.ReadThreeByteInteger());
                int    TotalLength = data.Length * Duplicates;

                for (; Duplicates > 0; Duplicates--)
                {
                    //read the message again in a loop just incase if somebody will change the variables in the message
                    IMessage TempMsg = messageHandler.HandleMessage(new PayloadReader(data), MessageId);

                    switch (packetId)
                    {
                    case PacketId.Payload:
                    {
                        try
                        {
                            //if(DPI.Inspect(data, false))
                            {
                                if (Client.MultiThreadProcessing)
                                {
                                    //ThreadPool.QueueUserWorkItem((object o) => Client.onReceiveMessage(TempMsg));
                                }
                                else
                                {
                                    //Client.onReceiveMessage(TempMsg);
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            Client.onException(ex, ErrorType.UserLand);
                        }
                        break;
                    }

                    case PacketId.StreamMessages:
                    {
                        StreamQueue.Enqueue(TempMsg);
                        break;
                    }

                    case PacketId.ChannelPayload:
                    {
                        //new R_ChannelPayload(data) { RawSize = data.Length }.ReadPayload(this);
                        break;
                    }
                    }
                }
            }
        }