aboutsummaryrefslogtreecommitdiff
path: root/src/WixToolset.Core/ExtensibilityServices/Messaging.cs
diff options
context:
space:
mode:
authorRob Mensching <rob@firegiant.com>2017-12-19 12:25:40 -0800
committerRob Mensching <rob@firegiant.com>2017-12-19 12:25:40 -0800
commit155a6e96346e0cb3d9ab6f5372fa29b46ebaee89 (patch)
tree59d1f151bfde8068b6014b05b5c8cfea3402c974 /src/WixToolset.Core/ExtensibilityServices/Messaging.cs
parent6f1665ed759b31bd095f186f9239232c653597cd (diff)
downloadwix-155a6e96346e0cb3d9ab6f5372fa29b46ebaee89.tar.gz
wix-155a6e96346e0cb3d9ab6f5372fa29b46ebaee89.tar.bz2
wix-155a6e96346e0cb3d9ab6f5372fa29b46ebaee89.zip
Integrate simplified message handling
Diffstat (limited to 'src/WixToolset.Core/ExtensibilityServices/Messaging.cs')
-rw-r--r--src/WixToolset.Core/ExtensibilityServices/Messaging.cs194
1 files changed, 194 insertions, 0 deletions
diff --git a/src/WixToolset.Core/ExtensibilityServices/Messaging.cs b/src/WixToolset.Core/ExtensibilityServices/Messaging.cs
new file mode 100644
index 00000000..4510f264
--- /dev/null
+++ b/src/WixToolset.Core/ExtensibilityServices/Messaging.cs
@@ -0,0 +1,194 @@
1// 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.
2
3namespace WixToolset.Core.ExtensibilityServices
4{
5 using System;
6 using System.Collections.Generic;
7 using System.Globalization;
8 using System.Text;
9 using WixToolset.Data;
10 using WixToolset.Extensibility;
11 using WixToolset.Extensibility.Services;
12
13 internal class Messaging : IMessaging
14 {
15 private IMessageListener listener;
16 private HashSet<int> suppressedWarnings = new HashSet<int>();
17 private HashSet<int> warningsAsErrors = new HashSet<int>();
18
19 public bool EncounteredError { get; private set; }
20
21 public int LastErrorNumber { get; private set; }
22
23 public bool ShowVerboseMessages { get; set; }
24
25 public bool SuppressAllWarnings { get; set; }
26
27 public bool WarningsAsError { get; set; }
28
29 public void ElevateWarningMessage(int warningNumber)
30 {
31 this.warningsAsErrors.Add(warningNumber);
32 }
33
34 public void SetListener(IMessageListener listener)
35 {
36 this.listener = listener;
37 }
38
39 public void SuppressWarningMessage(int warningNumber)
40 {
41 this.suppressedWarnings.Add(warningNumber);
42 }
43
44 public string FormatMessage(Message message)
45 {
46 var level = CalculateMessageLevel(message);
47
48 if (level == MessageLevel.Nothing)
49 {
50 return String.Empty;
51 }
52
53 var shortAppName = String.IsNullOrEmpty(this.listener?.ShortAppName) ? "WIX" : this.listener.ShortAppName;
54 var longAppName = String.IsNullOrEmpty(this.listener?.LongAppName) ? "WIX" : this.listener.LongAppName;
55
56 var fileNames = new List<string>();
57 var errorFileName = longAppName;
58 for (var sln = message.SourceLineNumbers; null != sln; sln = sln.Parent)
59 {
60 if (String.IsNullOrEmpty(sln.FileName))
61 {
62 continue;
63 }
64 else if (sln.LineNumber.HasValue)
65 {
66 if (fileNames.Count == 0)
67 {
68 errorFileName = String.Format(CultureInfo.CurrentUICulture, WixStrings.Format_FirstLineNumber, sln.FileName, sln.LineNumber);
69 }
70
71 fileNames.Add(String.Format(CultureInfo.CurrentUICulture, WixStrings.Format_LineNumber, sln.FileName, sln.LineNumber));
72 }
73 else
74 {
75 if (fileNames.Count == 0)
76 {
77 errorFileName = sln.FileName;
78 }
79
80 fileNames.Add(sln.FileName);
81 }
82 }
83
84 var levelString = String.Empty;
85 if (MessageLevel.Warning == level)
86 {
87 levelString = WixStrings.MessageType_Warning;
88 }
89 else if (MessageLevel.Error == level)
90 {
91 levelString = WixStrings.MessageType_Error;
92 }
93
94 string formatted;
95 if (message.ResourceManager == null)
96 {
97 formatted = String.Format(CultureInfo.InvariantCulture, message.ResourceNameOrFormat, message.MessageArgs);
98 }
99 else
100 {
101 formatted = String.Format(CultureInfo.InvariantCulture, message.ResourceManager.GetString(message.ResourceNameOrFormat), message.MessageArgs);
102 }
103
104 var builder = new StringBuilder();
105 if (level == MessageLevel.Information || level == MessageLevel.Verbose)
106 {
107 builder.AppendFormat(WixStrings.Format_InfoMessage, formatted);
108 }
109 else
110 {
111 builder.AppendFormat(WixStrings.Format_NonInfoMessage, errorFileName, levelString, shortAppName, message.Id, formatted);
112 }
113
114 if (fileNames.Count > 1)
115 {
116 builder.AppendFormat(WixStrings.INF_SourceTrace, Environment.NewLine);
117
118 foreach (var fileName in fileNames)
119 {
120 builder.AppendFormat(WixStrings.INF_SourceTraceLocation, fileName, Environment.NewLine);
121 }
122
123 builder.AppendLine();
124 }
125
126 return builder.ToString();
127 }
128
129 public void Write(Message message)
130 {
131 var level = CalculateMessageLevel(message);
132
133 if (level == MessageLevel.Nothing)
134 {
135 return;
136 }
137
138 if (level == MessageLevel.Error)
139 {
140 this.EncounteredError = true;
141 this.LastErrorNumber = message.Id;
142 }
143
144 if (this.listener != null)
145 {
146 this.listener.Write(message);
147 }
148 else if (level == MessageLevel.Error)
149 {
150 throw new WixException(message);
151 }
152 }
153
154 public void Write(string message, bool verbose = false)
155 {
156 if (!verbose || this.ShowVerboseMessages)
157 {
158 this.listener?.Write(message);
159 }
160 }
161
162 /// <summary>
163 /// Determines the level of this message, when taking into account warning-as-error,
164 /// warning level, verbosity level and message suppressed by the caller.
165 /// </summary>
166 /// <param name="message">Event arguments for the message.</param>
167 /// <returns>MessageLevel representing the level of this message.</returns>
168 private MessageLevel CalculateMessageLevel(Message message)
169 {
170 var level = message.Level;
171
172 if (level == MessageLevel.Verbose)
173 {
174 if (!this.ShowVerboseMessages)
175 {
176 level = MessageLevel.Nothing;
177 }
178 }
179 else if (level == MessageLevel.Warning)
180 {
181 if (this.SuppressAllWarnings || this.suppressedWarnings.Contains(message.Id))
182 {
183 level = MessageLevel.Nothing;
184 }
185 else if (this.WarningsAsError || this.warningsAsErrors.Contains(message.Id))
186 {
187 level = MessageLevel.Error;
188 }
189 }
190
191 return level;
192 }
193 }
194}