/// <summary> /// Generates a <code>HLAFixedRecordDataAttribute</code>. /// </summary> private void GenerateHLAFixedRecordDataAttribute(int localIndentLevel, System.IO.StreamWriter ps, HLAFixedRecordData fixedRecord) { string indentStr = GenerateIndentString(localIndentLevel); string newLine = "," + Environment.NewLine + indentStr + " "; ps.Write(indentStr + "[HLAFixedRecordData(Name = \"" + fixedRecord.Name + "\""); if (!String.IsNullOrEmpty(fixedRecord.Encoding)) { ps.Write(newLine); ps.Write("Encoding = \"" + fixedRecord.Encoding + "\""); } if (!String.IsNullOrEmpty(fixedRecord.EncodingNotes)) { ps.Write(newLine); ps.Write("EncodingNotes = \"" + fixedRecord.EncodingNotes + "\""); } if (!String.IsNullOrEmpty(fixedRecord.Semantics)) { ps.Write(newLine); ps.Write("Semantics = \"" + fixedRecord.Semantics + "\""); } if (!String.IsNullOrEmpty(fixedRecord.SemanticsNotes)) { ps.Write(newLine); ps.Write("SemanticsNotes = \"" + fixedRecord.SemanticsNotes + "\""); } if (!String.IsNullOrEmpty(fixedRecord.NameNotes)) { ps.Write(newLine); ps.Write("NameNotes = \"" + fixedRecord.NameNotes + "\""); } ps.WriteLine(")]"); }
/// <summary> /// Generates a fixed record data type class. /// </summary> private void GenerateFixedRecordDataType(System.IO.StreamWriter stream, HLAFixedRecordData fixedRecord) { int indentLevel = 0; string indentStr = GenerateIndentString(indentLevel); System.String typeName = fixedRecord.Name; try { System.IO.StreamWriter ps; if (stream == null) { String qualifiedTypeName = packagePrefix + typeName; String path = qualifiedTypeName.Replace('.', Path.DirectorySeparatorChar) + ".cs"; System.IO.FileInfo sourceFile = new System.IO.FileInfo(targetDirectory.FullName + Path.DirectorySeparatorChar + path); System.IO.Directory.CreateDirectory(new System.IO.FileInfo(sourceFile.DirectoryName).FullName); System.IO.FileStream fos = new System.IO.FileStream(sourceFile.FullName, System.IO.FileMode.Create); ps = new System.IO.StreamWriter(fos); System.String packageName = GetPackageName(qualifiedTypeName); if (packageName != null) { ps.WriteLine(indentStr + "namespace " + packageName); } else { ps.WriteLine(indentStr + "namespace Sxta.Rti1516.Proxies"); } ps.WriteLine(indentStr + "{"); indentLevel++; indentStr = GenerateIndentString(indentLevel); ps.WriteLine(indentStr + "using System;"); ps.WriteLine(indentStr + "using System.IO;"); ps.WriteLine(); ps.WriteLine(indentStr + "using Sxta.Rti1516.Reflection;"); } else { ps = stream; } ps.WriteLine(); if (!string.IsNullOrEmpty(fixedRecord.Semantics)) { PrintClassComment(ps, fixedRecord.Semantics, indentLevel); } else { PrintClassComment(ps, "Autogenerated fixed record data type.", indentLevel); } ps.WriteLine(indentStr + "[Serializable]"); GenerateHLAFixedRecordDataAttribute(indentLevel, ps, fixedRecord); ps.WriteLine(indentStr + "public struct " + typeName); ps.WriteLine(indentStr + "{"); indentLevel++; indentStr = GenerateIndentString(indentLevel); IList <HLARecordField> fields = fixedRecord.RecordFields; bool first = true; for (int i = 0; i < fields.Count; i++) { HLARecordField field = fields[i]; if (NativeTypeForDataType(field.DataType) != null) { if (!string.IsNullOrEmpty(field.Semantics)) { PrintVariableComment(ps, field.Semantics, indentLevel); } else { PrintVariableComment(ps, "Field #" + i + ".", indentLevel); } string propertyRecordFieldName = BuildRecordFieldPropertyName(field.Name, typeName); string nativeFieldName = BuildRecordFieldName(field.Name, typeName, propertyRecordFieldName); ps.WriteLine(indentStr + "private " + NativeTypeForDataType(field.DataType) + " " + nativeFieldName + ";"); ps.WriteLine(); } } //---------------------------------------- // FixedRecordDataType.constructor //---------------------------------------- /* Structs dont have parameterless constructors * ps.WriteLine(indentStr + "///<summary>Default constructor.</summary>"); * ps.WriteLine(indentStr + "public " + typeName + "()"); * ps.WriteLine(indentStr + "{"); * * indentLevel++; * indentStr = GenerateIndentString(indentLevel); * * indentLevel--; * indentStr = GenerateIndentString(indentLevel); * ps.WriteLine(indentStr + "}"); * ps.WriteLine(); */ //---------------------------------------- // FixedRecordDataType.ToString //---------------------------------------- ps.WriteLine(indentStr + "///<summary> Returns a string representation of this " + typeName + ". </summary>"); ps.WriteLine(indentStr + "///<returns> a string representation of this " + typeName + "</returns>"); ps.WriteLine(indentStr + "public override String ToString()"); ps.WriteLine(indentStr + "{"); indentLevel++; indentStr = GenerateIndentString(indentLevel); ps.WriteLine(indentStr + "return \"" + typeName + "(\" +"); first = true; for (int i = 0; i < fields.Count; i++) { HLARecordField field = fields[i]; System.String nativeType = NativeTypeForDataType(field.DataType); string propertyRecordFieldName = BuildRecordFieldPropertyName(field.Name, typeName); string nativefieldName = BuildRecordFieldName(field.Name, typeName, propertyRecordFieldName); if (nativeType != null) { if (!first) { ps.WriteLine(" + \", \" +"); } else { first = false; } ps.Write(indentStr + " \"" + field.Name + ": \" + " + nativefieldName); } } ps.WriteLine(" + "); ps.WriteLine(indentStr + " \")\";"); indentLevel--; indentStr = GenerateIndentString(indentLevel); ps.WriteLine(indentStr + "}"); //---------------------------------------- // FixedRecordDataType.Attributes (Gets/Sets) //---------------------------------------- for (int i = 0; i < fields.Count; i++) { HLARecordField field = fields[i]; System.String propertyRecordFieldName = BuildRecordFieldPropertyName(field.Name, typeName); System.String fieldName = BuildRecordFieldName(field.Name, typeName, propertyRecordFieldName); System.String fieldType = field.DataType; System.String fieldNativeType = NativeTypeForDataType(fieldType); if (fieldNativeType != null) { ps.WriteLine(); ps.WriteLine(indentStr + "///<summary>"); ps.WriteLine(indentStr + "/// Gets/Sets the value of the " + field.Name + " field."); ps.WriteLine(indentStr + "///</summary>"); GenerateHLARecordFieldAttribute(indentLevel, ps, field); ps.WriteLine(indentStr + "public " + fieldNativeType + " " + propertyRecordFieldName); ps.WriteLine(indentStr + "{"); ps.WriteLine(indentStr + " set {" + fieldName + " = value; }"); ps.WriteLine(indentStr + " get { return " + fieldName + "; }"); ps.WriteLine(indentStr + "}"); ps.WriteLine(); } } indentLevel--; indentStr = GenerateIndentString(indentLevel); ps.WriteLine(indentStr + "}"); if (stream == null) { indentLevel--; indentStr = GenerateIndentString(indentLevel); ps.WriteLine(indentStr + "}"); ps.Flush(); ps.Close(); } } catch (System.IO.IOException ioe) { System.Console.Error.WriteLine("Error generating fixed record data type: " + ioe); } }
/// <summary> /// Generates a serializer class for the fixed record data type class. /// </summary> private void GenerateFixedRecordDataTypeSerializers(System.IO.StreamWriter stream, HLAFixedRecordData fixedRecord, int indentLevel) { string indentStr = GenerateIndentString(indentLevel); String typeName = fixedRecord.Name; String typeNameSerializer = typeName + "XrtiSerializer"; try { System.IO.StreamWriter ps; if (stream == null) { String qualifiedTypeName = packagePrefix + typeNameSerializer; String path = qualifiedTypeName.Replace('.', Path.DirectorySeparatorChar) + ".cs"; System.IO.FileInfo sourceFile = new System.IO.FileInfo(targetDirectory.FullName + Path.DirectorySeparatorChar + path); System.IO.Directory.CreateDirectory(new System.IO.FileInfo(sourceFile.DirectoryName).FullName); System.IO.FileStream fos = new System.IO.FileStream(sourceFile.FullName, System.IO.FileMode.Create); ps = new System.IO.StreamWriter(fos); System.String packageName = GetPackageName(qualifiedTypeName); if (packageName != null) { ps.WriteLine(indentStr + "namespace " + packageName); } else { ps.WriteLine(indentStr + "namespace Sxta.Rti1516.Proxies"); } ps.WriteLine(indentStr + "{"); indentLevel++; indentStr = GenerateIndentString(indentLevel); ps.WriteLine(indentStr + "using System;"); ps.WriteLine(indentStr + "using System.IO;"); ps.WriteLine(); ps.WriteLine(indentStr + "using HlaEncodingReader = Sxta.Rti1516.Serializers.XrtiEncoding.HlaEncodingReader;"); ps.WriteLine(indentStr + "using HlaEncodingWriter = Sxta.Rti1516.Serializers.XrtiEncoding.HlaEncodingWriter;"); } else { ps = stream; } ps.WriteLine(); ps.WriteLine(); PrintClassComment(ps, "Serializes and deserializes " + typeName + " objects into and from HLA formats.", indentLevel); ps.WriteLine(indentStr + "public sealed class " + typeNameSerializer); ps.WriteLine(indentStr + "{"); indentLevel++; indentStr = GenerateIndentString(indentLevel); //---------------------------------------- // FixedRecordDataType.Serializer.Serialize //---------------------------------------- ps.WriteLine(indentStr + "///<summary>"); ps.WriteLine(indentStr + "/// Writes this " + typeName + " to the specified stream."); ps.WriteLine(indentStr + "///</summary>"); ps.WriteLine(indentStr + "///<param name=\"writer\"> the output stream to write to</param>"); ps.WriteLine(indentStr + "///<param name=\"obj\"> the object to serialize</param>"); ps.WriteLine(indentStr + "///<exception cref=\"IOException\"> if an error occurs</exception>"); ps.WriteLine(indentStr + "public static void Serialize(HlaEncodingWriter writer, " + typeName + " obj)"); ps.WriteLine(indentStr + "{"); indentLevel++; indentStr = GenerateIndentString(indentLevel); IList <HLARecordField> fields = fixedRecord.RecordFields; for (int i = 0; i < fields.Count; i++) { HLARecordField field = fields[i]; if (NativeTypeForDataType(field.Name) != null) { PrintSerializationBlock(ps, indentLevel, 'i', field.DataType, "obj." + BuildRecordFieldPropertyName(field.Name, typeNameSerializer), "writer"); } } indentLevel--; indentStr = GenerateIndentString(indentLevel); ps.WriteLine(indentStr + "}"); ps.WriteLine(); //---------------------------------------- // FixedRecordDataType.Serializer.Deserialize //---------------------------------------- ps.WriteLine(); ps.WriteLine(indentStr + "///<summary>"); ps.WriteLine(indentStr + "/// Reads and returns a " + typeName + " from the specified stream."); ps.WriteLine(indentStr + "///</summary>"); ps.WriteLine(indentStr + "///<param name=\"reader\"> the input stream to read from</param>"); ps.WriteLine(indentStr + "///<returns> the decoded value</returns>"); ps.WriteLine(indentStr + "///<exception cref=\"IOException\"> if an error occurs</exception>"); ps.WriteLine(indentStr + "public static " + typeName + " Deserialize(HlaEncodingReader reader)"); ps.WriteLine(indentStr + "{"); indentLevel++; indentStr = GenerateIndentString(indentLevel); ps.WriteLine(indentStr + typeName + " decodedValue = new " + typeName + "();"); ps.WriteLine(); for (int i = 0; i < fields.Count; i++) { HLARecordField field = fields[i]; if (NativeTypeForDataType(field.Name) != null) { PrintDeserializationBlock(ps, indentLevel, 'i', field.DataType, "decodedValue." + BuildRecordFieldPropertyName(field.Name, typeNameSerializer), "reader"); } } ps.WriteLine(indentStr + "return decodedValue;"); indentLevel--; indentStr = GenerateIndentString(indentLevel); ps.WriteLine(indentStr + "}"); ps.WriteLine(); indentLevel--; indentStr = GenerateIndentString(indentLevel); ps.WriteLine(indentStr + "}"); ps.WriteLine(); if (stream == null) { indentLevel--; indentStr = GenerateIndentString(indentLevel); ps.WriteLine(indentStr + "}"); ps.Flush(); ps.Close(); } } catch (System.IO.IOException ioe) { System.Console.Error.WriteLine("Error generating fixed record data type: " + ioe); } }