Example #1
0
        public frmAdvViewer(string fileName)
        {
            InitializeComponent();

            timerScrolling.Enabled = false;

            m_FileName = fileName;
            m_AdvFile  = AdvFile.OpenFile(fileName);
        }
Example #2
0
        public frmAdvViewer(string fileName)
        {
            InitializeComponent();

            timerScrolling.Enabled = false;

            m_FileName = fileName;
            m_AdvFile = AdvFile.OpenFile(fileName);
        }
Example #3
0
        private bool ProcessAdvFile()
        {
            try
            {
                int fileVersion = TangraCore.ADV2GetFormatVersion(m_FileName);
                if (fileVersion != 1)
                {
                    MessageBox.Show(
                        this,
                        string.Format("ADV repair hasn't been implememted for ADV Version {0}. Cannot continue with file '{1}'", fileVersion, Path.GetFileName(m_FileName)),
                        "Tangra",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Error);

                    return(false);
                }

                m_AdvFile = AdvFile.OpenFile(m_FileName);
                if (!m_AdvFile.IsCorrupted)
                {
                    MessageBox.Show(
                        this,
                        string.Format("{0} does not need to be repaired.", Path.GetFileName(m_FileName)),
                        "Tangra",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Information);

                    return(false);
                }

                m_CalcThread = new Thread(RepairAdvFile);
                m_CalcThread.Start();
                return(true);
            }
            catch (Exception ex)
            {
                MessageBox.Show(
                    this,
                    ex.Message,
                    "Tangra",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Error);

                return(false);
            }
        }
Example #4
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;
        }
Example #5
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);
        }
        private void DoConsistencyCheck(AdvFile advFile, ref bool fileIsCorrupted, ref bool isADVFormat, ref int advFormatVersion)
        {
            fileIsCorrupted = advFile.IsCorrupted;

            string fstsTypeStr;
            if (!advFile.AdvFileTags.TryGetValue("FSTF-TYPE", out fstsTypeStr))
                isADVFormat = false;
            else
                isADVFormat = fstsTypeStr == "ADV" || fstsTypeStr == "AAV";

            if (fstsTypeStr == "ADV")
            {
                string advVersionStr;
                if (!advFile.AdvFileTags.TryGetValue("ADV-VERSION", out advVersionStr))
                    advFormatVersion = -1;
                else
                    if (!int.TryParse(advVersionStr, out advFormatVersion))
                        advFormatVersion = -1;
            }
            else if (fstsTypeStr == "AAV")
            {
                string advVersionStr;
                if (!advFile.AdvFileTags.TryGetValue("AAV-VERSION", out advVersionStr))
                    advFormatVersion = -1;
                else
                    if (!int.TryParse(advVersionStr, out advFormatVersion))
                        advFormatVersion = -1;
            }
        }
        private void CheckAdvFileFormatInternal(AdvFile advFile)
        {
            bool fileIsCorrupted = true;
            bool isADVFormat = false;
            int advFormatVersion = -1;
            DoConsistencyCheck(advFile, ref fileIsCorrupted, ref isADVFormat, ref advFormatVersion);

            if (!isADVFormat)
                throw new ADVFormatException("The file is not in ADV/AAV format.");

            if (advFormatVersion > 1)
                throw new ADVFormatException("The file ADV/AAV version is not supported yet.");

            if (fileIsCorrupted)
                throw new ADVFormatException("The ADV/AAV file may be corrupted.\r\n\r\nTry to recover it from Tools -> ADV/AAV Tools -> Repair ADV/AAV File");
        }
Example #8
0
        private bool ProcessAdvFile()
        {
            try
            {
                int fileVersion = TangraCore.ADV2GetFormatVersion(m_FileName);
                if (fileVersion != 1)
                {
                    MessageBox.Show(
                        this,
                        string.Format("ADV repair hasn't been implememted for ADV Version {0}. Cannot continue with file '{1}'", fileVersion, Path.GetFileName(m_FileName)),
                        "Tangra",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Error);

                    return false;
                }

                m_AdvFile = AdvFile.OpenFile(m_FileName);
                if (!m_AdvFile.IsCorrupted)
                {
                    MessageBox.Show(
                        this,
                        string.Format("{0} does not need to be repaired.", Path.GetFileName(m_FileName)),
                        "Tangra",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Information);

                    return false;
                }

                m_CalcThread = new Thread(RepairAdvFile);
                m_CalcThread.Start();
                return true;
            }
            catch (Exception ex)
            {
                MessageBox.Show(
                    this,
                    ex.Message,
                    "Tangra",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Error);

                return false;
            }
        }