public void GenerateWriteMethod() { var tab = 0; var writeMethod = new MethodInfo { AccessModifiers = AccessModifiers.Public | AccessModifiers.Override, Arguments = new List <ParameterInfo> { new ParameterInfo(typeof(BinaryWriter)), new ParameterInfo(typeof(int), "nextAddress") }, ClassName = "Write", Returns = "int" }; var binaryWriter = writeMethod.Arguments.First(); var addressParam = writeMethod.Arguments[1]; var bodyBuilder = new StringBuilder(); bodyBuilder.AppendLine(string.Format("using({0})", StaticReflection.GetMemberName((BinaryWriter b) => b.BaseStream.Pin(), binaryWriter))); bodyBuilder.AppendLine("{".Tab(ref tab)); foreach (var item in Fields) { if (item.IsArray) { // fixed byte array like padding or skip arrays if (item.ArraySize > 0 && Type.GetType(item.FieldTypeName) == typeof(byte)) { bodyBuilder.AppendLine(string.Format("{0}.Write({1}, 0, {2});", binaryWriter.Name, item.Value.Name, item.ArraySize)); } // variable byte array (data) else if (Type.GetType(item.FieldTypeName) == typeof(byte)) { bodyBuilder.AppendLine(string.Format("{1} = Guerilla.WriteData({0}, {2}, {1});", binaryWriter.Name, addressParam.Name, item.Value.Name)); } // variable short array (data) else if (Type.GetType(item.FieldTypeName) == typeof(short)) { bodyBuilder.AppendLine(string.Format("{1} = Guerilla.WriteData({0}, {2}, {1});", binaryWriter.Name, addressParam.Name, item.Value.Name)); } // inline array else if (item.ArraySize > 0) { for (var i = 0; i < item.ArraySize; i++) { bodyBuilder.AppendLine(string.Format("{0}[{1}].Write({2});", item.Value.Name, i, binaryWriter.Name)); } } // assume a TagBlock else { var format = string.Format("{3} = Guerilla.WriteBlockArray<{1}>({2}, {0}, {3});", item.Value.Name, item.FieldTypeName, binaryWriter.Name, addressParam.Name); bodyBuilder.AppendLine(format); } } else { if (EnumDefinitions.Any(x => x.Value.Name == item.FieldTypeName)) { var enumDefinition = EnumDefinitions.First(x => x.Value.Name == item.FieldTypeName); var type = enumDefinition.BaseType == EnumInfo.Type.Byte ? "Byte" : enumDefinition.BaseType == EnumInfo.Type.Short ? "Int16" : "Int32"; bodyBuilder.AppendLine(string.Format("{0}.Write(({1}){2});", binaryWriter.Name, type, item.Value.Name)); } else if (Type.GetType(item.FieldTypeName) == null) { bodyBuilder.AppendLine(string.Format("{0}.Write({1});", item.Value.Name, binaryWriter.Name)); } else { bodyBuilder.AppendLine(string.Format("{0}.Write({1});", binaryWriter.Name, item.Value.Name)); } } } bodyBuilder.AppendLine(string.Format("return {0};", writeMethod.Arguments[1].Name)); bodyBuilder.AppendLine("}".Tab(ref tab)); var baseMethodCall = string.Format("base.{0};\n", writeMethod.GetMethodCallSignature()); writeMethod.Body = baseMethodCall + bodyBuilder.ToString().Trim(); Methods.Add(writeMethod); }
public void GenerateBinaryReaderConstructor( ) { Constructors.Add(new MethodInfo( ) { ClassName = this.Value.Name, Returns = "", AccessModifiers = AccessModifiers.Internal, Arguments = { "BinaryReader binaryReader" }, Wrapper = string.IsNullOrWhiteSpace(BaseClass) ? false : true }); StringBuilder stringBuilder = new StringBuilder( ); foreach (var item in this.Fields) { if (item.IsArray) { // fixed byte array like padding or skip arrays if (item.ArraySize > 0 && Type.GetType(item.FieldTypeName) == typeof(byte)) { stringBuilder.AppendLine(string.Format("this.{0} = binaryReader.ReadBytes({1});", item.Value.Name, item.ArraySize)); } // variable byte array (data) else if (Type.GetType(item.FieldTypeName) == typeof(byte)) { stringBuilder.AppendLine(string.Format("this.{0} = ReadData(binaryReader);", item.Value.Name, item.ArraySize)); } // inline array else if (item.ArraySize > 0) { string initializer = ""; for (int i = 0; i <= item.ArraySize - 1; i++) { initializer += string.Format("new {0}(binaryReader){1}", item.FieldTypeName, i == item.ArraySize ? "" : ", "); } stringBuilder.AppendLine(string.Format("this.{0} = new []{{ {1} }};", item.Value.Name, initializer)); } // assume an TagBlock else { var methodInfo = this.MethodsTemplates.Where(x => x.ClassName == "Read{0}Array").First( ); stringBuilder.AppendLine(string.Format("this.{0} = {1};", item.Value.Name, methodInfo.GetMethodCallSignatureFormat(item.FieldTypeName, "binaryReader"))); var method = methodInfo.MakeFromTemplate(item.FieldTypeName); if (!this.Methods.Where(x => x.ClassName == method.ClassName && x.Arguments == method.Arguments && x.Returns == method.Returns).Any( )) { this.Methods.Add(method); } } } else { if (EnumDefinitions.Where(x => x.Value.Name == item.FieldTypeName).Any( )) { var enumDefinition = EnumDefinitions.Where(x => x.Value.Name == item.FieldTypeName).First( ); string type = enumDefinition.BaseType == EnumInfo.Type.Byte ? "Byte" : enumDefinition.BaseType == EnumInfo.Type.Short ? "Int16" : "Int32"; stringBuilder.AppendLine(string.Format("this.{0} = ({1})binaryReader.Read{2}();", item.Value.Name, item.FieldTypeName, type)); } else if (Type.GetType(item.FieldTypeName) == null) { stringBuilder.AppendLine(string.Format("this.{0} = new {1}(binaryReader);", item.Value.Name, item.FieldTypeName)); } else { var value = GuerillaCs.GetBinaryReaderMethodName(Type.GetType(item.FieldTypeName)); stringBuilder.AppendLine(string.Format("this.{0} = binaryReader.{1}();", item.Value.Name, value)); } } } Constructors.Last( ).Body = stringBuilder.ToString( ).TrimEnd( ); }