public void WriteToXMLWriter(XmlWriter xmlWriter, DAIEbx EbxFile) { if (Descriptor.FieldName == "$") { ComplexValue.WriteToXmlWriter(xmlWriter, EbxFile); return; } xmlWriter.WriteStartElement(Descriptor.FieldName); switch (ValueType) { case DAIFieldType.DAI_Complex: case DAIFieldType.DAI_Array: if (ComplexValue != null) { ComplexValue.WriteToXmlWriter(xmlWriter, EbxFile); } break; case DAIFieldType.DAI_String: xmlWriter.WriteString(XmlConvert.EncodeNmToken(GetStringValue())); break; case DAIFieldType.DAI_Int: xmlWriter.WriteValue(GetIntValue().ToString("X8")); break; case DAIFieldType.DAI_UInt: xmlWriter.WriteValue(GetUIntValue().ToString("X8")); break; case DAIFieldType.DAI_Float: xmlWriter.WriteValue(GetFloatValue().ToString("F3")); break; case DAIFieldType.DAI_Short: xmlWriter.WriteValue(GetShortValue().ToString("X4")); break; case DAIFieldType.DAI_UShort: xmlWriter.WriteValue(GetUShortValue().ToString("X4")); break; case DAIFieldType.DAI_Byte: xmlWriter.WriteValue(GetByteValue().ToString("X2")); break; case DAIFieldType.DAI_Long: xmlWriter.WriteValue(GetLongValue().ToString("X16")); break; case DAIFieldType.DAI_LongLong: for (int i = 0; i < Value.Length; i++) { xmlWriter.WriteValue(Value[i].ToString("X2")); } break; case DAIFieldType.DAI_Enum: xmlWriter.WriteString(XmlConvert.EncodeNmToken(GetEnumValue())); break; case DAIFieldType.DAI_Guid: { uint UIntValue = GetUIntValue(); if ((UIntValue >> 31) == 1) { /* External Guid */ DAIExternalGuid Guid = EbxFile.ExternalGuids.ElementAt((int)(UIntValue & 0x7fffffff)); xmlWriter.WriteValue(Guid.ToString()); } else if (UIntValue == 0) { /* NULL Guid */ xmlWriter.WriteValue("00"); } else { /* Internal Guid */ byte[] Guid = EbxFile.InternalGuids[(int)(UIntValue - 1)]; for (int i = 0; i < Guid.Length; i++) { xmlWriter.WriteValue(Guid[i].ToString("X2")); } } } break; } xmlWriter.WriteEndElement(); }
public void Serialize(Stream s) { int Magic = Tools.ReadInt(s); if (Magic == 0x0fb2d1ce) { Header = new DAIHeader(); Header.Serialize(s); /* File GUID */ FileGuid = new byte[16]; s.Read(FileGuid, 0, 16); /* Padding */ while (s.Position % 16 != 0) { s.Seek(1, SeekOrigin.Current); } /* External GUIDs */ ExternalGuids = new List <DAIExternalGuid>(); for (int i = 0; i < Header.ExternalGuidCount; i++) { DAIExternalGuid ExternalGuid = new DAIExternalGuid(); s.Read(ExternalGuid.FileGuid, 0, 16); s.Read(ExternalGuid.InstanceGuid, 0, 16); ExternalGuids.Add(ExternalGuid); } /* Keywords */ KeywordDict = new Dictionary <int, string>(); Int64 StartPos = s.Position; while ((s.Position - StartPos) < Header.NameLength) { String Keyword = Tools.ReadNullString(s); int Hash = Hasher(Keyword); if (!KeywordDict.ContainsKey(Hash)) { KeywordDict.Add(Hash, Keyword); } } /* Field descriptors */ FieldDescriptors = new List <DAIFieldDescriptor>(); for (int i = 0; i < Header.FieldCount; i++) { DAIFieldDescriptor CurDescriptor = new DAIFieldDescriptor(); CurDescriptor.Serialize(s, this); FieldDescriptors.Add(CurDescriptor); } /* Complex */ ComplexDescriptors = new List <DAIComplexDescriptor>(); for (int i = 0; i < Header.ComplexEntryCount; i++) { DAIComplexDescriptor CurDescriptor = new DAIComplexDescriptor(); CurDescriptor.Serialize(s, this); ComplexDescriptors.Add(CurDescriptor); } /* Instance repeaters */ InstanceRepeaters = new List <DAIInstanceRepeater>(); for (int i = 0; i < Header.InstanceRepeaterCount; i++) { DAIInstanceRepeater CurRepeater = new DAIInstanceRepeater(); CurRepeater.Serialize(s, this); InstanceRepeaters.Add(CurRepeater); } /* Padding */ while (s.Position % 16 != 0) { s.Seek(1, SeekOrigin.Current); } /* Array repeaters */ ArrayRepeaters = new List <DAIArrayRepeater>(); for (int i = 0; i < Header.ArrayRepeaterCount; i++) { DAIArrayRepeater CurRepeater = new DAIArrayRepeater(); CurRepeater.Serialize(s, this); ArrayRepeaters.Add(CurRepeater); } /* Payload */ s.Seek(Header.StringOffset + Header.StringLength, SeekOrigin.Begin); InternalGuids = new List <byte[]>(); Instances = new Dictionary <byte[], DAIComplex>(); int Idx = 0; int NonGuidIndex = 0; foreach (DAIInstanceRepeater CurRepeater in InstanceRepeaters) { for (int i = 0; i < CurRepeater.Count; i++) { /* Alignment */ while ((s.Position % ComplexDescriptors[CurRepeater.ComplexDescriptorIndex].Alignment) != 0) { s.Seek(1, SeekOrigin.Current); } byte[] InstanceGuid = null; if (Idx < Header.GuidRepeaterCount) { InstanceGuid = new byte[16]; s.Read(InstanceGuid, 0, 16); } else { InstanceGuid = BitConverter.GetBytes(NonGuidIndex); NonGuidIndex++; } InternalGuids.Add(InstanceGuid); Instances.Add(InstanceGuid, ReadComplex(s, CurRepeater.ComplexDescriptorIndex, true)); } Idx++; } RootInstance = Instances.Values.ElementAt(0); } }
public string GetString(DAIEbx EbxFile, ref int TabCount) { String RetVal = ""; if (Descriptor.FieldName == "$") { TabCount--; RetVal += ComplexValue.GetString(EbxFile, ref TabCount); TabCount++; return(RetVal); } RetVal += DAIEbx.Tabs(TabCount) + "<" + Descriptor.FieldName + ">"; switch (ValueType) { case DAIFieldType.DAI_Complex: case DAIFieldType.DAI_Array: RetVal += "\n" + ComplexValue.GetString(EbxFile, ref TabCount); RetVal += DAIEbx.Tabs(TabCount) + "</" + Descriptor.FieldName + ">\n"; return(RetVal); case DAIFieldType.DAI_String: RetVal += GetStringValue(); break; case DAIFieldType.DAI_Int: RetVal += GetIntValue().ToString("X8"); break; case DAIFieldType.DAI_UInt: RetVal += GetUIntValue().ToString("X8"); break; case DAIFieldType.DAI_Float: RetVal += GetFloatValue().ToString("F3"); break; case DAIFieldType.DAI_Short: RetVal += GetShortValue().ToString("X4"); break; case DAIFieldType.DAI_UShort: RetVal += GetUShortValue().ToString("X4"); break; case DAIFieldType.DAI_Byte: RetVal += GetByteValue().ToString("X2"); break; case DAIFieldType.DAI_Long: RetVal += GetLongValue().ToString("X16"); break; case DAIFieldType.DAI_LongLong: for (int i = 0; i < Value.Length; i++) { RetVal += Value[i].ToString("X2"); } break; case DAIFieldType.DAI_Enum: RetVal += GetEnumValue(); break; case DAIFieldType.DAI_Guid: { uint UIntValue = GetUIntValue(); if ((UIntValue >> 31) == 1) { /* External Guid */ DAIExternalGuid Guid = EbxFile.ExternalGuids.ElementAt((int)(UIntValue & 0x7fffffff)); RetVal += Guid.ToString(); } else if (UIntValue == 0) { /* NULL Guid */ RetVal += "00"; } else { /* Internal Guid */ byte[] Guid = EbxFile.InternalGuids[(int)(UIntValue - 1)]; for (int i = 0; i < Guid.Length; i++) { RetVal += Guid[i].ToString("X2"); } } } break; } RetVal += "</" + Descriptor.FieldName + ">\n"; return(RetVal); }