main
cs 112 lines 3.45 KB
Raw
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
3 namespace WixToolset.Core.ExtensibilityServices
4 {
5 using System.Collections.Generic;
6 using WixToolset.Data;
7 using WixToolset.Extensibility;
8 using WixToolset.Extensibility.Services;
9
10 internal class Messaging : IMessaging
11 {
12 private IMessageListener listener;
13 private readonly HashSet<int> suppressedWarnings = new HashSet<int>();
14 private readonly HashSet<int> warningsAsErrors = new HashSet<int>();
15
16 public bool EncounteredError => this.ErrorCount > 0;
17
18 public int ErrorCount { get; private set; }
19
20 public int LastErrorNumber { get; private set; }
21
22 public bool ShowVerboseMessages { get; set; }
23
24 public bool SuppressAllWarnings { get; set; }
25
26 public bool WarningsAsError { get; set; }
27
28 public void ElevateWarningMessage(int warningNumber)
29 {
30 this.warningsAsErrors.Add(warningNumber);
31 }
32
33 public void SetListener(IMessageListener listener)
34 {
35 this.listener = listener;
36 }
37
38 public void SuppressWarningMessage(int warningNumber)
39 {
40 this.suppressedWarnings.Add(warningNumber);
41 }
42
43 public void Write(Message message)
44 {
45 var level = this.CalculateMessageLevel(message);
46
47 if (level == MessageLevel.Nothing)
48 {
49 return;
50 }
51
52 if (level == MessageLevel.Error)
53 {
54 ++this.ErrorCount;
55 this.LastErrorNumber = message.Id;
56 }
57
58 if (this.listener != null)
59 {
60 this.listener.Write(message);
61 }
62 else if (level == MessageLevel.Error)
63 {
64 throw new WixException(message);
65 }
66 }
67
68 public void Write(string message, bool verbose = false)
69 {
70 if (!verbose || this.ShowVerboseMessages)
71 {
72 this.listener?.Write(message);
73 }
74 }
75
76 /// <summary>
77 /// Determines the level of this message, when taking into account warning-as-error,
78 /// warning level, verbosity level and message suppressed by the caller.
79 /// </summary>
80 /// <param name="message">Event arguments for the message.</param>
81 /// <returns>MessageLevel representing the level of this message.</returns>
82 private MessageLevel CalculateMessageLevel(Message message)
83 {
84 var level = message.Level;
85
86 if (level == MessageLevel.Verbose)
87 {
88 if (!this.ShowVerboseMessages)
89 {
90 level = MessageLevel.Nothing;
91 }
92 }
93 else if (level == MessageLevel.Warning)
94 {
95 if (this.SuppressAllWarnings || this.suppressedWarnings.Contains(message.Id))
96 {
97 level = MessageLevel.Nothing;
98 }
99 else if (this.WarningsAsError || this.warningsAsErrors.Contains(message.Id))
100 {
101 message.ElevateToError();
102
103 level = MessageLevel.Error;
104 }
105 }
106
107 level = this.listener?.CalculateMessageLevel(this, message, level) ?? level;
108
109 return level;
110 }
111 }
112 }