Beispiel #1
0
        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();
        }
Beispiel #2
0
        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);
            }
        }
Beispiel #3
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);
        }