Пример #1
0
        public byte[] Encode(object message, ref short serial)
        {
            var factory = _factories.FirstOrDefault(f => f.ContainsType(message.GetType()));

            byte[] result = null;

            if (factory == null)
            {
                throw new InvalidProgramException($"Invalid message type {message.GetType()}");
            }

            ushort opCode = factory.GetOpCode(message.GetType());

            var att = message
                      .GetType()
                      .GetCustomAttributes(false)
                      .Where(x => x.GetType() == typeof(WZContractAttribute))
                      .FirstOrDefault() as WZContractAttribute;

            if (att == null)
            {
                throw new InvalidOperationException("Invalid message format");
            }

            using (var h = new MemoryStream())
                using (var b = new MemoryStream())
                {
                    Serializer.Serialize(b, message);
                    var body    = b.ToArray();
                    var length  = body.Length;
                    var sizeFix = (((opCode & 0xFF00) == 0xFF00) ? 1 : 0);

                    if (att.LongMessage)
                    {
                        var header = new WZWPacket
                        {
                            Type      = (byte)0xC2,
                            Size      = (ushort)(length + 5 - sizeFix),
                            Operation = opCode
                        };

                        if (att.Serialized)
                        {
                            var temp = new byte[header.Size - 2];

                            temp[0] = (byte)serial;

                            Array.Copy(body, 0, temp, 1, body.Length);

                            body         = SimpleModulus.Encoder(temp);
                            header.Type += 2;

                            serial++;
                        }

                        Serializer.Serialize(h, header);
                    }
                    else
                    {
                        var header = new WZBPacket
                        {
                            Type      = (byte)0xC1,
                            Size      = (byte)(length + 4 - sizeFix),
                            Operation = opCode
                        };

                        if (att.Serialized)
                        {
                            var temp = new byte[header.Size - 1];

                            temp[0] = (byte)serial;

                            Array.Copy(body, 0, temp, 1, body.Length);

                            body         = SimpleModulus.Encoder(temp);
                            header.Type += 2;

                            serial++;
                        }

                        Serializer.Serialize(h, header);
                    }

                    var head    = h.ToArray();
                    var headLen = head.Length - sizeFix;

                    result = new byte[headLen + body.Length];
                    Array.Copy(head, result, headLen);
                    Array.Copy(body, 0, result, headLen, body.Length);

                    using (var spe = new StreamPacketEngine(false))
                    {
                        spe.AddData(result);
                        result = spe.ExtractData();
                    }
                }

            return(result);
        }