예제 #1
0
        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
            });
        }
예제 #2
0
        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);
        }