aboutsummaryrefslogtreecommitdiff
path: root/src/WixToolset.Core/Msi/SummaryInformation.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/WixToolset.Core/Msi/SummaryInformation.cs')
-rw-r--r--src/WixToolset.Core/Msi/SummaryInformation.cs323
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
3namespace 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}