MegaBites-AI/Windows-powershell
0372
1// Copyright (c) Microsoft Corporation.2// Licensed under the MIT License.3 4using System.Collections;5using System.Collections.ObjectModel;6using System.Runtime.Serialization;7 8namespace System.Management.Automation9{10 /// <summary>11 /// Base class for items in the PSInformationalBuffers.12 ///13 /// A PSInformationalRecord consists of a string Message and the InvocationInfo and pipeline state corresponding14 /// to the command that created the record.15 /// </summary>16 [DataContract]17 public abstract class InformationalRecord18 {19 /// <remarks>20 /// This class can be instantiated only by its derived classes21 /// </remarks>22 internal InformationalRecord(string message)23 {24 _message = message;25 _invocationInfo = null;26 _pipelineIterationInfo = null;27 _serializeExtendedInfo = false;28 }29 30 /// <summary>31 /// Creates an InformationalRecord object from a record serialized as a PSObject by ToPSObjectForRemoting.32 /// </summary>33 internal InformationalRecord(PSObject serializedObject)34 {35 _message = (string)SerializationUtilities.GetPropertyValue(serializedObject, "InformationalRecord_Message");36 _serializeExtendedInfo = (bool)SerializationUtilities.GetPropertyValue(serializedObject, "InformationalRecord_SerializeInvocationInfo");37 38 if (_serializeExtendedInfo)39 {40 _invocationInfo = new InvocationInfo(serializedObject);41 42 ArrayList pipelineIterationInfo = (ArrayList)SerializationUtilities.GetPsObjectPropertyBaseObject(serializedObject, "InformationalRecord_PipelineIterationInfo");43 44 _pipelineIterationInfo = new ReadOnlyCollection<int>((int[])pipelineIterationInfo.ToArray(typeof(int)));45 }46 else47 {48 _invocationInfo = null;49 }50 }51 52 /// <summary>53 /// The message written by the command that created this record.54 /// </summary>55 public string Message56 {57 get58 {59 return _message;60 }61 62 set63 {64 _message = value;65 }66 }67 68 /// <summary>69 /// The InvocationInfo of the command that created this record.70 /// </summary>71 /// <remarks>72 /// The InvocationInfo can be null if the record was not created by a command.73 /// </remarks>74 public InvocationInfo InvocationInfo75 {76 get77 {78 return _invocationInfo;79 }80 }81 82 /// <summary>83 /// The status of the pipeline when this record was created.84 /// </summary>85 /// <remarks>86 /// The PipelineIterationInfo can be null if the record was not created by a command.87 /// </remarks>88 public ReadOnlyCollection<int> PipelineIterationInfo89 {90 get91 {92 return _pipelineIterationInfo;93 }94 }95 96 /// <summary>97 /// Sets the InvocationInfo (and PipelineIterationInfo) for this record.98 /// </summary>99 internal void SetInvocationInfo(InvocationInfo invocationInfo)100 {101 _invocationInfo = invocationInfo;102 103 //104 // Copy a snapshot of the PipelineIterationInfo from the InvocationInfo to this InformationalRecord105 //106 if (invocationInfo.PipelineIterationInfo != null)107 {108 int[] snapshot = (int[])invocationInfo.PipelineIterationInfo.Clone();109 110 _pipelineIterationInfo = new ReadOnlyCollection<int>(snapshot);111 }112 }113 114 /// <summary>115 /// Whether to serialize the InvocationInfo and PipelineIterationInfo during remote calls.116 /// </summary>117 internal bool SerializeExtendedInfo118 {119 get120 {121 return _serializeExtendedInfo;122 }123 124 set125 {126 _serializeExtendedInfo = value;127 }128 }129 130 /// <summary>131 /// Returns the record's message.132 /// </summary>133 public override string ToString()134 {135 return this.Message;136 }137 138 /// <summary>139 /// Adds the information about this informational record to a PSObject as note properties.140 /// The PSObject is used to serialize the record during remote operations.141 /// </summary>142 internal virtual void ToPSObjectForRemoting(PSObject psObject)143 {144 RemotingEncoder.AddNoteProperty<string>(psObject, "InformationalRecord_Message", () => this.Message);145 146 //147 // The invocation info may be null if the record was created via WriteVerbose/Warning/DebugLine instead of WriteVerbose/Warning/Debug, in that case148 // we set InformationalRecord_SerializeInvocationInfo to false.149 //150 if (!this.SerializeExtendedInfo || _invocationInfo == null)151 {152 RemotingEncoder.AddNoteProperty(psObject, "InformationalRecord_SerializeInvocationInfo", () => false);153 }154 else155 {156 RemotingEncoder.AddNoteProperty(psObject, "InformationalRecord_SerializeInvocationInfo", () => true);157 _invocationInfo.ToPSObjectForRemoting(psObject);158 RemotingEncoder.AddNoteProperty<object>(psObject, "InformationalRecord_PipelineIterationInfo", () => this.PipelineIterationInfo);159 }160 }161 162 [DataMember]163 private string _message;164 165 private InvocationInfo _invocationInfo;166 private ReadOnlyCollection<int> _pipelineIterationInfo;167 private bool _serializeExtendedInfo;168 }169 170 /// <summary>171 /// A warning record in the PSInformationalBuffers.172 /// </summary>173 [DataContract]174 public class WarningRecord : InformationalRecord175 {176 /// <summary>177 /// </summary>178 /// <param name="message"></param>179 public WarningRecord(string message)180 : base(message)181 { }182 183 /// <summary>184 /// </summary>185 /// <param name="record"></param>186 public WarningRecord(PSObject record)187 : base(record)188 { }189 190 /// <summary>191 /// Constructor for Fully qualified warning Id.192 /// </summary>193 /// <param name="fullyQualifiedWarningId">Fully qualified warning Id.</param>194 /// <param name="message">Warning message.</param>195 public WarningRecord(string fullyQualifiedWarningId, string message)196 : base(message)197 {198 _fullyQualifiedWarningId = fullyQualifiedWarningId;199 }200 201 /// <summary>202 /// Constructor for Fully qualified warning Id.203 /// </summary>204 /// <param name="fullyQualifiedWarningId">Fully qualified warning Id.</param>205 /// <param name="record">Warning serialized object.</param>206 public WarningRecord(string fullyQualifiedWarningId, PSObject record)207 : base(record)208 {209 _fullyQualifiedWarningId = fullyQualifiedWarningId;210 }211 212 /// <summary>213 /// String which uniquely identifies this warning condition.214 /// </summary>215 public string FullyQualifiedWarningId216 {217 get218 {219 return _fullyQualifiedWarningId ?? string.Empty;220 }221 }222 223 private readonly string _fullyQualifiedWarningId;224 }225 226 /// <summary>227 /// A debug record in the PSInformationalBuffers.228 /// </summary>229 [DataContract]230 public class DebugRecord : InformationalRecord231 {232 /// <summary>233 /// </summary>234 /// <param name="message"></param>235 public DebugRecord(string message)236 : base(message)237 { }238 239 /// <summary>240 /// </summary>241 /// <param name="record"></param>242 public DebugRecord(PSObject record)243 : base(record)244 { }245 }246 247 /// <summary>248 /// A verbose record in the PSInformationalBuffers.249 /// </summary>250 [DataContract]251 public class VerboseRecord : InformationalRecord252 {253 /// <summary>254 /// </summary>255 /// <param name="message"></param>256 public VerboseRecord(string message)257 : base(message)258 { }259 260 /// <summary>261 /// </summary>262 /// <param name="record"></param>263 public VerboseRecord(PSObject record)264 : base(record)265 { }266 }267}268 