public static ReplayFile FromFileSystemEntry(FileSystemEntry entry, bool onlyHeader = false) { using (var stream = entry.Open()) using (var reader = new BinaryReader(stream, Encoding.Unicode, true)) { var result = new ReplayFile { Header = ReplayHeader.Parse(reader) }; if (onlyHeader) { return(result); } var chunks = new List <ReplayChunk>(); while (reader.BaseStream.Position < reader.BaseStream.Length) { chunks.Add(ReplayChunk.Parse(reader)); } result.Chunks = chunks; if (result.Header.NumTimecodes != chunks[chunks.Count - 1].Header.Timecode) { throw new InvalidDataException(); } return(result); } }
internal static ReplayHeader Parse(BinaryReader reader) { var gameType = ParseGameType(reader.BaseStream); var result = new ReplayHeader { GameType = gameType }; result.StartTime = ReadTimestamp(reader); result.EndTime = ReadTimestamp(reader); if (gameType == ReplayGameType.Generals) { result.NumTimecodes = reader.ReadUInt16(); var zero = reader.ReadBytes(12); // TODO //for (var i = 0; i < zero.Length; i++) //{ // if (zero[i] != 0) // { // throw new InvalidDataException(); // } //} } else { throw new NotImplementedException(); } result.Filename = reader.ReadNullTerminatedString(); result.Timestamp = ReplayTimestamp.Parse(reader); result.Version = reader.ReadNullTerminatedString(); result.BuildDate = reader.ReadNullTerminatedString(); result.VersionMinor = reader.ReadUInt16(); result.VersionMajor = reader.ReadUInt16(); result.UnknownHash = reader.ReadBytes(8); result.Metadata = ReplayMetadata.Parse(reader); result.Unknown1 = reader.ReadUInt16(); result.Unknown2 = reader.ReadUInt32(); result.Unknown3 = reader.ReadUInt32(); result.Unknown4 = reader.ReadUInt32(); result.GameSpeed = reader.ReadUInt32(); return(result); }