MegaBites-AI/Windows-powershell
0308
1// Copyright (c) Microsoft Corporation.2// Licensed under the MIT License.3 4using System.Collections.Concurrent;5using System.Collections.Generic;6using System.Collections.ObjectModel;7using System.IO;8using System.Management.Automation.Internal;9using System.Text;10 11namespace System.Management.Automation.Runspaces12{13 internal class PSSnapInTypeAndFormatErrors14 {15 public string psSnapinName;16 // only one of fullPath or formatTable or typeData or typeDefinition should be specified..17 // typeData and isRemove should be used together18 19 internal PSSnapInTypeAndFormatErrors(string psSnapinName, string fullPath)20 {21 this.psSnapinName = psSnapinName;22 FullPath = fullPath;23 Errors = new ConcurrentBag<string>();24 }25 26 internal PSSnapInTypeAndFormatErrors(string psSnapinName, FormatTable formatTable)27 {28 this.psSnapinName = psSnapinName;29 FormatTable = formatTable;30 Errors = new ConcurrentBag<string>();31 }32 33 internal PSSnapInTypeAndFormatErrors(string psSnapinName, TypeData typeData, bool isRemove)34 {35 this.psSnapinName = psSnapinName;36 TypeData = typeData;37 IsRemove = isRemove;38 Errors = new ConcurrentBag<string>();39 }40 41 internal PSSnapInTypeAndFormatErrors(string psSnapinName, ExtendedTypeDefinition typeDefinition)42 {43 this.psSnapinName = psSnapinName;44 FormatData = typeDefinition;45 Errors = new ConcurrentBag<string>();46 }47 48 internal ExtendedTypeDefinition FormatData { get; }49 50 internal TypeData TypeData { get; }51 52 internal bool IsRemove { get; }53 54 internal string FullPath { get; }55 56 internal FormatTable FormatTable { get; }57 58 internal ConcurrentBag<string> Errors { get; set; }59 60 internal string PSSnapinName { get { return psSnapinName; } }61 62 internal bool FailToLoadFile;63 }64 65 internal static class FormatAndTypeDataHelper66 {67 private const string FileNotFound = "FileNotFound";68 private const string CannotFindRegistryKey = "CannotFindRegistryKey";69 private const string CannotFindRegistryKeyPath = "CannotFindRegistryKeyPath";70 private const string EntryShouldBeMshXml = "EntryShouldBeMshXml";71 private const string DuplicateFile = "DuplicateFile";72 internal const string ValidationException = "ValidationException";73 74 private static string GetBaseFolder(Collection<string> independentErrors)75 {76 return Path.GetDirectoryName(Environment.ProcessPath);77 }78 79 private static string GetAndCheckFullFileName(80 string psSnapinName,81 HashSet<string> fullFileNameSet,82 string baseFolder,83 string baseFileName,84 Collection<string> independentErrors,85 ref bool needToRemoveEntry,86 bool checkFileExists)87 {88 string retValue = Path.IsPathRooted(baseFileName) ? baseFileName : Path.Combine(baseFolder, baseFileName);89 90 if (checkFileExists && !File.Exists(retValue))91 {92 string error = StringUtil.Format(TypesXmlStrings.FileNotFound, psSnapinName, retValue);93 independentErrors.Add(error);94 return null;95 }96 97 if (fullFileNameSet.Contains(retValue))98 {99 // Do not add Errors as we want loading of type/format files to be idempotent.100 // Just mark as Duplicate so the duplicate entry gets removed101 needToRemoveEntry = true;102 return null;103 }104 105 if (!retValue.EndsWith(".ps1xml", StringComparison.OrdinalIgnoreCase))106 {107 string error = StringUtil.Format(TypesXmlStrings.EntryShouldBeMshXml, psSnapinName, retValue);108 independentErrors.Add(error);109 return null;110 }111 112 fullFileNameSet.Add(retValue);113 return retValue;114 }115 116 internal static void ThrowExceptionOnError(117 string errorId,118 Collection<string> independentErrors,119 Collection<PSSnapInTypeAndFormatErrors> PSSnapinFilesCollection,120 Category category)121 {122 Collection<string> errors = new Collection<string>();123 if (independentErrors != null)124 {125 foreach (string error in independentErrors)126 {127 errors.Add(error);128 }129 }130 131 foreach (PSSnapInTypeAndFormatErrors PSSnapinFiles in PSSnapinFilesCollection)132 {133 foreach (string error in PSSnapinFiles.Errors)134 {135 errors.Add(error);136 }137 }138 139 if (errors.Count == 0)140 {141 return;142 }143 144 StringBuilder allErrors = new StringBuilder();145 146 allErrors.Append('\n');147 foreach (string error in errors)148 {149 allErrors.Append(error);150 allErrors.Append('\n');151 }152 153 string message = string.Empty;154 if (category == Category.Types)155 {156 message =157 StringUtil.Format(ExtendedTypeSystem.TypesXmlError, allErrors.ToString());158 }159 else if (category == Category.Formats)160 {161 message = StringUtil.Format(FormatAndOutXmlLoadingStrings.FormatLoadingErrors, allErrors.ToString());162 }163 164 RuntimeException ex = new RuntimeException(message);165 ex.SetErrorId(errorId);166 throw ex;167 }168 169 internal static void ThrowExceptionOnError(170 string errorId,171 ConcurrentBag<string> errors,172 Category category)173 {174 if (errors.IsEmpty)175 {176 return;177 }178 179 StringBuilder allErrors = new StringBuilder();180 181 allErrors.Append('\n');182 foreach (string error in errors)183 {184 allErrors.Append(error);185 allErrors.Append('\n');186 }187 188 string message = string.Empty;189 if (category == Category.Types)190 {191 message =192 StringUtil.Format(ExtendedTypeSystem.TypesXmlError, allErrors.ToString());193 }194 else if (category == Category.Formats)195 {196 message = StringUtil.Format(FormatAndOutXmlLoadingStrings.FormatLoadingErrors, allErrors.ToString());197 }198 199 RuntimeException ex = new RuntimeException(message);200 ex.SetErrorId(errorId);201 throw ex;202 }203 204 internal enum Category205 {206 Types,207 Formats,208 }209 }210}211 