diff options
| author | Ac_K <Acoustik666@gmail.com> | 2019-09-19 02:45:11 +0200 |
|---|---|---|
| committer | jduncanator <1518948+jduncanator@users.noreply.github.com> | 2019-09-19 10:45:11 +1000 |
| commit | a0720b5681852f3d786d77bd3793b0359dea321c (patch) | |
| tree | 9d8f61e540d1d1d827999902dad95e5c0c1e076e /Ryujinx.HLE/HOS/Services/Lm/LogService | |
| parent | 4af3101b22e6957d6aa48a2768566d658699f4ed (diff) | |
Refactoring HOS folder structure (#771)
* Refactoring HOS folder structure
Refactoring HOS folder structure:
- Added some subfolders when needed (Following structure decided in private).
- Added some `Types` folders when needed.
- Little cleanup here and there.
- Add services placeholders for every HOS services (close #766 and #753).
* Remove Types namespaces
Diffstat (limited to 'Ryujinx.HLE/HOS/Services/Lm/LogService')
3 files changed, 115 insertions, 0 deletions
diff --git a/Ryujinx.HLE/HOS/Services/Lm/LogService/ILogger.cs b/Ryujinx.HLE/HOS/Services/Lm/LogService/ILogger.cs new file mode 100644 index 00000000..357a1332 --- /dev/null +++ b/Ryujinx.HLE/HOS/Services/Lm/LogService/ILogger.cs @@ -0,0 +1,86 @@ +using Ryujinx.Common.Logging; +using System.IO; +using System.Text; + +namespace Ryujinx.HLE.HOS.Services.Lm.LogService +{ + class ILogger : IpcService + { + public ILogger() { } + + [Command(0)] + // Log(buffer<unknown, 0x21>) + public ResultCode Log(ServiceCtx context) + { + (long bufPos, long bufSize) = context.Request.GetBufferType0x21(); + byte[] logBuffer = context.Memory.ReadBytes(bufPos, bufSize); + + using (MemoryStream ms = new MemoryStream(logBuffer)) + { + BinaryReader reader = new BinaryReader(ms); + + long pid = reader.ReadInt64(); + long threadContext = reader.ReadInt64(); + short flags = reader.ReadInt16(); + byte level = reader.ReadByte(); + byte verbosity = reader.ReadByte(); + int payloadLength = reader.ReadInt32(); + + StringBuilder sb = new StringBuilder(); + + sb.AppendLine("Guest log:"); + + sb.AppendLine($" Log level: {(LmLogLevel)level}"); + + while (ms.Position < ms.Length) + { + byte type = reader.ReadByte(); + byte size = reader.ReadByte(); + + LmLogField field = (LmLogField)type; + + string fieldStr = string.Empty; + + if (field == LmLogField.Start) + { + reader.ReadBytes(size); + + continue; + } + else if (field == LmLogField.Stop) + { + break; + } + else if (field == LmLogField.Line) + { + fieldStr = $"{field}: {reader.ReadInt32()}"; + } + else if (field == LmLogField.DropCount) + { + fieldStr = $"{field}: {reader.ReadInt64()}"; + } + else if (field == LmLogField.Time) + { + fieldStr = $"{field}: {reader.ReadInt64()}s"; + } + else if (field < LmLogField.Count) + { + fieldStr = $"{field}: '{Encoding.UTF8.GetString(reader.ReadBytes(size)).TrimEnd()}'"; + } + else + { + fieldStr = $"Field{field}: '{Encoding.UTF8.GetString(reader.ReadBytes(size)).TrimEnd()}'"; + } + + sb.AppendLine(" " + fieldStr); + } + + string text = sb.ToString(); + + Logger.PrintGuest(LogClass.ServiceLm, text); + } + + return ResultCode.Success; + } + } +}
\ No newline at end of file diff --git a/Ryujinx.HLE/HOS/Services/Lm/LogService/Types/LmLogField.cs b/Ryujinx.HLE/HOS/Services/Lm/LogService/Types/LmLogField.cs new file mode 100644 index 00000000..3f93e167 --- /dev/null +++ b/Ryujinx.HLE/HOS/Services/Lm/LogService/Types/LmLogField.cs @@ -0,0 +1,18 @@ +namespace Ryujinx.HLE.HOS.Services.Lm.LogService +{ + enum LmLogField + { + Start = 0, + Stop = 1, + Message = 2, + Line = 3, + Filename = 4, + Function = 5, + Module = 6, + Thread = 7, + DropCount = 8, + Time = 9, + ProgramName = 10, + Count + } +}
\ No newline at end of file diff --git a/Ryujinx.HLE/HOS/Services/Lm/LogService/Types/LmLogLevel.cs b/Ryujinx.HLE/HOS/Services/Lm/LogService/Types/LmLogLevel.cs new file mode 100644 index 00000000..ee1a8396 --- /dev/null +++ b/Ryujinx.HLE/HOS/Services/Lm/LogService/Types/LmLogLevel.cs @@ -0,0 +1,11 @@ +namespace Ryujinx.HLE.HOS.Services.Lm.LogService +{ + enum LmLogLevel + { + Trace, + Info, + Warning, + Error, + Critical + } +}
\ No newline at end of file |
