/src/System.Management.Automation/engine/remoting/fanin/PSSessionConfigurationData.cs
C# | 237 lines | 171 code | 32 blank | 34 comment | 17 complexity | 6f8aa832ac1ec2f36120c53ac799e66e MD5 | raw file
- // Copyright (c) Microsoft Corporation. All rights reserved.
- // Licensed under the MIT License.
- using System.IO;
- using System.Xml;
- using Microsoft.PowerShell.Commands;
- using Dbg = System.Management.Automation.Diagnostics;
- using System.Collections.Generic;
- using System.Text;
- namespace System.Management.Automation.Remoting
- {
- /// <summary>
- ///
- /// </summary>
- public sealed class PSSessionConfigurationData
- {
- /// <summary>
- /// </summary>
- public static bool IsServerManager;
- #region Public Properties
- /// <summary>
- ///
- /// </summary>
- public List<string> ModulesToImport
- {
- get
- {
- return _modulesToImport;
- }
- }
- internal List<object> ModulesToImportInternal
- {
- get
- {
- return _modulesToImportInternal;
- }
- }
- /// <summary>
- ///
- /// </summary>
- public String PrivateData
- {
- get
- {
- return _privateData;
- }
- internal set
- {
- _privateData = value;
- }
- }
- #endregion Public Properties
- #region Internal Methods
- private PSSessionConfigurationData()
- {
- }
- internal static string Unescape(string s)
- {
- StringBuilder sb = new StringBuilder(s);
- sb.Replace("<", "<");
- sb.Replace(">", ">");
- sb.Replace(""", "\"");
- sb.Replace("'", "'");
- sb.Replace("&", "&");
- return sb.ToString();
- }
- internal static PSSessionConfigurationData Create(string configurationData)
- {
- PSSessionConfigurationData configuration = new PSSessionConfigurationData();
- if (String.IsNullOrEmpty(configurationData)) return configuration;
- configurationData = Unescape(configurationData);
- XmlReaderSettings readerSettings = new XmlReaderSettings
- {
- CheckCharacters = false,
- IgnoreComments = true,
- IgnoreProcessingInstructions = true,
- MaxCharactersInDocument = 10000,
- XmlResolver = null,
- ConformanceLevel = ConformanceLevel.Fragment
- };
- using (XmlReader reader = XmlReader.Create(new StringReader(configurationData), readerSettings))
- {
- // read the header <SessionConfigurationData>
- if (reader.ReadToFollowing(SessionConfigToken))
- {
- bool isParamFound = reader.ReadToDescendant(ParamToken);
- while (isParamFound)
- {
- if (!reader.MoveToAttribute(NameToken))
- {
- throw PSTraceSource.NewArgumentException(configurationData,
- RemotingErrorIdStrings.NoAttributesFoundForParamElement,
- NameToken, ValueToken, ParamToken);
- }
- string optionName = reader.Value;
- if (String.Equals(optionName, PrivateDataToken, StringComparison.OrdinalIgnoreCase))
- {
- // this is a PrivateData element which we
- // need to process
- if (reader.ReadToFollowing(PrivateDataToken))
- {
- string privateData = reader.ReadOuterXml();
- AssertValueNotAssigned(PrivateDataToken, configuration._privateData);
- configuration._privateData = privateData;
- }
- }
- else
- {
- if (!reader.MoveToAttribute(ValueToken))
- {
- throw PSTraceSource.NewArgumentException(configurationData,
- RemotingErrorIdStrings.NoAttributesFoundForParamElement,
- NameToken, ValueToken, ParamToken);
- }
- string optionValue = reader.Value;
- configuration.Update(optionName, optionValue);
- }
- // move to next Param token.
- isParamFound = reader.ReadToFollowing(ParamToken);
- }
- }
- }
- configuration.CreateCollectionIfNecessary();
- return configuration;
- }
- #endregion Internal Methods
- #region Private Members
- private List<string> _modulesToImport;
- private List<object> _modulesToImportInternal;
- private string _privateData;
- /// <summary>
- /// Checks if the originalValue is empty. If not throws an exception
- /// </summary>
- /// <param name="optionName"></param>
- /// <param name="originalValue"></param>
- /// <exception cref="ArgumentException">
- /// 1. "optionName" is already defined
- /// </exception>
- private static void AssertValueNotAssigned(string optionName, object originalValue)
- {
- if (originalValue != null)
- {
- throw PSTraceSource.NewArgumentException(optionName,
- RemotingErrorIdStrings.DuplicateInitializationParameterFound, optionName, SessionConfigToken);
- }
- }
- /// <summary>
- /// Using optionName and optionValue updates the current object
- /// </summary>
- /// <param name="optionName"></param>
- /// <param name="optionValue"></param>
- /// <exception cref="ArgumentException">
- /// 1. "optionName" is not valid in "InitializationParameters" section.
- /// 2. "startupscript" must specify a PowerShell script file that ends with extension ".ps1".
- /// </exception>
- private void Update(string optionName, string optionValue)
- {
- switch (optionName.ToLowerInvariant())
- {
- case ModulesToImportToken:
- {
- AssertValueNotAssigned(ModulesToImportToken, _modulesToImport);
- _modulesToImport = new List<string>();
- _modulesToImportInternal = new List<object>();
- object[] modulesToImport = optionValue.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries);
- foreach (var module in modulesToImport)
- {
- var s = module as string;
- if (s != null)
- {
- _modulesToImport.Add(s.Trim());
- ModuleSpecification moduleSpec = null;
- if (ModuleSpecification.TryParse(s, out moduleSpec))
- {
- _modulesToImportInternal.Add(moduleSpec);
- }
- else
- {
- _modulesToImportInternal.Add(s.Trim());
- }
- }
- }
- }
- break;
- default:
- {
- Dbg.Assert(false, "Unknown option specified");
- }
- break;
- }
- }
- private void CreateCollectionIfNecessary()
- {
- if (_modulesToImport == null) _modulesToImport = new List<string>();
- if (_modulesToImportInternal == null) _modulesToImportInternal = new List<object>();
- }
- private const string SessionConfigToken = "SessionConfigurationData";
- internal const string ModulesToImportToken = "modulestoimport";
- internal const string PrivateDataToken = "PrivateData";
- internal const string InProcActivityToken = "InProcActivity";
- private const string ParamToken = "Param";
- private const string NameToken = "Name";
- private const string ValueToken = "Value";
- #endregion Private Members
- }
- }