diff options
Diffstat (limited to 'src/WixToolset.Core/Bind/FileResolver.cs')
-rw-r--r-- | src/WixToolset.Core/Bind/FileResolver.cs | 92 |
1 files changed, 12 insertions, 80 deletions
diff --git a/src/WixToolset.Core/Bind/FileResolver.cs b/src/WixToolset.Core/Bind/FileResolver.cs index 2142d261..a20d3f34 100644 --- a/src/WixToolset.Core/Bind/FileResolver.cs +++ b/src/WixToolset.Core/Bind/FileResolver.cs | |||
@@ -6,7 +6,6 @@ namespace WixToolset.Core.Bind | |||
6 | using System.Collections.Generic; | 6 | using System.Collections.Generic; |
7 | using System.IO; | 7 | using System.IO; |
8 | using System.Linq; | 8 | using System.Linq; |
9 | using System.Runtime.InteropServices; | ||
10 | using WixToolset.Data; | 9 | using WixToolset.Data; |
11 | using WixToolset.Data.Bind; | 10 | using WixToolset.Data.Bind; |
12 | using WixToolset.Extensibility; | 11 | using WixToolset.Extensibility; |
@@ -22,9 +21,9 @@ namespace WixToolset.Core.Bind | |||
22 | this.RebaseUpdated = this.BindPaths[BindStage.Updated].Any(); | 21 | this.RebaseUpdated = this.BindPaths[BindStage.Updated].Any(); |
23 | } | 22 | } |
24 | 23 | ||
25 | public FileResolver(IEnumerable<BindPath> bindPaths, IEnumerable<IBinderExtension> extensions) : this(bindPaths) | 24 | public FileResolver(IEnumerable<BindPath> bindPaths, IEnumerable<IResolverExtension> extensions) : this(bindPaths) |
26 | { | 25 | { |
27 | this.BinderExtensions = extensions ?? Array.Empty<IBinderExtension>(); | 26 | this.ResolverExtensions = extensions ?? Array.Empty<IResolverExtension>(); |
28 | } | 27 | } |
29 | 28 | ||
30 | public FileResolver(IEnumerable<BindPath> bindPaths, IEnumerable<ILibrarianExtension> extensions) : this(bindPaths) | 29 | public FileResolver(IEnumerable<BindPath> bindPaths, IEnumerable<ILibrarianExtension> extensions) : this(bindPaths) |
@@ -38,79 +37,15 @@ namespace WixToolset.Core.Bind | |||
38 | 37 | ||
39 | public bool RebaseUpdated { get; } | 38 | public bool RebaseUpdated { get; } |
40 | 39 | ||
41 | private IEnumerable<IBinderExtension> BinderExtensions { get; } | 40 | private IEnumerable<IResolverExtension> ResolverExtensions { get; } |
42 | 41 | ||
43 | private IEnumerable<ILibrarianExtension> LibrarianExtensions { get; } | 42 | private IEnumerable<ILibrarianExtension> LibrarianExtensions { get; } |
44 | 43 | ||
45 | /// <summary> | 44 | public string Resolve(SourceLineNumber sourceLineNumbers, IntermediateTupleDefinition tupleDefinition, string source) |
46 | /// Copies a file. | ||
47 | /// </summary> | ||
48 | /// <param name="source">The file to copy.</param> | ||
49 | /// <param name="destination">The destination file.</param> | ||
50 | /// <param name="overwrite">true if the destination file can be overwritten; otherwise, false.</param> | ||
51 | public bool CopyFile(string source, string destination, bool overwrite) | ||
52 | { | ||
53 | foreach (var extension in this.BinderExtensions) | ||
54 | { | ||
55 | if (extension.CopyFile(source, destination, overwrite)) | ||
56 | { | ||
57 | return true; | ||
58 | } | ||
59 | } | ||
60 | |||
61 | if (overwrite && File.Exists(destination)) | ||
62 | { | ||
63 | File.Delete(destination); | ||
64 | } | ||
65 | |||
66 | if (!CreateHardLink(destination, source, IntPtr.Zero)) | ||
67 | { | ||
68 | #if DEBUG | ||
69 | int er = Marshal.GetLastWin32Error(); | ||
70 | #endif | ||
71 | |||
72 | File.Copy(source, destination, overwrite); | ||
73 | } | ||
74 | |||
75 | return true; | ||
76 | } | ||
77 | |||
78 | /// <summary> | ||
79 | /// Moves a file. | ||
80 | /// </summary> | ||
81 | /// <param name="source">The file to move.</param> | ||
82 | /// <param name="destination">The destination file.</param> | ||
83 | public bool MoveFile(string source, string destination, bool overwrite) | ||
84 | { | ||
85 | foreach (var extension in this.BinderExtensions) | ||
86 | { | ||
87 | if (extension.MoveFile(source, destination, overwrite)) | ||
88 | { | ||
89 | return true; | ||
90 | } | ||
91 | } | ||
92 | |||
93 | if (overwrite && File.Exists(destination)) | ||
94 | { | ||
95 | File.Delete(destination); | ||
96 | } | ||
97 | |||
98 | var directory = Path.GetDirectoryName(destination); | ||
99 | if (!String.IsNullOrEmpty(directory)) | ||
100 | { | ||
101 | Directory.CreateDirectory(directory); | ||
102 | } | ||
103 | |||
104 | File.Move(source, destination); | ||
105 | |||
106 | return true; | ||
107 | } | ||
108 | |||
109 | public string Resolve(SourceLineNumber sourceLineNumbers, string table, string path) | ||
110 | { | 45 | { |
111 | foreach (var extension in this.LibrarianExtensions) | 46 | foreach (var extension in this.LibrarianExtensions) |
112 | { | 47 | { |
113 | var resolved = extension.Resolve(sourceLineNumbers, table, path); | 48 | var resolved = extension.Resolve(sourceLineNumbers, tupleDefinition, source); |
114 | 49 | ||
115 | if (null != resolved) | 50 | if (null != resolved) |
116 | { | 51 | { |
@@ -118,7 +53,7 @@ namespace WixToolset.Core.Bind | |||
118 | } | 53 | } |
119 | } | 54 | } |
120 | 55 | ||
121 | return this.ResolveUsingBindPaths(path, table, sourceLineNumbers, BindStage.Normal); | 56 | return this.ResolveUsingBindPaths(source, tupleDefinition, sourceLineNumbers, BindStage.Normal); |
122 | } | 57 | } |
123 | 58 | ||
124 | /// <summary> | 59 | /// <summary> |
@@ -129,11 +64,11 @@ namespace WixToolset.Core.Bind | |||
129 | /// <param name="sourceLineNumbers">Optional source line of source file being resolved.</param> | 64 | /// <param name="sourceLineNumbers">Optional source line of source file being resolved.</param> |
130 | /// <param name="bindStage">The binding stage used to determine what collection of bind paths will be used</param> | 65 | /// <param name="bindStage">The binding stage used to determine what collection of bind paths will be used</param> |
131 | /// <returns>Should return a valid path for the stream to be imported.</returns> | 66 | /// <returns>Should return a valid path for the stream to be imported.</returns> |
132 | public string ResolveFile(string source, string type, SourceLineNumber sourceLineNumbers, BindStage bindStage) | 67 | public string ResolveFile(string source, IntermediateTupleDefinition tupleDefinition, SourceLineNumber sourceLineNumbers, BindStage bindStage) |
133 | { | 68 | { |
134 | foreach (var extension in this.BinderExtensions) | 69 | foreach (var extension in this.ResolverExtensions) |
135 | { | 70 | { |
136 | var resolved = extension.ResolveFile(source, type, sourceLineNumbers, bindStage); | 71 | var resolved = extension.ResolveFile(source, tupleDefinition, sourceLineNumbers, bindStage); |
137 | 72 | ||
138 | if (null != resolved) | 73 | if (null != resolved) |
139 | { | 74 | { |
@@ -141,10 +76,10 @@ namespace WixToolset.Core.Bind | |||
141 | } | 76 | } |
142 | } | 77 | } |
143 | 78 | ||
144 | return this.ResolveUsingBindPaths(source, type, sourceLineNumbers, bindStage); | 79 | return this.ResolveUsingBindPaths(source, tupleDefinition, sourceLineNumbers, bindStage); |
145 | } | 80 | } |
146 | 81 | ||
147 | private string ResolveUsingBindPaths(string source, string type, SourceLineNumber sourceLineNumbers, BindStage bindStage) | 82 | private string ResolveUsingBindPaths(string source, IntermediateTupleDefinition tupleDefinition, SourceLineNumber sourceLineNumbers, BindStage bindStage) |
148 | { | 83 | { |
149 | string resolved = null; | 84 | string resolved = null; |
150 | 85 | ||
@@ -206,7 +141,7 @@ namespace WixToolset.Core.Bind | |||
206 | 141 | ||
207 | if (null == resolved) | 142 | if (null == resolved) |
208 | { | 143 | { |
209 | throw new WixFileNotFoundException(sourceLineNumbers, source, type); | 144 | throw new WixFileNotFoundException(sourceLineNumbers, source, tupleDefinition.Name); |
210 | } | 145 | } |
211 | 146 | ||
212 | // Didn't find the file. | 147 | // Didn't find the file. |
@@ -224,8 +159,5 @@ namespace WixToolset.Core.Bind | |||
224 | throw new WixException(ErrorMessages.IllegalCharactersInPath(path)); | 159 | throw new WixException(ErrorMessages.IllegalCharactersInPath(path)); |
225 | } | 160 | } |
226 | } | 161 | } |
227 | |||
228 | [DllImport("Kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] | ||
229 | private static extern bool CreateHardLink(string lpFileName, string lpExistingFileName, IntPtr lpSecurityAttributes); | ||
230 | } | 162 | } |
231 | } | 163 | } |