diff options
| author | Rob Mensching <rob@firegiant.com> | 2019-10-25 00:48:35 -0700 |
|---|---|---|
| committer | Rob Mensching <rob@firegiant.com> | 2019-10-25 00:53:29 -0700 |
| commit | 9c714a8f1baa6e0130e5cd00cbdca649cebaf6a5 (patch) | |
| tree | ebf26d0e37244f3014e0c4924a29af7f7e56e2f2 /src/WixToolset.Core | |
| parent | 87580cbe111a8df836231a0192dee674cf482f08 (diff) | |
| download | wix-9c714a8f1baa6e0130e5cd00cbdca649cebaf6a5.tar.gz wix-9c714a8f1baa6e0130e5cd00cbdca649cebaf6a5.tar.bz2 wix-9c714a8f1baa6e0130e5cd00cbdca649cebaf6a5.zip | |
Update to WixOutput file structure to fix embedded file handling
Diffstat (limited to 'src/WixToolset.Core')
| -rw-r--r-- | src/WixToolset.Core/Bind/ExpectedExtractFile.cs | 4 | ||||
| -rw-r--r-- | src/WixToolset.Core/Bind/ExtractEmbeddedFiles.cs | 38 | ||||
| -rw-r--r-- | src/WixToolset.Core/Bind/ExtractEmbeddedFilesCommand.cs | 36 | ||||
| -rw-r--r-- | src/WixToolset.Core/Bind/ResolveFieldsCommand.cs | 4 | ||||
| -rw-r--r-- | src/WixToolset.Core/CommandLine/BuildCommand.cs | 38 | ||||
| -rw-r--r-- | src/WixToolset.Core/Librarian.cs | 14 | ||||
| -rw-r--r-- | src/WixToolset.Core/Linker.cs | 2 |
7 files changed, 60 insertions, 76 deletions
diff --git a/src/WixToolset.Core/Bind/ExpectedExtractFile.cs b/src/WixToolset.Core/Bind/ExpectedExtractFile.cs index afad12fc..b27cdfee 100644 --- a/src/WixToolset.Core/Bind/ExpectedExtractFile.cs +++ b/src/WixToolset.Core/Bind/ExpectedExtractFile.cs | |||
| @@ -1,4 +1,4 @@ | |||
| 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.Bind |
| 4 | { | 4 | { |
| @@ -9,7 +9,7 @@ namespace WixToolset.Core.Bind | |||
| 9 | { | 9 | { |
| 10 | public Uri Uri { get; set; } | 10 | public Uri Uri { get; set; } |
| 11 | 11 | ||
| 12 | public int EmbeddedFileIndex { get; set; } | 12 | public string EmbeddedFileId { get; set; } |
| 13 | 13 | ||
| 14 | public string OutputPath { get; set; } | 14 | public string OutputPath { get; set; } |
| 15 | } | 15 | } |
diff --git a/src/WixToolset.Core/Bind/ExtractEmbeddedFiles.cs b/src/WixToolset.Core/Bind/ExtractEmbeddedFiles.cs index 644e5c63..35c8a2f0 100644 --- a/src/WixToolset.Core/Bind/ExtractEmbeddedFiles.cs +++ b/src/WixToolset.Core/Bind/ExtractEmbeddedFiles.cs | |||
| @@ -15,7 +15,7 @@ namespace WixToolset.Core.Bind | |||
| 15 | /// </summary> | 15 | /// </summary> |
| 16 | internal class ExtractEmbeddedFiles | 16 | internal class ExtractEmbeddedFiles |
| 17 | { | 17 | { |
| 18 | private Dictionary<Uri, SortedList<int, string>> filesWithEmbeddedFiles = new Dictionary<Uri, SortedList<int, string>>(); | 18 | private readonly Dictionary<Uri, SortedList<string, string>> filesWithEmbeddedFiles = new Dictionary<Uri, SortedList<string, string>>(); |
| 19 | 19 | ||
| 20 | public IEnumerable<Uri> Uris => this.filesWithEmbeddedFiles.Keys; | 20 | public IEnumerable<Uri> Uris => this.filesWithEmbeddedFiles.Keys; |
| 21 | 21 | ||
| @@ -23,28 +23,28 @@ namespace WixToolset.Core.Bind | |||
| 23 | /// Adds an embedded file index to track and returns the path where the embedded file will be extracted. Duplicates will return the same extract path. | 23 | /// Adds an embedded file index to track and returns the path where the embedded file will be extracted. Duplicates will return the same extract path. |
| 24 | /// </summary> | 24 | /// </summary> |
| 25 | /// <param name="uri">Uri to file containing the embedded files.</param> | 25 | /// <param name="uri">Uri to file containing the embedded files.</param> |
| 26 | /// <param name="embeddedFileIndex">Index of the embedded file to extract.</param> | 26 | /// <param name="embeddedFileId">Id of the embedded file to extract.</param> |
| 27 | /// <param name="tempPath">Path where temporary files should be placed.</param> | 27 | /// <param name="extractFolder">Folder where extracted files should be placed.</param> |
| 28 | /// <returns>The extract path for the embedded file.</returns> | 28 | /// <returns>The extract path for the embedded file.</returns> |
| 29 | public string AddEmbeddedFileIndex(Uri uri, int embeddedFileIndex, string tempPath) | 29 | public string AddEmbeddedFileToExtract(Uri uri, string embeddedFileId, string extractFolder) |
| 30 | { | 30 | { |
| 31 | // If the uri to the file that contains the embedded file does not already have embedded files | 31 | // If the uri to the file that contains the embedded file does not already have embedded files |
| 32 | // being extracted, create the dictionary to track that. | 32 | // being extracted, create the dictionary to track that. |
| 33 | if (!this.filesWithEmbeddedFiles.TryGetValue(uri, out var extracts)) | 33 | if (!this.filesWithEmbeddedFiles.TryGetValue(uri, out var extracts)) |
| 34 | { | 34 | { |
| 35 | extracts = new SortedList<int, string>(); | 35 | extracts = new SortedList<string, string>(StringComparer.OrdinalIgnoreCase); |
| 36 | this.filesWithEmbeddedFiles.Add(uri, extracts); | 36 | this.filesWithEmbeddedFiles.Add(uri, extracts); |
| 37 | } | 37 | } |
| 38 | 38 | ||
| 39 | // If the embedded file is not already tracked in the dictionary of extracts, add it. | 39 | // If the embedded file is not already tracked in the dictionary of extracts, add it. |
| 40 | if (!extracts.TryGetValue(embeddedFileIndex, out var extractPath)) | 40 | if (!extracts.TryGetValue(embeddedFileId, out var extractPath)) |
| 41 | { | 41 | { |
| 42 | string localFileNameWithoutExtension = Path.GetFileNameWithoutExtension(uri.LocalPath); | 42 | var localFileNameWithoutExtension = Path.GetFileNameWithoutExtension(uri.LocalPath); |
| 43 | string unique = this.HashUri(uri.AbsoluteUri); | 43 | var unique = this.HashUri(uri.AbsoluteUri); |
| 44 | string extractedName = String.Format(CultureInfo.InvariantCulture, @"{0}_{1}\{2}", localFileNameWithoutExtension, unique, embeddedFileIndex); | 44 | var extractedName = String.Format(CultureInfo.InvariantCulture, @"{0}_{1}\{2}", localFileNameWithoutExtension, unique, embeddedFileId); |
| 45 | 45 | ||
| 46 | extractPath = Path.Combine(tempPath, extractedName); | 46 | extractPath = Path.GetFullPath(Path.Combine(extractFolder, extractedName)); |
| 47 | extracts.Add(embeddedFileIndex, extractPath); | 47 | extracts.Add(embeddedFileId, extractPath); |
| 48 | } | 48 | } |
| 49 | 49 | ||
| 50 | return extractPath; | 50 | return extractPath; |
| @@ -52,35 +52,39 @@ namespace WixToolset.Core.Bind | |||
| 52 | 52 | ||
| 53 | public IEnumerable<ExpectedExtractFile> GetExpectedEmbeddedFiles() | 53 | public IEnumerable<ExpectedExtractFile> GetExpectedEmbeddedFiles() |
| 54 | { | 54 | { |
| 55 | var files = new List<ExpectedExtractFile>(); | ||
| 56 | |||
| 55 | foreach (var uriWithExtracts in this.filesWithEmbeddedFiles) | 57 | foreach (var uriWithExtracts in this.filesWithEmbeddedFiles) |
| 56 | { | 58 | { |
| 57 | foreach (var extracts in uriWithExtracts.Value) | 59 | foreach (var extracts in uriWithExtracts.Value) |
| 58 | { | 60 | { |
| 59 | yield return new ExpectedExtractFile | 61 | files.Add(new ExpectedExtractFile |
| 60 | { | 62 | { |
| 61 | Uri = uriWithExtracts.Key, | 63 | Uri = uriWithExtracts.Key, |
| 62 | EmbeddedFileIndex = extracts.Key, | 64 | EmbeddedFileId = extracts.Key, |
| 63 | OutputPath = extracts.Value, | 65 | OutputPath = extracts.Value, |
| 64 | }; | 66 | }); |
| 65 | } | 67 | } |
| 66 | } | 68 | } |
| 69 | |||
| 70 | return files; | ||
| 67 | } | 71 | } |
| 68 | 72 | ||
| 69 | public IEnumerable<ExpectedExtractFile> GetExtractFilesForUri(Uri uri) | 73 | public IEnumerable<ExpectedExtractFile> GetExtractFilesForUri(Uri uri) |
| 70 | { | 74 | { |
| 71 | if (!this.filesWithEmbeddedFiles.TryGetValue(uri, out var extracts)) | 75 | if (!this.filesWithEmbeddedFiles.TryGetValue(uri, out var extracts)) |
| 72 | { | 76 | { |
| 73 | extracts = new SortedList<int, string>(); | 77 | extracts = new SortedList<string, string>(StringComparer.OrdinalIgnoreCase); |
| 74 | } | 78 | } |
| 75 | 79 | ||
| 76 | return extracts.Select(e => new ExpectedExtractFile() { Uri = uri, EmbeddedFileIndex = e.Key, OutputPath = e.Value }); | 80 | return extracts.Select(e => new ExpectedExtractFile { Uri = uri, EmbeddedFileId = e.Key, OutputPath = e.Value }); |
| 77 | } | 81 | } |
| 78 | 82 | ||
| 79 | private string HashUri(string uri) | 83 | private string HashUri(string uri) |
| 80 | { | 84 | { |
| 81 | using (SHA1 sha1 = new SHA1CryptoServiceProvider()) | 85 | using (SHA1 sha1 = new SHA1CryptoServiceProvider()) |
| 82 | { | 86 | { |
| 83 | byte[] hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(uri)); | 87 | var hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(uri)); |
| 84 | return Convert.ToBase64String(hash).TrimEnd('=').Replace('+', '-').Replace('/', '_'); | 88 | return Convert.ToBase64String(hash).TrimEnd('=').Replace('+', '-').Replace('/', '_'); |
| 85 | } | 89 | } |
| 86 | } | 90 | } |
diff --git a/src/WixToolset.Core/Bind/ExtractEmbeddedFilesCommand.cs b/src/WixToolset.Core/Bind/ExtractEmbeddedFilesCommand.cs index d82609db..683c3c50 100644 --- a/src/WixToolset.Core/Bind/ExtractEmbeddedFilesCommand.cs +++ b/src/WixToolset.Core/Bind/ExtractEmbeddedFilesCommand.cs | |||
| @@ -2,10 +2,9 @@ | |||
| 2 | 2 | ||
| 3 | namespace WixToolset.Core.Bind | 3 | namespace WixToolset.Core.Bind |
| 4 | { | 4 | { |
| 5 | using System; | ||
| 5 | using System.Collections.Generic; | 6 | using System.Collections.Generic; |
| 6 | using System.IO; | ||
| 7 | using System.Linq; | 7 | using System.Linq; |
| 8 | using System.Reflection; | ||
| 9 | using WixToolset.Data; | 8 | using WixToolset.Data; |
| 10 | using WixToolset.Extensibility.Data; | 9 | using WixToolset.Extensibility.Data; |
| 11 | 10 | ||
| @@ -26,41 +25,18 @@ namespace WixToolset.Core.Bind | |||
| 26 | { | 25 | { |
| 27 | var baseUri = expectedEmbeddedFileByUri.Key; | 26 | var baseUri = expectedEmbeddedFileByUri.Key; |
| 28 | 27 | ||
| 29 | Stream stream = null; | 28 | using (var wixout = WixOutput.Read(baseUri)) |
| 30 | try | ||
| 31 | { | 29 | { |
| 32 | // If the embedded files are stored in an assembly resource stream (usually | 30 | var uniqueIds = new SortedSet<string>(StringComparer.OrdinalIgnoreCase); |
| 33 | // a .wixlib embedded in a WixExtension). | ||
| 34 | if ("embeddedresource" == baseUri.Scheme) | ||
| 35 | { | ||
| 36 | var assemblyPath = Path.GetFullPath(baseUri.LocalPath); | ||
| 37 | var resourceName = baseUri.Fragment.TrimStart('#'); | ||
| 38 | |||
| 39 | var assembly = Assembly.LoadFile(assemblyPath); | ||
| 40 | stream = assembly.GetManifestResourceStream(resourceName); | ||
| 41 | } | ||
| 42 | else // normal file (usually a binary .wixlib on disk). | ||
| 43 | { | ||
| 44 | stream = File.OpenRead(baseUri.LocalPath); | ||
| 45 | } | ||
| 46 | 31 | ||
| 47 | using (var fs = FileStructure.Read(stream)) | 32 | foreach (var embeddedFile in expectedEmbeddedFileByUri) |
| 48 | { | 33 | { |
| 49 | var uniqueIndicies = new SortedSet<int>(); | 34 | if (uniqueIds.Add(embeddedFile.EmbeddedFileId)) |
| 50 | |||
| 51 | foreach (var embeddedFile in expectedEmbeddedFileByUri) | ||
| 52 | { | 35 | { |
| 53 | if (uniqueIndicies.Add(embeddedFile.EmbeddedFileIndex)) | 36 | wixout.ExtractEmbeddedFile(embeddedFile.EmbeddedFileId, embeddedFile.OutputPath); |
| 54 | { | ||
| 55 | fs.ExtractEmbeddedFile(embeddedFile.EmbeddedFileIndex, embeddedFile.OutputPath); | ||
| 56 | } | ||
| 57 | } | 37 | } |
| 58 | } | 38 | } |
| 59 | } | 39 | } |
| 60 | finally | ||
| 61 | { | ||
| 62 | stream?.Close(); | ||
| 63 | } | ||
| 64 | } | 40 | } |
| 65 | } | 41 | } |
| 66 | } | 42 | } |
diff --git a/src/WixToolset.Core/Bind/ResolveFieldsCommand.cs b/src/WixToolset.Core/Bind/ResolveFieldsCommand.cs index 2c213402..19a26915 100644 --- a/src/WixToolset.Core/Bind/ResolveFieldsCommand.cs +++ b/src/WixToolset.Core/Bind/ResolveFieldsCommand.cs | |||
| @@ -98,9 +98,9 @@ namespace WixToolset.Core.Bind | |||
| 98 | #endif | 98 | #endif |
| 99 | 99 | ||
| 100 | // File is embedded and path to it was not modified above. | 100 | // File is embedded and path to it was not modified above. |
| 101 | if (objectField.EmbeddedFileIndex.HasValue && isDefault) | 101 | if (isDefault && objectField.Embed) |
| 102 | { | 102 | { |
| 103 | var extractPath = this.FilesWithEmbeddedFiles.AddEmbeddedFileIndex(objectField.BaseUri, objectField.EmbeddedFileIndex.Value, this.IntermediateFolder); | 103 | var extractPath = this.FilesWithEmbeddedFiles.AddEmbeddedFileToExtract(objectField.BaseUri, objectField.Path, this.IntermediateFolder); |
| 104 | 104 | ||
| 105 | // Set the path to the embedded file once where it will be extracted. | 105 | // Set the path to the embedded file once where it will be extracted. |
| 106 | field.Set(extractPath); | 106 | field.Set(extractPath); |
diff --git a/src/WixToolset.Core/CommandLine/BuildCommand.cs b/src/WixToolset.Core/CommandLine/BuildCommand.cs index 972258fe..5ee60984 100644 --- a/src/WixToolset.Core/CommandLine/BuildCommand.cs +++ b/src/WixToolset.Core/CommandLine/BuildCommand.cs | |||
| @@ -100,29 +100,38 @@ namespace WixToolset.Core.CommandLine | |||
| 100 | 100 | ||
| 101 | if (this.OutputType == OutputType.Library) | 101 | if (this.OutputType == OutputType.Library) |
| 102 | { | 102 | { |
| 103 | var wixlib = this.LibraryPhase(wixobjs, wxls, this.commandLine.BindFiles, this.commandLine.BindPaths); | 103 | using (new IntermediateFieldContext("wix.lib")) |
| 104 | |||
| 105 | if (!this.Messaging.EncounteredError) | ||
| 106 | { | 104 | { |
| 107 | wixlib.Save(this.commandLine.OutputFile); | 105 | var wixlib = this.LibraryPhase(wixobjs, wxls, this.commandLine.BindFiles, this.commandLine.BindPaths); |
| 106 | |||
| 107 | if (!this.Messaging.EncounteredError) | ||
| 108 | { | ||
| 109 | wixlib.Save(this.commandLine.OutputFile); | ||
| 110 | } | ||
| 108 | } | 111 | } |
| 109 | } | 112 | } |
| 110 | else | 113 | else |
| 111 | { | 114 | { |
| 112 | if (wixipl == null) | 115 | using (new IntermediateFieldContext("wix.link")) |
| 113 | { | ||
| 114 | wixipl = this.LinkPhase(wixobjs, this.commandLine.LibraryFilePaths, creator); | ||
| 115 | } | ||
| 116 | |||
| 117 | if (!this.Messaging.EncounteredError) | ||
| 118 | { | 116 | { |
| 119 | if (this.OutputType == OutputType.IntermediatePostLink) | 117 | if (wixipl == null) |
| 120 | { | 118 | { |
| 121 | wixipl.Save(this.commandLine.OutputFile); | 119 | wixipl = this.LinkPhase(wixobjs, this.commandLine.LibraryFilePaths, creator); |
| 122 | } | 120 | } |
| 123 | else | 121 | |
| 122 | if (!this.Messaging.EncounteredError) | ||
| 124 | { | 123 | { |
| 125 | this.BindPhase(wixipl, wxls, filterCultures, this.commandLine.CabCachePath, this.commandLine.BindPaths, this.commandLine.BurnStubPath); | 124 | if (this.OutputType == OutputType.IntermediatePostLink) |
| 125 | { | ||
| 126 | wixipl.Save(this.commandLine.OutputFile); | ||
| 127 | } | ||
| 128 | else | ||
| 129 | { | ||
| 130 | using (new IntermediateFieldContext("wix.bind")) | ||
| 131 | { | ||
| 132 | this.BindPhase(wixipl, wxls, filterCultures, this.commandLine.CabCachePath, this.commandLine.BindPaths, this.commandLine.BurnStubPath); | ||
| 133 | } | ||
| 134 | } | ||
| 126 | } | 135 | } |
| 127 | } | 136 | } |
| 128 | } | 137 | } |
| @@ -469,6 +478,7 @@ namespace WixToolset.Core.CommandLine | |||
| 469 | break; | 478 | break; |
| 470 | } | 479 | } |
| 471 | 480 | ||
| 481 | case "bf": | ||
| 472 | case "bindfiles": | 482 | case "bindfiles": |
| 473 | this.BindFiles = true; | 483 | this.BindFiles = true; |
| 474 | return true; | 484 | return true; |
diff --git a/src/WixToolset.Core/Librarian.cs b/src/WixToolset.Core/Librarian.cs index 3c1810ac..5c0fb302 100644 --- a/src/WixToolset.Core/Librarian.cs +++ b/src/WixToolset.Core/Librarian.cs | |||
| @@ -56,14 +56,14 @@ namespace WixToolset.Core | |||
| 56 | return null; | 56 | return null; |
| 57 | } | 57 | } |
| 58 | 58 | ||
| 59 | var embedFilePaths = this.ResolveFilePathsToEmbed(context, sections); | 59 | this.ResolveFilePathsToEmbed(context, sections); |
| 60 | 60 | ||
| 61 | foreach (var section in sections) | 61 | foreach (var section in sections) |
| 62 | { | 62 | { |
| 63 | section.LibraryId = context.LibraryId; | 63 | section.LibraryId = context.LibraryId; |
| 64 | } | 64 | } |
| 65 | 65 | ||
| 66 | library = new Intermediate(context.LibraryId, sections, localizationsByCulture, embedFilePaths); | 66 | library = new Intermediate(context.LibraryId, sections, localizationsByCulture); |
| 67 | 67 | ||
| 68 | this.Validate(library); | 68 | this.Validate(library); |
| 69 | } | 69 | } |
| @@ -78,10 +78,8 @@ namespace WixToolset.Core | |||
| 78 | return this.Messaging.EncounteredError ? null : library; | 78 | return this.Messaging.EncounteredError ? null : library; |
| 79 | } | 79 | } |
| 80 | 80 | ||
| 81 | private List<string> ResolveFilePathsToEmbed(ILibraryContext context, IEnumerable<IntermediateSection> sections) | 81 | private void ResolveFilePathsToEmbed(ILibraryContext context, IEnumerable<IntermediateSection> sections) |
| 82 | { | 82 | { |
| 83 | var embedFilePaths = new List<string>(); | ||
| 84 | |||
| 85 | // Resolve paths to files that are to be embedded in the library. | 83 | // Resolve paths to files that are to be embedded in the library. |
| 86 | if (context.BindFiles) | 84 | if (context.BindFiles) |
| 87 | { | 85 | { |
| @@ -104,9 +102,7 @@ namespace WixToolset.Core | |||
| 104 | if (!String.IsNullOrEmpty(file)) | 102 | if (!String.IsNullOrEmpty(file)) |
| 105 | { | 103 | { |
| 106 | // File was successfully resolved so track the embedded index as the embedded file index. | 104 | // File was successfully resolved so track the embedded index as the embedded file index. |
| 107 | field.Set(new IntermediateFieldPathValue { EmbeddedFileIndex = embedFilePaths.Count }); | 105 | field.Set(new IntermediateFieldPathValue { Embed = true, Path = file }); |
| 108 | |||
| 109 | embedFilePaths.Add(file); | ||
| 110 | } | 106 | } |
| 111 | else | 107 | else |
| 112 | { | 108 | { |
| @@ -116,8 +112,6 @@ namespace WixToolset.Core | |||
| 116 | } | 112 | } |
| 117 | } | 113 | } |
| 118 | } | 114 | } |
| 119 | |||
| 120 | return embedFilePaths; | ||
| 121 | } | 115 | } |
| 122 | 116 | ||
| 123 | private void Validate(Intermediate library) | 117 | private void Validate(Intermediate library) |
diff --git a/src/WixToolset.Core/Linker.cs b/src/WixToolset.Core/Linker.cs index 81696840..6ef252b7 100644 --- a/src/WixToolset.Core/Linker.cs +++ b/src/WixToolset.Core/Linker.cs | |||
| @@ -564,7 +564,7 @@ namespace WixToolset.Core | |||
| 564 | var collate = new CollateLocalizationsCommand(this.Messaging, localizations); | 564 | var collate = new CollateLocalizationsCommand(this.Messaging, localizations); |
| 565 | var localizationsByCulture = collate.Execute(); | 565 | var localizationsByCulture = collate.Execute(); |
| 566 | 566 | ||
| 567 | intermediate = new Intermediate(resolvedSection.Id, new[] { resolvedSection }, localizationsByCulture, null); | 567 | intermediate = new Intermediate(resolvedSection.Id, new[] { resolvedSection }, localizationsByCulture); |
| 568 | 568 | ||
| 569 | #if MOVE_TO_BACKEND | 569 | #if MOVE_TO_BACKEND |
| 570 | this.CheckOutputConsistency(output); | 570 | this.CheckOutputConsistency(output); |
