/// <summary>
        /// Encode the message from server.
        /// </summary>
        /// <param name='route'>
        /// Route.
        /// </param>
        /// <param name='msg'>
        /// Message.
        /// </param>
        public byte [] encode(string route, JSONNode msg)
        {
            byte [] returnByte = null;
            object  proto;

            if (this.protos.TryGetValue(route, out proto))
            {
                if (!checkMsg(msg, (JSONNode)proto))
                {
                    return(null);
                }
                int     length = Encoder.byteLength(msg.ToString()) * 2;
                int     offset = 0;
                byte [] buff   = new byte[length];

                offset = encodeMsg(buff, offset, (JSONNode)proto, msg);

                returnByte = new byte[offset];
                for (int i = 0; i < offset; i++)
                {
                    returnByte[i] = buff[i];
                }
            }
            return(returnByte);
        }
        /// <summary>
        /// Encode each item in message.
        /// </summary>
        private int encodeProp(object value, string type, int offset, byte [] buffer, JsonObject proto)
        {
            switch (type)
            {
            case "uInt32":
                this.writeUInt32(buffer, ref offset, value);
                break;

            case "int32":
            case "sInt32":
                this.writeSInt32(buffer, ref offset, value);
                break;

            case "float":
                this.writeFloat(buffer, ref offset, value);
                break;

            case "double":
                this.writeDouble(buffer, ref offset, value);
                break;

            case "string":
                this.writeString(buffer, ref offset, value);
                break;

            default:
                object __messages;
                object __message_type;

                if (proto.TryGetValue("__messages", out __messages))
                {
                    if (((JsonObject)__messages).TryGetValue(type, out __message_type) || protos.TryGetValue("message " + type, out __message_type))
                    {
                        byte [] tembuff = new byte[Encoder.byteLength(value.ToString()) * 3];
                        int     length  = 0;
                        length = this.encodeMsg(tembuff, length, (JsonObject)__message_type, (JsonObject)value);
                        offset = writeBytes(buffer, offset, Encoder.encodeUInt32((uint)length));
                        for (int i = 0; i < length; i++)
                        {
                            buffer[offset] = tembuff[i];
                            offset++;
                        }
                    }
                }
                break;
            }
            return(offset);
        }
예제 #3
0
        private int encodeProp(object value, string type, int offset, byte[] buffer, JsonObject proto)
        {
            switch (type)
            {
            case "uInt32":
                this.writeUInt32(buffer, ref offset, value);
                break;

            case "int32":
            case "sInt32":
                this.writeInt32(buffer, ref offset, value);
                break;

            case "float":
                this.writeFloat(buffer, ref offset, value);
                break;

            case "double":
                this.writeDouble(buffer, ref offset, value);
                break;

            case "string":
                this.writeString(buffer, ref offset, value);
                break;

            default:
                object obj1;
                object obj2;
                if (proto.TryGetValue("__messages", out obj1) && (((JsonObject)obj1).TryGetValue(type, out obj2) || this.protos.TryGetValue("message " + type, out obj2)))
                {
                    byte[] buffer1 = new byte[Encoder.byteLength(value.ToString()) * 3];
                    int    offset1 = 0;
                    int    num     = this.encodeMsg(buffer1, offset1, (JsonObject)obj2, (JsonObject)value);
                    offset = this.writeBytes(buffer, offset, Encoder.encodeUInt32((uint)num));
                    for (int index = 0; index < num; ++index)
                    {
                        buffer[offset] = buffer1[index];
                        ++offset;
                    }
                    break;
                }
                break;
            }
            return(offset);
        }
        /// <summary>
        /// Encode the array type.
        /// </summary>
        private int encodeArray(List <object> msg, JObject protoField, int offset, byte[] buffer)
        {
            var type = protoField["type"];
            var id   = protoField["id"];

            if (type != null && id != null)
            {
                if (util.isSimpleType(type.ToString()))
                {
                    // 简单类型,packed 编码
                    int    length    = Encoder.byteLength(msg.ToString()) * 2;
                    int    subOffset = 0;
                    byte[] subBuff   = new byte[length];
                    offset = writeBytes(buffer, offset, encodeTag("repeated", Convert.ToInt32(id)));
                    foreach (object item in msg)
                    {
                        subOffset = encodeProp(item, type.ToString(), subOffset, subBuff, true);
                    }
                    offset = writeBytes(buffer, offset, Encoder.encodeUInt32((uint)subOffset));
                    for (var i = 0; i < subOffset; i++)
                    {
                        buffer[offset + i] = subBuff[i];
                    }
                    offset += subOffset;
                }
                else
                {
                    foreach (object item in msg)
                    {
                        int    length    = Encoder.byteLength(msg.ToString()) * 2;
                        int    subOffset = 0;
                        byte[] subBuff   = new byte[length];
                        offset    = writeBytes(buffer, offset, encodeTag("repeated", Convert.ToInt32(id)));
                        subOffset = encodeProp(item, type.ToString(), subOffset, subBuff, true);
                        offset    = writeBytes(buffer, offset, Encoder.encodeUInt32((uint)subOffset));
                        for (var i = 0; i < subOffset; i++)
                        {
                            buffer[offset + i] = subBuff[i];
                        }
                        offset += subOffset;
                    }
                }
            }
            return(offset);
        }
        /// <summary>
        /// Encode the message from server.
        /// </summary>
        /// <param name='route'>
        /// Route.
        /// </param>
        /// <param name='msg'>
        /// Message.
        /// </param>
        public byte[] encode(string route, JObject msg)
        {
            byte[]  returnByte = null;
            JObject proto      = util.GetProtoMessage(protos, route);

            if (proto != null)
            {
                int    length = Encoder.byteLength(msg.ToString()) * 2;
                int    offset = 0;
                byte[] buff   = new byte[length];
                offset     = encodeMsg(buff, offset, proto, msg);
                returnByte = new byte[offset];
                for (int i = 0; i < offset; i++)
                {
                    returnByte[i] = buff[i];
                }
            }
            return(returnByte);
        }
        private void encodeObject(string type, JObject msg, ref int offset, byte[] buffer, bool inArray)
        {
            JObject subProto = util.GetProtoMessage(protos, type);

            if (subProto != null)
            {
                byte[] subBuff   = new byte[Encoder.byteLength(msg.ToString())];
                int    subOffset = 0;
                subOffset = encodeMsg(subBuff, subOffset, subProto, msg);
                if (!inArray)
                {
                    // 不在数组里,则需要记录长度
                    offset = writeBytes(buffer, offset, Encoder.encodeUInt32((uint)subOffset));
                }
                for (int i = 0; i < subOffset; i++)
                {
                    buffer[offset + i] = subBuff[i];
                }
                offset += subOffset;
            }
        }
예제 #7
0
        public byte[] encode(string route, JsonObject msg)
        {
            byte[] numArray = (byte[])null;
            object obj;

            if (this.protos.TryGetValue(route, out obj))
            {
                if (!this.checkMsg(msg, (JsonObject)obj))
                {
                    return((byte[])null);
                }
                int    length1 = Encoder.byteLength(msg.ToString()) * 2;
                int    offset  = 0;
                byte[] buffer  = new byte[length1];
                int    length2 = this.encodeMsg(buffer, offset, (JsonObject)obj, msg);
                numArray = new byte[length2];
                for (int index = 0; index < length2; ++index)
                {
                    numArray[index] = buffer[index];
                }
            }
            return(numArray);
        }