Browse Source

Add temporary Harmony log source for il2cpp version

ghorsington 4 years ago
parent
commit
3787671c43
2 changed files with 47 additions and 0 deletions
  1. 46 0
      BepInEx.IL2CPP/HarmonyLogSource.cs
  2. 1 0
      BepInEx.IL2CPP/IL2CPPChainloader.cs

+ 46 - 0
BepInEx.IL2CPP/HarmonyLogSource.cs

@@ -0,0 +1,46 @@
+using System;
+using System.Collections.Generic;
+using BepInEx.Configuration;
+using HarmonyLogger = HarmonyLib.Tools.Logger;
+
+namespace BepInEx.Logging
+{
+	internal class HarmonyLogSource : ILogSource
+	{
+		private static readonly ConfigEntry<HarmonyLogger.LogChannel> LogChannels = ConfigFile.CoreConfig.Bind(
+			"Harmony.Logger",
+			"LogChannels",
+			HarmonyLogger.LogChannel.Warn | HarmonyLogger.LogChannel.Error,
+			"Specifies which Harmony log channels to listen to.\nNOTE: IL channel dumps the whole patch methods, use only when needed!");
+
+		private static readonly Dictionary<HarmonyLogger.LogChannel, LogLevel> LevelMap = new Dictionary<HarmonyLogger.LogChannel, LogLevel>
+		{
+			[HarmonyLogger.LogChannel.Info] = LogLevel.Info,
+			[HarmonyLogger.LogChannel.Warn] = LogLevel.Warning,
+			[HarmonyLogger.LogChannel.Error] = LogLevel.Error,
+			[HarmonyLogger.LogChannel.IL] = LogLevel.Debug
+		};
+		
+		public HarmonyLogSource()
+		{
+			HarmonyLogger.ChannelFilter = LogChannels.Value;			
+			HarmonyLogger.MessageReceived += HandleHarmonyMessage;
+		}
+
+		private void HandleHarmonyMessage(object sender, HarmonyLib.Tools.Logger.LogEventArgs e)
+		{
+			if (!LevelMap.TryGetValue(e.LogChannel, out var level))
+				return;
+
+			LogEvent?.Invoke(this, new LogEventArgs(e.Message, level, this));
+		}
+
+		public void Dispose()
+		{
+			HarmonyLogger.MessageReceived -= HandleHarmonyMessage;
+		}
+
+		public string SourceName { get; } = "HarmonyX";
+		public event EventHandler<LogEventArgs> LogEvent;
+	}
+}

+ 1 - 0
BepInEx.IL2CPP/IL2CPPChainloader.cs

@@ -41,6 +41,7 @@ namespace BepInEx.IL2CPP
 
 		public override unsafe void Initialize(string gameExePath = null)
 		{
+			Logger.Sources.Add(new HarmonyLogSource());
 			PatchManager.ResolvePatcher += IL2CPPDetourMethodPatcher.TryResolve;
 
 			base.Initialize(gameExePath);