From d218c2eeadc7ec633f2f0aac985a796b40c0864e Mon Sep 17 00:00:00 2001 From: Ac_K Date: Thu, 30 Jan 2020 17:39:05 +0100 Subject: [PATCH] prepo IPrepoService accurate parsing for report (#905) * prepo IPrepoService accurate parsing for report I've found they use msgpack for the report, so I've added a nuget package and deserialize the report in the right way. Close #838 * jD requested changes * Change nuget to MsgPack.Cli * Use var instead of explicit cast --- .../HOS/Services/Prepo/IPrepoService.cs | 115 +++--------------- Ryujinx.HLE/Ryujinx.HLE.csproj | 1 + 2 files changed, 19 insertions(+), 97 deletions(-) diff --git a/Ryujinx.HLE/HOS/Services/Prepo/IPrepoService.cs b/Ryujinx.HLE/HOS/Services/Prepo/IPrepoService.cs index f606361c..f5c8a873 100644 --- a/Ryujinx.HLE/HOS/Services/Prepo/IPrepoService.cs +++ b/Ryujinx.HLE/HOS/Services/Prepo/IPrepoService.cs @@ -1,7 +1,7 @@ +using MsgPack.Serialization; using Ryujinx.Common.Logging; using Ryujinx.HLE.Utilities; -using System; -using System.Buffers.Binary; +using System.Collections.Generic; using System.IO; using System.Text; @@ -79,7 +79,7 @@ namespace Ryujinx.HLE.HOS.Services.Prepo return ResultCode.Success; } - public string ReadReportBuffer(byte[] buffer, string room, UInt128 userId) + private string ReadReportBuffer(byte[] buffer, string room, UInt128 userId) { StringBuilder sb = new StringBuilder(); @@ -93,103 +93,24 @@ namespace Ryujinx.HLE.HOS.Services.Prepo sb.AppendLine($" Room: {room}"); - try + var payload = Deserialize>(buffer); + + foreach (var field in payload) { - using (MemoryStream stream = new MemoryStream(buffer)) - using (BinaryReader reader = new BinaryReader(stream)) - { - byte unknown1 = reader.ReadByte(); // Version ? - short unknown2 = reader.ReadInt16(); // Size ? - - bool isValue = false; - - string fieldStr = string.Empty; - - while (stream.Position != stream.Length) - { - byte descriptor = reader.ReadByte(); - - if (!isValue) - { - byte[] key = reader.ReadBytes(descriptor - 0xA0); - - fieldStr = $" Key: {Encoding.ASCII.GetString(key)}"; - - isValue = true; - } - else - { - if (descriptor > 0xD0) // Int value. - { - if (descriptor - 0xD0 == 1) - { - fieldStr += $", Value: {BinaryPrimitives.ReverseEndianness(reader.ReadUInt16())}"; - } - else if (descriptor - 0xD0 == 2) - { - fieldStr += $", Value: {BinaryPrimitives.ReverseEndianness(reader.ReadInt32())}"; - } - else if (descriptor - 0xD0 == 4) - { - fieldStr += $", Value: {BinaryPrimitives.ReverseEndianness(reader.ReadInt64())}"; - } - else - { - // Unknown. - break; - } - } - else if (descriptor > 0xA0 && descriptor < 0xD0) // String value, max size = 0x20 bytes ? - { - int size = descriptor - 0xA0; - string value = string.Empty; - byte[] rawValues = new byte[0]; - - for (int i = 0; i < size; i++) - { - byte chr = reader.ReadByte(); - - if (chr >= 0x20 && chr < 0x7f) - { - value += (char)chr; - } - else - { - Array.Resize(ref rawValues, rawValues.Length + 1); - - rawValues[rawValues.Length - 1] = chr; - } - } - - if (value != string.Empty) - { - fieldStr += $", Value: {value}"; - } - - // TODO(Ac_K): Determine why there are non-alphanumeric values sometimes. - if (rawValues.Length > 0) - { - fieldStr += $", RawValue: 0x{BitConverter.ToString(rawValues).Replace("-", "")}"; - } - } - else // Byte value. - { - fieldStr += $", Value: {descriptor}"; - } - - sb.AppendLine(fieldStr); - - isValue = false; - } - } - } - } - catch (Exception) - { - sb.AppendLine(" Error while parsing the report buffer."); + sb.AppendLine($" Key: {field.Key}, Value: {field.Value}"); } return sb.ToString(); } + + private static T Deserialize(byte[] bytes) + { + MessagePackSerializer serializer = MessagePackSerializer.Get(); + + using (MemoryStream byteStream = new MemoryStream(bytes)) + { + return (T)serializer.Unpack(byteStream); + } + } } -} +} \ No newline at end of file diff --git a/Ryujinx.HLE/Ryujinx.HLE.csproj b/Ryujinx.HLE/Ryujinx.HLE.csproj index 4fb4835d..ac4b8224 100644 --- a/Ryujinx.HLE/Ryujinx.HLE.csproj +++ b/Ryujinx.HLE/Ryujinx.HLE.csproj @@ -53,6 +53,7 @@ +