Add bextutil.
Sean Hall committed
Mar 30, 2020 at 18:52 UTC
51af2090a7c911d0ae1b8232b11ca67613adf3ef
16 files changed
+1032
appveyor.cmd
+1
@@ -8,6 +8,7 @@ msbuild -p:Configuration=Release;Platform=x86;PlatformToolset=v140_xp
8
msbuild -p:Configuration=Release;Platform=x86;PlatformToolset=v141_xp
9
10
msbuild -p:Configuration=Release -t:Pack src\balutil\balutil.vcxproj
11
+msbuild -p:Configuration=Release -t:Pack src\bextutil\bextutil.vcxproj
12
msbuild -p:Configuration=Release -t:Pack src\WixToolset.Mba.Core\WixToolset.Mba.Core.csproj
13
14
@popd
balutil.sln
+10
@@ -5,6 +5,8 @@ VisualStudioVersion = 16.0.29503.13
5
MinimumVisualStudioVersion = 15.0.26124.0
6
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "balutil", "src\balutil\balutil.vcxproj", "{EDCB8095-0E6A-43E0-BC33-C4F762FC5CDB}"
7
EndProject
8
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bextutil", "src\bextutil\bextutil.vcxproj", "{06027492-1CB9-48BC-B31E-C1F9356ED07E}"
9
+EndProject
10
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WixToolset.Mba.Core", "src\WixToolset.Mba.Core\WixToolset.Mba.Core.csproj", "{E7E1841E-A58E-4901-B9CA-4845B807D45F}"
11
EndProject
12
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mbanative", "src\mbanative\mbanative.vcxproj", "{665E0441-17F9-4105-B202-EDF274657F6E}"
@@ -27,6 +29,14 @@ Global
29
{EDCB8095-0E6A-43E0-BC33-C4F762FC5CDB}.Release|x64.Build.0 = Release|x64
30
{EDCB8095-0E6A-43E0-BC33-C4F762FC5CDB}.Release|x86.ActiveCfg = Release|Win32
31
{EDCB8095-0E6A-43E0-BC33-C4F762FC5CDB}.Release|x86.Build.0 = Release|Win32
32
+ {06027492-1CB9-48BC-B31E-C1F9356ED07E}.Debug|x64.ActiveCfg = Debug|x64
33
+ {06027492-1CB9-48BC-B31E-C1F9356ED07E}.Debug|x64.Build.0 = Debug|x64
34
+ {06027492-1CB9-48BC-B31E-C1F9356ED07E}.Debug|x86.ActiveCfg = Debug|Win32
35
+ {06027492-1CB9-48BC-B31E-C1F9356ED07E}.Debug|x86.Build.0 = Debug|Win32
36
+ {06027492-1CB9-48BC-B31E-C1F9356ED07E}.Release|x64.ActiveCfg = Release|x64
37
+ {06027492-1CB9-48BC-B31E-C1F9356ED07E}.Release|x64.Build.0 = Release|x64
38
+ {06027492-1CB9-48BC-B31E-C1F9356ED07E}.Release|x86.ActiveCfg = Release|Win32
39
+ {06027492-1CB9-48BC-B31E-C1F9356ED07E}.Release|x86.Build.0 = Release|Win32
40
{E7E1841E-A58E-4901-B9CA-4845B807D45F}.Debug|x64.ActiveCfg = Debug|Any CPU
41
{E7E1841E-A58E-4901-B9CA-4845B807D45F}.Debug|x64.Build.0 = Debug|Any CPU
42
{E7E1841E-A58E-4901-B9CA-4845B807D45F}.Debug|x86.ActiveCfg = Debug|Any CPU
src/bextutil/BextBundleExtensionEngine.cpp
new
+331
@@ -0,0 +1,331 @@
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
+#include "precomp.h"
4
+
5
+
6
+class CBextBundleExtensionEngine : public IBundleExtensionEngine
7
+{
8
+public: // IUnknown
9
+ virtual STDMETHODIMP QueryInterface(
10
+ __in REFIID riid,
11
+ __out LPVOID *ppvObject
12
+ )
13
+ {
14
+ if (!ppvObject)
15
+ {
16
+ return E_INVALIDARG;
17
+ }
18
+
19
+ *ppvObject = NULL;
20
+
21
+ if (::IsEqualIID(__uuidof(IBundleExtensionEngine), riid))
22
+ {
23
+ *ppvObject = static_cast<IBundleExtensionEngine*>(this);
24
+ }
25
+ else if (::IsEqualIID(IID_IUnknown, riid))
26
+ {
27
+ *ppvObject = reinterpret_cast<IUnknown*>(this);
28
+ }
29
+ else // no interface for requested iid
30
+ {
31
+ return E_NOINTERFACE;
32
+ }
33
+
34
+ AddRef();
35
+ return S_OK;
36
+ }
37
+
38
+ virtual STDMETHODIMP_(ULONG) AddRef()
39
+ {
40
+ return ::InterlockedIncrement(&this->m_cReferences);
41
+ }
42
+
43
+ virtual STDMETHODIMP_(ULONG) Release()
44
+ {
45
+ long l = ::InterlockedDecrement(&this->m_cReferences);
46
+ if (0 < l)
47
+ {
48
+ return l;
49
+ }
50
+
51
+ delete this;
52
+ return 0;
53
+ }
54
+
55
+public: // IBundleExtensionEngine
56
+ virtual STDMETHODIMP EscapeString(
57
+ __in_z LPCWSTR wzIn,
58
+ __out_ecount_opt(*pcchOut) LPWSTR wzOut,
59
+ __inout DWORD* pcchOut
60
+ )
61
+ {
62
+ HRESULT hr = S_OK;
63
+ BUNDLE_EXTENSION_ENGINE_ESCAPESTRING_ARGS args = { };
64
+ BUNDLE_EXTENSION_ENGINE_ESCAPESTRING_RESULTS results = { };
65
+
66
+ ExitOnNull(pcchOut, hr, E_INVALIDARG, "pcchOut is required");
67
+
68
+ args.cbSize = sizeof(args);
69
+ args.wzIn = wzIn;
70
+
71
+ results.cbSize = sizeof(results);
72
+ results.wzOut = wzOut;
73
+ results.cchOut = *pcchOut;
74
+
75
+ hr = m_pfnBundleExtensionEngineProc(BUNDLE_EXTENSION_ENGINE_MESSAGE_ESCAPESTRING, &args, &results, m_pvBundleExtensionEngineProcContext);
76
+
77
+ *pcchOut = results.cchOut;
78
+
79
+ LExit:
80
+ return hr;
81
+ }
82
+
83
+ virtual STDMETHODIMP EvaluateCondition(
84
+ __in_z LPCWSTR wzCondition,
85
+ __out BOOL* pf
86
+ )
87
+ {
88
+ HRESULT hr = S_OK;
89
+ BUNDLE_EXTENSION_ENGINE_EVALUATECONDITION_ARGS args = { };
90
+ BUNDLE_EXTENSION_ENGINE_EVALUATECONDITION_RESULTS results = { };
91
+
92
+ ExitOnNull(pf, hr, E_INVALIDARG, "pf is required");
93
+
94
+ args.cbSize = sizeof(args);
95
+ args.wzCondition = wzCondition;
96
+
97
+ results.cbSize = sizeof(results);
98
+
99
+ hr = m_pfnBundleExtensionEngineProc(BUNDLE_EXTENSION_ENGINE_MESSAGE_EVALUATECONDITION, &args, &results, m_pvBundleExtensionEngineProcContext);
100
+
101
+ *pf = results.f;
102
+
103
+ LExit:
104
+ return hr;
105
+ }
106
+
107
+ virtual STDMETHODIMP FormatString(
108
+ __in_z LPCWSTR wzIn,
109
+ __out_ecount_opt(*pcchOut) LPWSTR wzOut,
110
+ __inout DWORD* pcchOut
111
+ )
112
+ {
113
+ HRESULT hr = S_OK;
114
+ BUNDLE_EXTENSION_ENGINE_FORMATSTRING_ARGS args = { };
115
+ BUNDLE_EXTENSION_ENGINE_FORMATSTRING_RESULTS results = { };
116
+
117
+ ExitOnNull(pcchOut, hr, E_INVALIDARG, "pcchOut is required");
118
+
119
+ args.cbSize = sizeof(args);
120
+ args.wzIn = wzIn;
121
+
122
+ results.cbSize = sizeof(results);
123
+ results.wzOut = wzOut;
124
+ results.cchOut = *pcchOut;
125
+
126
+ hr = m_pfnBundleExtensionEngineProc(BUNDLE_EXTENSION_ENGINE_MESSAGE_FORMATSTRING, &args, &results, m_pvBundleExtensionEngineProcContext);
127
+
128
+ *pcchOut = results.cchOut;
129
+
130
+ LExit:
131
+ return hr;
132
+ }
133
+
134
+ virtual STDMETHODIMP GetVariableNumeric(
135
+ __in_z LPCWSTR wzVariable,
136
+ __out LONGLONG* pllValue
137
+ )
138
+ {
139
+ HRESULT hr = S_OK;
140
+ BUNDLE_EXTENSION_ENGINE_GETVARIABLENUMERIC_ARGS args = { };
141
+ BUNDLE_EXTENSION_ENGINE_GETVARIABLENUMERIC_RESULTS results = { };
142
+
143
+ ExitOnNull(pllValue, hr, E_INVALIDARG, "pllValue is required");
144
+
145
+ args.cbSize = sizeof(args);
146
+ args.wzVariable = wzVariable;
147
+
148
+ results.cbSize = sizeof(results);
149
+
150
+ hr = m_pfnBundleExtensionEngineProc(BUNDLE_EXTENSION_ENGINE_MESSAGE_GETVARIABLENUMERIC, &args, &results, m_pvBundleExtensionEngineProcContext);
151
+
152
+ *pllValue = results.llValue;
153
+
154
+ LExit:
155
+ SecureZeroMemory(&results, sizeof(results));
156
+ return hr;
157
+ }
158
+
159
+ virtual STDMETHODIMP GetVariableString(
160
+ __in_z LPCWSTR wzVariable,
161
+ __out_ecount_opt(*pcchValue) LPWSTR wzValue,
162
+ __inout DWORD* pcchValue
163
+ )
164
+ {
165
+ HRESULT hr = S_OK;
166
+ BUNDLE_EXTENSION_ENGINE_GETVARIABLESTRING_ARGS args = { };
167
+ BUNDLE_EXTENSION_ENGINE_GETVARIABLESTRING_RESULTS results = { };
168
+
169
+ ExitOnNull(pcchValue, hr, E_INVALIDARG, "pcchValue is required");
170
+
171
+ args.cbSize = sizeof(args);
172
+ args.wzVariable = wzVariable;
173
+
174
+ results.cbSize = sizeof(results);
175
+ results.wzValue = wzValue;
176
+ results.cchValue = *pcchValue;
177
+
178
+ hr = m_pfnBundleExtensionEngineProc(BUNDLE_EXTENSION_ENGINE_MESSAGE_GETVARIABLESTRING, &args, &results, m_pvBundleExtensionEngineProcContext);
179
+
180
+ *pcchValue = results.cchValue;
181
+
182
+ LExit:
183
+ return hr;
184
+ }
185
+
186
+ virtual STDMETHODIMP GetVariableVersion(
187
+ __in_z LPCWSTR wzVariable,
188
+ __out DWORD64* pqwValue
189
+ )
190
+ {
191
+ HRESULT hr = S_OK;
192
+ BUNDLE_EXTENSION_ENGINE_GETVARIABLEVERSION_ARGS args = { };
193
+ BUNDLE_EXTENSION_ENGINE_GETVARIABLEVERSION_RESULTS results = { };
194
+
195
+ ExitOnNull(pqwValue, hr, E_INVALIDARG, "pqwValue is required");
196
+
197
+ args.cbSize = sizeof(args);
198
+ args.wzVariable = wzVariable;
199
+
200
+ results.cbSize = sizeof(results);
201
+
202
+ hr = m_pfnBundleExtensionEngineProc(BUNDLE_EXTENSION_ENGINE_MESSAGE_GETVARIABLEVERSION, &args, &results, m_pvBundleExtensionEngineProcContext);
203
+
204
+ *pqwValue = results.qwValue;
205
+
206
+ LExit:
207
+ SecureZeroMemory(&results, sizeof(results));
208
+ return hr;
209
+ }
210
+
211
+ virtual STDMETHODIMP Log(
212
+ __in BUNDLE_EXTENSION_LOG_LEVEL level,
213
+ __in_z LPCWSTR wzMessage
214
+ )
215
+ {
216
+ BUNDLE_EXTENSION_ENGINE_LOG_ARGS args = { };
217
+ BUNDLE_EXTENSION_ENGINE_LOG_RESULTS results = { };
218
+
219
+ args.cbSize = sizeof(args);
220
+ args.level = level;
221
+ args.wzMessage = wzMessage;
222
+
223
+ results.cbSize = sizeof(results);
224
+
225
+ return m_pfnBundleExtensionEngineProc(BUNDLE_EXTENSION_ENGINE_MESSAGE_LOG, &args, &results, m_pvBundleExtensionEngineProcContext);
226
+ }
227
+
228
+ virtual STDMETHODIMP SetVariableLiteralString(
229
+ __in_z LPCWSTR wzVariable,
230
+ __in_z_opt LPCWSTR wzValue
231
+ )
232
+ {
233
+ BUNDLE_EXTENSION_ENGINE_SETVARIABLELITERALSTRING_ARGS args = { };
234
+ BUNDLE_EXTENSION_ENGINE_SETVARIABLELITERALSTRING_RESULTS results = { };
235
+
236
+ args.cbSize = sizeof(args);
237
+ args.wzVariable = wzVariable;
238
+ args.wzValue = wzValue;
239
+
240
+ results.cbSize = sizeof(results);
241
+
242
+ return m_pfnBundleExtensionEngineProc(BUNDLE_EXTENSION_ENGINE_MESSAGE_SETVARIABLELITERALSTRING, &args, &results, m_pvBundleExtensionEngineProcContext);
243
+ }
244
+
245
+ virtual STDMETHODIMP SetVariableNumeric(
246
+ __in_z LPCWSTR wzVariable,
247
+ __in LONGLONG llValue
248
+ )
249
+ {
250
+ BUNDLE_EXTENSION_ENGINE_SETVARIABLENUMERIC_ARGS args = { };
251
+ BUNDLE_EXTENSION_ENGINE_SETVARIABLENUMERIC_RESULTS results = { };
252
+
253
+ args.cbSize = sizeof(args);
254
+ args.wzVariable = wzVariable;
255
+ args.llValue = llValue;
256
+
257
+ results.cbSize = sizeof(results);
258
+
259
+ return m_pfnBundleExtensionEngineProc(BUNDLE_EXTENSION_ENGINE_MESSAGE_SETVARIABLENUMERIC, &args, &results, m_pvBundleExtensionEngineProcContext);
260
+ }
261
+
262
+ virtual STDMETHODIMP SetVariableString(
263
+ __in_z LPCWSTR wzVariable,
264
+ __in_z_opt LPCWSTR wzValue
265
+ )
266
+ {
267
+ BUNDLE_EXTENSION_ENGINE_SETVARIABLESTRING_ARGS args = { };
268
+ BUNDLE_EXTENSION_ENGINE_SETVARIABLESTRING_RESULTS results = { };
269
+
270
+ args.cbSize = sizeof(args);
271
+ args.wzVariable = wzVariable;
272
+ args.wzValue = wzValue;
273
+
274
+ results.cbSize = sizeof(results);
275
+
276
+ return m_pfnBundleExtensionEngineProc(BUNDLE_EXTENSION_ENGINE_MESSAGE_SETVARIABLESTRING, &args, &results, m_pvBundleExtensionEngineProcContext);
277
+ }
278
+
279
+ virtual STDMETHODIMP SetVariableVersion(
280
+ __in_z LPCWSTR wzVariable,
281
+ __in DWORD64 qwValue
282
+ )
283
+ {
284
+ BUNDLE_EXTENSION_ENGINE_SETVARIABLEVERSION_ARGS args = { };
285
+ BUNDLE_EXTENSION_ENGINE_SETVARIABLEVERSION_RESULTS results = { };
286
+
287
+ args.cbSize = sizeof(args);
288
+ args.wzVariable = wzVariable;
289
+ args.qwValue = qwValue;
290
+
291
+ results.cbSize = sizeof(results);
292
+
293
+ return m_pfnBundleExtensionEngineProc(BUNDLE_EXTENSION_ENGINE_MESSAGE_SETVARIABLEVERSION, &args, &results, m_pvBundleExtensionEngineProcContext);
294
+ }
295
+
296
+public:
297
+ CBextBundleExtensionEngine(
298
+ __in PFN_BUNDLE_EXTENSION_ENGINE_PROC pfnBundleExtensionEngineProc,
299
+ __in_opt LPVOID pvBundleExtensionEngineProcContext
300
+ )
301
+ {
302
+ m_cReferences = 1;
303
+ m_pfnBundleExtensionEngineProc = pfnBundleExtensionEngineProc;
304
+ m_pvBundleExtensionEngineProcContext = pvBundleExtensionEngineProcContext;
305
+ }
306
+
307
+private:
308
+ long m_cReferences;
309
+ PFN_BUNDLE_EXTENSION_ENGINE_PROC m_pfnBundleExtensionEngineProc;
310
+ LPVOID m_pvBundleExtensionEngineProcContext;
311
+};
312
+
313
+HRESULT BextBundleExtensionEngineCreate(
314
+ __in PFN_BUNDLE_EXTENSION_ENGINE_PROC pfnBundleExtensionEngineProc,
315
+ __in_opt LPVOID pvBundleExtensionEngineProcContext,
316
+ __out IBundleExtensionEngine** ppEngineForExtension
317
+ )
318
+{
319
+ HRESULT hr = S_OK;
320
+ CBextBundleExtensionEngine* pBundleExtensionEngine = NULL;
321
+
322
+ pBundleExtensionEngine = new CBextBundleExtensionEngine(pfnBundleExtensionEngineProc, pvBundleExtensionEngineProcContext);
323
+ ExitOnNull(pBundleExtensionEngine, hr, E_OUTOFMEMORY, "Failed to allocate new BextBundleExtensionEngine object.");
324
+
325
+ hr = pBundleExtensionEngine->QueryInterface(IID_PPV_ARGS(ppEngineForExtension));
326
+ ExitOnFailure(hr, "Failed to QI for IBundleExtensionEngine from BextBundleExtensionEngine object.");
327
+
328
+LExit:
329
+ ReleaseObject(pBundleExtensionEngine);
330
+ return hr;
331
+}
src/bextutil/bextutil.cpp
new
+179
@@ -0,0 +1,179 @@
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
+#include "precomp.h"
4
+
5
+static IBundleExtensionEngine* vpEngine = NULL;
6
+
7
+// prototypes
8
+
9
+DAPI_(void) BextInitialize(
10
+ __in IBundleExtensionEngine* pEngine
11
+ )
12
+{
13
+ pEngine->AddRef();
14
+
15
+ ReleaseObject(vpEngine);
16
+ vpEngine = pEngine;
17
+}
18
+
19
+DAPI_(HRESULT) BextInitializeFromCreateArgs(
20
+ __in const BUNDLE_EXTENSION_CREATE_ARGS* pArgs,
21
+ __out_opt IBundleExtensionEngine** ppEngine
22
+ )
23
+{
24
+ HRESULT hr = S_OK;
25
+ IBundleExtensionEngine* pEngine = NULL;
26
+
27
+ hr = BextBundleExtensionEngineCreate(pArgs->pfnBundleExtensionEngineProc, pArgs->pvBundleExtensionEngineProcContext, &pEngine);
28
+ ExitOnFailure(hr, "Failed to create BextBundleExtensionEngine.");
29
+
30
+ BextInitialize(pEngine);
31
+
32
+ if (ppEngine)
33
+ {
34
+ *ppEngine = pEngine;
35
+ }
36
+ pEngine = NULL;
37
+
38
+LExit:
39
+ ReleaseObject(pEngine);
40
+
41
+ return hr;
42
+}
43
+
44
+
45
+DAPI_(void) BextUninitialize()
46
+{
47
+ ReleaseNullObject(vpEngine);
48
+}
49
+
50
+DAPI_(HRESULT) BextGetBundleExtensionDataNode(
51
+ __in IXMLDOMDocument* pixdManifest,
52
+ __in LPCWSTR wzExtensionId,
53
+ __out IXMLDOMNode** ppixnBundleExtension
54
+ )
55
+{
56
+ HRESULT hr = S_OK;
57
+ IXMLDOMElement* pixeBundleExtensionData = NULL;
58
+ IXMLDOMNodeList* pixnNodes = NULL;
59
+ IXMLDOMNode* pixnNode = NULL;
60
+ DWORD cNodes = 0;
61
+ LPWSTR sczId = NULL;
62
+
63
+ // Get BundleExtensionData element.
64
+ hr = pixdManifest->get_documentElement(&pixeBundleExtensionData);
65
+ ExitOnFailure(hr, "Failed to get BundleExtensionData element.");
66
+
67
+ // Select BundleExtension nodes.
68
+ hr = XmlSelectNodes(pixeBundleExtensionData, L"BundleExtension", &pixnNodes);
69
+ ExitOnFailure(hr, "Failed to select BundleExtension nodes.");
70
+
71
+ // Get BundleExtension node count.
72
+ hr = pixnNodes->get_length((long*)&cNodes);
73
+ ExitOnFailure(hr, "Failed to get BundleExtension node count.");
74
+
75
+ if (!cNodes)
76
+ {
77
+ ExitFunction();
78
+ }
79
+
80
+ // Find requested extension.
81
+ for (DWORD i = 0; i < cNodes; ++i)
82
+ {
83
+ hr = XmlNextElement(pixnNodes, &pixnNode, NULL);
84
+ ExitOnFailure(hr, "Failed to get next node.");
85
+
86
+ // @Id
87
+ hr = XmlGetAttributeEx(pixnNode, L"Id", &sczId);
88
+ ExitOnFailure(hr, "Failed to get @Id.");
89
+
90
+ if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, sczId, -1, wzExtensionId, -1))
91
+ {
92
+ *ppixnBundleExtension = pixnNode;
93
+ pixnNode = NULL;
94
+
95
+ ExitFunction1(hr = S_OK);
96
+ }
97
+
98
+ // Prepare next iteration.
99
+ ReleaseNullObject(pixnNode);
100
+ }
101
+
102
+ hr = E_NOTFOUND;
103
+
104
+LExit:
105
+ ReleaseStr(sczId);
106
+ ReleaseObject(pixnNode);
107
+ ReleaseObject(pixnNodes);
108
+ ReleaseObject(pixeBundleExtensionData);
109
+
110
+ return hr;
111
+}
112
+
113
+
114
+DAPIV_(HRESULT) BextLog(
115
+ __in BUNDLE_EXTENSION_LOG_LEVEL level,
116
+ __in_z __format_string LPCSTR szFormat,
117
+ ...
118
+ )
119
+{
120
+ HRESULT hr = S_OK;
121
+ va_list args;
122
+ LPSTR sczFormattedAnsi = NULL;
123
+ LPWSTR sczMessage = NULL;
124
+
125
+ if (!vpEngine)
126
+ {
127
+ hr = E_POINTER;
128
+ ExitOnRootFailure(hr, "BextInitialize() must be called first.");
129
+ }
130
+
131
+ va_start(args, szFormat);
132
+ hr = StrAnsiAllocFormattedArgs(&sczFormattedAnsi, szFormat, args);
133
+ va_end(args);
134
+ ExitOnFailure(hr, "Failed to format log string.");
135
+
136
+ hr = StrAllocStringAnsi(&sczMessage, sczFormattedAnsi, 0, CP_UTF8);
137
+ ExitOnFailure(hr, "Failed to convert log string to Unicode.");
138
+
139
+ hr = vpEngine->Log(level, sczMessage);
140
+
141
+LExit:
142
+ ReleaseStr(sczMessage);
143
+ ReleaseStr(sczFormattedAnsi);
144
+ return hr;
145
+}
146
+
147
+
148
+DAPIV_(HRESULT) BextLogError(
149
+ __in HRESULT hrError,
150
+ __in_z __format_string LPCSTR szFormat,
151
+ ...
152
+ )
153
+{
154
+ HRESULT hr = S_OK;
155
+ va_list args;
156
+ LPSTR sczFormattedAnsi = NULL;
157
+ LPWSTR sczMessage = NULL;
158
+
159
+ if (!vpEngine)
160
+ {
161
+ hr = E_POINTER;
162
+ ExitOnRootFailure(hr, "BextInitialize() must be called first.");
163
+ }
164
+
165
+ va_start(args, szFormat);
166
+ hr = StrAnsiAllocFormattedArgs(&sczFormattedAnsi, szFormat, args);
167
+ va_end(args);
168
+ ExitOnFailure(hr, "Failed to format error log string.");
169
+
170
+ hr = StrAllocFormatted(&sczMessage, L"Error 0x%08x: %S", hrError, sczFormattedAnsi);
171
+ ExitOnFailure(hr, "Failed to prepend error number to error log string.");
172
+
173
+ hr = vpEngine->Log(BUNDLE_EXTENSION_LOG_LEVEL_ERROR, sczMessage);
174
+
175
+LExit:
176
+ ReleaseStr(sczMessage);
177
+ ReleaseStr(sczFormattedAnsi);
178
+ return hr;
179
+}
src/bextutil/bextutil.nuspec
new
+26
@@ -0,0 +1,26 @@
1
+<?xml version="1.0"?>
2
+<package >
3
+ <metadata>
4
+ <id>$id$</id>
5
+ <version>$version$</version>
6
+ <authors>$authors$</authors>
7
+ <owners>$authors$</owners>
8
+ <!-- <license type="expression">MS-RL</license> -->
9
+ <licenseUrl>https://licenses.nuget.org/MS-RL</licenseUrl>
10
+ <projectUrl>https://github.com/wixtoolset/balutil</projectUrl>
11
+ <requireLicenseAcceptance>false</requireLicenseAcceptance>
12
+ <description>$description$</description>
13
+ <copyright>$copyright$</copyright>
14
+ <dependencies>
15
+ <dependency id="WixToolset.BootstrapperCore.Native" version="[4,5)" />
16
+ <dependency id="WixToolset.DUtil" version="[4,5)" />
17
+ </dependencies>
18
+ </metadata>
19
+
20
+ <files>
21
+ <file src="build\$id$.props" target="build\" />
22
+ <file src="inc\*" target="build\native\include" />
23
+ <file src="..\..\build\$configuration$\v140_xp\x86\bextutil.lib" target="build\native\v140\x86" />
24
+ <file src="..\..\build\$configuration$\v141_xp\x86\bextutil.lib" target="build\native\v141\x86" />
25
+ </files>
26
+</package>
src/bextutil/bextutil.vcxproj
new
+86
@@ -0,0 +1,86 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<!-- 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. -->
3
+
4
+<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
5
+ <Import Project="..\..\packages\WixToolset.BootstrapperCore.Native.4.0.13\build\WixToolset.BootstrapperCore.Native.props" Condition="Exists('..\..\packages\WixToolset.BootstrapperCore.Native.4.0.13\build\WixToolset.BootstrapperCore.Native.props')" />
6
+ <Import Project="..\..\packages\WixToolset.DUtil.4.0.18\build\WixToolset.DUtil.props" Condition="Exists('..\..\packages\WixToolset.DUtil.4.0.18\build\WixToolset.DUtil.props')" />
7
+
8
+ <ItemGroup Label="ProjectConfigurations">
9
+ <ProjectConfiguration Include="Debug|Win32">
10
+ <Configuration>Debug</Configuration>
11
+ <Platform>Win32</Platform>
12
+ </ProjectConfiguration>
13
+ <ProjectConfiguration Include="Release|Win32">
14
+ <Configuration>Release</Configuration>
15
+ <Platform>Win32</Platform>
16
+ </ProjectConfiguration>
17
+ <ProjectConfiguration Include="Debug|x64">
18
+ <Configuration>Debug</Configuration>
19
+ <Platform>x64</Platform>
20
+ </ProjectConfiguration>
21
+ <ProjectConfiguration Include="Release|x64">
22
+ <Configuration>Release</Configuration>
23
+ <Platform>x64</Platform>
24
+ </ProjectConfiguration>
25
+ </ItemGroup>
26
+
27
+ <PropertyGroup Label="Globals">
28
+ <ProjectGuid>{06027492-1CB9-48BC-B31E-C1F9356ED07E}</ProjectGuid>
29
+ <ConfigurationType>StaticLibrary</ConfigurationType>
30
+ <TargetName>bextutil</TargetName>
31
+ <PlatformToolset>v141</PlatformToolset>
32
+ <CharacterSet>MultiByte</CharacterSet>
33
+ <Description>WiX Toolset Bundle Extension native utility library</Description>
34
+ </PropertyGroup>
35
+
36
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
37
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
38
+ <Import Project="..\..\packages\Nerdbank.GitVersioning.2.1.65\build\Nerdbank.GitVersioning.targets" Condition="Exists('..\..\packages\Nerdbank.GitVersioning.2.1.65\build\Nerdbank.GitVersioning.targets')" />
39
+ <Import Project="..\NativeMultiTargeting.Build.props" />
40
+
41
+ <ImportGroup Label="ExtensionSettings">
42
+ </ImportGroup>
43
+
44
+ <ImportGroup Label="Shared">
45
+ </ImportGroup>
46
+
47
+ <PropertyGroup>
48
+ <ProjectAdditionalIncludeDirectories>$(ProjectDir)..\inc</ProjectAdditionalIncludeDirectories>
49
+ </PropertyGroup>
50
+
51
+ <ItemGroup>
52
+ <ClCompile Include="BextBundleExtensionEngine.cpp" />
53
+ <ClCompile Include="bextutil.cpp" />
54
+ <ClCompile Include="precomp.cpp">
55
+ <PrecompiledHeader>Create</PrecompiledHeader>
56
+ </ClCompile>
57
+ </ItemGroup>
58
+ <ItemGroup>
59
+ <ClInclude Include="inc\BextBaseBundleExtension.h" />
60
+ <ClInclude Include="inc\BextBaseBundleExtensionProc.h" />
61
+ <ClInclude Include="inc\BextBundleExtensionEngine.h" />
62
+ <ClInclude Include="inc\bextutil.h" />
63
+ <ClInclude Include="inc\IBundleExtension.h" />
64
+ <ClInclude Include="inc\IBundleExtensionEngine.h" />
65
+ <ClInclude Include="precomp.h" />
66
+ </ItemGroup>
67
+
68
+ <ItemGroup>
69
+ <None Include="packages.config" />
70
+ </ItemGroup>
71
+
72
+ <Target Name="Pack"
73
+ DependsOnTargets="GetBuildVersion">
74
+ <Exec Command='nuget pack bextutil.nuspec -OutputDirectory "$(BaseOutputPath)$(Configuration)" -Properties Configuration=$(Configuration);Id=WixToolset.BextUtil;Version="$(BuildVersionSimple)";Authors="$(Authors)";Copyright="$(Copyright)";Description="$(Description)";Title="$(Title)"' />
75
+ </Target>
76
+
77
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
78
+ <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
79
+ <PropertyGroup>
80
+ <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
81
+ </PropertyGroup>
82
+ <Error Condition="!Exists('..\..\packages\WixToolset.BootstrapperCore.Native.4.0.13\build\WixToolset.BootstrapperCore.Native.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.BootstrapperCore.Native.4.0.13\build\WixToolset.BootstrapperCore.Native.props'))" />
83
+ <Error Condition="!Exists('..\..\packages\WixToolset.DUtil.4.0.18\build\WixToolset.DUtil.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.DUtil.4.0.18\build\WixToolset.DUtil.props'))" />
84
+ <Error Condition="!Exists('..\..\packages\Nerdbank.GitVersioning.2.1.65\build\Nerdbank.GitVersioning.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Nerdbank.GitVersioning.2.1.65\build\Nerdbank.GitVersioning.targets'))" />
85
+ </Target>
86
+</Project>
src/bextutil/build/WixToolset.BextUtil.props
new
+23
@@ -0,0 +1,23 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<!-- 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. -->
3
+
4
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
5
+ <ItemDefinitionGroup>
6
+ <ClCompile>
7
+ <AdditionalIncludeDirectories>$(MSBuildThisFileDirectory)native\include\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
8
+ </ClCompile>
9
+ <ResourceCompile>
10
+ <AdditionalIncludeDirectories>$(MSBuildThisFileDirectory)native\include\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
11
+ </ResourceCompile>
12
+ </ItemDefinitionGroup>
13
+ <ItemDefinitionGroup Condition=" $(PlatformToolset.ToLower().StartsWith('v140')) ">
14
+ <Link>
15
+ <AdditionalDependencies>$(MSBuildThisFileDirectory)native\v140\$(PlatformTarget)\bextutil.lib;%(AdditionalDependencies)</AdditionalDependencies>
16
+ </Link>
17
+ </ItemDefinitionGroup>
18
+ <ItemDefinitionGroup Condition=" $(PlatformToolset.ToLower().StartsWith('v141')) ">
19
+ <Link>
20
+ <AdditionalDependencies>$(MSBuildThisFileDirectory)native\v141\$(PlatformTarget)\bextutil.lib;%(AdditionalDependencies)</AdditionalDependencies>
21
+ </Link>
22
+ </ItemDefinitionGroup>
23
+</Project>
src/bextutil/inc/BextBaseBundleExtension.h
new
+120
@@ -0,0 +1,120 @@
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
+#include <windows.h>
4
+
5
+#include "BundleExtensionEngine.h"
6
+#include "BundleExtension.h"
7
+#include "IBundleExtensionEngine.h"
8
+#include "IBundleExtension.h"
9
+
10
+#include "bextutil.h"
11
+
12
+class CBextBaseBundleExtension : public IBundleExtension
13
+{
14
+public: // IUnknown
15
+ virtual STDMETHODIMP QueryInterface(
16
+ __in REFIID riid,
17
+ __out LPVOID *ppvObject
18
+ )
19
+ {
20
+ if (!ppvObject)
21
+ {
22
+ return E_INVALIDARG;
23
+ }
24
+
25
+ *ppvObject = NULL;
26
+
27
+ if (::IsEqualIID(__uuidof(IBundleExtension), riid))
28
+ {
29
+ *ppvObject = static_cast<IBundleExtension*>(this);
30
+ }
31
+ else if (::IsEqualIID(IID_IUnknown, riid))
32
+ {
33
+ *ppvObject = static_cast<IUnknown*>(this);
34
+ }
35
+ else // no interface for requested iid
36
+ {
37
+ return E_NOINTERFACE;
38
+ }
39
+
40
+ AddRef();
41
+ return S_OK;
42
+ }
43
+
44
+ virtual STDMETHODIMP_(ULONG) AddRef()
45
+ {
46
+ return ::InterlockedIncrement(&this->m_cReferences);
47
+ }
48
+
49
+ virtual STDMETHODIMP_(ULONG) Release()
50
+ {
51
+ long l = ::InterlockedDecrement(&this->m_cReferences);
52
+ if (0 < l)
53
+ {
54
+ return l;
55
+ }
56
+
57
+ delete this;
58
+ return 0;
59
+ }
60
+
61
+public: // IBundleExtension
62
+ virtual STDMETHODIMP Search(
63
+ __in LPCWSTR /*wzId*/,
64
+ __in LPCWSTR /*wzVariable*/
65
+ )
66
+ {
67
+ return E_NOTIMPL;
68
+ }
69
+
70
+ virtual STDMETHODIMP BundleExtensionProc(
71
+ __in BUNDLE_EXTENSION_MESSAGE /*message*/,
72
+ __in const LPVOID /*pvArgs*/,
73
+ __inout LPVOID /*pvResults*/,
74
+ __in_opt LPVOID /*pvContext*/
75
+ )
76
+ {
77
+ return E_NOTIMPL;
78
+ }
79
+
80
+public: //CBextBaseBundleExtension
81
+ virtual STDMETHODIMP Initialize(
82
+ __in const BUNDLE_EXTENSION_CREATE_ARGS* pCreateArgs
83
+ )
84
+ {
85
+ HRESULT hr = S_OK;
86
+
87
+ hr = StrAllocString(&m_sczBundleExtensionDataPath, pCreateArgs->wzBundleExtensionDataPath, 0);
88
+ ExitOnFailure(hr, "Failed to copy BundleExtensionDataPath.");
89
+
90
+ LExit:
91
+ return hr;
92
+ }
93
+
94
+protected:
95
+
96
+ CBextBaseBundleExtension(
97
+ __in IBundleExtensionEngine* pEngine
98
+ )
99
+ {
100
+ m_cReferences = 1;
101
+
102
+ pEngine->AddRef();
103
+ m_pEngine = pEngine;
104
+
105
+ m_sczBundleExtensionDataPath = NULL;
106
+ }
107
+
108
+ virtual ~CBextBaseBundleExtension()
109
+ {
110
+ ReleaseNullObject(m_pEngine);
111
+ ReleaseStr(m_sczBundleExtensionDataPath);
112
+ }
113
+
114
+protected:
115
+ IBundleExtensionEngine* m_pEngine;
116
+ LPWSTR m_sczBundleExtensionDataPath;
117
+
118
+private:
119
+ long m_cReferences;
120
+};
src/bextutil/inc/BextBaseBundleExtensionProc.h
new
+48
@@ -0,0 +1,48 @@
1
+#pragma once
2
+// 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.
3
+
4
+
5
+#include <windows.h>
6
+
7
+#include "BundleExtensionEngine.h"
8
+#include "BundleExtension.h"
9
+#include "IBundleExtensionEngine.h"
10
+#include "IBundleExtension.h"
11
+
12
+static HRESULT BextBaseBEProcSearch(
13
+ __in IBundleExtension* pBE,
14
+ __in BUNDLE_EXTENSION_SEARCH_ARGS* pArgs,
15
+ __inout BUNDLE_EXTENSION_SEARCH_RESULTS* /*pResults*/
16
+ )
17
+{
18
+ return pBE->Search(pArgs->wzId, pArgs->wzVariable);
19
+}
20
+
21
+/*******************************************************************
22
+BextBaseBundleExtensionProc - requires pvContext to be of type IBundleExtension.
23
+ Provides a default mapping between the message based
24
+ BundleExtension interface and the COM-based BundleExtension interface.
25
+
26
+*******************************************************************/
27
+static HRESULT WINAPI BextBaseBundleExtensionProc(
28
+ __in BUNDLE_EXTENSION_MESSAGE message,
29
+ __in const LPVOID pvArgs,
30
+ __inout LPVOID pvResults,
31
+ __in_opt LPVOID pvContext
32
+ )
33
+{
34
+ IBundleExtension* pBE = reinterpret_cast<IBundleExtension*>(pvContext);
35
+ HRESULT hr = pBE->BundleExtensionProc(message, pvArgs, pvResults, pvContext);
36
+
37
+ if (E_NOTIMPL == hr)
38
+ {
39
+ switch (message)
40
+ {
41
+ case BUNDLE_EXTENSION_MESSAGE_SEARCH:
42
+ hr = BextBaseBEProcSearch(pBE, reinterpret_cast<BUNDLE_EXTENSION_SEARCH_ARGS*>(pvArgs), reinterpret_cast<BUNDLE_EXTENSION_SEARCH_RESULTS*>(pvResults));
43
+ break;
44
+ }
45
+ }
46
+
47
+ return hr;
48
+}
src/bextutil/inc/BextBundleExtensionEngine.h
new
+17
@@ -0,0 +1,17 @@
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
+#ifdef __cplusplus
4
+extern "C" {
5
+#endif
6
+
7
+// function declarations
8
+
9
+HRESULT BextBundleExtensionEngineCreate(
10
+ __in PFN_BUNDLE_EXTENSION_ENGINE_PROC pfnBundleExtensionEngineProc,
11
+ __in_opt LPVOID pvBundleExtensionEngineProcContext,
12
+ __out IBundleExtensionEngine** ppEngineForExtension
13
+ );
14
+
15
+#ifdef __cplusplus
16
+}
17
+#endif
src/bextutil/inc/IBundleExtension.h
new
+20
@@ -0,0 +1,20 @@
1
+#pragma once
2
+// 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.
3
+
4
+
5
+DECLARE_INTERFACE_IID_(IBundleExtension, IUnknown, "93123C9D-796B-4FCD-A507-6EDEF9A925FD")
6
+{
7
+ STDMETHOD(Search)(
8
+ __in LPCWSTR wzId,
9
+ __in LPCWSTR wzVariable
10
+ ) = 0;
11
+
12
+ // BundleExtensionProc - The PFN_BUNDLE_EXTENSION_PROC can call this method to give the BundleExtension raw access to the callback from the engine.
13
+ // This might be used to help the BundleExtension support more than one version of the engine.
14
+ STDMETHOD(BundleExtensionProc)(
15
+ __in BUNDLE_EXTENSION_MESSAGE message,
16
+ __in const LPVOID pvArgs,
17
+ __inout LPVOID pvResults,
18
+ __in_opt LPVOID pvContext
19
+ ) = 0;
20
+};
src/bextutil/inc/IBundleExtensionEngine.h
new
+64
@@ -0,0 +1,64 @@
1
+#pragma once
2
+// 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.
3
+
4
+
5
+DECLARE_INTERFACE_IID_(IBundleExtensionEngine, IUnknown, "9D027A39-F6B6-42CC-9737-C185089EB263")
6
+{
7
+ STDMETHOD(EscapeString)(
8
+ __in_z LPCWSTR wzIn,
9
+ __out_ecount_opt(*pcchOut) LPWSTR wzOut,
10
+ __inout DWORD * pcchOut
11
+ ) = 0;
12
+
13
+ STDMETHOD(EvaluateCondition)(
14
+ __in_z LPCWSTR wzCondition,
15
+ __out BOOL * pf
16
+ ) = 0;
17
+
18
+ STDMETHOD(FormatString)(
19
+ __in_z LPCWSTR wzIn,
20
+ __out_ecount_opt(*pcchOut) LPWSTR wzOut,
21
+ __inout DWORD * pcchOut
22
+ ) = 0;
23
+
24
+ STDMETHOD(GetVariableNumeric)(
25
+ __in_z LPCWSTR wzVariable,
26
+ __out LONGLONG* pllValue
27
+ ) = 0;
28
+
29
+ STDMETHOD(GetVariableString)(
30
+ __in_z LPCWSTR wzVariable,
31
+ __out_ecount_opt(*pcchValue) LPWSTR wzValue,
32
+ __inout DWORD* pcchValue
33
+ ) = 0;
34
+
35
+ STDMETHOD(GetVariableVersion)(
36
+ __in_z LPCWSTR wzVariable,
37
+ __out DWORD64* pqwValue
38
+ ) = 0;
39
+
40
+ STDMETHOD(Log)(
41
+ __in BUNDLE_EXTENSION_LOG_LEVEL level,
42
+ __in_z LPCWSTR wzMessage
43
+ ) = 0;
44
+
45
+ STDMETHOD(SetVariableLiteralString)(
46
+ __in_z LPCWSTR wzVariable,
47
+ __in_z_opt LPCWSTR wzValue
48
+ ) = 0;
49
+
50
+ STDMETHOD(SetVariableNumeric)(
51
+ __in_z LPCWSTR wzVariable,
52
+ __in LONGLONG llValue
53
+ ) = 0;
54
+
55
+ STDMETHOD(SetVariableString)(
56
+ __in_z LPCWSTR wzVariable,
57
+ __in_z_opt LPCWSTR wzValue
58
+ ) = 0;
59
+
60
+ STDMETHOD(SetVariableVersion)(
61
+ __in_z LPCWSTR wzVariable,
62
+ __in DWORD64 qwValue
63
+ ) = 0;
64
+};
src/bextutil/inc/bextutil.h
new
+76
@@ -0,0 +1,76 @@
1
+#pragma once
2
+// 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.
3
+
4
+
5
+#include "dutil.h"
6
+
7
+
8
+#ifdef __cplusplus
9
+extern "C" {
10
+#endif
11
+
12
+#define BextExitOnFailure(x, f, ...) if (FAILED(x)) { BextLogError(x, f, __VA_ARGS__); ExitTrace(x, f, __VA_ARGS__); goto LExit; }
13
+#define BextExitOnRootFailure(x, f, ...) if (FAILED(x)) { BextLogError(x, f, __VA_ARGS__); Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace(x, f, __VA_ARGS__); goto LExit; }
14
+#define BextExitOnNullWithLastError(p, x, f, ...) if (NULL == p) { DWORD Dutil_er = ::GetLastError(); x = HRESULT_FROM_WIN32(Dutil_er); if (!FAILED(x)) { x = E_FAIL; } BextLogError(x, f, __VA_ARGS__); ExitTrace(x, f, __VA_ARGS__); goto LExit; }
15
+
16
+const LPCWSTR BUNDLE_EXTENSION_MANIFEST_FILENAME = L"BundleExtensionData.xml";
17
+
18
+
19
+/*******************************************************************
20
+ BextInitialize - remembers the engine interface to enable logging and
21
+ other functions.
22
+
23
+********************************************************************/
24
+DAPI_(void) BextInitialize(
25
+ __in IBundleExtensionEngine* pEngine
26
+ );
27
+
28
+/*******************************************************************
29
+ BextInitializeFromCreateArgs - convenience function to call BextBundleExtensionEngineCreate
30
+ then pass it along to BextInitialize.
31
+
32
+********************************************************************/
33
+DAPI_(HRESULT) BextInitializeFromCreateArgs(
34
+ __in const BUNDLE_EXTENSION_CREATE_ARGS* pArgs,
35
+ __out IBundleExtensionEngine** ppEngine
36
+ );
37
+
38
+/*******************************************************************
39
+ BextUninitialize - cleans up utility layer internals.
40
+
41
+********************************************************************/
42
+DAPI_(void) BextUninitialize();
43
+
44
+/*******************************************************************
45
+ BextGetBundleExtensionDataNode - gets the requested BundleExtension node.
46
+
47
+********************************************************************/
48
+DAPI_(HRESULT) BextGetBundleExtensionDataNode(
49
+ __in IXMLDOMDocument* pixdManifest,
50
+ __in LPCWSTR wzExtensionId,
51
+ __out IXMLDOMNode** ppixnBundleExtension
52
+ );
53
+
54
+/*******************************************************************
55
+ BextLog - logs a message with the engine.
56
+
57
+********************************************************************/
58
+DAPIV_(HRESULT) BextLog(
59
+ __in BUNDLE_EXTENSION_LOG_LEVEL level,
60
+ __in_z __format_string LPCSTR szFormat,
61
+ ...
62
+ );
63
+
64
+/*******************************************************************
65
+ BextLogError - logs an error message with the engine.
66
+
67
+********************************************************************/
68
+DAPIV_(HRESULT) BextLogError(
69
+ __in HRESULT hr,
70
+ __in_z __format_string LPCSTR szFormat,
71
+ ...
72
+ );
73
+
74
+#ifdef __cplusplus
75
+}
76
+#endif
src/bextutil/packages.config
new
+6
@@ -0,0 +1,6 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<packages>
3
+ <package id="Nerdbank.GitVersioning" version="2.1.65" targetFramework="native" developmentDependency="true" />
4
+ <package id="WixToolset.BootstrapperCore.Native" version="4.0.13" targetFramework="native" />
5
+ <package id="WixToolset.DUtil" version="4.0.18" targetFramework="native" />
6
+</packages>
\ No newline at end of file
src/bextutil/precomp.cpp
new
+3
@@ -0,0 +1,3 @@
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
+#include "precomp.h"
src/bextutil/precomp.h
new
+22
@@ -0,0 +1,22 @@
1
+#pragma once
2
+// 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.
3
+
4
+
5
+#include <windows.h>
6
+#include <strsafe.h>
7
+#include <msxml2.h>
8
+
9
+#include <dutil.h>
10
+#include <locutil.h>
11
+#include <memutil.h>
12
+#include <strutil.h>
13
+#include <xmlutil.h>
14
+
15
+#include <BundleExtensionEngine.h>
16
+#include <BundleExtension.h>
17
+
18
+#include "IBundleExtensionEngine.h"
19
+#include "IBundleExtension.h"
20
+
21
+#include "bextutil.h"
22
+#include "BextBundleExtensionEngine.h"