Exemple #1
0
        public static AdvFile OpenFile(string fileName)
        {
            FileStream   inputFile  = new FileStream(fileName, FileMode.Open, FileAccess.Read);
            BinaryReader fileReader = new BinaryReader(inputFile);

            uint magic = fileReader.ReadUInt32();

            if (magic != 0x46545346)
            {
                throw new FormatException("Unknown or unsupported version of an FSTF file");
            }

            byte dataFormatVer = fileReader.ReadByte();

            uint numFrames                 = fileReader.ReadUInt32();
            long indexTableOffset          = fileReader.ReadInt64();
            long metadataSystemTableOffset = fileReader.ReadInt64();
            long metadataUserTableOffset   = fileReader.ReadInt64();

            AdvFile rv = new AdvFile();

            rv.m_InputFile  = inputFile;
            rv.m_FileReader = fileReader;
            rv.m_FileName   = fileName;

            if (dataFormatVer == 1)
            {
                byte sectionsCount = fileReader.ReadByte();

                var sectionDefs = new Dictionary <ulong, string>();

                for (int i = 0; i < sectionsCount; i++)
                {
                    string sectionType         = fileReader.ReadAsciiString256();
                    ulong  sectionHeaderOffset = fileReader.ReadUInt64();
                    sectionDefs.Add(sectionHeaderOffset, sectionType);
                }

                rv.m_NumberOfFrames = numFrames;
                foreach (uint offset in sectionDefs.Keys)
                {
                    inputFile.Seek(offset, SeekOrigin.Begin);
                    IAdvDataSection section = AdvSectionFactory.ConstructSection(sectionDefs[offset], fileReader);
                    rv.AddDataSection(section);
                }

                fileReader.BaseStream.Seek(metadataSystemTableOffset, SeekOrigin.Begin);
                #region read metadata

                uint propsCount = fileReader.ReadUInt32();
                for (int i = 0; i < propsCount; i++)
                {
                    string propName  = fileReader.ReadAsciiString256();
                    string propValue = fileReader.ReadAsciiString256();
                    rv.AdvFileTags[propName] = propValue;
                }
                #endregion

                rv.m_RecoveryOffset = fileReader.BaseStream.Position;

                if (indexTableOffset > fileReader.BaseStream.Length || metadataUserTableOffset > fileReader.BaseStream.Length ||
                    indexTableOffset == 0 || metadataUserTableOffset == 0)
                {
                    rv.m_IsCorrupted = true;
                    return(rv);
                }

                inputFile.Seek(indexTableOffset, SeekOrigin.Begin);
            }

            rv.m_Magic = magic;

            try
            {
                rv.m_Index = new AdvFramesIndex(fileReader);
            }
            catch (Exception ex)
            {
                Trace.WriteLine(ex);
                rv.m_IsCorrupted = true;
                return(rv);
            }

            fileReader.BaseStream.Seek(metadataUserTableOffset, SeekOrigin.Begin);
            rv.m_UserMetadataTableOffset = metadataUserTableOffset;
            #region read metadata

            uint count = fileReader.ReadUInt32();
            for (int i = 0; i < count; i++)
            {
                string propName  = fileReader.ReadAsciiString256();
                string propValue = fileReader.ReadAsciiString256();
                rv.AdvFileTags[propName] = propValue;
            }
            #endregion

            rv.InitialisePropertiesFromTags();

            return(rv);
        }
Exemple #2
0
 public void AddDataSection(IAdvDataSection section)
 {
     m_Sections.Add(section);
 }
Exemple #3
0
 public void AddDataSection(IAdvDataSection section)
 {
     m_Sections.Add(section);
 }