public async Task <ReplayFile> ReadROFL(string filePath) { // Create a new parser ROFLParser roflParser = new ROFLParser(); // Open file stream and parse ROFLHeader parseResult = null; using (FileStream fileStream = new FileStream(filePath, FileMode.Open)) { parseResult = (ROFLHeader)await roflParser.ReadReplayAsync(fileStream); } // Create replay file based on header return(new ReplayFile { Type = ReplayType.ROFL, Name = Path.GetFileNameWithoutExtension(filePath), Location = filePath, MatchId = parseResult.PayloadFields.MatchId.ToString(), GameDuration = TimeSpan.FromMilliseconds(parseResult.MatchMetadata.GameDuration), GameVersion = parseResult.MatchMetadata.GameVersion, BluePlayers = parseResult.MatchMetadata.BluePlayers ?? new Player[0], RedPlayers = parseResult.MatchMetadata.RedPlayers ?? new Player[0], RawJsonString = parseResult.RawJsonString }); }
public async Task <IReplayHeader> ReadReplayAsync(FileStream fileStream) { if (!fileStream.CanRead) { throw new IOException($"{exceptionOriginName} - Stream does not support reading"); } // Read and check Magic Numbers ReplayType type; try { type = await ParserHelpers.GetReplayTypeAsync(fileStream); } catch (Exception ex) { throw new IOException($"{exceptionOriginName} - Reading Magic Number: " + ex.Message, ex); } if (type != ReplayType.ROFL) { throw new Exception($"{exceptionOriginName} - Selected file is not in valid ROFL format"); } // Read and deserialize length fields byte[] lengthFieldBuffer; try { lengthFieldBuffer = await ParserHelpers.ReadBytesAsync(fileStream, 26, 262, SeekOrigin.Begin); } catch (Exception ex) { throw new IOException($"{exceptionOriginName} - Reading Length Header: " + ex.Message, ex); } LengthFields lengthFields; try { lengthFields = ParseLengthFields(lengthFieldBuffer); } catch (Exception ex) { throw new Exception($"{exceptionOriginName} - Parsing Length Header: " + ex.Message, ex); } // Read and deserialize metadata byte[] metadataBuffer; try { metadataBuffer = await ParserHelpers.ReadBytesAsync(fileStream, (int)lengthFields.MetadataLength, (int)lengthFields.MetadataOffset, SeekOrigin.Begin); } catch (Exception ex) { throw new IOException($"{exceptionOriginName} - Reading JSON Metadata: " + ex.Message, ex); } MatchMetadata metadataFields; try { metadataFields = ParseMetadata(metadataBuffer); } catch (Exception ex) { throw new Exception($"{exceptionOriginName} - Parsing Metadata Header: " + ex.Message, ex); } // Read and deserialize payload fields byte[] payloadBuffer; try { payloadBuffer = await ParserHelpers.ReadBytesAsync(fileStream, (int)lengthFields.PayloadHeaderLength, (int)lengthFields.PayloadHeaderOffset, SeekOrigin.Begin); } catch (Exception ex) { throw new IOException($"{exceptionOriginName} - Reading Match Header: " + ex.Message, ex); } PayloadFields payloadFields; try { payloadFields = ParsePayloadHeader(payloadBuffer); } catch (Exception ex) { throw new Exception($"{exceptionOriginName} - Parsing Payload Header: " + ex.Message, ex); } // Combine objects to create header ROFLHeader result = new ROFLHeader { LengthFields = lengthFields, MatchMetadata = metadataFields, PayloadFields = payloadFields }; // Create json of entire contents string jsonString = JsonConvert.SerializeObject(result); // throw it back on the object and return result.RawJsonString = jsonString; return(result); }