aboutsummaryrefslogtreecommitdiff
path: root/src/WixToolset.Data/Bind
diff options
context:
space:
mode:
authorRob Mensching <rob@firegiant.com>2017-10-18 15:10:45 -0700
committerRob Mensching <rob@firegiant.com>2017-10-18 15:10:45 -0700
commitd0d48599caf5b5f018b9fdd4ea8f6064d76d2e8b (patch)
tree597f686b78f9b2539a3b8df9b8216897571806c9 /src/WixToolset.Data/Bind
parentcc997ec641d4634d2f3c6086a481fc8295e34b46 (diff)
downloadwix-d0d48599caf5b5f018b9fdd4ea8f6064d76d2e8b.tar.gz
wix-d0d48599caf5b5f018b9fdd4ea8f6064d76d2e8b.tar.bz2
wix-d0d48599caf5b5f018b9fdd4ea8f6064d76d2e8b.zip
Incorporate refactoring of WixToolset.Core assemblies
Diffstat (limited to 'src/WixToolset.Data/Bind')
-rw-r--r--src/WixToolset.Data/Bind/BindResult.cs19
-rw-r--r--src/WixToolset.Data/Bind/BindStage.cs27
-rw-r--r--src/WixToolset.Data/Bind/FileTransfer.cs111
3 files changed, 157 insertions, 0 deletions
diff --git a/src/WixToolset.Data/Bind/BindResult.cs b/src/WixToolset.Data/Bind/BindResult.cs
new file mode 100644
index 00000000..917bebca
--- /dev/null
+++ b/src/WixToolset.Data/Bind/BindResult.cs
@@ -0,0 +1,19 @@
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
3namespace WixToolset.Data.Bind
4{
5 using System.Collections.Generic;
6
7 public class BindResult
8 {
9 public BindResult(IEnumerable<FileTransfer> fileTransfers, IEnumerable<string> contentFilePaths)
10 {
11 this.FileTransfers = fileTransfers;
12 this.ContentFilePaths = contentFilePaths;
13 }
14
15 public IEnumerable<FileTransfer> FileTransfers { get; }
16
17 public IEnumerable<string> ContentFilePaths { get; }
18 }
19} \ No newline at end of file
diff --git a/src/WixToolset.Data/Bind/BindStage.cs b/src/WixToolset.Data/Bind/BindStage.cs
new file mode 100644
index 00000000..500ea288
--- /dev/null
+++ b/src/WixToolset.Data/Bind/BindStage.cs
@@ -0,0 +1,27 @@
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
3namespace WixToolset.Data.Bind
4{
5 /// <summary>
6 /// Bind stage of a file.. The reason we need this is to change the ResolveFile behavior based on if
7 /// dynamic bindpath plugin is desirable. We cannot change the signature of ResolveFile since it might
8 /// break existing implementers which derived from BinderFileManager
9 /// </summary>
10 public enum BindStage
11 {
12 /// <summary>
13 /// Normal binding
14 /// </summary>
15 Normal,
16
17 /// <summary>
18 /// Bind the file path of the target build file
19 /// </summary>
20 Target,
21
22 /// <summary>
23 /// Bind the file path of the updated build file
24 /// </summary>
25 Updated,
26 }
27}
diff --git a/src/WixToolset.Data/Bind/FileTransfer.cs b/src/WixToolset.Data/Bind/FileTransfer.cs
new file mode 100644
index 00000000..178934e8
--- /dev/null
+++ b/src/WixToolset.Data/Bind/FileTransfer.cs
@@ -0,0 +1,111 @@
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
3namespace WixToolset.Data.Bind
4{
5 using System;
6 using System.IO;
7
8 /// <summary>
9 /// Structure used for all file transfer information.
10 /// </summary>
11 public class FileTransfer
12 {
13 /// <summary>Source path to file.</summary>
14 public string Source { get; set; }
15
16 /// <summary>Destination path for file.</summary>
17 public string Destination { get; set; }
18
19 /// <summary>Flag if file should be moved (optimal).</summary>
20 public bool Move { get; set; }
21
22 /// <summary>Optional source line numbers where this file transfer orginated.</summary>
23 public SourceLineNumber SourceLineNumbers { get; set; }
24
25 /// <summary>Optional type of file this transfer is moving or copying.</summary>
26 public string Type { get; set; }
27
28 /// <summary>Indicates whether the file transer was a built by this build or copied from other some build.</summary>
29 public bool Built { get; set; }
30
31 /// <summary>Set during layout of media when the file transfer when the source and target resolve to the same path.</summary>
32 public bool Redundant { get; set; }
33
34 /// <summary>
35 /// Prefer the TryCreate() method to create FileTransfer objects.
36 /// </summary>
37 /// <param name="source">Source path to file.</param>
38 /// <param name="destination">Destination path for file.</param>
39 /// <param name="move">File if file should be moved (optimal).</param>
40 /// <param name="type">Optional type of file this transfer is transferring.</param>
41 /// <param name="sourceLineNumbers">Optional source line numbers wher this transfer originated.</param>
42 public FileTransfer(string source, string destination, bool move, string type = null, SourceLineNumber sourceLineNumbers = null)
43 {
44 this.Source = source;
45 this.Destination = destination;
46 this.Move = move;
47
48 this.Type = type;
49 this.SourceLineNumbers = sourceLineNumbers;
50 }
51
52 /// <summary>
53 /// Creates a file transfer if the source and destination are different.
54 /// </summary>
55 /// <param name="source">Source path to file.</param>
56 /// <param name="destination">Destination path for file.</param>
57 /// <param name="move">File if file should be moved (optimal).</param>
58 /// <param name="type">Optional type of file this transfer is transferring.</param>
59 /// <param name="sourceLineNumbers">Optional source line numbers where this transfer originated.</param>
60 /// <returns>true if the source and destination are the different, false if no file transfer is created.</returns>
61 public static bool TryCreate(string source, string destination, bool move, string type, SourceLineNumber sourceLineNumbers, out FileTransfer transfer)
62 {
63 string sourceFullPath = GetValidatedFullPath(sourceLineNumbers, source);
64
65 string fileLayoutFullPath = GetValidatedFullPath(sourceLineNumbers, destination);
66
67 // if the current source path (where we know that the file already exists) and the resolved
68 // path as dictated by the Directory table are not the same, then propagate the file. The
69 // image that we create may have already been done by some other process other than the linker, so
70 // there is no reason to copy the files to the resolved source if they are already there.
71 if (String.Equals(sourceFullPath, fileLayoutFullPath, StringComparison.OrdinalIgnoreCase))
72 {
73 transfer = null;
74 return false;
75 }
76
77 transfer = new FileTransfer(source, destination, move, type, sourceLineNumbers);
78 return true;
79 }
80
81 private static string GetValidatedFullPath(SourceLineNumber sourceLineNumbers, string path)
82 {
83 string result;
84
85 try
86 {
87 result = Path.GetFullPath(path);
88
89 string filename = Path.GetFileName(result);
90
91 foreach (string reservedName in Common.ReservedFileNames)
92 {
93 if (reservedName.Equals(filename, StringComparison.OrdinalIgnoreCase))
94 {
95 throw new WixException(WixDataErrors.InvalidFileName(sourceLineNumbers, path));
96 }
97 }
98 }
99 catch (System.ArgumentException)
100 {
101 throw new WixException(WixDataErrors.InvalidFileName(sourceLineNumbers, path));
102 }
103 catch (System.IO.PathTooLongException)
104 {
105 throw new WixException(WixDataErrors.PathTooLong(sourceLineNumbers, path));
106 }
107
108 return result;
109 }
110 }
111}