Team Ai
Datasetpublic

MegaBites-AI/Windows-powershell

sourceHugging Facemitupdated 6mo agoView on Hugging Face
0likes372downloads
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