1*eeb7e5b3SAdam Hornáček /* 2*eeb7e5b3SAdam Hornáček PowerShell 6.0 3*eeb7e5b3SAdam Hornáček 4*eeb7e5b3SAdam Hornáček Copyright (c) Microsoft Corporation. All rights reserved. 5*eeb7e5b3SAdam Hornáček 6*eeb7e5b3SAdam Hornáček All rights reserved. 7*eeb7e5b3SAdam Hornáček 8*eeb7e5b3SAdam Hornáček MIT License 9*eeb7e5b3SAdam Hornáček 10*eeb7e5b3SAdam Hornáček Permission is hereby granted, free of charge, to any person obtaining a copy 11*eeb7e5b3SAdam Hornáček of this software and associated documentation files (the ""Software""), to deal 12*eeb7e5b3SAdam Hornáček in the Software without restriction, including without limitation the rights 13*eeb7e5b3SAdam Hornáček to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 14*eeb7e5b3SAdam Hornáček copies of the Software, and to permit persons to whom the Software is 15*eeb7e5b3SAdam Hornáček furnished to do so, subject to the following conditions: 16*eeb7e5b3SAdam Hornáček 17*eeb7e5b3SAdam Hornáček The above copyright notice and this permission notice shall be included in all 18*eeb7e5b3SAdam Hornáček copies or substantial portions of the Software. 19*eeb7e5b3SAdam Hornáček 20*eeb7e5b3SAdam Hornáček THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21*eeb7e5b3SAdam Hornáček IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22*eeb7e5b3SAdam Hornáček FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 23*eeb7e5b3SAdam Hornáček AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24*eeb7e5b3SAdam Hornáček LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 25*eeb7e5b3SAdam Hornáček OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 26*eeb7e5b3SAdam Hornáček SOFTWARE. 27*eeb7e5b3SAdam Hornáček */ 28*eeb7e5b3SAdam Hornáček 29*eeb7e5b3SAdam Hornáček /********************************************************************++ 30*eeb7e5b3SAdam Hornáček Copyright (c) Microsoft Corporation. All rights reserved. 31*eeb7e5b3SAdam Hornáček --********************************************************************/ 32*eeb7e5b3SAdam Hornáček 33*eeb7e5b3SAdam Hornáček using System; 34*eeb7e5b3SAdam Hornáček using System.IO; 35*eeb7e5b3SAdam Hornáček using System.Management.Automation; 36*eeb7e5b3SAdam Hornáček using System.Xml; 37*eeb7e5b3SAdam Hornáček 38*eeb7e5b3SAdam Hornáček 39*eeb7e5b3SAdam Hornáček using Dbg = System.Management.Automation.Diagnostics; 40*eeb7e5b3SAdam Hornáček 41*eeb7e5b3SAdam Hornáček 42*eeb7e5b3SAdam Hornáček 43*eeb7e5b3SAdam Hornáček namespace Microsoft.PowerShell 44*eeb7e5b3SAdam Hornáček { 45*eeb7e5b3SAdam Hornáček /// <summary> 46*eeb7e5b3SAdam Hornáček /// 47*eeb7e5b3SAdam Hornáček /// Wraps Hitesh's xml serializer in such a way that it will select the proper serializer based on the data 48*eeb7e5b3SAdam Hornáček /// format. 49*eeb7e5b3SAdam Hornáček /// 50*eeb7e5b3SAdam Hornáček /// </summary> 51*eeb7e5b3SAdam Hornáček 52*eeb7e5b3SAdam Hornáček internal class Serialization 53*eeb7e5b3SAdam Hornáček { 54*eeb7e5b3SAdam Hornáček /// <summary> 55*eeb7e5b3SAdam Hornáček /// 56*eeb7e5b3SAdam Hornáček /// Describes the format of the data streamed between minishells, e.g. the allowed arguments to the minishell 57*eeb7e5b3SAdam Hornáček /// -outputformat and -inputformat command line parameters. 58*eeb7e5b3SAdam Hornáček /// 59*eeb7e5b3SAdam Hornáček /// </summary> 60*eeb7e5b3SAdam Hornáček 61*eeb7e5b3SAdam Hornáček internal enum DataFormat 62*eeb7e5b3SAdam Hornáček { 63*eeb7e5b3SAdam Hornáček /// <summary> 64*eeb7e5b3SAdam Hornáček /// 65*eeb7e5b3SAdam Hornáček /// text format -- i.e. stream text just as out-default would display it. 66*eeb7e5b3SAdam Hornáček /// 67*eeb7e5b3SAdam Hornáček /// </summary> 68*eeb7e5b3SAdam Hornáček 69*eeb7e5b3SAdam Hornáček Text = 0, 70*eeb7e5b3SAdam Hornáček 71*eeb7e5b3SAdam Hornáček /// <summary> 72*eeb7e5b3SAdam Hornáček /// 73*eeb7e5b3SAdam Hornáček /// XML-serialized format 74*eeb7e5b3SAdam Hornáček /// 75*eeb7e5b3SAdam Hornáček /// </summary> 76*eeb7e5b3SAdam Hornáček 77*eeb7e5b3SAdam Hornáček XML = 0xFF, 78*eeb7e5b3SAdam Hornáček 79*eeb7e5b3SAdam Hornáček /// <summary> 80*eeb7e5b3SAdam Hornáček /// 81*eeb7e5b3SAdam Hornáček /// Indicates that the data should be discarded instead of processed. 82*eeb7e5b3SAdam Hornáček /// 83*eeb7e5b3SAdam Hornáček /// </summary> 84*eeb7e5b3SAdam Hornáček None = 2 85*eeb7e5b3SAdam Hornáček } 86*eeb7e5b3SAdam Hornáček 87*eeb7e5b3SAdam Hornáček 88*eeb7e5b3SAdam Hornáček 89*eeb7e5b3SAdam Hornáček protected Serialization(DataFormat dataFormat, string streamName)90*eeb7e5b3SAdam Hornáček Serialization(DataFormat dataFormat, string streamName) 91*eeb7e5b3SAdam Hornáček { 92*eeb7e5b3SAdam Hornáček Dbg.Assert(!string.IsNullOrEmpty(streamName), "stream needs a name"); 93*eeb7e5b3SAdam Hornáček 94*eeb7e5b3SAdam Hornáček format = dataFormat; 95*eeb7e5b3SAdam Hornáček this.streamName = streamName; 96*eeb7e5b3SAdam Hornáček } 97*eeb7e5b3SAdam Hornáček 98*eeb7e5b3SAdam Hornáček 99*eeb7e5b3SAdam Hornáček 100*eeb7e5b3SAdam Hornáček protected static string XmlCliTag = "#< CLIXML"; 101*eeb7e5b3SAdam Hornáček 102*eeb7e5b3SAdam Hornáček protected string streamName; 103*eeb7e5b3SAdam Hornáček protected DataFormat format; 104*eeb7e5b3SAdam Hornáček } 105*eeb7e5b3SAdam Hornáček 106*eeb7e5b3SAdam Hornáček 107*eeb7e5b3SAdam Hornáček 108*eeb7e5b3SAdam Hornáček internal 109*eeb7e5b3SAdam Hornáček class WrappedSerializer : Serialization 110*eeb7e5b3SAdam Hornáček { 111*eeb7e5b3SAdam Hornáček internal WrappedSerializer(DataFormat dataFormat, string streamName, TextWriter output)112*eeb7e5b3SAdam Hornáček WrappedSerializer(DataFormat dataFormat, string streamName, TextWriter output) 113*eeb7e5b3SAdam Hornáček : 114*eeb7e5b3SAdam Hornáček base(dataFormat, streamName) 115*eeb7e5b3SAdam Hornáček { 116*eeb7e5b3SAdam Hornáček Dbg.Assert(output != null, "output should have a value"); 117*eeb7e5b3SAdam Hornáček 118*eeb7e5b3SAdam Hornáček textWriter = output; 119*eeb7e5b3SAdam Hornáček switch (format) 120*eeb7e5b3SAdam Hornáček { 121*eeb7e5b3SAdam Hornáček case DataFormat.XML: 122*eeb7e5b3SAdam Hornáček XmlWriterSettings settings = new XmlWriterSettings(); 123*eeb7e5b3SAdam Hornáček settings.CheckCharacters = false; 124*eeb7e5b3SAdam Hornáček settings.OmitXmlDeclaration = true; 125*eeb7e5b3SAdam Hornáček _xmlWriter = XmlWriter.Create(textWriter, settings); 126*eeb7e5b3SAdam Hornáček _xmlSerializer = new Serializer(_xmlWriter); 127*eeb7e5b3SAdam Hornáček break; 128*eeb7e5b3SAdam Hornáček case DataFormat.Text: 129*eeb7e5b3SAdam Hornáček default: 130*eeb7e5b3SAdam Hornáček // do nothing; we'll just write to the TextWriter 131*eeb7e5b3SAdam Hornáček // or discard it. 132*eeb7e5b3SAdam Hornáček 133*eeb7e5b3SAdam Hornáček break; 134*eeb7e5b3SAdam Hornáček } 135*eeb7e5b3SAdam Hornáček } 136*eeb7e5b3SAdam Hornáček 137*eeb7e5b3SAdam Hornáček 138*eeb7e5b3SAdam Hornáček 139*eeb7e5b3SAdam Hornáček internal 140*eeb7e5b3SAdam Hornáček void Serialize(object o)141*eeb7e5b3SAdam Hornáček Serialize(object o) 142*eeb7e5b3SAdam Hornáček { 143*eeb7e5b3SAdam Hornáček Serialize(o, this.streamName); 144*eeb7e5b3SAdam Hornáček } 145*eeb7e5b3SAdam Hornáček 146*eeb7e5b3SAdam Hornáček internal 147*eeb7e5b3SAdam Hornáček void Serialize(object o, string streamName)148*eeb7e5b3SAdam Hornáček Serialize(object o, string streamName) 149*eeb7e5b3SAdam Hornáček { 150*eeb7e5b3SAdam Hornáček switch (format) 151*eeb7e5b3SAdam Hornáček { 152*eeb7e5b3SAdam Hornáček case DataFormat.None: 153*eeb7e5b3SAdam Hornáček break; 154*eeb7e5b3SAdam Hornáček case DataFormat.XML: 155*eeb7e5b3SAdam Hornáček if (_firstCall) 156*eeb7e5b3SAdam Hornáček { 157*eeb7e5b3SAdam Hornáček _firstCall = false; 158*eeb7e5b3SAdam Hornáček textWriter.WriteLine(Serialization.XmlCliTag); 159*eeb7e5b3SAdam Hornáček } 160*eeb7e5b3SAdam Hornáček _xmlSerializer.Serialize(o, streamName); 161*eeb7e5b3SAdam Hornáček break; 162*eeb7e5b3SAdam Hornáček case DataFormat.Text: 163*eeb7e5b3SAdam Hornáček default: 164*eeb7e5b3SAdam Hornáček textWriter.Write(o.ToString()); 165*eeb7e5b3SAdam Hornáček break; 166*eeb7e5b3SAdam Hornáček } 167*eeb7e5b3SAdam Hornáček } 168*eeb7e5b3SAdam Hornáček 169*eeb7e5b3SAdam Hornáček 170*eeb7e5b3SAdam Hornáček internal 171*eeb7e5b3SAdam Hornáček void End()172*eeb7e5b3SAdam Hornáček End() 173*eeb7e5b3SAdam Hornáček { 174*eeb7e5b3SAdam Hornáček switch (format) 175*eeb7e5b3SAdam Hornáček { 176*eeb7e5b3SAdam Hornáček case DataFormat.None: 177*eeb7e5b3SAdam Hornáček // do nothing 178*eeb7e5b3SAdam Hornáček break; 179*eeb7e5b3SAdam Hornáček 180*eeb7e5b3SAdam Hornáček case DataFormat.XML: 181*eeb7e5b3SAdam Hornáček _xmlSerializer.Done(); 182*eeb7e5b3SAdam Hornáček _xmlSerializer = null; 183*eeb7e5b3SAdam Hornáček break; 184*eeb7e5b3SAdam Hornáček 185*eeb7e5b3SAdam Hornáček case DataFormat.Text: 186*eeb7e5b3SAdam Hornáček default: 187*eeb7e5b3SAdam Hornáček // do nothing 188*eeb7e5b3SAdam Hornáček 189*eeb7e5b3SAdam Hornáček break; 190*eeb7e5b3SAdam Hornáček } 191*eeb7e5b3SAdam Hornáček } 192*eeb7e5b3SAdam Hornáček 193*eeb7e5b3SAdam Hornáček 194*eeb7e5b3SAdam Hornáček internal TextWriter textWriter; 195*eeb7e5b3SAdam Hornáček private XmlWriter _xmlWriter; 196*eeb7e5b3SAdam Hornáček private Serializer _xmlSerializer; 197*eeb7e5b3SAdam Hornáček private bool _firstCall = true; 198*eeb7e5b3SAdam Hornáček } 199*eeb7e5b3SAdam Hornáček 200*eeb7e5b3SAdam Hornáček 201*eeb7e5b3SAdam Hornáček 202*eeb7e5b3SAdam Hornáček internal 203*eeb7e5b3SAdam Hornáček class WrappedDeserializer : Serialization 204*eeb7e5b3SAdam Hornáček { 205*eeb7e5b3SAdam Hornáček internal WrappedDeserializer(DataFormat dataFormat, string streamName, TextReader input)206*eeb7e5b3SAdam Hornáček WrappedDeserializer(DataFormat dataFormat, string streamName, TextReader input) 207*eeb7e5b3SAdam Hornáček : 208*eeb7e5b3SAdam Hornáček base(dataFormat, streamName) 209*eeb7e5b3SAdam Hornáček { 210*eeb7e5b3SAdam Hornáček Dbg.Assert(input != null, "input should have a value"); 211*eeb7e5b3SAdam Hornáček 212*eeb7e5b3SAdam Hornáček // If the data format is none - do nothing... 213*eeb7e5b3SAdam Hornáček if (dataFormat == DataFormat.None) 214*eeb7e5b3SAdam Hornáček return; 215*eeb7e5b3SAdam Hornáček 216*eeb7e5b3SAdam Hornáček textReader = input; 217*eeb7e5b3SAdam Hornáček _firstLine = textReader.ReadLine(); 218*eeb7e5b3SAdam Hornáček if (String.Compare(_firstLine, Serialization.XmlCliTag, StringComparison.OrdinalIgnoreCase) == 0) 219*eeb7e5b3SAdam Hornáček { 220*eeb7e5b3SAdam Hornáček // format should be XML 221*eeb7e5b3SAdam Hornáček 222*eeb7e5b3SAdam Hornáček dataFormat = DataFormat.XML; 223*eeb7e5b3SAdam Hornáček } 224*eeb7e5b3SAdam Hornáček 225*eeb7e5b3SAdam Hornáček switch (format) 226*eeb7e5b3SAdam Hornáček { 227*eeb7e5b3SAdam Hornáček case DataFormat.XML: 228*eeb7e5b3SAdam Hornáček _xmlReader = XmlReader.Create(textReader, new XmlReaderSettings { XmlResolver = null }); 229*eeb7e5b3SAdam Hornáček _xmlDeserializer = new Deserializer(_xmlReader); 230*eeb7e5b3SAdam Hornáček break; 231*eeb7e5b3SAdam Hornáček case DataFormat.Text: 232*eeb7e5b3SAdam Hornáček default: 233*eeb7e5b3SAdam Hornáček // do nothing; we'll just read from the TextReader 234*eeb7e5b3SAdam Hornáček 235*eeb7e5b3SAdam Hornáček break; 236*eeb7e5b3SAdam Hornáček } 237*eeb7e5b3SAdam Hornáček } 238*eeb7e5b3SAdam Hornáček 239*eeb7e5b3SAdam Hornáček 240*eeb7e5b3SAdam Hornáček 241*eeb7e5b3SAdam Hornáček internal 242*eeb7e5b3SAdam Hornáček object Deserialize()243*eeb7e5b3SAdam Hornáček Deserialize() 244*eeb7e5b3SAdam Hornáček { 245*eeb7e5b3SAdam Hornáček object o; 246*eeb7e5b3SAdam Hornáček switch (format) 247*eeb7e5b3SAdam Hornáček { 248*eeb7e5b3SAdam Hornáček case DataFormat.None: 249*eeb7e5b3SAdam Hornáček _atEnd = true; 250*eeb7e5b3SAdam Hornáček return null; 251*eeb7e5b3SAdam Hornáček 252*eeb7e5b3SAdam Hornáček case DataFormat.XML: 253*eeb7e5b3SAdam Hornáček string unused; 254*eeb7e5b3SAdam Hornáček o = _xmlDeserializer.Deserialize(out unused); 255*eeb7e5b3SAdam Hornáček break; 256*eeb7e5b3SAdam Hornáček 257*eeb7e5b3SAdam Hornáček case DataFormat.Text: 258*eeb7e5b3SAdam Hornáček default: 259*eeb7e5b3SAdam Hornáček if (_atEnd) 260*eeb7e5b3SAdam Hornáček { 261*eeb7e5b3SAdam Hornáček return null; 262*eeb7e5b3SAdam Hornáček } 263*eeb7e5b3SAdam Hornáček if (_firstLine != null) 264*eeb7e5b3SAdam Hornáček { 265*eeb7e5b3SAdam Hornáček o = _firstLine; 266*eeb7e5b3SAdam Hornáček _firstLine = null; 267*eeb7e5b3SAdam Hornáček } 268*eeb7e5b3SAdam Hornáček else 269*eeb7e5b3SAdam Hornáček { 270*eeb7e5b3SAdam Hornáček o = textReader.ReadLine(); 271*eeb7e5b3SAdam Hornáček if (o == null) 272*eeb7e5b3SAdam Hornáček { 273*eeb7e5b3SAdam Hornáček _atEnd = true; 274*eeb7e5b3SAdam Hornáček } 275*eeb7e5b3SAdam Hornáček } 276*eeb7e5b3SAdam Hornáček break; 277*eeb7e5b3SAdam Hornáček } 278*eeb7e5b3SAdam Hornáček return o; 279*eeb7e5b3SAdam Hornáček } 280*eeb7e5b3SAdam Hornáček 281*eeb7e5b3SAdam Hornáček 282*eeb7e5b3SAdam Hornáček 283*eeb7e5b3SAdam Hornáček internal 284*eeb7e5b3SAdam Hornáček bool 285*eeb7e5b3SAdam Hornáček AtEnd 286*eeb7e5b3SAdam Hornáček { 287*eeb7e5b3SAdam Hornáček get 288*eeb7e5b3SAdam Hornáček { 289*eeb7e5b3SAdam Hornáček bool result = false; 290*eeb7e5b3SAdam Hornáček switch (format) 291*eeb7e5b3SAdam Hornáček { 292*eeb7e5b3SAdam Hornáček case DataFormat.None: 293*eeb7e5b3SAdam Hornáček _atEnd = true; 294*eeb7e5b3SAdam Hornáček result = true; 295*eeb7e5b3SAdam Hornáček break; 296*eeb7e5b3SAdam Hornáček 297*eeb7e5b3SAdam Hornáček case DataFormat.XML: 298*eeb7e5b3SAdam Hornáček result = _xmlDeserializer.Done(); 299*eeb7e5b3SAdam Hornáček break; 300*eeb7e5b3SAdam Hornáček 301*eeb7e5b3SAdam Hornáček case DataFormat.Text: 302*eeb7e5b3SAdam Hornáček default: 303*eeb7e5b3SAdam Hornáček result = _atEnd; 304*eeb7e5b3SAdam Hornáček break; 305*eeb7e5b3SAdam Hornáček } 306*eeb7e5b3SAdam Hornáček return result; 307*eeb7e5b3SAdam Hornáček } 308*eeb7e5b3SAdam Hornáček } 309*eeb7e5b3SAdam Hornáček 310*eeb7e5b3SAdam Hornáček 311*eeb7e5b3SAdam Hornáček 312*eeb7e5b3SAdam Hornáček internal 313*eeb7e5b3SAdam Hornáček void End()314*eeb7e5b3SAdam Hornáček End() 315*eeb7e5b3SAdam Hornáček { 316*eeb7e5b3SAdam Hornáček switch (format) 317*eeb7e5b3SAdam Hornáček { 318*eeb7e5b3SAdam Hornáček case DataFormat.None: 319*eeb7e5b3SAdam Hornáček case DataFormat.XML: 320*eeb7e5b3SAdam Hornáček case DataFormat.Text: 321*eeb7e5b3SAdam Hornáček default: 322*eeb7e5b3SAdam Hornáček // do nothing 323*eeb7e5b3SAdam Hornáček 324*eeb7e5b3SAdam Hornáček break; 325*eeb7e5b3SAdam Hornáček } 326*eeb7e5b3SAdam Hornáček } 327*eeb7e5b3SAdam Hornáček 328*eeb7e5b3SAdam Hornáček 329*eeb7e5b3SAdam Hornáček internal TextReader textReader; 330*eeb7e5b3SAdam Hornáček private XmlReader _xmlReader; 331*eeb7e5b3SAdam Hornáček private Deserializer _xmlDeserializer; 332*eeb7e5b3SAdam Hornáček private string _firstLine; 333*eeb7e5b3SAdam Hornáček private bool _atEnd; 334*eeb7e5b3SAdam Hornáček } 335*eeb7e5b3SAdam Hornáček } // namespace 336*eeb7e5b3SAdam Hornáček /*http://example.com*/ 337