/// <summary>
        /// Generates the struct deserializer code.
        /// </summary>
        /// <param name="dataType">Type of the data.</param>
        /// <returns>Serializer code for structs</returns>
        private string GenerateDeserializerSignature(XerusStruct dataType)
        {
            string name = dataType.Name;
            var    tb   = new TextBuilder();

            tb.AppendLine(string.Format(@"/** Deserializer for data type {0}
*  @param data Buffer with the serialized data
*  @param output Data type
*  @return  Length of the data in bytes
*/", name));
            tb.AppendLine("static uint16 Bytes_To_{0}(const uint8 *const data, {0} &output);", name);
            return(tb.ToString());
        }
        /// <summary>
        /// Generates the struct serializer code.
        /// </summary>
        /// <param name="dataType">Type of the data.</param>
        /// <returns>Serializer code for structs</returns>
        private string GenerateSerializerSignature(XerusStruct dataType)
        {
            string name = dataType.Name;
            var    tb   = new TextBuilder();

            tb.AppendLine(string.Format(@"/** Serializer for data type {0}
*  @param input Data type
*  @param data Buffer for the serialized data
*  @return Length of the serialized data in bytes
*/", name));
            tb.AppendLine("static uint16 {0}_To_Bytes(const {0} input, uint8 *const data);", name);
            return(tb.ToString());
        }
Exemple #3
0
        /// <summary>
        /// 转换为字符串
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            var          builder    = new TextBuilder();
            const string timeFormat = "yyyy-MM-dd HH:mm:ss.fff";

            if (this.HasRequest == true)
            {
                builder
                .AppendLine($"[REQUEST]{this.RequestTime.ToString(timeFormat)}")
                .AppendIfNotNull(this.RequestHeaders)
                .AppendLineIfNotNull(this.RequestContent);
            }

            if (this.HasResponse == true)
            {
                builder
                .AppendLineIfHasValue()
                .AppendLine($"[RESPONSE]{this.ResponseTime.ToString(timeFormat)}")
                .AppendIfNotNull(this.ResponseHeaders)
                .AppendLineIfNotNull(this.ResponseContent);
            }

            if (this.Exception != null)
            {
                builder
                .AppendLineIfHasValue()
                .AppendLine($"[EXCEPTION]")
                .AppendLine(this.Exception.ToString());
            }

            return(builder
                   .AppendLineIfHasValue()
                   .Append($"[ELAPSED]{this.ResponseTime.Subtract(this.RequestTime)}")
                   .ToString());
        }
        /// <summary>
        /// Generates the serializer code for an enum
        /// </summary>
        /// <param name="dataType">Type of the data.</param>
        /// <returns>Serializer code for enums</returns>
        private string GenerateSerializerDefinition(XerusEnumType dataType, string serializerName)
        {
            string name = dataType.Name;

            int maxValue = 0;

            foreach (var xerusEnumMemberType in dataType.Members)
            {
                if (xerusEnumMemberType.DefinedValue > maxValue)
                {
                    maxValue = xerusEnumMemberType.DefinedValue;
                }
            }

            var tb = new TextBuilder();

            tb.AppendLine(string.Format(
                              @"/** Serializer for data type {0}
*  @param input Data type
*  @param data Buffer for the serialized data
*  @return Length of the serialized data in bytes
*/", name));
            tb.AppendLine("uint16 " + serializerName + "::{0}_To_Bytes(const {0} input, uint8 *const data)", name);
            tb.AppendLine("{");
            tb.PushIndent();

            if (maxValue > 65535)
            {
                tb.AppendLine("uint32_To_Bytes((const uint32)input, data);");
                tb.AppendLine("return 4;");
            }
            else if (maxValue > 255)
            {
                tb.AppendLine("uint16_To_Bytes((const uint16)input, data);");
                tb.AppendLine("return 2;");
            }
            else
            {
                tb.AppendLine("data[0] = input;");
                tb.AppendLine("return 1;");
            }
            tb.PopIndent();
            tb.AppendLine("}");
            return(tb.ToString());
        }
Exemple #5
0
        private void DoTabComplete(bool incremental)
        {
            if (_hasTabCompleteResults)
            {
                string firstMatch = _tabCompleteMatches[_tabCompleteMatchIndex].Match;
                //_textBuilder.CursorPosition = _tabCompletePosition + _tabCompleteStart + _tabCompleteLength;

                if (_tabCompletePrevLength > 0)
                {
                    TextBuilder.CursorPosition = _tabCompletePosition + _tabCompleteStart + _tabCompletePrevLength;
                    for (int i = 0; i < _tabCompletePrevLength; i++)
                    {
                        TextBuilder.RemoveCharacter();
                    }
                }
                else
                {
                    TextBuilder.CursorPosition = _tabCompletePosition + _tabCompleteStart + _tabCompleteLength;
                    for (int i = 0; i < _tabCompleteLength; i++)
                    {
                        TextBuilder.RemoveCharacter();
                    }
                }

                TextBuilder.CursorPosition = _tabCompletePosition + _tabCompleteStart;
                TextBuilder.AppendLine(firstMatch);
                _tabCompletePrevLength = firstMatch.Length;

                if (incremental)
                {
                    if (_tabCompleteMatchIndex + 1 >= _tabCompleteMatches.Length)
                    {
                        _tabCompleteMatchIndex = 0;
                    }
                    else
                    {
                        _tabCompleteMatchIndex++;
                    }
                }
                else
                {
                    if (_tabCompleteMatchIndex - 1 < 0)
                    {
                        _tabCompleteMatchIndex = _tabCompleteMatches.Length - 1;
                    }
                    else
                    {
                        _tabCompleteMatchIndex--;
                    }
                }

                return;
            }
        }
        /// <summary>
        /// Generates the deserializer code for an enum.
        /// </summary>
        /// <param name="dataType">Type of the data.</param>
        /// <returns>Derializer code for enums</returns>
        private string GenerateDeserializerDefinition(XerusEnumType dataType, string serializerName)
        {
            string name = dataType.Name;

            int maxValue = 0;

            foreach (var xerusEnumMemberType in dataType.Members)
            {
                if (xerusEnumMemberType.DefinedValue > maxValue)
                {
                    maxValue = xerusEnumMemberType.DefinedValue;
                }
            }

            var tb = new TextBuilder();

            tb.AppendLine(string.Format(
                              @"/** Deserializer for data type {0}
*  @param data Buffer with the serialized data
*  @return Deserialized data type
*/", name));
            tb.AppendLine("uint16 " + serializerName + "::Bytes_To_{0}(const uint8 *const data, {0}& output )", name);
            tb.AppendLine("{");
            tb.PushIndent();

            if (maxValue > 65535)
            {
                tb.AppendLine("return Bytes_To_uint32(data, (uint32&) output);", name);
            }
            else if (maxValue > 255)
            {
                tb.AppendLine("return Bytes_To_uint16(data, (uint16&) output);", name);
            }
            else
            {
                tb.AppendLine("return Bytes_To_uint8(data, (uint8&) output);", name);
            }

            tb.PopIndent();
            tb.AppendLine("}");
            return(tb.ToString());
        }
        /// <summary>
        /// Creates deserializer for the specified data type.
        /// </summary>
        /// <param name="dataType">Type of the data.</param>
        /// <returns>Serializer code for base types</returns>
        private string GenerateDeserializerDefinition(XerusBaseType dataType, string serializerName)
        {
            string name = dataType.GetType().XerusTypeName(TargetLanguage.Cpp);

            var tb = new TextBuilder();

            tb.AppendLine(string.Format(
                              @"/** Deserializer for data type {0}
*  @param data Buffer with the serialized data
*  @return Deserialized data type
*/", name));
            tb.AppendLine("uint16 " + serializerName + "::Bytes_To_{0}(const uint8 *const data, {0}& output)", name);
            tb.AppendLine("{");
            tb.PushIndent();
            var languageSpecificTypeDefinition = dataType.GetType().TypeDefinition(TargetLanguage.Cpp);

            tb.AppendLine("output = ( *((const {0}*)(data)) );", name);
            tb.AppendLine("return {0};", languageSpecificTypeDefinition.NumberOfBytes);
            tb.PopIndent();
            tb.AppendLine("}");
            return(tb.ToString());
        }
        /// <summary>
        /// Creates serializer for the specified data type.
        /// </summary>
        /// <param name="dataType">Type of the data.</param>
        /// <returns>Serializer code for base types</returns>
        private string GenerateSerializerDefinition(XerusBaseType dataType, string serializerName)
        {
            string name = dataType.GetType().XerusTypeName(TargetLanguage.Cpp);

            var tb = new TextBuilder();

            tb.AppendLine(string.Format(
                              @"/** Serializer for data type {0}
*  @param input Data type
*  @param data Buffer for the serialized data
*  @return Length of the serialized data in bytes
*/", name));
            tb.AppendLine("uint16 " + serializerName + "::{0}_To_Bytes(const {0} input, uint8 *const data)", name);
            tb.AppendLine("{");
            tb.PushIndent();
            var languageSpecificTypeDefinition = dataType.GetType().TypeDefinition(TargetLanguage.Cpp);

            tb.AppendLine("*(({0}*)(data)) = input;", name);
            tb.AppendLine("return {0};", languageSpecificTypeDefinition.NumberOfBytes);
            tb.PopIndent();
            tb.AppendLine("}");
            return(tb.ToString());
        }
Exemple #9
0
 public void AppendLine(string str) => builder.AppendLine(str);
        /// <summary>
        /// Generates the struct deserializer code.
        /// </summary>
        /// <param name="dataType">Type of the data.</param>
        /// <returns>Serializer code for structs</returns>
        private string GenerateDeserializerDefinition(XerusStruct dataType, string serializerName)
        {
            string name = dataType.Name;
            var    tb   = new TextBuilder();

            tb.AppendLine(string.Format(
                              @"/** Deserializer for data type {0}
*  @param input Data type
*  @param data Buffer with the serialized data
*  @return Deserialized data type
*/", name));
            tb.AppendLine("uint16 " + serializerName + "::Bytes_To_{0}(const uint8 *const data, {0} &output)", name);
            tb.AppendLine("{");
            tb.PushIndent();

            tb.AppendLine("int offset = 0;");

            foreach (var memberInfo in dataType.GetType().GetFields())
            {
                var fieldType = memberInfo.FieldType;

                if (fieldType.IsArray)
                {
                    var arrayRank = fieldType.GetArrayRank();
                    var value     = memberInfo.GetValue(dataType);
                    if (value == null)
                    {
                        throw new ModelValidationException(string.Format("The dimension of the array {0}.{1} has to be specifed. e.g. DataType[,] Member1 = new DataType[5,2]", dataType.Name, memberInfo.Name));
                    }

                    var array       = value as Array;
                    var indexString = new StringBuilder();

                    for (int currentRank = 0; currentRank < arrayRank; currentRank++)
                    {
                        tb.AppendLine("for (int index{0} = 0; index{0} < {1}; index{0}++)", currentRank, array.GetLength(currentRank));
                        tb.AppendLine("{");
                        tb.PushIndent();
                        indexString.Append(string.Format("[index{0}]", currentRank));
                    }

                    tb.AppendLine("offset+=Bytes_To_{0}(data+offset, output.{1}{2});", fieldType.XerusTypeName(TargetLanguage.Cpp), memberInfo.Name, indexString.ToString());

                    for (int currentRank = 0; currentRank < arrayRank; currentRank++)
                    {
                        tb.PopIndent();
                        tb.AppendLine("}");
                    }
                }
                else
                {
                    tb.AppendLine("offset+=Bytes_To_{0}(data+offset, output.{1});", fieldType.XerusTypeName(TargetLanguage.Cpp), memberInfo.Name);
                }
            }


            tb.AppendLine("return offset;");
            tb.PopIndent();
            tb.AppendLine("}");

            return(tb.ToString());
        }