aboutsummaryrefslogtreecommitdiff
path: root/src/dtf/WixToolset.Dtf.Resources/FixedFileVersionInfo.cs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/dtf/WixToolset.Dtf.Resources/FixedFileVersionInfo.cs183
1 files changed, 183 insertions, 0 deletions
diff --git a/src/dtf/WixToolset.Dtf.Resources/FixedFileVersionInfo.cs b/src/dtf/WixToolset.Dtf.Resources/FixedFileVersionInfo.cs
new file mode 100644
index 00000000..e0d081db
--- /dev/null
+++ b/src/dtf/WixToolset.Dtf.Resources/FixedFileVersionInfo.cs
@@ -0,0 +1,183 @@
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.Dtf.Resources
4{
5 using System;
6 using System.IO;
7 using System.Text;
8 using System.Reflection;
9 using System.Collections;
10 using System.Globalization;
11 using System.Diagnostics.CodeAnalysis;
12
13 internal class FixedFileVersionInfo
14 {
15 public FixedFileVersionInfo()
16 {
17 // Set reasonable defaults
18 this.signature = 0xFEEF04BD;
19 this.structVersion = 0x00010000; // v1.0
20 this.FileVersion = new Version(0, 0, 0, 0);
21 this.ProductVersion = new Version(0, 0, 0, 0);
22 this.FileFlagsMask = VersionBuildTypes.Debug | VersionBuildTypes.Prerelease;
23 this.FileFlags = VersionBuildTypes.None;
24 this.FileOS = VersionFileOS.NT_WINDOWS32;
25 this.FileType = VersionFileType.Application;
26 this.FileSubtype = VersionFileSubtype.Unknown;
27 this.Timestamp = DateTime.MinValue;
28 }
29
30 private uint signature;
31 private uint structVersion;
32
33 public Version FileVersion
34 {
35 get
36 {
37 return this.fileVersion;
38 }
39
40 set
41 {
42 if (value == null)
43 {
44 throw new InvalidOperationException();
45 }
46
47 this.fileVersion = value;
48 }
49 }
50 private Version fileVersion;
51
52 public Version ProductVersion
53 {
54 get
55 {
56 return this.productVersion;
57 }
58
59 set
60 {
61 if (value == null)
62 {
63 throw new InvalidOperationException();
64 }
65
66 this.productVersion = value;
67 }
68 }
69 private Version productVersion;
70
71 public VersionBuildTypes FileFlagsMask
72 {
73 get { return this.fileFlagsMask; }
74 set { this.fileFlagsMask = value; }
75 }
76 private VersionBuildTypes fileFlagsMask;
77
78 public VersionBuildTypes FileFlags
79 {
80 get { return this.fileFlags; }
81 set { this.fileFlags = value; }
82 }
83 private VersionBuildTypes fileFlags;
84
85 [SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
86 public VersionFileOS FileOS
87 {
88 get { return this.fileOS; }
89 set { this.fileOS = value; }
90 }
91 private VersionFileOS fileOS;
92
93 public VersionFileType FileType
94 {
95 get { return this.fileType; }
96 set { this.fileType = value; }
97 }
98 private VersionFileType fileType;
99
100 public VersionFileSubtype FileSubtype
101 {
102 get { return this.fileSubtype; }
103 set { this.fileSubtype = value; }
104 }
105 private VersionFileSubtype fileSubtype;
106
107 public DateTime Timestamp
108 {
109 get { return this.timestamp; }
110 set { this.timestamp = value; }
111 }
112 private DateTime timestamp;
113
114 public void Read(BinaryReader reader)
115 {
116 this.signature = reader.ReadUInt32();
117 this.structVersion = reader.ReadUInt32();
118 this.fileVersion = UInt64ToVersion(reader.ReadUInt64());
119 this.productVersion = UInt64ToVersion(reader.ReadUInt64());
120 this.fileFlagsMask = (VersionBuildTypes) reader.ReadInt32();
121 this.fileFlags = (VersionBuildTypes) reader.ReadInt32();
122 this.fileOS = (VersionFileOS) reader.ReadInt32();
123 this.fileType = (VersionFileType) reader.ReadInt32();
124 this.fileSubtype = (VersionFileSubtype) reader.ReadInt32();
125 this.timestamp = UInt64ToDateTime(reader.ReadUInt64());
126 }
127
128 public void Write(BinaryWriter writer)
129 {
130 writer.Write(this.signature);
131 writer.Write(this.structVersion);
132 writer.Write(VersionToUInt64(this.fileVersion));
133 writer.Write(VersionToUInt64(this.productVersion));
134 writer.Write((int) this.fileFlagsMask);
135 writer.Write((int) this.fileFlags);
136 writer.Write((int) this.fileOS);
137 writer.Write((int) this.fileType);
138 writer.Write((int) this.fileSubtype);
139 writer.Write(DateTimeToUInt64(this.timestamp));
140 }
141
142 public static explicit operator FixedFileVersionInfo(byte[] bytesValue)
143 {
144 FixedFileVersionInfo ffviValue = new FixedFileVersionInfo();
145 using (BinaryReader reader = new BinaryReader(new MemoryStream(bytesValue, false)))
146 {
147 ffviValue.Read(reader);
148 }
149 return ffviValue;
150 }
151
152 public static explicit operator byte[](FixedFileVersionInfo ffviValue)
153 {
154 const int FFVI_LENGTH = 52;
155
156 byte[] bytesValue = new byte[FFVI_LENGTH];
157 using (BinaryWriter writer = new BinaryWriter(new MemoryStream(bytesValue, true)))
158 {
159 ffviValue.Write(writer);
160 }
161 return bytesValue;
162 }
163
164 private static Version UInt64ToVersion(ulong version)
165 {
166 return new Version((int) ((version >> 16) & 0xFFFF), (int) (version & 0xFFFF), (int) (version >> 48), (int) ((version >> 32) & 0xFFFF));
167 }
168 private static ulong VersionToUInt64(Version version)
169 {
170 return (((ulong) (ushort) version.Major) << 16) | ((ulong) (ushort) version.Minor)
171 | (((ulong) (ushort) version.Build) << 48) | (((ulong) (ushort) version.Revision) << 32);
172 }
173
174 private static DateTime UInt64ToDateTime(ulong dateTime)
175 {
176 return (dateTime == 0 ? DateTime.MinValue : DateTime.FromFileTime((long) dateTime));
177 }
178 private static ulong DateTimeToUInt64(DateTime dateTime)
179 {
180 return (dateTime == DateTime.MinValue ? 0 : (ulong) dateTime.ToFileTime());
181 }
182 }
183}