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); }