diff options
| author | Rob Mensching <rob@firegiant.com> | 2021-03-14 07:38:48 -0700 |
|---|---|---|
| committer | Rob Mensching <rob@firegiant.com> | 2021-03-14 07:47:48 -0700 |
| commit | 3ccd5e439da4296d6f2b66ce47075ab20d039676 (patch) | |
| tree | b5546552613b869367d09f444492a0bbcfadcfe0 /src/WixToolset.Core | |
| parent | 574785ab1421c9b67336c13ade5c2263e665ca07 (diff) | |
| download | wix-3ccd5e439da4296d6f2b66ce47075ab20d039676.tar.gz wix-3ccd5e439da4296d6f2b66ce47075ab20d039676.tar.bz2 wix-3ccd5e439da4296d6f2b66ce47075ab20d039676.zip | |
Minimize public surface area of Core
Fixes wixtoolset/issues#6374
Diffstat (limited to 'src/WixToolset.Core')
20 files changed, 406 insertions, 602 deletions
diff --git a/src/WixToolset.Core/AppCommon.cs b/src/WixToolset.Core/AppCommon.cs deleted file mode 100644 index 7f54b057..00000000 --- a/src/WixToolset.Core/AppCommon.cs +++ /dev/null | |||
| @@ -1,45 +0,0 @@ | |||
| 1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
| 2 | |||
| 3 | namespace WixToolset.Core | ||
| 4 | { | ||
| 5 | using System; | ||
| 6 | using System.Reflection; | ||
| 7 | |||
| 8 | /// <summary> | ||
| 9 | /// Common utilities for Wix applications. | ||
| 10 | /// </summary> | ||
| 11 | public static class AppCommon | ||
| 12 | { | ||
| 13 | /// <summary> | ||
| 14 | /// Creates and returns the string for CreatingApplication field (MSI Summary Information Stream). | ||
| 15 | /// </summary> | ||
| 16 | /// <remarks>It reads the AssemblyProductAttribute and AssemblyVersionAttribute of executing assembly | ||
| 17 | /// and builds the CreatingApplication string of the form "[ProductName] ([ProductVersion])".</remarks> | ||
| 18 | /// <returns>Returns value for PID_APPNAME."</returns> | ||
| 19 | public static string GetCreatingApplicationString() | ||
| 20 | { | ||
| 21 | var assembly = Assembly.GetExecutingAssembly(); | ||
| 22 | return WixDistribution.ReplacePlaceholders("[AssemblyProduct] ([FileVersion])", assembly); | ||
| 23 | } | ||
| 24 | |||
| 25 | /// <summary> | ||
| 26 | /// Displays help message header on Console for caller tool. | ||
| 27 | /// </summary> | ||
| 28 | public static void DisplayToolHeader() | ||
| 29 | { | ||
| 30 | var assembly = Assembly.GetCallingAssembly(); | ||
| 31 | Console.WriteLine(WixDistribution.ReplacePlaceholders("[AssemblyProduct] [AssemblyDescription] version [FileVersion]", assembly)); | ||
| 32 | Console.WriteLine(WixDistribution.ReplacePlaceholders("[AssemblyCopyright]", assembly)); | ||
| 33 | } | ||
| 34 | |||
| 35 | /// <summary> | ||
| 36 | /// Displays help message header on Console for caller tool. | ||
| 37 | /// </summary> | ||
| 38 | public static void DisplayToolFooter() | ||
| 39 | { | ||
| 40 | var assembly = Assembly.GetCallingAssembly(); | ||
| 41 | Console.WriteLine(); | ||
| 42 | Console.WriteLine(WixDistribution.ReplacePlaceholders("For more information see: [SupportUrl]", assembly)); | ||
| 43 | } | ||
| 44 | } | ||
| 45 | } | ||
diff --git a/src/WixToolset.Core/Bind/ExtractEmbeddedFilesCommand.cs b/src/WixToolset.Core/Bind/ExtractEmbeddedFilesCommand.cs index 29fba6b2..981a991f 100644 --- a/src/WixToolset.Core/Bind/ExtractEmbeddedFilesCommand.cs +++ b/src/WixToolset.Core/Bind/ExtractEmbeddedFilesCommand.cs | |||
| @@ -9,8 +9,7 @@ namespace WixToolset.Core.Bind | |||
| 9 | using WixToolset.Extensibility.Data; | 9 | using WixToolset.Extensibility.Data; |
| 10 | using WixToolset.Extensibility.Services; | 10 | using WixToolset.Extensibility.Services; |
| 11 | 11 | ||
| 12 | #pragma warning disable 1591 // TODO: this shouldn't be public, need interface in Extensibility | 12 | internal class ExtractEmbeddedFilesCommand |
| 13 | public class ExtractEmbeddedFilesCommand | ||
| 14 | { | 13 | { |
| 15 | public ExtractEmbeddedFilesCommand(IBackendHelper backendHelper, IEnumerable<IExpectedExtractFile> embeddedFiles) | 14 | public ExtractEmbeddedFilesCommand(IBackendHelper backendHelper, IEnumerable<IExpectedExtractFile> embeddedFiles) |
| 16 | { | 15 | { |
diff --git a/src/WixToolset.Core/Bind/ResolveDelayedFieldsCommand.cs b/src/WixToolset.Core/Bind/ResolveDelayedFieldsCommand.cs index 14b6d011..0afcc2b3 100644 --- a/src/WixToolset.Core/Bind/ResolveDelayedFieldsCommand.cs +++ b/src/WixToolset.Core/Bind/ResolveDelayedFieldsCommand.cs | |||
| @@ -10,19 +10,18 @@ namespace WixToolset.Core.Bind | |||
| 10 | using WixToolset.Extensibility.Data; | 10 | using WixToolset.Extensibility.Data; |
| 11 | using WixToolset.Extensibility.Services; | 11 | using WixToolset.Extensibility.Services; |
| 12 | 12 | ||
| 13 | #pragma warning disable 1591 // TODO: this shouldn't be public, need interface in Extensibility | ||
| 14 | /// <summary> | 13 | /// <summary> |
| 15 | /// Resolves the fields which had variables that needed to be resolved after the file information | 14 | /// Resolves the fields which had variables that needed to be resolved after the file information |
| 16 | /// was loaded. | 15 | /// was loaded. |
| 17 | /// </summary> | 16 | /// </summary> |
| 18 | public class ResolveDelayedFieldsCommand | 17 | internal class ResolveDelayedFieldsCommand |
| 19 | { | 18 | { |
| 20 | /// <summary> | 19 | /// <summary> |
| 21 | /// Resolve delayed fields. | 20 | /// Resolve delayed fields. |
| 22 | /// </summary> | 21 | /// </summary> |
| 23 | /// <param name="messaging"></param> | 22 | /// <param name="messaging"></param> |
| 24 | /// <param name="delayedFields">The fields which had resolution delayed.</param> | 23 | /// <param name="delayedFields">The fields which had resolution delayed.</param> |
| 25 | /// <param name="variableCache">The file information to use when resolving variables.</param> | 24 | /// <param name="variableCache">The cached variable values used when resolving delayed fields.</param> |
| 26 | public ResolveDelayedFieldsCommand(IMessaging messaging, IEnumerable<IDelayedField> delayedFields, Dictionary<string, string> variableCache) | 25 | public ResolveDelayedFieldsCommand(IMessaging messaging, IEnumerable<IDelayedField> delayedFields, Dictionary<string, string> variableCache) |
| 27 | { | 26 | { |
| 28 | this.Messaging = messaging; | 27 | this.Messaging = messaging; |
| @@ -49,7 +48,7 @@ namespace WixToolset.Core.Bind | |||
| 49 | // process properties first in case they refer to other binder variables | 48 | // process properties first in case they refer to other binder variables |
| 50 | if (delayedField.Symbol.Definition.Type == SymbolDefinitionType.Property) | 49 | if (delayedField.Symbol.Definition.Type == SymbolDefinitionType.Property) |
| 51 | { | 50 | { |
| 52 | var value = ResolveDelayedVariables(propertySymbol.SourceLineNumbers, delayedField.Field.AsString(), this.VariableCache); | 51 | var value = this.ResolveDelayedVariables(propertySymbol.SourceLineNumbers, delayedField.Field.AsString()); |
| 53 | 52 | ||
| 54 | // update the variable cache with the new value | 53 | // update the variable cache with the new value |
| 55 | var key = String.Concat("property.", propertySymbol.Id.Id); | 54 | var key = String.Concat("property.", propertySymbol.Id.Id); |
| @@ -72,7 +71,7 @@ namespace WixToolset.Core.Bind | |||
| 72 | 71 | ||
| 73 | // add specialization for ProductVersion fields | 72 | // add specialization for ProductVersion fields |
| 74 | var keyProductVersion = "property.ProductVersion"; | 73 | var keyProductVersion = "property.ProductVersion"; |
| 75 | if (this.VariableCache.TryGetValue(keyProductVersion, out var versionValue) && Version.TryParse(versionValue, out Version productVersion)) | 74 | if (this.VariableCache.TryGetValue(keyProductVersion, out var versionValue) && Version.TryParse(versionValue, out var productVersion)) |
| 76 | { | 75 | { |
| 77 | // Don't add the variable if it already exists (developer defined a property with the same name). | 76 | // Don't add the variable if it already exists (developer defined a property with the same name). |
| 78 | var fieldKey = String.Concat(keyProductVersion, ".Major"); | 77 | var fieldKey = String.Concat(keyProductVersion, ".Major"); |
| @@ -105,7 +104,7 @@ namespace WixToolset.Core.Bind | |||
| 105 | { | 104 | { |
| 106 | try | 105 | try |
| 107 | { | 106 | { |
| 108 | var value = ResolveDelayedVariables(delayedField.Symbol.SourceLineNumbers, delayedField.Field.AsString(), this.VariableCache); | 107 | var value = this.ResolveDelayedVariables(delayedField.Symbol.SourceLineNumbers, delayedField.Field.AsString()); |
| 109 | delayedField.Field.Set(value); | 108 | delayedField.Field.Set(value); |
| 110 | } | 109 | } |
| 111 | catch (WixException we) | 110 | catch (WixException we) |
| @@ -115,7 +114,7 @@ namespace WixToolset.Core.Bind | |||
| 115 | } | 114 | } |
| 116 | } | 115 | } |
| 117 | 116 | ||
| 118 | private static string ResolveDelayedVariables(SourceLineNumber sourceLineNumbers, string value, IDictionary<string, string> resolutionData) | 117 | private string ResolveDelayedVariables(SourceLineNumber sourceLineNumbers, string value) |
| 119 | { | 118 | { |
| 120 | var start = 0; | 119 | var start = 0; |
| 121 | 120 | ||
| @@ -125,7 +124,7 @@ namespace WixToolset.Core.Bind | |||
| 125 | { | 124 | { |
| 126 | var key = String.Concat(parsed.Name, ".", parsed.Scope); | 125 | var key = String.Concat(parsed.Name, ".", parsed.Scope); |
| 127 | 126 | ||
| 128 | if (!resolutionData.TryGetValue(key, out var resolvedValue)) | 127 | if (!this.VariableCache.TryGetValue(key, out var resolvedValue)) |
| 129 | { | 128 | { |
| 130 | resolvedValue = parsed.DefaultValue; | 129 | resolvedValue = parsed.DefaultValue; |
| 131 | } | 130 | } |
| @@ -149,7 +148,7 @@ namespace WixToolset.Core.Bind | |||
| 149 | } | 148 | } |
| 150 | else | 149 | else |
| 151 | { | 150 | { |
| 152 | throw new WixException(ErrorMessages.UnresolvedBindReference(sourceLineNumbers, value)); | 151 | this.Messaging.Write(ErrorMessages.UnresolvedBindReference(sourceLineNumbers, value)); |
| 153 | } | 152 | } |
| 154 | } | 153 | } |
| 155 | else | 154 | else |
diff --git a/src/WixToolset.Core/CommandLine/CommandLine.cs b/src/WixToolset.Core/CommandLine/CommandLine.cs index 0c21eaaa..7371628b 100644 --- a/src/WixToolset.Core/CommandLine/CommandLine.cs +++ b/src/WixToolset.Core/CommandLine/CommandLine.cs | |||
| @@ -55,7 +55,9 @@ namespace WixToolset.Core.CommandLine | |||
| 55 | 55 | ||
| 56 | if (command.ShowLogo) | 56 | if (command.ShowLogo) |
| 57 | { | 57 | { |
| 58 | AppCommon.DisplayToolHeader(); | 58 | var branding = this.ServiceProvider.GetService<IWixBranding>(); |
| 59 | Console.WriteLine(branding.ReplacePlaceholders("[AssemblyProduct] [AssemblyDescription] version [FileVersion]")); | ||
| 60 | Console.WriteLine(branding.ReplacePlaceholders("[AssemblyCopyright]")); | ||
| 59 | } | 61 | } |
| 60 | 62 | ||
| 61 | return command; | 63 | return command; |
| @@ -73,6 +75,7 @@ namespace WixToolset.Core.CommandLine | |||
| 73 | 75 | ||
| 74 | private ICommandLineCommand Parse(ICommandLineContext context) | 76 | private ICommandLineCommand Parse(ICommandLineContext context) |
| 75 | { | 77 | { |
| 78 | var branding = context.ServiceProvider.GetService<IWixBranding>(); | ||
| 76 | var extensions = context.ExtensionManager.GetServices<IExtensionCommandLine>(); | 79 | var extensions = context.ExtensionManager.GetServices<IExtensionCommandLine>(); |
| 77 | 80 | ||
| 78 | foreach (var extension in extensions) | 81 | foreach (var extension in extensions) |
| @@ -118,7 +121,7 @@ namespace WixToolset.Core.CommandLine | |||
| 118 | extension.PostParse(); | 121 | extension.PostParse(); |
| 119 | } | 122 | } |
| 120 | 123 | ||
| 121 | return command ?? new HelpCommand(extensions); | 124 | return command ?? new HelpCommand(extensions, branding); |
| 122 | } | 125 | } |
| 123 | 126 | ||
| 124 | private bool TryParseCommand(string arg, ICommandLineParser parser, IEnumerable<IExtensionCommandLine> extensions, out ICommandLineCommand command) | 127 | private bool TryParseCommand(string arg, ICommandLineParser parser, IEnumerable<IExtensionCommandLine> extensions, out ICommandLineCommand command) |
| @@ -134,7 +137,8 @@ namespace WixToolset.Core.CommandLine | |||
| 134 | case "h": | 137 | case "h": |
| 135 | case "help": | 138 | case "help": |
| 136 | case "-help": | 139 | case "-help": |
| 137 | command = new HelpCommand(extensions); | 140 | var branding = this.ServiceProvider.GetService<IWixBranding>(); |
| 141 | command = new HelpCommand(extensions, branding); | ||
| 138 | break; | 142 | break; |
| 139 | 143 | ||
| 140 | case "version": | 144 | case "version": |
diff --git a/src/WixToolset.Core/CommandLine/HelpCommand.cs b/src/WixToolset.Core/CommandLine/HelpCommand.cs index 3af442aa..6a5ac183 100644 --- a/src/WixToolset.Core/CommandLine/HelpCommand.cs +++ b/src/WixToolset.Core/CommandLine/HelpCommand.cs | |||
| @@ -19,9 +19,10 @@ namespace WixToolset.Core.CommandLine | |||
| 19 | new ExtensionCommandLineSwitch { Switch = "decompile", Description = "Decompile a package or bundle into source code." }, | 19 | new ExtensionCommandLineSwitch { Switch = "decompile", Description = "Decompile a package or bundle into source code." }, |
| 20 | }; | 20 | }; |
| 21 | 21 | ||
| 22 | public HelpCommand(IEnumerable<IExtensionCommandLine> extensions) | 22 | public HelpCommand(IEnumerable<IExtensionCommandLine> extensions, IWixBranding branding) |
| 23 | { | 23 | { |
| 24 | this.Extensions = extensions; | 24 | this.Extensions = extensions; |
| 25 | this.Branding = branding; | ||
| 25 | } | 26 | } |
| 26 | 27 | ||
| 27 | public bool ShowLogo => true; | 28 | public bool ShowLogo => true; |
| @@ -30,6 +31,8 @@ namespace WixToolset.Core.CommandLine | |||
| 30 | 31 | ||
| 31 | private IEnumerable<IExtensionCommandLine> Extensions { get; } | 32 | private IEnumerable<IExtensionCommandLine> Extensions { get; } |
| 32 | 33 | ||
| 34 | private IWixBranding Branding { get; } | ||
| 35 | |||
| 33 | public Task<int> ExecuteAsync(CancellationToken _) | 36 | public Task<int> ExecuteAsync(CancellationToken _) |
| 34 | { | 37 | { |
| 35 | var commandLineSwitches = new List<ExtensionCommandLineSwitch>(BuiltInSwitches); | 38 | var commandLineSwitches = new List<ExtensionCommandLineSwitch>(BuiltInSwitches); |
| @@ -52,7 +55,8 @@ namespace WixToolset.Core.CommandLine | |||
| 52 | 55 | ||
| 53 | Console.WriteLine(); | 56 | Console.WriteLine(); |
| 54 | Console.WriteLine("Run 'wix [command] --help' for more information on a command."); | 57 | Console.WriteLine("Run 'wix [command] --help' for more information on a command."); |
| 55 | AppCommon.DisplayToolFooter(); | 58 | Console.WriteLine(); |
| 59 | Console.WriteLine(this.Branding.ReplacePlaceholders("For more information see: [SupportUrl]")); | ||
| 56 | 60 | ||
| 57 | return Task.FromResult(-1); | 61 | return Task.FromResult(-1); |
| 58 | } | 62 | } |
diff --git a/src/WixToolset.Core/Common.cs b/src/WixToolset.Core/Common.cs index 79f06135..848f009a 100644 --- a/src/WixToolset.Core/Common.cs +++ b/src/WixToolset.Core/Common.cs | |||
| @@ -18,124 +18,35 @@ namespace WixToolset.Core | |||
| 18 | /// <summary> | 18 | /// <summary> |
| 19 | /// Common Wix utility methods and types. | 19 | /// Common Wix utility methods and types. |
| 20 | /// </summary> | 20 | /// </summary> |
| 21 | public static class Common | 21 | internal static class Common |
| 22 | { | 22 | { |
| 23 | // TODO: Find a place to put all of these so they doesn't have to be public and exposed by WixToolset.Core.dll | 23 | private static readonly char[] IllegalShortFilenameCharacters = new[] { '\\', '?', '|', '>', '<', ':', '/', '*', '\"', '+', ',', ';', '=', '[', ']', '.', ' ' }; |
| 24 | /// <summary> | 24 | private static readonly char[] IllegalWildcardShortFilenameCharacters = new[] { '\\', '|', '>', '<', ':', '/', '\"', '+', ',', ';', '=', '[', ']', '.', ' ' }; |
| 25 | /// | ||
| 26 | /// </summary> | ||
| 27 | public const string UpgradeDetectedProperty = "WIX_UPGRADE_DETECTED"; | ||
| 28 | /// <summary> | ||
| 29 | /// | ||
| 30 | /// </summary> | ||
| 31 | public const string UpgradePreventedCondition = "NOT WIX_UPGRADE_DETECTED"; | ||
| 32 | /// <summary> | ||
| 33 | /// | ||
| 34 | /// </summary> | ||
| 35 | public const string DowngradeDetectedProperty = "WIX_DOWNGRADE_DETECTED"; | ||
| 36 | /// <summary> | ||
| 37 | /// | ||
| 38 | /// </summary> | ||
| 39 | public const string DowngradePreventedCondition = "NOT WIX_DOWNGRADE_DETECTED"; | ||
| 40 | |||
| 41 | //------------------------------------------------------------------------------------------------- | ||
| 42 | // Layout of an Access Mask (from http://technet.microsoft.com/en-us/library/cc783530(WS.10).aspx) | ||
| 43 | // | ||
| 44 | // ------------------------------------------------------------------------------------------------- | ||
| 45 | // |31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|15|14|13|12|11|10|09|08|07|06|05|04|03|02|01|00| | ||
| 46 | // ------------------------------------------------------------------------------------------------- | ||
| 47 | // |GR|GW|GE|GA| Reserved |AS|StandardAccessRights| Object-Specific Access Rights | | ||
| 48 | // | ||
| 49 | // Key | ||
| 50 | // GR = Generic Read | ||
| 51 | // GW = Generic Write | ||
| 52 | // GE = Generic Execute | ||
| 53 | // GA = Generic All | ||
| 54 | // AS = Right to access SACL | ||
| 55 | // | ||
| 56 | // TODO: what is the expected decompile behavior if a bit is found that is not explicitly enumerated | ||
| 57 | // | ||
| 58 | //------------------------------------------------------------------------------------------------- | ||
| 59 | // Generic Access Rights (per WinNT.h) | ||
| 60 | // --------------------- | ||
| 61 | // GENERIC_ALL (0x10000000L) | ||
| 62 | // GENERIC_EXECUTE (0x20000000L) | ||
| 63 | // GENERIC_WRITE (0x40000000L) | ||
| 64 | // GENERIC_READ (0x80000000L) | ||
| 65 | // TODO: Find a place to put this that it doesn't have to be public and exposed by WixToolset.Core.dll | ||
| 66 | /// <summary> | ||
| 67 | /// | ||
| 68 | /// </summary> | ||
| 69 | public static readonly string[] GenericPermissions = { "GenericAll", "GenericExecute", "GenericWrite", "GenericRead" }; | ||
| 70 | |||
| 71 | // Standard Access Rights (per WinNT.h) | ||
| 72 | // ---------------------- | ||
| 73 | // DELETE (0x00010000L) | ||
| 74 | // READ_CONTROL (0x00020000L) | ||
| 75 | // WRITE_DAC (0x00040000L) | ||
| 76 | // WRITE_OWNER (0x00080000L) | ||
| 77 | // SYNCHRONIZE (0x00100000L) | ||
| 78 | // TODO: Find a place to put this that it doesn't have to be public and exposed by WixToolset.Core.dll | ||
| 79 | /// <summary> | ||
| 80 | /// | ||
| 81 | /// </summary> | ||
| 82 | public static readonly string[] StandardPermissions = { "Delete", "ReadPermission", "ChangePermission", "TakeOwnership", "Synchronize" }; | ||
| 83 | |||
| 84 | // Object-Specific Access Rights | ||
| 85 | // ============================= | ||
| 86 | // Directory Access Rights (per WinNT.h) | ||
| 87 | // ----------------------- | ||
| 88 | // FILE_LIST_DIRECTORY ( 0x0001 ) | ||
| 89 | // FILE_ADD_FILE ( 0x0002 ) | ||
| 90 | // FILE_ADD_SUBDIRECTORY ( 0x0004 ) | ||
| 91 | // FILE_READ_EA ( 0x0008 ) | ||
| 92 | // FILE_WRITE_EA ( 0x0010 ) | ||
| 93 | // FILE_TRAVERSE ( 0x0020 ) | ||
| 94 | // FILE_DELETE_CHILD ( 0x0040 ) | ||
| 95 | // FILE_READ_ATTRIBUTES ( 0x0080 ) | ||
| 96 | // FILE_WRITE_ATTRIBUTES ( 0x0100 ) | ||
| 97 | // TODO: Find a place to put this that it doesn't have to be public and exposed by WixToolset.Core.dll | ||
| 98 | /// <summary> | ||
| 99 | /// | ||
| 100 | /// </summary> | ||
| 101 | public static readonly string[] FolderPermissions = { "Read", "CreateFile", "CreateChild", "ReadExtendedAttributes", "WriteExtendedAttributes", "Traverse", "DeleteChild", "ReadAttributes", "WriteAttributes" }; | ||
| 102 | |||
| 103 | // Registry Access Rights (per TODO) | ||
| 104 | // ---------------------- | ||
| 105 | // TODO: Find a place to put this that it doesn't have to be public and exposed by WixToolset.Core.dll | ||
| 106 | /// <summary> | ||
| 107 | /// | ||
| 108 | /// </summary> | ||
| 109 | public static readonly string[] RegistryPermissions = { "Read", "Write", "CreateSubkeys", "EnumerateSubkeys", "Notify", "CreateLink" }; | ||
| 110 | |||
| 111 | // File Access Rights (per WinNT.h) | ||
| 112 | // ------------------ | ||
| 113 | // FILE_READ_DATA ( 0x0001 ) | ||
| 114 | // FILE_WRITE_DATA ( 0x0002 ) | ||
| 115 | // FILE_APPEND_DATA ( 0x0004 ) | ||
| 116 | // FILE_READ_EA ( 0x0008 ) | ||
| 117 | // FILE_WRITE_EA ( 0x0010 ) | ||
| 118 | // FILE_EXECUTE ( 0x0020 ) | ||
| 119 | // via mask FILE_ALL_ACCESS ( 0x0040 ) | ||
| 120 | // FILE_READ_ATTRIBUTES ( 0x0080 ) | ||
| 121 | // FILE_WRITE_ATTRIBUTES ( 0x0100 ) | ||
| 122 | // | ||
| 123 | // STANDARD_RIGHTS_REQUIRED (0x000F0000L) | ||
| 124 | // FILE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF) | ||
| 125 | // TODO: Find a place to put this that it doesn't have to be public and exposed by WixToolset.Core.dll | ||
| 126 | /// <summary> | ||
| 127 | /// | ||
| 128 | /// </summary> | ||
| 129 | public static readonly string[] FilePermissions = { "Read", "Write", "Append", "ReadExtendedAttributes", "WriteExtendedAttributes", "Execute", "FileAllRights", "ReadAttributes", "WriteAttributes" }; | ||
| 130 | 25 | ||
| 131 | internal static readonly char[] IllegalLongFilenameCharacters = new[] { '\\', '/', '?', '*', '|', '>', '<', ':', '\"' }; // illegal: \ / ? | > < : / * " | 26 | internal static readonly char[] IllegalLongFilenameCharacters = new[] { '\\', '/', '?', '*', '|', '>', '<', ':', '\"' }; // illegal: \ / ? | > < : / * " |
| 132 | internal static readonly char[] IllegalRelativeLongFilenameCharacters = new[] { '?', '*', '|', '>', '<', ':', '\"' }; // like illegal, but we allow '\' and '/' | 27 | internal static readonly char[] IllegalRelativeLongFilenameCharacters = new[] { '?', '*', '|', '>', '<', ':', '\"' }; // like illegal, but we allow '\' and '/' |
| 133 | internal static readonly char[] IllegalWildcardLongFilenameCharacters = new[] { '\\', '/', '|', '>', '<', ':', '\"' }; // like illegal: but we allow '*' and '?' | 28 | internal static readonly char[] IllegalWildcardLongFilenameCharacters = new[] { '\\', '/', '|', '>', '<', ':', '\"' }; // like illegal: but we allow '*' and '?' |
| 134 | 29 | ||
| 135 | private static readonly char[] IllegalShortFilenameCharacters = new[] { '\\', '?', '|', '>', '<', ':', '/', '*', '\"', '+', ',', ';', '=', '[', ']', '.', ' ' }; | 30 | public static string GetCanonicalRelativePath(SourceLineNumber sourceLineNumbers, string elementName, string attributeName, string relativePath, IMessaging messageHandler) |
| 136 | private static readonly char[] IllegalWildcardShortFilenameCharacters = new[] { '\\', '|', '>', '<', ':', '/', '\"', '+', ',', ';', '=', '[', ']', '.', ' ' }; | 31 | { |
| 137 | 32 | const string root = @"C:\"; | |
| 33 | if (!Path.IsPathRooted(relativePath)) | ||
| 34 | { | ||
| 35 | var normalizedPath = Path.GetFullPath(root + relativePath); | ||
| 36 | if (normalizedPath.StartsWith(root)) | ||
| 37 | { | ||
| 38 | var canonicalizedPath = normalizedPath.Substring(root.Length); | ||
| 39 | if (canonicalizedPath != relativePath) | ||
| 40 | { | ||
| 41 | messageHandler.Write(WarningMessages.PathCanonicalized(sourceLineNumbers, elementName, attributeName, relativePath, canonicalizedPath)); | ||
| 42 | } | ||
| 43 | return canonicalizedPath; | ||
| 44 | } | ||
| 45 | } | ||
| 138 | 46 | ||
| 47 | messageHandler.Write(ErrorMessages.PayloadMustBeRelativeToCache(sourceLineNumbers, elementName, attributeName, relativePath)); | ||
| 48 | return relativePath; | ||
| 49 | } | ||
| 139 | 50 | ||
| 140 | /// <summary> | 51 | /// <summary> |
| 141 | /// Gets a valid code page from the given web name or integer value. | 52 | /// Gets a valid code page from the given web name or integer value. |
| @@ -157,8 +68,8 @@ namespace WixToolset.Core | |||
| 157 | { | 68 | { |
| 158 | Encoding encoding; | 69 | Encoding encoding; |
| 159 | 70 | ||
| 160 | // check if a integer as a string was passed | 71 | // Check if a integer as a string was passed. |
| 161 | if (Int32.TryParse(value, out int codePage)) | 72 | if (Int32.TryParse(value, out var codePage)) |
| 162 | { | 73 | { |
| 163 | if (0 == codePage) | 74 | if (0 == codePage) |
| 164 | { | 75 | { |
| @@ -198,18 +109,91 @@ namespace WixToolset.Core | |||
| 198 | } | 109 | } |
| 199 | catch (ArgumentException ex) | 110 | catch (ArgumentException ex) |
| 200 | { | 111 | { |
| 201 | // rethrow as NotSupportedException since either can be thrown | 112 | // Rethrow as NotSupportedException since either can be thrown |
| 202 | // if the system does not support the specified code page | 113 | // if the system does not support the specified code page. |
| 203 | throw new NotSupportedException(ex.Message, ex); | 114 | throw new NotSupportedException(ex.Message, ex); |
| 204 | } | 115 | } |
| 205 | } | 116 | } |
| 206 | 117 | ||
| 207 | /// <summary> | 118 | /// <summary> |
| 208 | /// Verifies if a filename is a valid short filename. | 119 | /// Verifies if an identifier is a valid binder variable name. |
| 120 | /// </summary> | ||
| 121 | /// <param name="variable">Binder variable name to verify.</param> | ||
| 122 | /// <returns>True if the identifier is a valid binder variable name.</returns> | ||
| 123 | public static bool IsValidBinderVariable(string variable) | ||
| 124 | { | ||
| 125 | return TryParseWixVariable(variable, 0, out var parsed) && parsed.Index == 0 && parsed.Length == variable.Length && (parsed.Namespace == "bind" || parsed.Namespace == "wix"); | ||
| 126 | } | ||
| 127 | |||
| 128 | /// <summary> | ||
| 129 | /// Verifies if a string contains a valid binder variable name. | ||
| 130 | /// </summary> | ||
| 131 | /// <param name="verify">String to verify.</param> | ||
| 132 | /// <returns>True if the string contains a valid binder variable name.</returns> | ||
| 133 | public static bool ContainsValidBinderVariable(string verify) | ||
| 134 | { | ||
| 135 | return TryParseWixVariable(verify, 0, out var parsed) && (parsed.Namespace == "bind" || parsed.Namespace == "wix"); | ||
| 136 | } | ||
| 137 | |||
| 138 | /// <summary> | ||
| 139 | /// Verifies the given string is a valid 4-part version module or bundle version. | ||
| 209 | /// </summary> | 140 | /// </summary> |
| 210 | /// <param name="filename">Filename to verify.</param> | 141 | /// <param name="version">The version to verify.</param> |
| 211 | /// <param name="allowWildcards">true if wildcards are allowed in the filename.</param> | 142 | /// <returns>True if version is a valid module or bundle version.</returns> |
| 212 | /// <returns>True if the filename is a valid short filename</returns> | 143 | public static bool IsValidFourPartVersion(string version) |
| 144 | { | ||
| 145 | if (!Common.IsValidBinderVariable(version)) | ||
| 146 | { | ||
| 147 | if (!Version.TryParse(version, out var ver) || 65535 < ver.Major || 65535 < ver.Minor || 65535 < ver.Build || 65535 < ver.Revision) | ||
| 148 | { | ||
| 149 | return false; | ||
| 150 | } | ||
| 151 | } | ||
| 152 | |||
| 153 | return true; | ||
| 154 | } | ||
| 155 | |||
| 156 | public static bool IsValidLongFilename(string filename, bool allowWildcards, bool allowRelative) | ||
| 157 | { | ||
| 158 | if (String.IsNullOrEmpty(filename)) | ||
| 159 | { | ||
| 160 | return false; | ||
| 161 | } | ||
| 162 | else if (filename.Length > 259) | ||
| 163 | { | ||
| 164 | return false; | ||
| 165 | } | ||
| 166 | |||
| 167 | // Check for a non-period character (all periods is not legal) | ||
| 168 | var allPeriods = true; | ||
| 169 | foreach (var character in filename) | ||
| 170 | { | ||
| 171 | if ('.' != character) | ||
| 172 | { | ||
| 173 | allPeriods = false; | ||
| 174 | break; | ||
| 175 | } | ||
| 176 | } | ||
| 177 | |||
| 178 | if (allPeriods) | ||
| 179 | { | ||
| 180 | return false; | ||
| 181 | } | ||
| 182 | |||
| 183 | if (allowWildcards) | ||
| 184 | { | ||
| 185 | return filename.IndexOfAny(Common.IllegalWildcardLongFilenameCharacters) == -1; | ||
| 186 | } | ||
| 187 | else if (allowRelative) | ||
| 188 | { | ||
| 189 | return filename.IndexOfAny(Common.IllegalRelativeLongFilenameCharacters) == -1; | ||
| 190 | } | ||
| 191 | else | ||
| 192 | { | ||
| 193 | return filename.IndexOfAny(Common.IllegalLongFilenameCharacters) == -1; | ||
| 194 | } | ||
| 195 | } | ||
| 196 | |||
| 213 | public static bool IsValidShortFilename(string filename, bool allowWildcards) | 197 | public static bool IsValidShortFilename(string filename, bool allowWildcards) |
| 214 | { | 198 | { |
| 215 | if (String.IsNullOrEmpty(filename)) | 199 | if (String.IsNullOrEmpty(filename)) |
| @@ -291,55 +275,6 @@ namespace WixToolset.Core | |||
| 291 | } | 275 | } |
| 292 | 276 | ||
| 293 | /// <summary> | 277 | /// <summary> |
| 294 | /// Verifies if an identifier is a valid binder variable name. | ||
| 295 | /// </summary> | ||
| 296 | /// <param name="variable">Binder variable name to verify.</param> | ||
| 297 | /// <returns>True if the identifier is a valid binder variable name.</returns> | ||
| 298 | public static bool IsValidBinderVariable(string variable) | ||
| 299 | { | ||
| 300 | return TryParseWixVariable(variable, 0, out var parsed) && parsed.Index == 0 && parsed.Length == variable.Length && (parsed.Namespace == "bind" || parsed.Namespace == "wix"); | ||
| 301 | } | ||
| 302 | |||
| 303 | /// <summary> | ||
| 304 | /// Verifies if a string contains a valid binder variable name. | ||
| 305 | /// </summary> | ||
| 306 | /// <param name="verify">String to verify.</param> | ||
| 307 | /// <returns>True if the string contains a valid binder variable name.</returns> | ||
| 308 | public static bool ContainsValidBinderVariable(string verify) | ||
| 309 | { | ||
| 310 | return TryParseWixVariable(verify, 0, out var parsed) && (parsed.Namespace == "bind" || parsed.Namespace == "wix"); | ||
| 311 | } | ||
| 312 | |||
| 313 | /// <summary> | ||
| 314 | /// Verifies the given string is a valid module or bundle version. | ||
| 315 | /// </summary> | ||
| 316 | /// <param name="version">The version to verify.</param> | ||
| 317 | /// <returns>True if version is a valid module or bundle version.</returns> | ||
| 318 | public static bool IsValidModuleOrBundleVersion(string version) | ||
| 319 | { | ||
| 320 | if (!Common.IsValidBinderVariable(version)) | ||
| 321 | { | ||
| 322 | Version ver; | ||
| 323 | |||
| 324 | try | ||
| 325 | { | ||
| 326 | ver = new Version(version); | ||
| 327 | } | ||
| 328 | catch (ArgumentException) | ||
| 329 | { | ||
| 330 | return false; | ||
| 331 | } | ||
| 332 | |||
| 333 | if (65535 < ver.Major || 65535 < ver.Minor || 65535 < ver.Build || 65535 < ver.Revision) | ||
| 334 | { | ||
| 335 | return false; | ||
| 336 | } | ||
| 337 | } | ||
| 338 | |||
| 339 | return true; | ||
| 340 | } | ||
| 341 | |||
| 342 | /// <summary> | ||
| 343 | /// Generate a new Windows Installer-friendly guid. | 278 | /// Generate a new Windows Installer-friendly guid. |
| 344 | /// </summary> | 279 | /// </summary> |
| 345 | /// <returns>A new guid.</returns> | 280 | /// <returns>A new guid.</returns> |
| @@ -451,14 +386,14 @@ namespace WixToolset.Core | |||
| 451 | /// <param name="markAttribute">If true, add the attribute to each file. If false, remove it.</param> | 386 | /// <param name="markAttribute">If true, add the attribute to each file. If false, remove it.</param> |
| 452 | private static void RecursiveFileAttributes(string path, FileAttributes fileAttribute, bool markAttribute, IMessaging messageHandler) | 387 | private static void RecursiveFileAttributes(string path, FileAttributes fileAttribute, bool markAttribute, IMessaging messageHandler) |
| 453 | { | 388 | { |
| 454 | foreach (string subDirectory in Directory.GetDirectories(path)) | 389 | foreach (var subDirectory in Directory.GetDirectories(path)) |
| 455 | { | 390 | { |
| 456 | RecursiveFileAttributes(subDirectory, fileAttribute, markAttribute, messageHandler); | 391 | RecursiveFileAttributes(subDirectory, fileAttribute, markAttribute, messageHandler); |
| 457 | } | 392 | } |
| 458 | 393 | ||
| 459 | foreach (string filePath in Directory.GetFiles(path)) | 394 | foreach (var filePath in Directory.GetFiles(path)) |
| 460 | { | 395 | { |
| 461 | FileAttributes attributes = File.GetAttributes(filePath); | 396 | var attributes = File.GetAttributes(filePath); |
| 462 | if (markAttribute) | 397 | if (markAttribute) |
| 463 | { | 398 | { |
| 464 | attributes = attributes | fileAttribute; // add to list of attributes | 399 | attributes = attributes | fileAttribute; // add to list of attributes |
| @@ -506,16 +441,15 @@ namespace WixToolset.Core | |||
| 506 | /// <returns>An array of strings of length 4. The contents are: short target, long target, short source, and long source.</returns> | 441 | /// <returns>An array of strings of length 4. The contents are: short target, long target, short source, and long source.</returns> |
| 507 | /// <remarks> | 442 | /// <remarks> |
| 508 | /// If any particular file name part is not parsed, its set to null in the appropriate location of the returned array of strings. | 443 | /// If any particular file name part is not parsed, its set to null in the appropriate location of the returned array of strings. |
| 509 | /// However, the returned array will always be of length 4. | 444 | /// Thus the returned array will always be of length 4. |
| 510 | /// </remarks> | 445 | /// </remarks> |
| 511 | public static string[] GetNames(string value) | 446 | public static string[] GetNames(string value) |
| 512 | { | 447 | { |
| 513 | string[] names = new string[4]; | 448 | var targetSeparator = value.IndexOf(':'); |
| 514 | int targetSeparator = value.IndexOf(':'); | ||
| 515 | 449 | ||
| 516 | // split source and target | 450 | // split source and target |
| 517 | string sourceName = null; | 451 | string sourceName = null; |
| 518 | string targetName = value; | 452 | var targetName = value; |
| 519 | if (0 <= targetSeparator) | 453 | if (0 <= targetSeparator) |
| 520 | { | 454 | { |
| 521 | sourceName = value.Substring(targetSeparator + 1); | 455 | sourceName = value.Substring(targetSeparator + 1); |
| @@ -526,7 +460,7 @@ namespace WixToolset.Core | |||
| 526 | string sourceLongName = null; | 460 | string sourceLongName = null; |
| 527 | if (null != sourceName) | 461 | if (null != sourceName) |
| 528 | { | 462 | { |
| 529 | int sourceLongNameSeparator = sourceName.IndexOf('|'); | 463 | var sourceLongNameSeparator = sourceName.IndexOf('|'); |
| 530 | if (0 <= sourceLongNameSeparator) | 464 | if (0 <= sourceLongNameSeparator) |
| 531 | { | 465 | { |
| 532 | sourceLongName = sourceName.Substring(sourceLongNameSeparator + 1); | 466 | sourceLongName = sourceName.Substring(sourceLongNameSeparator + 1); |
| @@ -535,7 +469,7 @@ namespace WixToolset.Core | |||
| 535 | } | 469 | } |
| 536 | 470 | ||
| 537 | // split the target short and long names | 471 | // split the target short and long names |
| 538 | int targetLongNameSeparator = targetName.IndexOf('|'); | 472 | var targetLongNameSeparator = targetName.IndexOf('|'); |
| 539 | string targetLongName = null; | 473 | string targetLongName = null; |
| 540 | if (0 <= targetLongNameSeparator) | 474 | if (0 <= targetLongNameSeparator) |
| 541 | { | 475 | { |
| @@ -543,19 +477,19 @@ namespace WixToolset.Core | |||
| 543 | targetName = targetName.Substring(0, targetLongNameSeparator); | 477 | targetName = targetName.Substring(0, targetLongNameSeparator); |
| 544 | } | 478 | } |
| 545 | 479 | ||
| 546 | // remove the long source name when its identical to the long source name | 480 | // Remove the long source name when its identical to the short source name. |
| 547 | if (null != sourceName && sourceName == sourceLongName) | 481 | if (null != sourceName && sourceName == sourceLongName) |
| 548 | { | 482 | { |
| 549 | sourceLongName = null; | 483 | sourceLongName = null; |
| 550 | } | 484 | } |
| 551 | 485 | ||
| 552 | // remove the long target name when its identical to the long target name | 486 | // Remove the long target name when its identical to the long target name. |
| 553 | if (null != targetName && targetName == targetLongName) | 487 | if (null != targetName && targetName == targetLongName) |
| 554 | { | 488 | { |
| 555 | targetLongName = null; | 489 | targetLongName = null; |
| 556 | } | 490 | } |
| 557 | 491 | ||
| 558 | // remove the source names when they are identical to the target names | 492 | // Remove the source names when they are identical to the target names. |
| 559 | if (sourceName == targetName && sourceLongName == targetLongName) | 493 | if (sourceName == targetName && sourceLongName == targetLongName) |
| 560 | { | 494 | { |
| 561 | sourceName = null; | 495 | sourceName = null; |
| @@ -563,28 +497,28 @@ namespace WixToolset.Core | |||
| 563 | } | 497 | } |
| 564 | 498 | ||
| 565 | // target name(s) | 499 | // target name(s) |
| 566 | if ("." != targetName) | 500 | if ("." == targetName) |
| 567 | { | 501 | { |
| 568 | names[0] = targetName; | 502 | targetName = null; |
| 569 | } | 503 | } |
| 570 | 504 | ||
| 571 | if (null != targetLongName && "." != targetLongName) | 505 | if ("." == targetLongName) |
| 572 | { | 506 | { |
| 573 | names[1] = targetLongName; | 507 | targetLongName = null; |
| 574 | } | 508 | } |
| 575 | 509 | ||
| 576 | // source name(s) | 510 | // source name(s) |
| 577 | if (null != sourceName) | 511 | if ("." == sourceName) |
| 578 | { | 512 | { |
| 579 | names[2] = sourceName; | 513 | sourceName = null; |
| 580 | } | 514 | } |
| 581 | 515 | ||
| 582 | if (null != sourceLongName && "." != sourceLongName) | 516 | if ("." == sourceLongName) |
| 583 | { | 517 | { |
| 584 | names[3] = sourceLongName; | 518 | sourceLongName = null; |
| 585 | } | 519 | } |
| 586 | 520 | ||
| 587 | return names; | 521 | return new[] { targetName, targetLongName, sourceName, sourceLongName }; |
| 588 | } | 522 | } |
| 589 | 523 | ||
| 590 | /// <summary> | 524 | /// <summary> |
| @@ -596,7 +530,7 @@ namespace WixToolset.Core | |||
| 596 | /// <returns>The name.</returns> | 530 | /// <returns>The name.</returns> |
| 597 | public static string GetName(string value, bool source, bool longName) | 531 | public static string GetName(string value, bool source, bool longName) |
| 598 | { | 532 | { |
| 599 | string[] names = GetNames(value); | 533 | var names = GetNames(value); |
| 600 | 534 | ||
| 601 | if (source) | 535 | if (source) |
| 602 | { | 536 | { |
| @@ -674,7 +608,7 @@ namespace WixToolset.Core | |||
| 674 | /// <returns>The attribute's identifier value or a special value if an error occurred.</returns> | 608 | /// <returns>The attribute's identifier value or a special value if an error occurred.</returns> |
| 675 | internal static string GetAttributeIdentifierValue(IMessaging messaging, SourceLineNumber sourceLineNumbers, XAttribute attribute) | 609 | internal static string GetAttributeIdentifierValue(IMessaging messaging, SourceLineNumber sourceLineNumbers, XAttribute attribute) |
| 676 | { | 610 | { |
| 677 | string value = Common.GetAttributeValue(messaging, sourceLineNumbers, attribute, EmptyRule.CanBeWhitespaceOnly); | 611 | var value = Common.GetAttributeValue(messaging, sourceLineNumbers, attribute, EmptyRule.CanBeWhitespaceOnly); |
| 678 | 612 | ||
| 679 | if (Common.IsIdentifier(value)) | 613 | if (Common.IsIdentifier(value)) |
| 680 | { | 614 | { |
| @@ -713,8 +647,8 @@ namespace WixToolset.Core | |||
| 713 | { | 647 | { |
| 714 | Debug.Assert(minimum > CompilerConstants.IntegerNotSet && minimum > CompilerConstants.IllegalInteger, "The legal values for this attribute collide with at least one sentinel used during parsing."); | 648 | Debug.Assert(minimum > CompilerConstants.IntegerNotSet && minimum > CompilerConstants.IllegalInteger, "The legal values for this attribute collide with at least one sentinel used during parsing."); |
| 715 | 649 | ||
| 716 | string value = Common.GetAttributeValue(messaging, sourceLineNumbers, attribute, EmptyRule.CanBeWhitespaceOnly); | 650 | var value = Common.GetAttributeValue(messaging, sourceLineNumbers, attribute, EmptyRule.CanBeWhitespaceOnly); |
| 717 | int integer = CompilerConstants.IllegalInteger; | 651 | var integer = CompilerConstants.IllegalInteger; |
| 718 | 652 | ||
| 719 | if (0 < value.Length) | 653 | if (0 < value.Length) |
| 720 | { | 654 | { |
| @@ -748,8 +682,8 @@ namespace WixToolset.Core | |||
| 748 | /// <returns>The attribute's YesNoType value.</returns> | 682 | /// <returns>The attribute's YesNoType value.</returns> |
| 749 | internal static YesNoType GetAttributeYesNoValue(IMessaging messaging, SourceLineNumber sourceLineNumbers, XAttribute attribute) | 683 | internal static YesNoType GetAttributeYesNoValue(IMessaging messaging, SourceLineNumber sourceLineNumbers, XAttribute attribute) |
| 750 | { | 684 | { |
| 751 | string value = Common.GetAttributeValue(messaging, sourceLineNumbers, attribute, EmptyRule.CanBeWhitespaceOnly); | 685 | var value = Common.GetAttributeValue(messaging, sourceLineNumbers, attribute, EmptyRule.CanBeWhitespaceOnly); |
| 752 | YesNoType yesNo = YesNoType.IllegalValue; | 686 | var yesNo = YesNoType.IllegalValue; |
| 753 | 687 | ||
| 754 | if ("yes".Equals(value) || "true".Equals(value)) | 688 | if ("yes".Equals(value) || "true".Equals(value)) |
| 755 | { | 689 | { |
diff --git a/src/WixToolset.Core/Compiler.cs b/src/WixToolset.Core/Compiler.cs index f311a5f6..2aa25141 100644 --- a/src/WixToolset.Core/Compiler.cs +++ b/src/WixToolset.Core/Compiler.cs | |||
| @@ -7073,7 +7073,7 @@ namespace WixToolset.Core | |||
| 7073 | Remove = removeFeatures, | 7073 | Remove = removeFeatures, |
| 7074 | MigrateFeatures = migrateFeatures, | 7074 | MigrateFeatures = migrateFeatures, |
| 7075 | IgnoreRemoveFailures = ignoreRemoveFailure, | 7075 | IgnoreRemoveFailures = ignoreRemoveFailure, |
| 7076 | ActionProperty = Common.UpgradeDetectedProperty | 7076 | ActionProperty = WixUpgradeConstants.UpgradeDetectedProperty |
| 7077 | }); | 7077 | }); |
| 7078 | 7078 | ||
| 7079 | if (allowDowngrades) | 7079 | if (allowDowngrades) |
| @@ -7094,7 +7094,7 @@ namespace WixToolset.Core | |||
| 7094 | { | 7094 | { |
| 7095 | this.Core.AddSymbol(new LaunchConditionSymbol(sourceLineNumbers) | 7095 | this.Core.AddSymbol(new LaunchConditionSymbol(sourceLineNumbers) |
| 7096 | { | 7096 | { |
| 7097 | Condition = Common.UpgradePreventedCondition, | 7097 | Condition = WixUpgradeConstants.UpgradePreventedCondition, |
| 7098 | Description = downgradeErrorMessage | 7098 | Description = downgradeErrorMessage |
| 7099 | }); | 7099 | }); |
| 7100 | } | 7100 | } |
| @@ -7109,12 +7109,12 @@ namespace WixToolset.Core | |||
| 7109 | Language = productLanguage, | 7109 | Language = productLanguage, |
| 7110 | OnlyDetect = true, | 7110 | OnlyDetect = true, |
| 7111 | IgnoreRemoveFailures = ignoreRemoveFailure, | 7111 | IgnoreRemoveFailures = ignoreRemoveFailure, |
| 7112 | ActionProperty = Common.DowngradeDetectedProperty | 7112 | ActionProperty = WixUpgradeConstants.DowngradeDetectedProperty |
| 7113 | }); | 7113 | }); |
| 7114 | 7114 | ||
| 7115 | this.Core.AddSymbol(new LaunchConditionSymbol(sourceLineNumbers) | 7115 | this.Core.AddSymbol(new LaunchConditionSymbol(sourceLineNumbers) |
| 7116 | { | 7116 | { |
| 7117 | Condition = Common.DowngradePreventedCondition, | 7117 | Condition = WixUpgradeConstants.DowngradePreventedCondition, |
| 7118 | Description = downgradeErrorMessage | 7118 | Description = downgradeErrorMessage |
| 7119 | }); | 7119 | }); |
| 7120 | } | 7120 | } |
diff --git a/src/WixToolset.Core/CompilerCore.cs b/src/WixToolset.Core/CompilerCore.cs index cfe3082e..ec22a8ec 100644 --- a/src/WixToolset.Core/CompilerCore.cs +++ b/src/WixToolset.Core/CompilerCore.cs | |||
| @@ -297,20 +297,6 @@ namespace WixToolset.Core | |||
| 297 | } | 297 | } |
| 298 | 298 | ||
| 299 | /// <summary> | 299 | /// <summary> |
| 300 | /// Creates a short file/directory name using an identifier and long file/directory name as input. | ||
| 301 | /// </summary> | ||
| 302 | /// <param name="longName">The long file/directory name.</param> | ||
| 303 | /// <param name="keepExtension">The option to keep the extension on generated short names.</param> | ||
| 304 | /// <param name="allowWildcards">true if wildcards are allowed in the filename.</param> | ||
| 305 | /// <param name="args">Any additional information to include in the hash for the generated short name.</param> | ||
| 306 | /// <returns>The generated 8.3-compliant short file/directory name.</returns> | ||
| 307 | [Obsolete] | ||
| 308 | public string CreateShortName(string longName, bool keepExtension, bool allowWildcards, params string[] args) | ||
| 309 | { | ||
| 310 | return this.parseHelper.CreateShortName(longName, keepExtension, allowWildcards, args); | ||
| 311 | } | ||
| 312 | |||
| 313 | /// <summary> | ||
| 314 | /// Verifies the given string is a valid product version. | 300 | /// Verifies the given string is a valid product version. |
| 315 | /// </summary> | 301 | /// </summary> |
| 316 | /// <param name="version">The product version to verify.</param> | 302 | /// <param name="version">The product version to verify.</param> |
| @@ -337,7 +323,7 @@ namespace WixToolset.Core | |||
| 337 | /// <returns>True if version is a valid module or bundle version.</returns> | 323 | /// <returns>True if version is a valid module or bundle version.</returns> |
| 338 | public static bool IsValidModuleOrBundleVersion(string version) | 324 | public static bool IsValidModuleOrBundleVersion(string version) |
| 339 | { | 325 | { |
| 340 | return Common.IsValidModuleOrBundleVersion(version); | 326 | return Common.IsValidFourPartVersion(version); |
| 341 | } | 327 | } |
| 342 | 328 | ||
| 343 | /// <summary> | 329 | /// <summary> |
| @@ -547,15 +533,14 @@ namespace WixToolset.Core | |||
| 547 | { | 533 | { |
| 548 | if (null == attribute) | 534 | if (null == attribute) |
| 549 | { | 535 | { |
| 550 | throw new ArgumentNullException("attribute"); | 536 | throw new ArgumentNullException(nameof(attribute)); |
| 551 | } | 537 | } |
| 552 | 538 | ||
| 553 | string value = this.GetAttributeValue(sourceLineNumbers, attribute); | 539 | var value = this.GetAttributeValue(sourceLineNumbers, attribute); |
| 554 | 540 | ||
| 555 | try | 541 | try |
| 556 | { | 542 | { |
| 557 | int codePage = Common.GetValidCodePage(value); | 543 | return Common.GetValidCodePage(value); |
| 558 | return codePage; | ||
| 559 | } | 544 | } |
| 560 | catch (NotSupportedException) | 545 | catch (NotSupportedException) |
| 561 | { | 546 | { |
| @@ -576,12 +561,12 @@ namespace WixToolset.Core | |||
| 576 | { | 561 | { |
| 577 | if (null == attribute) | 562 | if (null == attribute) |
| 578 | { | 563 | { |
| 579 | throw new ArgumentNullException("attribute"); | 564 | throw new ArgumentNullException(nameof(attribute)); |
| 580 | } | 565 | } |
| 581 | 566 | ||
| 582 | string value = this.GetAttributeValue(sourceLineNumbers, attribute); | 567 | var value = this.GetAttributeValue(sourceLineNumbers, attribute); |
| 583 | 568 | ||
| 584 | // allow for localization of code page names and values | 569 | // Allow for localization of code page names and values. |
| 585 | if (this.IsValidLocIdentifier(value)) | 570 | if (this.IsValidLocIdentifier(value)) |
| 586 | { | 571 | { |
| 587 | return value; | 572 | return value; |
| @@ -589,13 +574,13 @@ namespace WixToolset.Core | |||
| 589 | 574 | ||
| 590 | try | 575 | try |
| 591 | { | 576 | { |
| 592 | int codePage = Common.GetValidCodePage(value, false, onlyAnsi, sourceLineNumbers); | 577 | var codePage = Common.GetValidCodePage(value, false, onlyAnsi, sourceLineNumbers); |
| 593 | return codePage.ToString(CultureInfo.InvariantCulture); | 578 | return codePage.ToString(CultureInfo.InvariantCulture); |
| 594 | } | 579 | } |
| 595 | catch (NotSupportedException) | 580 | catch (NotSupportedException) |
| 596 | { | 581 | { |
| 597 | // not a valid windows code page | 582 | // Not a valid windows code page. |
| 598 | this.Write(ErrorMessages.IllegalCodepageAttribute(sourceLineNumbers, value, attribute.Parent.Name.LocalName, attribute.Name.LocalName)); | 583 | this.messaging.Write(ErrorMessages.IllegalCodepageAttribute(sourceLineNumbers, value, attribute.Parent.Name.LocalName, attribute.Name.LocalName)); |
| 599 | } | 584 | } |
| 600 | catch (WixException e) | 585 | catch (WixException e) |
| 601 | { | 586 | { |
| @@ -805,7 +790,7 @@ namespace WixToolset.Core | |||
| 805 | 790 | ||
| 806 | if (0 < value.Length) | 791 | if (0 < value.Length) |
| 807 | { | 792 | { |
| 808 | if (!this.IsValidShortFilename(value, allowWildcards) && !Common.ContainsValidBinderVariable(value)) | 793 | if (!this.parseHelper.IsValidShortFilename(value, allowWildcards) && !Common.ContainsValidBinderVariable(value)) |
| 809 | { | 794 | { |
| 810 | this.Write(ErrorMessages.IllegalShortFilename(sourceLineNumbers, attribute.Parent.Name.LocalName, attribute.Name.LocalName, value)); | 795 | this.Write(ErrorMessages.IllegalShortFilename(sourceLineNumbers, attribute.Parent.Name.LocalName, attribute.Name.LocalName, value)); |
| 811 | } | 796 | } |
diff --git a/src/WixToolset.Core/Compiler_Package.cs b/src/WixToolset.Core/Compiler_Package.cs index 03ba1c40..1dac5399 100644 --- a/src/WixToolset.Core/Compiler_Package.cs +++ b/src/WixToolset.Core/Compiler_Package.cs | |||
| @@ -1024,13 +1024,13 @@ namespace WixToolset.Core | |||
| 1024 | switch (tableName) | 1024 | switch (tableName) |
| 1025 | { | 1025 | { |
| 1026 | case "CreateFolder": | 1026 | case "CreateFolder": |
| 1027 | specialPermissions = Common.FolderPermissions; | 1027 | specialPermissions = LockPermissionConstants.FolderPermissions; |
| 1028 | break; | 1028 | break; |
| 1029 | case "File": | 1029 | case "File": |
| 1030 | specialPermissions = Common.FilePermissions; | 1030 | specialPermissions = LockPermissionConstants.FilePermissions; |
| 1031 | break; | 1031 | break; |
| 1032 | case "Registry": | 1032 | case "Registry": |
| 1033 | specialPermissions = Common.RegistryPermissions; | 1033 | specialPermissions = LockPermissionConstants.RegistryPermissions; |
| 1034 | break; | 1034 | break; |
| 1035 | default: | 1035 | default: |
| 1036 | this.Core.UnexpectedElement(node.Parent, node); | 1036 | this.Core.UnexpectedElement(node.Parent, node); |
| @@ -1059,9 +1059,9 @@ namespace WixToolset.Core | |||
| 1059 | break; | 1059 | break; |
| 1060 | default: | 1060 | default: |
| 1061 | var attribValue = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); | 1061 | var attribValue = this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib); |
| 1062 | if (!this.Core.TrySetBitFromName(Common.StandardPermissions, attrib.Name.LocalName, attribValue, bits, 16)) | 1062 | if (!this.Core.TrySetBitFromName(LockPermissionConstants.StandardPermissions, attrib.Name.LocalName, attribValue, bits, 16)) |
| 1063 | { | 1063 | { |
| 1064 | if (!this.Core.TrySetBitFromName(Common.GenericPermissions, attrib.Name.LocalName, attribValue, bits, 28)) | 1064 | if (!this.Core.TrySetBitFromName(LockPermissionConstants.GenericPermissions, attrib.Name.LocalName, attribValue, bits, 28)) |
| 1065 | { | 1065 | { |
| 1066 | if (!this.Core.TrySetBitFromName(specialPermissions, attrib.Name.LocalName, attribValue, bits, 0)) | 1066 | if (!this.Core.TrySetBitFromName(specialPermissions, attrib.Name.LocalName, attribValue, bits, 0)) |
| 1067 | { | 1067 | { |
diff --git a/src/WixToolset.Core/Compiler_Patch.cs b/src/WixToolset.Core/Compiler_Patch.cs index 998894d8..a2cadd67 100644 --- a/src/WixToolset.Core/Compiler_Patch.cs +++ b/src/WixToolset.Core/Compiler_Patch.cs | |||
| @@ -95,13 +95,13 @@ namespace WixToolset.Core | |||
| 95 | targetProductName = this.Core.GetAttributeValue(sourceLineNumbers, attrib); | 95 | targetProductName = this.Core.GetAttributeValue(sourceLineNumbers, attrib); |
| 96 | break; | 96 | break; |
| 97 | case "ApiPatchingSymbolNoImagehlpFlag": | 97 | case "ApiPatchingSymbolNoImagehlpFlag": |
| 98 | apiPatchingSymbolFlags |= (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib)) ? (int)PatchSymbolFlagsType.PATCH_SYMBOL_NO_IMAGEHLP : 0; | 98 | apiPatchingSymbolFlags |= (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib)) ? (int)PatchSymbolFlags.PatchSymbolNoImagehlp : 0; |
| 99 | break; | 99 | break; |
| 100 | case "ApiPatchingSymbolNoFailuresFlag": | 100 | case "ApiPatchingSymbolNoFailuresFlag": |
| 101 | apiPatchingSymbolFlags |= (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib)) ? (int)PatchSymbolFlagsType.PATCH_SYMBOL_NO_FAILURES : 0; | 101 | apiPatchingSymbolFlags |= (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib)) ? (int)PatchSymbolFlags.PatchSymbolNoFailures : 0; |
| 102 | break; | 102 | break; |
| 103 | case "ApiPatchingSymbolUndecoratedTooFlag": | 103 | case "ApiPatchingSymbolUndecoratedTooFlag": |
| 104 | apiPatchingSymbolFlags |= (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib)) ? (int)PatchSymbolFlagsType.PATCH_SYMBOL_UNDECORATED_TOO : 0; | 104 | apiPatchingSymbolFlags |= (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib)) ? (int)PatchSymbolFlags.PatchSymbolUndecoratedToo : 0; |
| 105 | break; | 105 | break; |
| 106 | case "OptimizePatchSizeForLargeFiles": | 106 | case "OptimizePatchSizeForLargeFiles": |
| 107 | optimizePatchSizeForLargeFiles = (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib)); | 107 | optimizePatchSizeForLargeFiles = (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib)); |
| @@ -275,7 +275,7 @@ namespace WixToolset.Core | |||
| 275 | private int ParseOptimizeCustomActionsElement(XElement node) | 275 | private int ParseOptimizeCustomActionsElement(XElement node) |
| 276 | { | 276 | { |
| 277 | var sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node); | 277 | var sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node); |
| 278 | var optimizeCA = OptimizeCA.None; | 278 | var optimizeCA = OptimizeCAFlags.None; |
| 279 | 279 | ||
| 280 | foreach (var attrib in node.Attributes()) | 280 | foreach (var attrib in node.Attributes()) |
| 281 | { | 281 | { |
| @@ -286,19 +286,19 @@ namespace WixToolset.Core | |||
| 286 | case "SkipAssignment": | 286 | case "SkipAssignment": |
| 287 | if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib)) | 287 | if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib)) |
| 288 | { | 288 | { |
| 289 | optimizeCA |= OptimizeCA.SkipAssignment; | 289 | optimizeCA |= OptimizeCAFlags.SkipAssignment; |
| 290 | } | 290 | } |
| 291 | break; | 291 | break; |
| 292 | case "SkipImmediate": | 292 | case "SkipImmediate": |
| 293 | if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib)) | 293 | if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib)) |
| 294 | { | 294 | { |
| 295 | optimizeCA |= OptimizeCA.SkipImmediate; | 295 | optimizeCA |= OptimizeCAFlags.SkipImmediate; |
| 296 | } | 296 | } |
| 297 | break; | 297 | break; |
| 298 | case "SkipDeferred": | 298 | case "SkipDeferred": |
| 299 | if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib)) | 299 | if (YesNoType.Yes == this.Core.GetAttributeYesNoValue(sourceLineNumbers, attrib)) |
| 300 | { | 300 | { |
| 301 | optimizeCA |= OptimizeCA.SkipDeferred; | 301 | optimizeCA |= OptimizeCAFlags.SkipDeferred; |
| 302 | } | 302 | } |
| 303 | break; | 303 | break; |
| 304 | default: | 304 | default: |
diff --git a/src/WixToolset.Core/ExtensibilityServices/BackendHelper.cs b/src/WixToolset.Core/ExtensibilityServices/BackendHelper.cs index 7b20286c..3dcc0ce9 100644 --- a/src/WixToolset.Core/ExtensibilityServices/BackendHelper.cs +++ b/src/WixToolset.Core/ExtensibilityServices/BackendHelper.cs | |||
| @@ -3,8 +3,12 @@ | |||
| 3 | namespace WixToolset.Core.ExtensibilityServices | 3 | namespace WixToolset.Core.ExtensibilityServices |
| 4 | { | 4 | { |
| 5 | using System; | 5 | using System; |
| 6 | using System.Collections.Generic; | ||
| 6 | using System.IO; | 7 | using System.IO; |
| 8 | using WixToolset.Core.Bind; | ||
| 7 | using WixToolset.Data; | 9 | using WixToolset.Data; |
| 10 | using WixToolset.Data.Symbols; | ||
| 11 | using WixToolset.Data.WindowsInstaller.Rows; | ||
| 8 | using WixToolset.Extensibility.Data; | 12 | using WixToolset.Extensibility.Data; |
| 9 | using WixToolset.Extensibility.Services; | 13 | using WixToolset.Extensibility.Services; |
| 10 | 14 | ||
| @@ -15,12 +19,24 @@ namespace WixToolset.Core.ExtensibilityServices | |||
| 15 | public BackendHelper(IWixToolsetServiceProvider serviceProvider) | 19 | public BackendHelper(IWixToolsetServiceProvider serviceProvider) |
| 16 | { | 20 | { |
| 17 | this.Messaging = serviceProvider.GetService<IMessaging>(); | 21 | this.Messaging = serviceProvider.GetService<IMessaging>(); |
| 18 | this.ParseHelper = serviceProvider.GetService<IParseHelper>(); | ||
| 19 | } | 22 | } |
| 20 | 23 | ||
| 21 | private IMessaging Messaging { get; } | 24 | private IMessaging Messaging { get; } |
| 22 | 25 | ||
| 23 | private IParseHelper ParseHelper { get; } | 26 | public IFileFacade CreateFileFacade(FileSymbol file, AssemblySymbol assembly) |
| 27 | { | ||
| 28 | return new FileFacade(file, assembly); | ||
| 29 | } | ||
| 30 | |||
| 31 | public IFileFacade CreateFileFacade(FileRow fileRow) | ||
| 32 | { | ||
| 33 | return new FileFacade(fileRow); | ||
| 34 | } | ||
| 35 | |||
| 36 | public IFileFacade CreateFileFacadeFromMergeModule(FileSymbol fileSymbol) | ||
| 37 | { | ||
| 38 | return new FileFacade(true, fileSymbol); | ||
| 39 | } | ||
| 24 | 40 | ||
| 25 | public IFileTransfer CreateFileTransfer(string source, string destination, bool move, SourceLineNumber sourceLineNumbers = null) | 41 | public IFileTransfer CreateFileTransfer(string source, string destination, bool move, SourceLineNumber sourceLineNumbers = null) |
| 26 | { | 42 | { |
| @@ -38,6 +54,11 @@ namespace WixToolset.Core.ExtensibilityServices | |||
| 38 | }; | 54 | }; |
| 39 | } | 55 | } |
| 40 | 56 | ||
| 57 | public string CreateGuid() | ||
| 58 | { | ||
| 59 | return Common.GenerateGuid(); | ||
| 60 | } | ||
| 61 | |||
| 41 | public string CreateGuid(Guid namespaceGuid, string value) | 62 | public string CreateGuid(Guid namespaceGuid, string value) |
| 42 | { | 63 | { |
| 43 | return Uuid.NewUuid(namespaceGuid, value).ToString("B").ToUpperInvariant(); | 64 | return Uuid.NewUuid(namespaceGuid, value).ToString("B").ToUpperInvariant(); |
| @@ -52,9 +73,43 @@ namespace WixToolset.Core.ExtensibilityServices | |||
| 52 | }; | 73 | }; |
| 53 | } | 74 | } |
| 54 | 75 | ||
| 76 | public IEnumerable<ITrackedFile> ExtractEmbeddedFiles(IEnumerable<IExpectedExtractFile> embeddedFiles) | ||
| 77 | { | ||
| 78 | var command = new ExtractEmbeddedFilesCommand(this, embeddedFiles); | ||
| 79 | command.Execute(); | ||
| 80 | |||
| 81 | return command.TrackedFiles; | ||
| 82 | } | ||
| 83 | |||
| 84 | public string GenerateIdentifier(string prefix, params string[] args) | ||
| 85 | { | ||
| 86 | return Common.GenerateIdentifier(prefix, args); | ||
| 87 | } | ||
| 88 | |||
| 55 | public string GetCanonicalRelativePath(SourceLineNumber sourceLineNumbers, string elementName, string attributeName, string relativePath) | 89 | public string GetCanonicalRelativePath(SourceLineNumber sourceLineNumbers, string elementName, string attributeName, string relativePath) |
| 56 | { | 90 | { |
| 57 | return this.ParseHelper.GetCanonicalRelativePath(sourceLineNumbers, elementName, attributeName, relativePath); | 91 | return Common.GetCanonicalRelativePath(sourceLineNumbers, elementName, attributeName, relativePath, this.Messaging); |
| 92 | } | ||
| 93 | |||
| 94 | public int GetValidCodePage(string value, bool allowNoChange = false, bool onlyAnsi = false, SourceLineNumber sourceLineNumbers = null) | ||
| 95 | { | ||
| 96 | return Common.GetValidCodePage(value, allowNoChange, onlyAnsi, sourceLineNumbers); | ||
| 97 | } | ||
| 98 | |||
| 99 | public string GetMsiFileName(string value, bool source, bool longName) | ||
| 100 | { | ||
| 101 | return Common.GetName(value, source, longName); | ||
| 102 | } | ||
| 103 | |||
| 104 | public void ResolveDelayedFields(IEnumerable<IDelayedField> delayedFields, Dictionary<string, string> variableCache) | ||
| 105 | { | ||
| 106 | var command = new ResolveDelayedFieldsCommand(this.Messaging, delayedFields, variableCache); | ||
| 107 | command.Execute(); | ||
| 108 | } | ||
| 109 | |||
| 110 | public string[] SplitMsiFileName(string value) | ||
| 111 | { | ||
| 112 | return Common.GetNames(value); | ||
| 58 | } | 113 | } |
| 59 | 114 | ||
| 60 | public ITrackedFile TrackFile(string path, TrackedFileType type, SourceLineNumber sourceLineNumbers = null) | 115 | public ITrackedFile TrackFile(string path, TrackedFileType type, SourceLineNumber sourceLineNumbers = null) |
| @@ -62,6 +117,31 @@ namespace WixToolset.Core.ExtensibilityServices | |||
| 62 | return new TrackedFile(path, type, sourceLineNumbers); | 117 | return new TrackedFile(path, type, sourceLineNumbers); |
| 63 | } | 118 | } |
| 64 | 119 | ||
| 120 | public bool IsValidBinderVariable(string variable) | ||
| 121 | { | ||
| 122 | return Common.IsValidBinderVariable(variable); | ||
| 123 | } | ||
| 124 | |||
| 125 | public bool IsValidFourPartVersion(string version) | ||
| 126 | { | ||
| 127 | return Common.IsValidFourPartVersion(version); | ||
| 128 | } | ||
| 129 | |||
| 130 | public bool IsValidIdentifier(string id) | ||
| 131 | { | ||
| 132 | return Common.IsIdentifier(id); | ||
| 133 | } | ||
| 134 | |||
| 135 | public bool IsValidLongFilename(string filename, bool allowWildcards, bool allowRelative) | ||
| 136 | { | ||
| 137 | return Common.IsValidLongFilename(filename, allowWildcards, allowRelative); | ||
| 138 | } | ||
| 139 | |||
| 140 | public bool IsValidShortFilename(string filename, bool allowWildcards) | ||
| 141 | { | ||
| 142 | return Common.IsValidShortFilename(filename, allowWildcards); | ||
| 143 | } | ||
| 144 | |||
| 65 | private string GetValidatedFullPath(SourceLineNumber sourceLineNumbers, string path) | 145 | private string GetValidatedFullPath(SourceLineNumber sourceLineNumbers, string path) |
| 66 | { | 146 | { |
| 67 | try | 147 | try |
diff --git a/src/WixToolset.Core/Bind/FileFacade.cs b/src/WixToolset.Core/ExtensibilityServices/FileFacade.cs index d1e5ae60..f85d4842 100644 --- a/src/WixToolset.Core/Bind/FileFacade.cs +++ b/src/WixToolset.Core/ExtensibilityServices/FileFacade.cs | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | 1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. |
| 2 | 2 | ||
| 3 | namespace WixToolset.Core.Bind | 3 | namespace WixToolset.Core.ExtensibilityServices |
| 4 | { | 4 | { |
| 5 | using System; | 5 | using System; |
| 6 | using System.Collections.Generic; | 6 | using System.Collections.Generic; |
| @@ -8,9 +8,9 @@ namespace WixToolset.Core.Bind | |||
| 8 | using WixToolset.Data.Symbols; | 8 | using WixToolset.Data.Symbols; |
| 9 | using WixToolset.Data.WindowsInstaller; | 9 | using WixToolset.Data.WindowsInstaller; |
| 10 | using WixToolset.Data.WindowsInstaller.Rows; | 10 | using WixToolset.Data.WindowsInstaller.Rows; |
| 11 | using WixToolset.Extensibility.Data; | ||
| 11 | 12 | ||
| 12 | #pragma warning disable 1591 // TODO: this shouldn't be public, need interface in Extensibility | 13 | internal class FileFacade : IFileFacade |
| 13 | public class FileFacade | ||
| 14 | { | 14 | { |
| 15 | public FileFacade(FileSymbol file, AssemblySymbol assembly) | 15 | public FileFacade(FileSymbol file, AssemblySymbol assembly) |
| 16 | { | 16 | { |
diff --git a/src/WixToolset.Core/ExtensibilityServices/ParseHelper.cs b/src/WixToolset.Core/ExtensibilityServices/ParseHelper.cs index 7894ce8e..3c040b35 100644 --- a/src/WixToolset.Core/ExtensibilityServices/ParseHelper.cs +++ b/src/WixToolset.Core/ExtensibilityServices/ParseHelper.cs | |||
| @@ -6,9 +6,6 @@ namespace WixToolset.Core.ExtensibilityServices | |||
| 6 | using System.Collections.Generic; | 6 | using System.Collections.Generic; |
| 7 | using System.Diagnostics; | 7 | using System.Diagnostics; |
| 8 | using System.Globalization; | 8 | using System.Globalization; |
| 9 | using System.IO; | ||
| 10 | using System.Security.Cryptography; | ||
| 11 | using System.Text; | ||
| 12 | using System.Xml.Linq; | 9 | using System.Xml.Linq; |
| 13 | using WixToolset.Data; | 10 | using WixToolset.Data; |
| 14 | using WixToolset.Data.Symbols; | 11 | using WixToolset.Data.Symbols; |
| @@ -292,56 +289,6 @@ namespace WixToolset.Core.ExtensibilityServices | |||
| 292 | return section.AddSymbol(symbolDefinition.CreateSymbol(sourceLineNumbers, identifier)); | 289 | return section.AddSymbol(symbolDefinition.CreateSymbol(sourceLineNumbers, identifier)); |
| 293 | } | 290 | } |
| 294 | 291 | ||
| 295 | public string CreateShortName(string longName, bool keepExtension, bool allowWildcards, params string[] args) | ||
| 296 | { | ||
| 297 | // canonicalize the long name if its not a localization identifier (they are case-sensitive) | ||
| 298 | if (!this.IsValidLocIdentifier(longName)) | ||
| 299 | { | ||
| 300 | longName = longName.ToLowerInvariant(); | ||
| 301 | } | ||
| 302 | |||
| 303 | // collect all the data | ||
| 304 | var strings = new List<string>(1 + args.Length); | ||
| 305 | strings.Add(longName); | ||
| 306 | strings.AddRange(args); | ||
| 307 | |||
| 308 | // prepare for hashing | ||
| 309 | var stringData = String.Join("|", strings); | ||
| 310 | var data = Encoding.UTF8.GetBytes(stringData); | ||
| 311 | |||
| 312 | // hash the data | ||
| 313 | byte[] hash; | ||
| 314 | using (var sha1 = new SHA1CryptoServiceProvider()) | ||
| 315 | { | ||
| 316 | hash = sha1.ComputeHash(data); | ||
| 317 | } | ||
| 318 | |||
| 319 | // generate the short file/directory name without an extension | ||
| 320 | var shortName = new StringBuilder(Convert.ToBase64String(hash)); | ||
| 321 | shortName.Remove(8, shortName.Length - 8).Replace('+', '-').Replace('/', '_'); | ||
| 322 | |||
| 323 | if (keepExtension) | ||
| 324 | { | ||
| 325 | var extension = Path.GetExtension(longName); | ||
| 326 | |||
| 327 | if (4 < extension.Length) | ||
| 328 | { | ||
| 329 | extension = extension.Substring(0, 4); | ||
| 330 | } | ||
| 331 | |||
| 332 | shortName.Append(extension); | ||
| 333 | |||
| 334 | // check the generated short name to ensure its still legal (the extension may not be legal) | ||
| 335 | if (!this.IsValidShortFilename(shortName.ToString(), allowWildcards)) | ||
| 336 | { | ||
| 337 | // remove the extension (by truncating the generated file name back to the generated characters) | ||
| 338 | shortName.Length -= extension.Length; | ||
| 339 | } | ||
| 340 | } | ||
| 341 | |||
| 342 | return shortName.ToString().ToLowerInvariant(); | ||
| 343 | } | ||
| 344 | |||
| 345 | public void EnsureTable(IntermediateSection section, SourceLineNumber sourceLineNumbers, TableDefinition tableDefinition) | 292 | public void EnsureTable(IntermediateSection section, SourceLineNumber sourceLineNumbers, TableDefinition tableDefinition) |
| 346 | { | 293 | { |
| 347 | section.AddSymbol(new WixEnsureTableSymbol(sourceLineNumbers) | 294 | section.AddSymbol(new WixEnsureTableSymbol(sourceLineNumbers) |
| @@ -673,23 +620,7 @@ namespace WixToolset.Core.ExtensibilityServices | |||
| 673 | 620 | ||
| 674 | public string GetCanonicalRelativePath(SourceLineNumber sourceLineNumbers, string elementName, string attributeName, string relativePath) | 621 | public string GetCanonicalRelativePath(SourceLineNumber sourceLineNumbers, string elementName, string attributeName, string relativePath) |
| 675 | { | 622 | { |
| 676 | const string root = @"C:\"; | 623 | return Common.GetCanonicalRelativePath(sourceLineNumbers, elementName, attributeName, relativePath, this.Messaging); |
| 677 | if (!Path.IsPathRooted(relativePath)) | ||
| 678 | { | ||
| 679 | var normalizedPath = Path.GetFullPath(root + relativePath); | ||
| 680 | if (normalizedPath.StartsWith(root)) | ||
| 681 | { | ||
| 682 | var canonicalizedPath = normalizedPath.Substring(root.Length); | ||
| 683 | if (canonicalizedPath != relativePath) | ||
| 684 | { | ||
| 685 | this.Messaging.Write(WarningMessages.PathCanonicalized(sourceLineNumbers, elementName, attributeName, relativePath, canonicalizedPath)); | ||
| 686 | } | ||
| 687 | return canonicalizedPath; | ||
| 688 | } | ||
| 689 | } | ||
| 690 | |||
| 691 | this.Messaging.Write(ErrorMessages.PayloadMustBeRelativeToCache(sourceLineNumbers, elementName, attributeName, relativePath)); | ||
| 692 | return relativePath; | ||
| 693 | } | 624 | } |
| 694 | 625 | ||
| 695 | public SourceLineNumber GetSourceLineNumbers(XElement element) | 626 | public SourceLineNumber GetSourceLineNumbers(XElement element) |
| @@ -723,46 +654,10 @@ namespace WixToolset.Core.ExtensibilityServices | |||
| 723 | 654 | ||
| 724 | public bool IsValidLongFilename(string filename, bool allowWildcards, bool allowRelative) | 655 | public bool IsValidLongFilename(string filename, bool allowWildcards, bool allowRelative) |
| 725 | { | 656 | { |
| 726 | if (String.IsNullOrEmpty(filename)) | 657 | return Common.IsValidLongFilename(filename, allowWildcards, allowRelative); |
| 727 | { | ||
| 728 | return false; | ||
| 729 | } | ||
| 730 | else if (filename.Length > 259) | ||
| 731 | { | ||
| 732 | return false; | ||
| 733 | } | ||
| 734 | |||
| 735 | // Check for a non-period character (all periods is not legal) | ||
| 736 | var allPeriods = true; | ||
| 737 | foreach (var character in filename) | ||
| 738 | { | ||
| 739 | if ('.' != character) | ||
| 740 | { | ||
| 741 | allPeriods = false; | ||
| 742 | break; | ||
| 743 | } | ||
| 744 | } | ||
| 745 | |||
| 746 | if (allPeriods) | ||
| 747 | { | ||
| 748 | return false; | ||
| 749 | } | ||
| 750 | |||
| 751 | if (allowWildcards) | ||
| 752 | { | ||
| 753 | return filename.IndexOfAny(Common.IllegalWildcardLongFilenameCharacters) == -1; | ||
| 754 | } | ||
| 755 | else if (allowRelative) | ||
| 756 | { | ||
| 757 | return filename.IndexOfAny(Common.IllegalRelativeLongFilenameCharacters) == -1; | ||
| 758 | } | ||
| 759 | else | ||
| 760 | { | ||
| 761 | return filename.IndexOfAny(Common.IllegalLongFilenameCharacters) == -1; | ||
| 762 | } | ||
| 763 | } | 658 | } |
| 764 | 659 | ||
| 765 | public bool IsValidShortFilename(string filename, bool allowWildcards = false) | 660 | public bool IsValidShortFilename(string filename, bool allowWildcards) |
| 766 | { | 661 | { |
| 767 | return Common.IsValidShortFilename(filename, allowWildcards); | 662 | return Common.IsValidShortFilename(filename, allowWildcards); |
| 768 | } | 663 | } |
diff --git a/src/WixToolset.Core/ExtensibilityServices/WixBranding.cs b/src/WixToolset.Core/ExtensibilityServices/WixBranding.cs new file mode 100644 index 00000000..56300400 --- /dev/null +++ b/src/WixToolset.Core/ExtensibilityServices/WixBranding.cs | |||
| @@ -0,0 +1,124 @@ | |||
| 1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
| 2 | |||
| 3 | using System.Resources; | ||
| 4 | |||
| 5 | [assembly: NeutralResourcesLanguage("en-US")] | ||
| 6 | |||
| 7 | namespace WixToolset.Core.ExtensibilityServices | ||
| 8 | { | ||
| 9 | using System; | ||
| 10 | using System.Diagnostics; | ||
| 11 | using System.IO; | ||
| 12 | using System.Reflection; | ||
| 13 | using WixToolset.Extensibility.Services; | ||
| 14 | |||
| 15 | /// <summary> | ||
| 16 | /// Branding strings. | ||
| 17 | /// </summary> | ||
| 18 | internal class WixBranding : IWixBranding | ||
| 19 | { | ||
| 20 | /// <summary> | ||
| 21 | /// News URL for the distribution. | ||
| 22 | /// </summary> | ||
| 23 | public static string NewsUrl = "http://wixtoolset.org/news/"; | ||
| 24 | |||
| 25 | /// <summary> | ||
| 26 | /// Short product name for the distribution. | ||
| 27 | /// </summary> | ||
| 28 | public static string ShortProduct = "WiX Toolset"; | ||
| 29 | |||
| 30 | /// <summary> | ||
| 31 | /// Support URL for the distribution. | ||
| 32 | /// </summary> | ||
| 33 | public static string SupportUrl = "http://wixtoolset.org/"; | ||
| 34 | |||
| 35 | /// <summary> | ||
| 36 | /// Telemetry URL format for the distribution. | ||
| 37 | /// </summary> | ||
| 38 | public static string TelemetryUrlFormat = "http://wixtoolset.org/telemetry/v{0}/?r={1}"; | ||
| 39 | |||
| 40 | /// <summary> | ||
| 41 | /// VS Extensions Landing page Url for the distribution. | ||
| 42 | /// </summary> | ||
| 43 | public static string VSExtensionsLandingUrl = "http://wixtoolset.org/releases/"; | ||
| 44 | |||
| 45 | public string GetCreatingApplication() | ||
| 46 | { | ||
| 47 | return this.ReplacePlaceholders("[AssemblyProduct] ([FileVersion])"); | ||
| 48 | } | ||
| 49 | |||
| 50 | public string ReplacePlaceholders(string original, Assembly assembly = null) | ||
| 51 | { | ||
| 52 | if (assembly == null) | ||
| 53 | { | ||
| 54 | assembly = typeof(WixBranding).Assembly; | ||
| 55 | } | ||
| 56 | |||
| 57 | var commonVersionPath = Path.Combine(Path.GetDirectoryName(typeof(WixBranding).Assembly.Location), "wixver.dll"); | ||
| 58 | if (File.Exists(commonVersionPath)) | ||
| 59 | { | ||
| 60 | var commonFileVersion = FileVersionInfo.GetVersionInfo(commonVersionPath); | ||
| 61 | |||
| 62 | original = original.Replace("[FileCopyright]", commonFileVersion.LegalCopyright); | ||
| 63 | original = original.Replace("[FileVersion]", commonFileVersion.FileVersion); | ||
| 64 | } | ||
| 65 | |||
| 66 | var fileVersion = FileVersionInfo.GetVersionInfo(assembly.Location); | ||
| 67 | |||
| 68 | original = original.Replace("[FileComments]", fileVersion.Comments); | ||
| 69 | original = original.Replace("[FileCopyright]", fileVersion.LegalCopyright); | ||
| 70 | original = original.Replace("[FileProductName]", fileVersion.ProductName); | ||
| 71 | original = original.Replace("[FileVersion]", fileVersion.FileVersion); | ||
| 72 | |||
| 73 | if (original.Contains("[FileVersionMajorMinor]")) | ||
| 74 | { | ||
| 75 | var version = new Version(fileVersion.FileVersion); | ||
| 76 | original = original.Replace("[FileVersionMajorMinor]", String.Concat(version.Major, ".", version.Minor)); | ||
| 77 | } | ||
| 78 | |||
| 79 | if (TryGetAttribute(assembly, out AssemblyCompanyAttribute company)) | ||
| 80 | { | ||
| 81 | original = original.Replace("[AssemblyCompany]", company.Company); | ||
| 82 | } | ||
| 83 | |||
| 84 | if (TryGetAttribute(assembly, out AssemblyCopyrightAttribute copyright)) | ||
| 85 | { | ||
| 86 | original = original.Replace("[AssemblyCopyright]", copyright.Copyright); | ||
| 87 | } | ||
| 88 | |||
| 89 | if (TryGetAttribute(assembly, out AssemblyDescriptionAttribute description)) | ||
| 90 | { | ||
| 91 | original = original.Replace("[AssemblyDescription]", description.Description); | ||
| 92 | } | ||
| 93 | |||
| 94 | if (TryGetAttribute(assembly, out AssemblyProductAttribute product)) | ||
| 95 | { | ||
| 96 | original = original.Replace("[AssemblyProduct]", product.Product); | ||
| 97 | } | ||
| 98 | |||
| 99 | if (TryGetAttribute(assembly, out AssemblyTitleAttribute title)) | ||
| 100 | { | ||
| 101 | original = original.Replace("[AssemblyTitle]", title.Title); | ||
| 102 | } | ||
| 103 | |||
| 104 | original = original.Replace("[NewsUrl]", NewsUrl); | ||
| 105 | original = original.Replace("[ShortProduct]", ShortProduct); | ||
| 106 | original = original.Replace("[SupportUrl]", SupportUrl); | ||
| 107 | |||
| 108 | return original; | ||
| 109 | } | ||
| 110 | |||
| 111 | private static bool TryGetAttribute<T>(Assembly assembly, out T attribute) where T : Attribute | ||
| 112 | { | ||
| 113 | attribute = null; | ||
| 114 | |||
| 115 | var customAttributes = assembly.GetCustomAttributes(typeof(T), false); | ||
| 116 | if (null != customAttributes && 0 < customAttributes.Length) | ||
| 117 | { | ||
| 118 | attribute = customAttributes[0] as T; | ||
| 119 | } | ||
| 120 | |||
| 121 | return null != attribute; | ||
| 122 | } | ||
| 123 | } | ||
| 124 | } | ||
diff --git a/src/WixToolset.Core/LocalizationParser.cs b/src/WixToolset.Core/LocalizationParser.cs index a0cf38a9..aaf4c425 100644 --- a/src/WixToolset.Core/LocalizationParser.cs +++ b/src/WixToolset.Core/LocalizationParser.cs | |||
| @@ -30,10 +30,10 @@ namespace WixToolset.Core | |||
| 30 | 30 | ||
| 31 | public Localization ParseLocalization(XDocument document) | 31 | public Localization ParseLocalization(XDocument document) |
| 32 | { | 32 | { |
| 33 | XElement root = document.Root; | 33 | var root = document.Root; |
| 34 | Localization localization = null; | 34 | Localization localization = null; |
| 35 | 35 | ||
| 36 | SourceLineNumber sourceLineNumbers = SourceLineNumber.CreateFromXObject(root); | 36 | var sourceLineNumbers = SourceLineNumber.CreateFromXObject(root); |
| 37 | if (LocalizationParser.XmlElementName == root.Name.LocalName) | 37 | if (LocalizationParser.XmlElementName == root.Name.LocalName) |
| 38 | { | 38 | { |
| 39 | if (LocalizationParser.WxlNamespace == root.Name.Namespace) | 39 | if (LocalizationParser.WxlNamespace == root.Name.Namespace) |
| @@ -85,11 +85,11 @@ namespace WixToolset.Core | |||
| 85 | /// <param name="node">Element to parse.</param> | 85 | /// <param name="node">Element to parse.</param> |
| 86 | private static Localization ParseWixLocalizationElement(IMessaging messaging, XElement node) | 86 | private static Localization ParseWixLocalizationElement(IMessaging messaging, XElement node) |
| 87 | { | 87 | { |
| 88 | int codepage = -1; | 88 | var sourceLineNumbers = SourceLineNumber.CreateFromXObject(node); |
| 89 | var codepage = -1; | ||
| 89 | string culture = null; | 90 | string culture = null; |
| 90 | SourceLineNumber sourceLineNumbers = SourceLineNumber.CreateFromXObject(node); | ||
| 91 | 91 | ||
| 92 | foreach (XAttribute attrib in node.Attributes()) | 92 | foreach (var attrib in node.Attributes()) |
| 93 | { | 93 | { |
| 94 | if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || LocalizationParser.WxlNamespace == attrib.Name.Namespace) | 94 | if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || LocalizationParser.WxlNamespace == attrib.Name.Namespace) |
| 95 | { | 95 | { |
| @@ -115,10 +115,10 @@ namespace WixToolset.Core | |||
| 115 | } | 115 | } |
| 116 | } | 116 | } |
| 117 | 117 | ||
| 118 | Dictionary<string, BindVariable> variables = new Dictionary<string, BindVariable>(); | 118 | var variables = new Dictionary<string, BindVariable>(); |
| 119 | Dictionary<string, LocalizedControl> localizedControls = new Dictionary<string, LocalizedControl>(); | 119 | var localizedControls = new Dictionary<string, LocalizedControl>(); |
| 120 | 120 | ||
| 121 | foreach (XElement child in node.Elements()) | 121 | foreach (var child in node.Elements()) |
| 122 | { | 122 | { |
| 123 | if (LocalizationParser.WxlNamespace == child.Name.Namespace) | 123 | if (LocalizationParser.WxlNamespace == child.Name.Namespace) |
| 124 | { | 124 | { |
| @@ -155,10 +155,10 @@ namespace WixToolset.Core | |||
| 155 | private static void ParseString(IMessaging messaging, XElement node, IDictionary<string, BindVariable> variables) | 155 | private static void ParseString(IMessaging messaging, XElement node, IDictionary<string, BindVariable> variables) |
| 156 | { | 156 | { |
| 157 | string id = null; | 157 | string id = null; |
| 158 | bool overridable = false; | 158 | var overridable = false; |
| 159 | SourceLineNumber sourceLineNumbers = SourceLineNumber.CreateFromXObject(node); | 159 | var sourceLineNumbers = SourceLineNumber.CreateFromXObject(node); |
| 160 | 160 | ||
| 161 | foreach (XAttribute attrib in node.Attributes()) | 161 | foreach (var attrib in node.Attributes()) |
| 162 | { | 162 | { |
| 163 | if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || LocalizationParser.WxlNamespace == attrib.Name.Namespace) | 163 | if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || LocalizationParser.WxlNamespace == attrib.Name.Namespace) |
| 164 | { | 164 | { |
| @@ -184,7 +184,7 @@ namespace WixToolset.Core | |||
| 184 | } | 184 | } |
| 185 | } | 185 | } |
| 186 | 186 | ||
| 187 | string value = Common.GetInnerText(node); | 187 | var value = Common.GetInnerText(node); |
| 188 | 188 | ||
| 189 | if (null == id) | 189 | if (null == id) |
| 190 | { | 190 | { |
| @@ -228,7 +228,7 @@ namespace WixToolset.Core | |||
| 228 | var rightAligned = false; | 228 | var rightAligned = false; |
| 229 | var leftScroll = false; | 229 | var leftScroll = false; |
| 230 | 230 | ||
| 231 | foreach (XAttribute attrib in node.Attributes()) | 231 | foreach (var attrib in node.Attributes()) |
| 232 | { | 232 | { |
| 233 | if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || LocalizationParser.WxlNamespace == attrib.Name.Namespace) | 233 | if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || LocalizationParser.WxlNamespace == attrib.Name.Namespace) |
| 234 | { | 234 | { |
diff --git a/src/WixToolset.Core/OptimizeCA.cs b/src/WixToolset.Core/OptimizeCA.cs deleted file mode 100644 index 0d7b5e1a..00000000 --- a/src/WixToolset.Core/OptimizeCA.cs +++ /dev/null | |||
| @@ -1,33 +0,0 @@ | |||
| 1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
| 2 | |||
| 3 | namespace WixToolset.Core | ||
| 4 | { | ||
| 5 | using System; | ||
| 6 | |||
| 7 | /// <summary> | ||
| 8 | /// Values for the OptimizeCA MsiPatchMetdata property, which indicates whether custom actions can be skipped when applying the patch. | ||
| 9 | /// </summary> | ||
| 10 | [Flags] | ||
| 11 | public enum OptimizeCA // TODO: review where to place this data so it can not be exposed by WixToolset.Core | ||
| 12 | { | ||
| 13 | /// <summary> | ||
| 14 | /// No custom actions are skipped. | ||
| 15 | /// </summary> | ||
| 16 | None = 0, | ||
| 17 | |||
| 18 | /// <summary> | ||
| 19 | /// Skip property (type 51) and directory (type 35) assignment custom actions. | ||
| 20 | /// </summary> | ||
| 21 | SkipAssignment = 1, | ||
| 22 | |||
| 23 | /// <summary> | ||
| 24 | /// Skip immediate custom actions that are not property or directory assignment custom actions. | ||
| 25 | /// </summary> | ||
| 26 | SkipImmediate = 2, | ||
| 27 | |||
| 28 | /// <summary> | ||
| 29 | /// Skip custom actions that run within the script. | ||
| 30 | /// </summary> | ||
| 31 | SkipDeferred = 4, | ||
| 32 | } | ||
| 33 | } | ||
diff --git a/src/WixToolset.Core/PatchSymbolFlagsType.cs b/src/WixToolset.Core/PatchSymbolFlagsType.cs deleted file mode 100644 index e751fd18..00000000 --- a/src/WixToolset.Core/PatchSymbolFlagsType.cs +++ /dev/null | |||
| @@ -1,34 +0,0 @@ | |||
| 1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
| 2 | |||
| 3 | namespace WixToolset.Core | ||
| 4 | { | ||
| 5 | using System; | ||
| 6 | |||
| 7 | /// <summary> | ||
| 8 | /// The following flags are used with PATCH_OPTION_DATA SymbolOptionFlags: | ||
| 9 | /// </summary> | ||
| 10 | [Flags] | ||
| 11 | public enum PatchSymbolFlagsType : uint | ||
| 12 | { | ||
| 13 | /// <summary> | ||
| 14 | /// don't use imagehlp.dll | ||
| 15 | /// </summary> | ||
| 16 | PATCH_SYMBOL_NO_IMAGEHLP = 0x00000001, | ||
| 17 | /// <summary> | ||
| 18 | /// don't fail patch due to imagehlp failures | ||
| 19 | /// </summary> | ||
| 20 | PATCH_SYMBOL_NO_FAILURES = 0x00000002, | ||
| 21 | /// <summary> | ||
| 22 | /// after matching decorated symbols, try to match remaining by undecorated names | ||
| 23 | /// </summary> | ||
| 24 | PATCH_SYMBOL_UNDECORATED_TOO = 0x00000004, | ||
| 25 | /// <summary> | ||
| 26 | /// (used internally) | ||
| 27 | /// </summary> | ||
| 28 | PATCH_SYMBOL_RESERVED1 = 0x80000000, | ||
| 29 | /// <summary> | ||
| 30 | /// | ||
| 31 | /// </summary> | ||
| 32 | MaxValue = PATCH_SYMBOL_NO_IMAGEHLP | PATCH_SYMBOL_NO_FAILURES | PATCH_SYMBOL_UNDECORATED_TOO | ||
| 33 | } | ||
| 34 | } | ||
diff --git a/src/WixToolset.Core/ResolvedCabinet.cs b/src/WixToolset.Core/ResolvedCabinet.cs index 9304b413..be04831f 100644 --- a/src/WixToolset.Core/ResolvedCabinet.cs +++ b/src/WixToolset.Core/ResolvedCabinet.cs | |||
| @@ -7,7 +7,7 @@ namespace WixToolset.Core | |||
| 7 | /// <summary> | 7 | /// <summary> |
| 8 | /// Data returned from build file manager ResolveCabinet callback. | 8 | /// Data returned from build file manager ResolveCabinet callback. |
| 9 | /// </summary> | 9 | /// </summary> |
| 10 | public class ResolvedCabinet : IResolvedCabinet | 10 | internal class ResolvedCabinet : IResolvedCabinet |
| 11 | { | 11 | { |
| 12 | /// <summary> | 12 | /// <summary> |
| 13 | /// Gets or sets the build option for the resolved cabinet. | 13 | /// Gets or sets the build option for the resolved cabinet. |
diff --git a/src/WixToolset.Core/WixDistribution.cs b/src/WixToolset.Core/WixDistribution.cs deleted file mode 100644 index 4ceb8982..00000000 --- a/src/WixToolset.Core/WixDistribution.cs +++ /dev/null | |||
| @@ -1,109 +0,0 @@ | |||
| 1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
| 2 | |||
| 3 | using System; | ||
| 4 | using System.Diagnostics; | ||
| 5 | using System.Reflection; | ||
| 6 | using System.Resources; | ||
| 7 | |||
| 8 | [assembly: NeutralResourcesLanguage("en-US")] | ||
| 9 | |||
| 10 | namespace WixToolset | ||
| 11 | { | ||
| 12 | /// <summary> | ||
| 13 | /// Distribution specific strings. | ||
| 14 | /// </summary> | ||
| 15 | internal static class WixDistribution | ||
| 16 | { | ||
| 17 | /// <summary> | ||
| 18 | /// News URL for the distribution. | ||
| 19 | /// </summary> | ||
| 20 | public static string NewsUrl = "http://wixtoolset.org/news/"; | ||
| 21 | |||
| 22 | /// <summary> | ||
| 23 | /// Short product name for the distribution. | ||
| 24 | /// </summary> | ||
| 25 | public static string ShortProduct = "WiX Toolset"; | ||
| 26 | |||
| 27 | /// <summary> | ||
| 28 | /// Support URL for the distribution. | ||
| 29 | /// </summary> | ||
| 30 | public static string SupportUrl = "http://wixtoolset.org/"; | ||
| 31 | |||
| 32 | /// <summary> | ||
| 33 | /// Telemetry URL format for the distribution. | ||
| 34 | /// </summary> | ||
| 35 | public static string TelemetryUrlFormat = "http://wixtoolset.org/telemetry/v{0}/?r={1}"; | ||
| 36 | |||
| 37 | /// <summary> | ||
| 38 | /// VS Extensions Landing page Url for the distribution. | ||
| 39 | /// </summary> | ||
| 40 | public static string VSExtensionsLandingUrl = "http://wixtoolset.org/releases/"; | ||
| 41 | |||
| 42 | public static string ReplacePlaceholders(string original, Assembly assembly) | ||
| 43 | { | ||
| 44 | if (null != assembly) | ||
| 45 | { | ||
| 46 | FileVersionInfo fileVersion = FileVersionInfo.GetVersionInfo(assembly.Location); | ||
| 47 | |||
| 48 | original = original.Replace("[FileComments]", fileVersion.Comments); | ||
| 49 | original = original.Replace("[FileCopyright]", fileVersion.LegalCopyright); | ||
| 50 | original = original.Replace("[FileProductName]", fileVersion.ProductName); | ||
| 51 | original = original.Replace("[FileVersion]", fileVersion.FileVersion); | ||
| 52 | |||
| 53 | if (original.Contains("[FileVersionMajorMinor]")) | ||
| 54 | { | ||
| 55 | Version version = new Version(fileVersion.FileVersion); | ||
| 56 | original = original.Replace("[FileVersionMajorMinor]", String.Concat(version.Major, ".", version.Minor)); | ||
| 57 | } | ||
| 58 | |||
| 59 | AssemblyCompanyAttribute company; | ||
| 60 | if (WixDistribution.TryGetAttribute(assembly, out company)) | ||
| 61 | { | ||
| 62 | original = original.Replace("[AssemblyCompany]", company.Company); | ||
| 63 | } | ||
| 64 | |||
| 65 | AssemblyCopyrightAttribute copyright; | ||
| 66 | if (WixDistribution.TryGetAttribute(assembly, out copyright)) | ||
| 67 | { | ||
| 68 | original = original.Replace("[AssemblyCopyright]", copyright.Copyright); | ||
| 69 | } | ||
| 70 | |||
| 71 | AssemblyDescriptionAttribute description; | ||
| 72 | if (WixDistribution.TryGetAttribute(assembly, out description)) | ||
| 73 | { | ||
| 74 | original = original.Replace("[AssemblyDescription]", description.Description); | ||
| 75 | } | ||
| 76 | |||
| 77 | AssemblyProductAttribute product; | ||
| 78 | if (WixDistribution.TryGetAttribute(assembly, out product)) | ||
| 79 | { | ||
| 80 | original = original.Replace("[AssemblyProduct]", product.Product); | ||
| 81 | } | ||
| 82 | |||
| 83 | AssemblyTitleAttribute title; | ||
| 84 | if (WixDistribution.TryGetAttribute(assembly, out title)) | ||
| 85 | { | ||
| 86 | original = original.Replace("[AssemblyTitle]", title.Title); | ||
| 87 | } | ||
| 88 | } | ||
| 89 | |||
| 90 | original = original.Replace("[NewsUrl]", WixDistribution.NewsUrl); | ||
| 91 | original = original.Replace("[ShortProduct]", WixDistribution.ShortProduct); | ||
| 92 | original = original.Replace("[SupportUrl]", WixDistribution.SupportUrl); | ||
| 93 | return original; | ||
| 94 | } | ||
| 95 | |||
| 96 | private static bool TryGetAttribute<T>(Assembly assembly, out T attribute) where T : Attribute | ||
| 97 | { | ||
| 98 | attribute = null; | ||
| 99 | |||
| 100 | object[] customAttributes = assembly.GetCustomAttributes(typeof(T), false); | ||
| 101 | if (null != customAttributes && 0 < customAttributes.Length) | ||
| 102 | { | ||
| 103 | attribute = customAttributes[0] as T; | ||
| 104 | } | ||
| 105 | |||
| 106 | return null != attribute; | ||
| 107 | } | ||
| 108 | } | ||
| 109 | } | ||
diff --git a/src/WixToolset.Core/WixToolsetServiceProvider.cs b/src/WixToolset.Core/WixToolsetServiceProvider.cs index 646b21fa..d4f186de 100644 --- a/src/WixToolset.Core/WixToolsetServiceProvider.cs +++ b/src/WixToolset.Core/WixToolsetServiceProvider.cs | |||
| @@ -25,6 +25,7 @@ namespace WixToolset.Core | |||
| 25 | this.AddService((provider, singletons) => AddSingleton<IPreprocessHelper>(singletons, new PreprocessHelper(provider))); | 25 | this.AddService((provider, singletons) => AddSingleton<IPreprocessHelper>(singletons, new PreprocessHelper(provider))); |
| 26 | this.AddService((provider, singletons) => AddSingleton<IBackendHelper>(singletons, new BackendHelper(provider))); | 26 | this.AddService((provider, singletons) => AddSingleton<IBackendHelper>(singletons, new BackendHelper(provider))); |
| 27 | this.AddService((provider, singletons) => AddSingleton<IPathResolver>(singletons, new PathResolver())); | 27 | this.AddService((provider, singletons) => AddSingleton<IPathResolver>(singletons, new PathResolver())); |
| 28 | this.AddService((provider, singletons) => AddSingleton<IWixBranding>(singletons, new WixBranding())); | ||
| 28 | 29 | ||
| 29 | // Transients. | 30 | // Transients. |
| 30 | this.AddService<ICommandLineArguments>((provider, singletons) => new CommandLineArguments(provider)); | 31 | this.AddService<ICommandLineArguments>((provider, singletons) => new CommandLineArguments(provider)); |
