MegaBites-AI/Windows-powershell
0372
1// Copyright (c) Microsoft Corporation.2// Licensed under the MIT License.3 4#region Using directives5 6using System;7using System.ComponentModel;8using System.Management.Automation;9 10#endregion11 12namespace Microsoft.Management.Infrastructure.CimCmdlets13{14 /// <summary>15 /// <para>16 /// Abstract Cimindication event args, which containing all elements related to17 /// an Cimindication.18 /// </para>19 /// </summary>20 public abstract class CimIndicationEventArgs : EventArgs21 {22 /// <summary>23 /// <para>24 /// Returns an Object value for an operation context25 /// </para>26 /// </summary>27 public object Context28 {29 get30 {31 return context;32 }33 }34 35 internal object context;36 }37 38 /// <summary>39 /// Cimindication exception event args, which containing occurred exception.40 /// </summary>41 public class CimIndicationEventExceptionEventArgs : CimIndicationEventArgs42 {43 /// <summary>44 /// <para>45 /// Returns an exception46 /// </para>47 /// </summary>48 public Exception Exception { get; }49 50 /// <summary>51 /// Initializes a new instance of the <see cref="CimIndicationEventExceptionEventArgs"/> class.52 /// </summary>53 /// <param name="result"></param>54 public CimIndicationEventExceptionEventArgs(Exception theException)55 {56 context = null;57 this.Exception = theException;58 }59 }60 61 /// <summary>62 /// Cimindication event args, which containing all elements related to63 /// an Cimindication.64 /// </summary>65 public class CimIndicationEventInstanceEventArgs : CimIndicationEventArgs66 {67 /// <summary>68 /// Get ciminstance of the indication object.69 /// </summary>70 public CimInstance NewEvent71 {72 get73 {74 return result?.Instance;75 }76 }77 78 /// <summary>79 /// Get MachineId of the indication object.80 /// </summary>81 public string MachineId82 {83 get84 {85 return result?.MachineId;86 }87 }88 89 /// <summary>90 /// Get BookMark of the indication object.91 /// </summary>92 public string Bookmark93 {94 get95 {96 return result?.Bookmark;97 }98 }99 100 /// <summary>101 /// Initializes a new instance of the <see cref="CimIndicationEventInstanceEventArgs"/> class.102 /// </summary>103 /// <param name="result"></param>104 public CimIndicationEventInstanceEventArgs(CimSubscriptionResult result)105 {106 context = null;107 this.result = result;108 }109 110 /// <summary>111 /// <para>112 /// subscription result113 /// </para>114 /// </summary>115 private readonly CimSubscriptionResult result;116 }117 118 /// <summary>119 /// <para>120 /// A public class used to start/stop the subscription to specific indication source,121 /// and listen to the incoming indications, event <see cref="CimIndicationArrived"/>122 /// will be raised for each cimindication.123 /// </para>124 /// </summary>125 public class CimIndicationWatcher126 {127 /// <summary>128 /// Status of <see cref="CimIndicationWatcher"/> object.129 /// </summary>130 internal enum Status131 {132 Default,133 Started,134 Stopped135 }136 137 /// <summary>138 /// <para>139 /// CimIndication arrived event140 /// </para>141 /// </summary>142 public event EventHandler<CimIndicationEventArgs> CimIndicationArrived;143 144 /// <summary>145 /// Initializes a new instance of the <see cref="CimIndicationWatcher"/> class.146 /// </summary>147 /// <param name="computerName"></param>148 /// <param name="nameSpace"></param>149 /// <param name="queryExpression"></param>150 /// <param name="operationTimeout"></param>151 public CimIndicationWatcher(152 string computerName,153 string theNamespace,154 string queryDialect,155 string queryExpression,156 uint operationTimeout)157 {158 ValidationHelper.ValidateNoNullorWhiteSpaceArgument(queryExpression, queryExpressionParameterName);159 computerName = ConstValue.GetComputerName(computerName);160 theNamespace = ConstValue.GetNamespace(theNamespace);161 Initialize(computerName, null, theNamespace, queryDialect, queryExpression, operationTimeout);162 }163 164 /// <summary>165 /// Initializes a new instance of the <see cref="CimIndicationWatcher"/> class.166 /// </summary>167 /// <param name="cimSession"></param>168 /// <param name="nameSpace"></param>169 /// <param name="queryExpression"></param>170 /// <param name="operationTimeout"></param>171 public CimIndicationWatcher(172 CimSession cimSession,173 string theNamespace,174 string queryDialect,175 string queryExpression,176 uint operationTimeout)177 {178 ValidationHelper.ValidateNoNullorWhiteSpaceArgument(queryExpression, queryExpressionParameterName);179 ValidationHelper.ValidateNoNullArgument(cimSession, cimSessionParameterName);180 theNamespace = ConstValue.GetNamespace(theNamespace);181 Initialize(null, cimSession, theNamespace, queryDialect, queryExpression, operationTimeout);182 }183 184 /// <summary>185 /// <para>186 /// Initialize187 /// </para>188 /// </summary>189 private void Initialize(190 string theComputerName,191 CimSession theCimSession,192 string theNameSpace,193 string theQueryDialect,194 string theQueryExpression,195 uint theOperationTimeout)196 {197 enableRaisingEvents = false;198 status = Status.Default;199 myLock = new object();200 cimRegisterCimIndication = new CimRegisterCimIndication();201 cimRegisterCimIndication.OnNewSubscriptionResult += NewSubscriptionResultHandler;202 203 this.cimSession = theCimSession;204 this.nameSpace = theNameSpace;205 this.queryDialect = ConstValue.GetQueryDialectWithDefault(theQueryDialect);206 this.queryExpression = theQueryExpression;207 this.operationTimeout = theOperationTimeout;208 this.computerName = theComputerName;209 }210 211 /// <summary>212 /// <para>213 /// Handler of new subscription result214 /// </para>215 /// </summary>216 /// <param name="src"></param>217 /// <param name="args"></param>218 private void NewSubscriptionResultHandler(object src, CimSubscriptionEventArgs args)219 {220 EventHandler<CimIndicationEventArgs> temp = this.CimIndicationArrived;221 if (temp != null)222 {223 // raise the event224 if (args is CimSubscriptionResultEventArgs resultArgs)225 temp(this, new CimIndicationEventInstanceEventArgs(resultArgs.Result));226 else if (args is CimSubscriptionExceptionEventArgs exceptionArgs)227 {228 temp(this, new CimIndicationEventExceptionEventArgs(exceptionArgs.Exception));229 }230 }231 }232 233 /// <summary>234 /// <para>235 /// Will be called by admin\monad\src\eengine\EventManager.cs:236 /// PSEventManager::ProcessNewSubscriber to start to listen to the Cim Indication.237 /// </para>238 /// <para>239 /// If set EnableRaisingEvents to false, which will be ignored240 /// </para>241 /// </summary>242 [Browsable(false)]243 public bool EnableRaisingEvents244 {245 get246 {247 return enableRaisingEvents;248 }249 250 set251 {252 DebugHelper.WriteLogEx();253 if (value && !enableRaisingEvents)254 {255 enableRaisingEvents = value;256 Start();257 }258 }259 }260 261 private bool enableRaisingEvents;262 263 /// <summary>264 /// <para>265 /// Start the subscription266 /// </para>267 /// </summary>268 public void Start()269 {270 DebugHelper.WriteLogEx();271 272 lock (myLock)273 {274 if (status == Status.Default)275 {276 if (this.cimSession == null)277 {278 cimRegisterCimIndication.RegisterCimIndication(279 this.computerName,280 this.nameSpace,281 this.queryDialect,282 this.queryExpression,283 this.operationTimeout);284 }285 else286 {287 cimRegisterCimIndication.RegisterCimIndication(288 this.cimSession,289 this.nameSpace,290 this.queryDialect,291 this.queryExpression,292 this.operationTimeout);293 }294 295 status = Status.Started;296 }297 }298 }299 300 /// <summary>301 /// <para>302 /// Unsubscribe the subscription303 /// </para>304 /// </summary>305 public void Stop()306 {307 DebugHelper.WriteLogEx("Status = {0}", 0, this.status);308 309 lock (this.myLock)310 {311 if (status == Status.Started)312 {313 if (this.cimRegisterCimIndication != null)314 {315 DebugHelper.WriteLog("Dispose CimRegisterCimIndication object", 4);316 this.cimRegisterCimIndication.Dispose();317 }318 319 status = Status.Stopped;320 }321 }322 }323 324 #region internal method325 /// <summary>326 /// Set the cmdlet object to throw ThrowTerminatingError327 /// in case there is a subscription failure.328 /// </summary>329 /// <param name="cmdlet"></param>330 internal void SetCmdlet(Cmdlet cmdlet)331 {332 if (this.cimRegisterCimIndication != null)333 {334 this.cimRegisterCimIndication.Cmdlet = cmdlet;335 }336 }337 #endregion338 339 #region private members340 /// <summary>341 /// <para>342 /// CimRegisterCimIndication object343 /// </para>344 /// </summary>345 private CimRegisterCimIndication cimRegisterCimIndication;346 347 /// <summary>348 /// The status of <see cref="CimIndicationWatcher"/> object.349 /// </summary>350 private Status status;351 352 /// <summary>353 /// Lock started field.354 /// </summary>355 private object myLock;356 357 /// <summary>358 /// CimSession parameter name.359 /// </summary>360 private const string cimSessionParameterName = "cimSession";361 362 /// <summary>363 /// QueryExpression parameter name.364 /// </summary>365 private const string queryExpressionParameterName = "queryExpression";366 367 #region parameters368 /// <summary>369 /// <para>370 /// parameters used to start the subscription371 /// </para>372 /// </summary>373 private string computerName;374 private CimSession cimSession;375 private string nameSpace;376 private string queryDialect;377 private string queryExpression;378 private uint operationTimeout;379 #endregion380 #endregion381 }382}383 