diff options
Diffstat (limited to 'src/WixToolset.Core/Msi/SummaryInformation.cs')
-rw-r--r-- | src/WixToolset.Core/Msi/SummaryInformation.cs | 323 |
1 files changed, 0 insertions, 323 deletions
diff --git a/src/WixToolset.Core/Msi/SummaryInformation.cs b/src/WixToolset.Core/Msi/SummaryInformation.cs deleted file mode 100644 index 39949db6..00000000 --- a/src/WixToolset.Core/Msi/SummaryInformation.cs +++ /dev/null | |||
@@ -1,323 +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.Msi | ||
4 | { | ||
5 | using System; | ||
6 | using System.ComponentModel; | ||
7 | using System.Diagnostics.CodeAnalysis; | ||
8 | using System.Globalization; | ||
9 | using System.Text; | ||
10 | using System.Runtime.InteropServices; | ||
11 | using FILETIME = System.Runtime.InteropServices.ComTypes.FILETIME; | ||
12 | using WixToolset.Core.Native; | ||
13 | |||
14 | /// <summary> | ||
15 | /// Summary information for the MSI files. | ||
16 | /// </summary> | ||
17 | internal sealed class SummaryInformation : MsiHandle | ||
18 | { | ||
19 | /// <summary> | ||
20 | /// Summary information properties for transforms. | ||
21 | /// </summary> | ||
22 | public enum Transform | ||
23 | { | ||
24 | /// <summary>PID_CODEPAGE = code page for the summary information stream</summary> | ||
25 | CodePage = 1, | ||
26 | |||
27 | /// <summary>PID_TITLE = typically just "Transform"</summary> | ||
28 | Title = 2, | ||
29 | |||
30 | /// <summary>PID_SUBJECT = original subject of target</summary> | ||
31 | TargetSubject = 3, | ||
32 | |||
33 | /// <summary>PID_AUTHOR = original manufacturer of target</summary> | ||
34 | TargetManufacturer = 4, | ||
35 | |||
36 | /// <summary>PID_KEYWORDS = keywords for the transform, typically including at least "Installer"</summary> | ||
37 | Keywords = 5, | ||
38 | |||
39 | /// <summary>PID_COMMENTS = describes what this package does</summary> | ||
40 | Comments = 6, | ||
41 | |||
42 | /// <summary>PID_TEMPLATE = target platform;language</summary> | ||
43 | TargetPlatformAndLanguage = 7, | ||
44 | |||
45 | /// <summary>PID_LASTAUTHOR = updated platform;language</summary> | ||
46 | UpdatedPlatformAndLanguage = 8, | ||
47 | |||
48 | /// <summary>PID_REVNUMBER = {productcode}version;{newproductcode}newversion;upgradecode</summary> | ||
49 | ProductCodes = 9, | ||
50 | |||
51 | /// <summary>PID_LASTPRINTED should be null for transforms</summary> | ||
52 | Reserved11 = 11, | ||
53 | |||
54 | ///.<summary>PID_CREATE_DTM = the timestamp when the transform was created</summary> | ||
55 | CreationTime = 12, | ||
56 | |||
57 | /// <summary>PID_PAGECOUNT = minimum installer version</summary> | ||
58 | InstallerRequirement = 14, | ||
59 | |||
60 | /// <summary>PID_CHARCOUNT = validation and error flags</summary> | ||
61 | ValidationFlags = 16, | ||
62 | |||
63 | /// <summary>PID_APPNAME = the application that created the transform</summary> | ||
64 | CreatingApplication = 18, | ||
65 | |||
66 | /// <summary>PID_SECURITY = whether read-only is enforced; should always be 4 for transforms</summary> | ||
67 | Security = 19, | ||
68 | } | ||
69 | |||
70 | /// <summary> | ||
71 | /// Summary information properties for patches. | ||
72 | /// </summary> | ||
73 | public enum Patch | ||
74 | { | ||
75 | /// <summary>PID_CODEPAGE = code page of the summary information stream</summary> | ||
76 | CodePage = 1, | ||
77 | |||
78 | /// <summary>PID_TITLE = a brief description of the package type</summary> | ||
79 | Title = 2, | ||
80 | |||
81 | /// <summary>PID_SUBJECT = package name</summary> | ||
82 | PackageName = 3, | ||
83 | |||
84 | /// <summary>PID_AUTHOR = manufacturer of the patch package</summary> | ||
85 | Manufacturer = 4, | ||
86 | |||
87 | /// <summary>PID_KEYWORDS = alternate sources for the patch package</summary> | ||
88 | Sources = 5, | ||
89 | |||
90 | /// <summary>PID_COMMENTS = general purpose of the patch package</summary> | ||
91 | Comments = 6, | ||
92 | |||
93 | /// <summary>PID_TEMPLATE = semicolon delimited list of ProductCodes</summary> | ||
94 | ProductCodes = 7, | ||
95 | |||
96 | /// <summary>PID_LASTAUTHOR = semicolon delimited list of transform names</summary> | ||
97 | TransformNames = 8, | ||
98 | |||
99 | /// <summary>PID_REVNUMBER = GUID patch code</summary> | ||
100 | PatchCode = 9, | ||
101 | |||
102 | /// <summary>PID_LASTPRINTED should be null for patches</summary> | ||
103 | Reserved11 = 11, | ||
104 | |||
105 | /// <summary>PID_PAGECOUNT should be null for patches</summary> | ||
106 | Reserved14 = 14, | ||
107 | |||
108 | /// <summary>PID_WORDCOUNT = minimum installer version</summary> | ||
109 | InstallerRequirement = 15, | ||
110 | |||
111 | /// <summary>PID_CHARCOUNT should be null for patches</summary> | ||
112 | Reserved16 = 16, | ||
113 | |||
114 | /// <summary>PID_SECURITY = read-only attribute of the patch package</summary> | ||
115 | Security = 19, | ||
116 | } | ||
117 | |||
118 | /// <summary> | ||
119 | /// Summary information values for the InstallerRequirement property. | ||
120 | /// </summary> | ||
121 | public enum InstallerRequirement | ||
122 | { | ||
123 | /// <summary>Any version of the installer will do</summary> | ||
124 | Version10 = 1, | ||
125 | |||
126 | /// <summary>At least 1.2</summary> | ||
127 | Version12 = 2, | ||
128 | |||
129 | /// <summary>At least 2.0</summary> | ||
130 | Version20 = 3, | ||
131 | |||
132 | /// <summary>At least 3.0</summary> | ||
133 | Version30 = 4, | ||
134 | |||
135 | /// <summary>At least 3.1</summary> | ||
136 | Version31 = 5, | ||
137 | } | ||
138 | |||
139 | /// <summary> | ||
140 | /// Instantiate a new SummaryInformation class from an open database. | ||
141 | /// </summary> | ||
142 | /// <param name="db">Database to retrieve summary information from.</param> | ||
143 | public SummaryInformation(Database db) | ||
144 | { | ||
145 | if (null == db) | ||
146 | { | ||
147 | throw new ArgumentNullException("db"); | ||
148 | } | ||
149 | |||
150 | uint handle = 0; | ||
151 | int error = MsiInterop.MsiGetSummaryInformation(db.Handle, null, 0, ref handle); | ||
152 | if (0 != error) | ||
153 | { | ||
154 | throw new MsiException(error); | ||
155 | } | ||
156 | this.Handle = handle; | ||
157 | } | ||
158 | |||
159 | /// <summary> | ||
160 | /// Instantiate a new SummaryInformation class from a database file. | ||
161 | /// </summary> | ||
162 | /// <param name="databaseFile">The database file.</param> | ||
163 | public SummaryInformation(string databaseFile) | ||
164 | { | ||
165 | if (null == databaseFile) | ||
166 | { | ||
167 | throw new ArgumentNullException("databaseFile"); | ||
168 | } | ||
169 | |||
170 | uint handle = 0; | ||
171 | int error = MsiInterop.MsiGetSummaryInformation(0, databaseFile, 0, ref handle); | ||
172 | if (0 != error) | ||
173 | { | ||
174 | throw new MsiException(error); | ||
175 | } | ||
176 | this.Handle = handle; | ||
177 | } | ||
178 | |||
179 | /// <summary> | ||
180 | /// Variant types in the summary information table. | ||
181 | /// </summary> | ||
182 | private enum VT : uint | ||
183 | { | ||
184 | /// <summary>Variant has not been assigned.</summary> | ||
185 | EMPTY = 0, | ||
186 | |||
187 | /// <summary>Null variant type.</summary> | ||
188 | NULL = 1, | ||
189 | |||
190 | /// <summary>16-bit integer variant type.</summary> | ||
191 | I2 = 2, | ||
192 | |||
193 | /// <summary>32-bit integer variant type.</summary> | ||
194 | I4 = 3, | ||
195 | |||
196 | /// <summary>String variant type.</summary> | ||
197 | LPSTR = 30, | ||
198 | |||
199 | /// <summary>Date time (FILETIME, converted to Variant time) variant type.</summary> | ||
200 | FILETIME = 64, | ||
201 | } | ||
202 | |||
203 | /// <summary> | ||
204 | /// Gets a summary information property. | ||
205 | /// </summary> | ||
206 | /// <param name="index">Index of the summary information property.</param> | ||
207 | /// <returns>The summary information property.</returns> | ||
208 | public string GetProperty(int index) | ||
209 | { | ||
210 | uint dataType; | ||
211 | StringBuilder stringValue = new StringBuilder(""); | ||
212 | int bufSize = 0; | ||
213 | int intValue; | ||
214 | FILETIME timeValue; | ||
215 | timeValue.dwHighDateTime = 0; | ||
216 | timeValue.dwLowDateTime = 0; | ||
217 | |||
218 | int error = MsiInterop.MsiSummaryInfoGetProperty(this.Handle, index, out dataType, out intValue, ref timeValue, stringValue, ref bufSize); | ||
219 | if (234 == error) | ||
220 | { | ||
221 | stringValue.EnsureCapacity(++bufSize); | ||
222 | error = MsiInterop.MsiSummaryInfoGetProperty(this.Handle, index, out dataType, out intValue, ref timeValue, stringValue, ref bufSize); | ||
223 | } | ||
224 | |||
225 | if (0 != error) | ||
226 | { | ||
227 | throw new MsiException(error); | ||
228 | } | ||
229 | |||
230 | switch ((VT)dataType) | ||
231 | { | ||
232 | case VT.EMPTY: | ||
233 | return String.Empty; | ||
234 | case VT.LPSTR: | ||
235 | return stringValue.ToString(); | ||
236 | case VT.I2: | ||
237 | case VT.I4: | ||
238 | return Convert.ToString(intValue, CultureInfo.InvariantCulture); | ||
239 | case VT.FILETIME: | ||
240 | long longFileTime = (((long)timeValue.dwHighDateTime) << 32) | unchecked((uint)timeValue.dwLowDateTime); | ||
241 | DateTime dateTime = DateTime.FromFileTime(longFileTime); | ||
242 | return dateTime.ToString("yyyy/MM/dd HH:mm:ss", CultureInfo.InvariantCulture); | ||
243 | default: | ||
244 | throw new InvalidOperationException(); | ||
245 | } | ||
246 | } | ||
247 | } | ||
248 | |||
249 | /// <summary> | ||
250 | /// Summary information values for the CharCount property in transforms. | ||
251 | /// </summary> | ||
252 | [Flags] | ||
253 | [SuppressMessage("Microsoft.Naming", "CA1711:IdentifiersShouldNotHaveIncorrectSuffix")] | ||
254 | public enum TransformFlags | ||
255 | { | ||
256 | /// <summary>Ignore error when adding a row that exists.</summary> | ||
257 | ErrorAddExistingRow = 0x1, | ||
258 | |||
259 | /// <summary>Ignore error when deleting a row that does not exist.</summary> | ||
260 | ErrorDeleteMissingRow = 0x2, | ||
261 | |||
262 | /// <summary>Ignore error when adding a table that exists. </summary> | ||
263 | ErrorAddExistingTable = 0x4, | ||
264 | |||
265 | /// <summary>Ignore error when deleting a table that does not exist. </summary> | ||
266 | ErrorDeleteMissingTable = 0x8, | ||
267 | |||
268 | /// <summary>Ignore error when updating a row that does not exist. </summary> | ||
269 | ErrorUpdateMissingRow = 0x10, | ||
270 | |||
271 | /// <summary>Ignore error when transform and database code pages do not match, and their code pages are neutral.</summary> | ||
272 | ErrorChangeCodePage = 0x20, | ||
273 | |||
274 | /// <summary>Default language must match base database. </summary> | ||
275 | ValidateLanguage = 0x10000, | ||
276 | |||
277 | /// <summary>Product must match base database.</summary> | ||
278 | ValidateProduct = 0x20000, | ||
279 | |||
280 | /// <summary>Check major version only. </summary> | ||
281 | ValidateMajorVersion = 0x80000, | ||
282 | |||
283 | /// <summary>Check major and minor versions only. </summary> | ||
284 | ValidateMinorVersion = 0x100000, | ||
285 | |||
286 | /// <summary>Check major, minor, and update versions.</summary> | ||
287 | ValidateUpdateVersion = 0x200000, | ||
288 | |||
289 | /// <summary>Installed version lt base version. </summary> | ||
290 | ValidateNewLessBaseVersion = 0x400000, | ||
291 | |||
292 | /// <summary>Installed version lte base version. </summary> | ||
293 | ValidateNewLessEqualBaseVersion = 0x800000, | ||
294 | |||
295 | /// <summary>Installed version eq base version. </summary> | ||
296 | ValidateNewEqualBaseVersion = 0x1000000, | ||
297 | |||
298 | /// <summary>Installed version gte base version.</summary> | ||
299 | ValidateNewGreaterEqualBaseVersion = 0x2000000, | ||
300 | |||
301 | /// <summary>Installed version gt base version.</summary> | ||
302 | ValidateNewGreaterBaseVersion = 0x4000000, | ||
303 | |||
304 | /// <summary>UpgradeCode must match base database.</summary> | ||
305 | ValidateUpgradeCode = 0x8000000, | ||
306 | |||
307 | /// <summary>Masks all version checks on ProductVersion.</summary> | ||
308 | ProductVersionMask = ValidateMajorVersion | ValidateMinorVersion | ValidateUpdateVersion, | ||
309 | |||
310 | /// <summary>Masks all operations on ProductVersion.</summary> | ||
311 | ProductVersionOperatorMask = ValidateNewLessBaseVersion | ValidateNewLessEqualBaseVersion | ValidateNewEqualBaseVersion | ValidateNewGreaterEqualBaseVersion | ValidateNewGreaterBaseVersion, | ||
312 | |||
313 | /// <summary>Default value for instance transforms.</summary> | ||
314 | InstanceTransformDefault = ErrorAddExistingRow | ErrorDeleteMissingRow | ErrorAddExistingTable | ErrorDeleteMissingTable | ErrorUpdateMissingRow | ErrorChangeCodePage | ValidateProduct | ValidateUpdateVersion | ValidateNewGreaterEqualBaseVersion, | ||
315 | |||
316 | /// <summary>Default value for language transforms.</summary> | ||
317 | LanguageTransformDefault = ErrorAddExistingRow | ErrorDeleteMissingRow | ErrorAddExistingTable | ErrorDeleteMissingTable | ErrorUpdateMissingRow | ErrorChangeCodePage | ValidateProduct, | ||
318 | |||
319 | /// <summary>Default value for patch transforms.</summary> | ||
320 | PatchTransformDefault = ErrorAddExistingRow | ErrorDeleteMissingRow | ErrorAddExistingTable | ErrorDeleteMissingTable | ErrorUpdateMissingRow | ValidateProduct | ValidateUpdateVersion | ValidateNewEqualBaseVersion | ValidateUpgradeCode, | ||
321 | } | ||
322 | |||
323 | } | ||