MegaBites-AI/Windows-powershell
0308
1// Copyright (c) Microsoft Corporation.2// Licensed under the MIT License.3 4using System.Collections.Generic;5using System.Globalization;6using System.Text;7 8using System.Management.Automation.Internal;9 10namespace System.Management.Automation11{12 internal static class EncodingConversion13 {14 internal const string ANSI = "ansi";15 internal const string Ascii = "ascii";16 internal const string BigEndianUnicode = "bigendianunicode";17 internal const string BigEndianUtf32 = "bigendianutf32";18 internal const string Default = "default";19 internal const string OEM = "oem";20 internal const string String = "string";21 internal const string Unicode = "unicode";22 internal const string Unknown = "unknown";23 internal const string Utf7 = "utf7";24 internal const string Utf8 = "utf8";25 internal const string Utf8Bom = "utf8BOM";26 internal const string Utf8NoBom = "utf8NoBOM";27 internal const string Utf32 = "utf32";28 29 internal static readonly string[] TabCompletionResults = {30 ANSI, Ascii, BigEndianUnicode, BigEndianUtf32, OEM, Unicode, Utf7, Utf8, Utf8Bom, Utf8NoBom, Utf3231 };32 33 internal static readonly Dictionary<string, Encoding> encodingMap = new(StringComparer.OrdinalIgnoreCase)34 {35 { ANSI, Encoding.GetEncoding(CultureInfo.CurrentCulture.TextInfo.ANSICodePage) },36 { Ascii, Encoding.ASCII },37 { BigEndianUnicode, Encoding.BigEndianUnicode },38 { BigEndianUtf32, new UTF32Encoding(bigEndian: true, byteOrderMark: true) },39 { Default, Encoding.Default },40 { OEM, ClrFacade.GetOEMEncoding() },41 { String, Encoding.Unicode },42 { Unicode, Encoding.Unicode },43 { Unknown, Encoding.Unicode },44#pragma warning disable SYSLIB000145 { Utf7, Encoding.UTF7 },46#pragma warning restore SYSLIB000147 { Utf8, Encoding.Default },48 { Utf8Bom, Encoding.UTF8 },49 { Utf8NoBom, Encoding.Default },50 { Utf32, Encoding.UTF32 },51 };52 53 /// <summary>54 /// Retrieve the encoding parameter from the command line55 /// it throws if the encoding does not match the known ones.56 /// </summary>57 /// <returns>A System.Text.Encoding object (null if no encoding specified).</returns>58 internal static Encoding Convert(Cmdlet cmdlet, string encoding)59 {60 if (string.IsNullOrEmpty(encoding))61 {62 // no parameter passed, default to UTF863 return Encoding.Default;64 }65 66 if (encodingMap.TryGetValue(encoding, out Encoding foundEncoding))67 {68 // Write a warning if using utf7 as it is obsolete in .NET569 if (string.Equals(encoding, Utf7, StringComparison.OrdinalIgnoreCase))70 {71 cmdlet.WriteWarning(PathUtilsStrings.Utf7EncodingObsolete);72 }73 74 return foundEncoding;75 }76 77 // error condition: unknown encoding value78 string validEncodingValues = string.Join(", ", TabCompletionResults);79 string msg = StringUtil.Format(PathUtilsStrings.OutFile_WriteToFileEncodingUnknown, encoding, validEncodingValues);80 81 ErrorRecord errorRecord = new ErrorRecord(82 PSTraceSource.NewArgumentException("Encoding"),83 "WriteToFileEncodingUnknown",84 ErrorCategory.InvalidArgument,85 null);86 87 errorRecord.ErrorDetails = new ErrorDetails(msg);88 cmdlet.ThrowTerminatingError(errorRecord);89 90 return null;91 }92 93 /// <summary>94 /// Warn if the encoding has been designated as obsolete.95 /// </summary>96 /// <param name="cmdlet">A cmdlet instance which is used to emit the warning.</param>97 /// <param name="encoding">The encoding to check for obsolescence.</param>98 internal static void WarnIfObsolete(Cmdlet cmdlet, Encoding encoding)99 {100 // Check for UTF-7 by checking for code page 65000101 // See: https://learn.microsoft.com/dotnet/core/compatibility/corefx#utf-7-code-paths-are-obsolete102 if (encoding != null && encoding.CodePage == 65000)103 {104 cmdlet.WriteWarning(PathUtilsStrings.Utf7EncodingObsolete);105 }106 }107 }108 109 /// <summary>110 /// To make it easier to specify -Encoding parameter, we add an ArgumentTransformationAttribute here.111 /// When the input data is of type string and is valid to be converted to System.Text.Encoding, we do112 /// the conversion and return the converted value. Otherwise, we just return the input data.113 /// </summary>114 internal sealed class ArgumentToEncodingTransformationAttribute : ArgumentTransformationAttribute115 {116 public override object Transform(EngineIntrinsics engineIntrinsics, object inputData)117 {118 inputData = PSObject.Base(inputData);119 120 switch (inputData)121 {122 case string stringName:123 if (EncodingConversion.encodingMap.TryGetValue(stringName, out Encoding foundEncoding))124 {125 return foundEncoding;126 }127 else128 {129 return Encoding.GetEncoding(stringName);130 }131 case int intName:132 return Encoding.GetEncoding(intName);133 }134 135 return inputData;136 }137 }138 139 /// <summary>140 /// Provides the set of Encoding values for tab completion of an Encoding parameter.141 /// </summary>142 internal sealed class ArgumentEncodingCompletionsAttribute : ArgumentCompletionsAttribute143 {144 public ArgumentEncodingCompletionsAttribute() : base(145 EncodingConversion.ANSI,146 EncodingConversion.Ascii,147 EncodingConversion.BigEndianUnicode,148 EncodingConversion.BigEndianUtf32,149 EncodingConversion.OEM,150 EncodingConversion.Unicode,151 EncodingConversion.Utf7,152 EncodingConversion.Utf8,153 EncodingConversion.Utf8Bom,154 EncodingConversion.Utf8NoBom,155 EncodingConversion.Utf32156 )157 { }158 }159}160 