From a627ca9b720047e633a8fe72003ab9bee31006c5 Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Tue, 26 Jul 2022 17:20:39 -0700 Subject: Create WixToolset.Heat.nupkg to distribute heat.exe and Heat targets Moves Heat functionality to the "tools" layer and packages it all up in WixToolset.Heat.nupkg for distribution in WiX v4. Completes 6838 --- src/tools/heat/ConsoleMessageListener.cs | 90 ++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 src/tools/heat/ConsoleMessageListener.cs (limited to 'src/tools/heat/ConsoleMessageListener.cs') diff --git a/src/tools/heat/ConsoleMessageListener.cs b/src/tools/heat/ConsoleMessageListener.cs new file mode 100644 index 00000000..ebf1622b --- /dev/null +++ b/src/tools/heat/ConsoleMessageListener.cs @@ -0,0 +1,90 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. + +namespace WixToolset.Tools.Core +{ + using System; + using System.Collections.Generic; + using System.Globalization; + using System.Text; + using System.Threading; + using WixToolset.Data; + using WixToolset.Extensibility; + using WixToolset.Extensibility.Services; + + public sealed class ConsoleMessageListener : IMessageListener + { + public ConsoleMessageListener(string prefix, string appName) + { + this.Prefix = prefix; + this.AppName = appName; + + PrepareConsoleForLocalization(); + } + + public string AppName { get; } + + public string Prefix { get; } + + public void Write(Message message) + { + var filename = message.SourceLineNumbers?.FileName ?? this.AppName; + var type = message.Level.ToString().ToLowerInvariant(); + var output = message.Level >= MessageLevel.Warning ? Console.Out : Console.Error; + + if (message.SourceLineNumbers?.LineNumber.HasValue == true) + { + filename = String.Concat(filename, "(", message.SourceLineNumbers?.LineNumber.Value, ")"); + } + + output.WriteLine("{0} : {1} {2}{3:0000}: {4}", filename, type, this.Prefix, message.Id, message.ToString()); + + var fileNames = GetFileNames(message.SourceLineNumbers); + if (fileNames.Count > 1) + { + foreach (var fileName in fileNames) + { + output.WriteLine("Source trace: {0}", fileName); + } + } + } + + public void Write(string message) => Console.Out.WriteLine(message); + + public MessageLevel CalculateMessageLevel(IMessaging messaging, Message message, MessageLevel defaultMessageLevel) => defaultMessageLevel; + + private static IList GetFileNames(SourceLineNumber sourceLineNumbers) + { + var fileNames = new List(); + + for (var sln = sourceLineNumbers; null != sln; sln = sln.Parent) + { + if (String.IsNullOrEmpty(sln.FileName)) + { + continue; + } + else if (sln.LineNumber.HasValue) + { + fileNames.Add(String.Format(CultureInfo.CurrentUICulture, "{0}: line {1}", sln.FileName, sln.LineNumber)); + } + else + { + fileNames.Add(sln.FileName); + } + } + + return fileNames; + } + + private static void PrepareConsoleForLocalization() + { + Thread.CurrentThread.CurrentUICulture = CultureInfo.CurrentUICulture.GetConsoleFallbackUICulture(); + + if (Console.OutputEncoding.CodePage != Encoding.UTF8.CodePage && + Console.OutputEncoding.CodePage != Thread.CurrentThread.CurrentUICulture.TextInfo.OEMCodePage && + Console.OutputEncoding.CodePage != Thread.CurrentThread.CurrentUICulture.TextInfo.ANSICodePage) + { + Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US"); + } + } + } +} -- cgit v1.2.3-55-g6feb