public frmAdvViewer(string fileName) { InitializeComponent(); timerScrolling.Enabled = false; m_FileName = fileName; m_AdvFile = AdvFile.OpenFile(fileName); }
public frmAdvViewer(string fileName) { InitializeComponent(); timerScrolling.Enabled = false; m_FileName = fileName; m_AdvFile = AdvFile.OpenFile(fileName); }
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); } }
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; }
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"); }
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; } }