From d925de2d0e7f3a065020c63dc1274644284e4006 Mon Sep 17 00:00:00 2001
From: Thog <me@thog.eu>
Date: Sun, 8 Dec 2019 14:35:25 +0100
Subject: [PATCH] Fix ILogger type and size decoding (#842)

* Fix ILogger type and size decoding

The type and size are custom encoded integer not byte.

This fix issues on games that send messages longer than 127 characters.

* Address gdk's comments
---
 .../HOS/Services/Lm/LogService/ILogger.cs     | 24 +++++++++++++++++--
 1 file changed, 22 insertions(+), 2 deletions(-)

diff --git a/Ryujinx.HLE/HOS/Services/Lm/LogService/ILogger.cs b/Ryujinx.HLE/HOS/Services/Lm/LogService/ILogger.cs
index 357a13324a..a269312ebe 100644
--- a/Ryujinx.HLE/HOS/Services/Lm/LogService/ILogger.cs
+++ b/Ryujinx.HLE/HOS/Services/Lm/LogService/ILogger.cs
@@ -8,6 +8,26 @@ namespace Ryujinx.HLE.HOS.Services.Lm.LogService
     {
         public ILogger() { }
 
+        private static int ReadEncodedInt(BinaryReader reader)
+        {
+            int result   = 0;
+            int position = 0;
+
+            byte encoded;
+
+            do
+            {
+                encoded = reader.ReadByte();
+
+                result += (encoded & 0x7F) << (7 * position);
+
+                position++;
+
+            } while ((encoded & 0x80) != 0);
+
+            return result;
+        }
+
         [Command(0)]
         // Log(buffer<unknown, 0x21>)
         public ResultCode Log(ServiceCtx context)
@@ -34,8 +54,8 @@ namespace Ryujinx.HLE.HOS.Services.Lm.LogService
 
                 while (ms.Position < ms.Length)
                 {
-                    byte type = reader.ReadByte();
-                    byte size = reader.ReadByte();
+                    int type = ReadEncodedInt(reader);
+                    int size = ReadEncodedInt(reader);
 
                     LmLogField field = (LmLogField)type;