Team Ai
Datasetpublic

MegaBites-AI/Windows-powershell

sourceHugging Facemitupdated 6mo agoView on Hugging Face
0likes308downloads
EncodingUtils.cs160 linesDownload Raw Back to utils
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