/// <summary> /// Loads the file. The progress parameter is a way for us /// to report progress to the calling thread. /// </summary> /// <param name="progress"></param> public async Task Load(IProgress <int> progress) { using (reader = new BinaryReader(File.OpenRead(FilePath))) { // Save file's header. BaseHeader = reader.ReadBytes(0x20); // Read the bytes into a byte array for decrypting. fileData = reader.ReadBytes(reader.ReadInt32() - 0x24); // Decrypt data Crypter.Crypt(fileData, 0, fileData.Length); // Re-initalize the reader with the deciphered data. reader = new BinaryReader(new MemoryStream(fileData)); DataHeader = reader.ReadUInt32(); recordCount = reader.ReadUInt32(); defaultRecordLength = reader.ReadUInt32(); columnCount = reader.ReadUInt32(); // Read columns var unknownColumnCount = 0; var recordLength = 2; for (int i = 0; i < columnCount; i++) { var columnName = reader.ReadString(0x30); var columnType = reader.ReadUInt32(); var columnLength = reader.ReadInt32(); // If column name is empty, supply it with a UnkCol name. if (columnName.Length == 0 || string.IsNullOrWhiteSpace(columnName)) { columnName = "UnkCol" + unknownColumnCount.ToString("00"); unknownColumnCount++; } var shnType = getSHNTypeFromID(columnType); var shnColumn = new SHNColumn(columnName, columnLength, shnType, getTypeFromID(columnType)); Columns.Add(shnColumn); recordLength += columnLength; } if (recordLength != defaultRecordLength) { throw new Exception("Record length is invalid!"); } readRows(new Progress <int>(p => progress.Report(p))); IsSaved = true; } }
/// <summary> /// Loads the file. The progress parameter is a way for us /// to report progress to the calling thread. /// </summary> /// <param name="progress"></param> public async Task Load(IProgress<int> progress) { using (reader = new BinaryReader(File.OpenRead(FilePath))) { // Save file's header. BaseHeader = reader.ReadBytes(0x20); // Read the bytes into a byte array for decrypting. fileData = reader.ReadBytes(reader.ReadInt32() - 0x24); // Decrypt data Crypter.Crypt(fileData, 0, fileData.Length); // Re-initalize the reader with the deciphered data. reader = new BinaryReader(new MemoryStream(fileData)); DataHeader = reader.ReadUInt32(); recordCount = reader.ReadUInt32(); defaultRecordLength = reader.ReadUInt32(); columnCount = reader.ReadUInt32(); // Read columns var unknownColumnCount = 0; var recordLength = 2; for (int i = 0; i < columnCount; i++) { var columnName = reader.ReadString(0x30); var columnType = reader.ReadUInt32(); var columnLength = reader.ReadInt32(); // If column name is empty, supply it with a UnkCol name. if (columnName.Length == 0 || string.IsNullOrWhiteSpace(columnName)) { columnName = "UnkCol" + unknownColumnCount.ToString("00"); unknownColumnCount++; } var shnType = getSHNTypeFromID(columnType); var shnColumn = new SHNColumn(columnName, columnLength, shnType, getTypeFromID(columnType)); Columns.Add(shnColumn); recordLength += columnLength; } if (recordLength != defaultRecordLength) { throw new Exception("Record length is invalid!"); } readRows(new Progress<int>(p => progress.Report(p))); IsSaved = true; } }