MegaBites-AI/Windows-powershell
0372
1// Copyright (c) Microsoft Corporation.2// Licensed under the MIT License.3 4using System.Collections.Generic;5using System.Collections.ObjectModel;6using System.Diagnostics;7using System.Globalization;8using System.Linq;9using System.Management.Automation.Internal;10using System.Text;11 12namespace System.Management.Automation.Help13{14 /// <summary>15 /// Represents each supported culture.16 /// </summary>17 internal class CultureSpecificUpdatableHelp18 {19 /// <summary>20 /// Class constructor.21 /// </summary>22 /// <param name="culture">Culture info.</param>23 /// <param name="version">Version info.</param>24 internal CultureSpecificUpdatableHelp(CultureInfo culture, Version version)25 {26 Debug.Assert(version != null);27 Debug.Assert(culture != null);28 29 Culture = culture;30 Version = version;31 }32 33 /// <summary>34 /// Culture version.35 /// </summary>36 internal Version Version { get; set; }37 38 /// <summary>39 /// Supported culture.40 /// </summary>41 internal CultureInfo Culture { get; set; }42 43 /// <summary>44 /// Enumerates fallback chain (parents) of the culture, including itself.45 /// </summary>46 /// <param name="culture">Culture to enumerate</param>47 /// <example>48 /// Examples:49 /// en-GB => { en-GB, en }50 /// zh-Hans-CN => { zh-Hans-CN, zh-Hans, zh }.51 /// </example>52 /// <returns>An enumerable list of culture names.</returns>53 internal static IEnumerable<string> GetCultureFallbackChain(CultureInfo culture)54 {55 // We use just names instead because comparing two CultureInfo objects56 // can fail if they are created using different means57 while (culture != null)58 {59 if (string.IsNullOrEmpty(culture.Name))60 {61 yield break;62 }63 64 yield return culture.Name;65 66 culture = culture.Parent;67 }68 }69 70 /// <summary>71 /// Checks if a culture is supported.72 /// </summary>73 /// <param name="cultureName">Name of the culture to check.</param>74 /// <returns>True if supported, false if not.</returns>75 internal bool IsCultureSupported(string cultureName)76 {77 Debug.Assert(cultureName != null, $"{nameof(cultureName)} may not be null");78 return GetCultureFallbackChain(Culture).Any(fallback => fallback == cultureName);79 }80 }81 82 /// <summary>83 /// This class represents the HelpInfo metadata XML.84 /// </summary>85 internal class UpdatableHelpInfo86 {87 /// <summary>88 /// Class constructor.89 /// </summary>90 /// <param name="unresolvedUri">Unresolved help content URI.</param>91 /// <param name="cultures">Supported UI cultures.</param>92 internal UpdatableHelpInfo(string unresolvedUri, CultureSpecificUpdatableHelp[] cultures)93 {94 Debug.Assert(cultures != null);95 96 UnresolvedUri = unresolvedUri;97 HelpContentUriCollection = new Collection<UpdatableHelpUri>();98 UpdatableHelpItems = cultures;99 }100 101 /// <summary>102 /// Unresolved URI.103 /// </summary>104 internal string UnresolvedUri { get; }105 106 /// <summary>107 /// Link to the actual help content.108 /// </summary>109 internal Collection<UpdatableHelpUri> HelpContentUriCollection { get; }110 111 /// <summary>112 /// Supported UI cultures.113 /// </summary>114 internal CultureSpecificUpdatableHelp[] UpdatableHelpItems { get; }115 116 /// <summary>117 /// Checks if the other HelpInfo has a newer version.118 /// </summary>119 /// <param name="helpInfo">HelpInfo object to check.</param>120 /// <param name="culture">Culture to check.</param>121 /// <returns>True if the other HelpInfo is newer, false if not.</returns>122 internal bool IsNewerVersion(UpdatableHelpInfo helpInfo, CultureInfo culture)123 {124 Debug.Assert(helpInfo != null);125 126 Version v1 = helpInfo.GetCultureVersion(culture);127 Version v2 = GetCultureVersion(culture);128 129 Debug.Assert(v1 != null);130 131 if (v2 == null)132 {133 return true;134 }135 136 return v1 > v2;137 }138 139 /// <summary>140 /// Checks if a culture is supported.141 /// </summary>142 /// <param name="cultureName">Name of the culture to check.</param>143 /// <returns>True if supported, false if not.</returns>144 internal bool IsCultureSupported(string cultureName)145 {146 Debug.Assert(cultureName != null, $"{nameof(cultureName)} may not be null");147 return UpdatableHelpItems.Any(item => item.IsCultureSupported(cultureName));148 }149 150 /// <summary>151 /// Gets a string representation of the supported cultures.152 /// </summary>153 /// <returns>Supported cultures in string.</returns>154 internal string GetSupportedCultures()155 {156 if (UpdatableHelpItems.Length == 0)157 {158 return StringUtil.Format(HelpDisplayStrings.None);159 }160 161 StringBuilder sb = new StringBuilder();162 163 for (int i = 0; i < UpdatableHelpItems.Length; i++)164 {165 sb.Append(UpdatableHelpItems[i].Culture.Name);166 167 if (i != (UpdatableHelpItems.Length - 1))168 {169 sb.Append(" | ");170 }171 }172 173 return sb.ToString();174 }175 176 /// <summary>177 /// Gets the culture version.178 /// </summary>179 /// <param name="culture">Culture info.</param>180 /// <returns>Culture version.</returns>181 internal Version GetCultureVersion(CultureInfo culture)182 {183 foreach (CultureSpecificUpdatableHelp updatableHelpItem in UpdatableHelpItems)184 {185 if (string.Equals(updatableHelpItem.Culture.Name, culture.Name,186 StringComparison.OrdinalIgnoreCase))187 {188 return updatableHelpItem.Version;189 }190 }191 192 return null;193 }194 }195}196 