diff options
23 files changed, 317 insertions, 186 deletions
@@ -399,3 +399,5 @@ build/.tools/ | |||
399 | 399 | ||
400 | # Ignore generated test data | 400 | # Ignore generated test data |
401 | src/test/burn/TestData/CacheTests/BundleC/fivegb.file | 401 | src/test/burn/TestData/CacheTests/BundleC/fivegb.file |
402 | src/test/burn/TestData/Manual/BundleB/BAPayloads | ||
403 | src/test/burn/TestData/Manual/BundleB/PackagePayloads | ||
diff --git a/src/burn/engine/apply.cpp b/src/burn/engine/apply.cpp index a99a3987..c126d63c 100644 --- a/src/burn/engine/apply.cpp +++ b/src/burn/engine/apply.cpp | |||
@@ -1175,7 +1175,7 @@ static HRESULT ExtractContainer( | |||
1175 | { | 1175 | { |
1176 | BOOL fExtracted = FALSE; | 1176 | BOOL fExtracted = FALSE; |
1177 | 1177 | ||
1178 | hr = PayloadFindEmbeddedBySourcePath(pContext->pPayloads, sczStreamName, &pExtract); | 1178 | hr = PayloadFindEmbeddedBySourcePath(pContainer->sdhPayloads, sczStreamName, &pExtract); |
1179 | if (E_NOTFOUND != hr) | 1179 | if (E_NOTFOUND != hr) |
1180 | { | 1180 | { |
1181 | ExitOnFailure(hr, "Failed to find embedded payload by source path: %ls container: %ls", sczStreamName, pContainer->sczId); | 1181 | ExitOnFailure(hr, "Failed to find embedded payload by source path: %ls container: %ls", sczStreamName, pContainer->sczId); |
diff --git a/src/burn/engine/burnextension.cpp b/src/burn/engine/burnextension.cpp index 475df1c5..ee4b1542 100644 --- a/src/burn/engine/burnextension.cpp +++ b/src/burn/engine/burnextension.cpp | |||
@@ -26,6 +26,7 @@ EXTERN_C HRESULT BurnExtensionParseFromXml( | |||
26 | IXMLDOMNodeList* pixnNodes = NULL; | 26 | IXMLDOMNodeList* pixnNodes = NULL; |
27 | IXMLDOMNode* pixnNode = NULL; | 27 | IXMLDOMNode* pixnNode = NULL; |
28 | DWORD cNodes = 0; | 28 | DWORD cNodes = 0; |
29 | LPWSTR scz = NULL; | ||
29 | 30 | ||
30 | // Select BundleExtension nodes. | 31 | // Select BundleExtension nodes. |
31 | hr = XmlSelectNodes(pixnBundle, L"BundleExtension", &pixnNodes); | 32 | hr = XmlSelectNodes(pixnBundle, L"BundleExtension", &pixnNodes); |
@@ -59,11 +60,11 @@ EXTERN_C HRESULT BurnExtensionParseFromXml( | |||
59 | ExitOnFailure(hr, "Failed to get @Id."); | 60 | ExitOnFailure(hr, "Failed to get @Id."); |
60 | 61 | ||
61 | // @EntryPayloadId | 62 | // @EntryPayloadId |
62 | hr = XmlGetAttributeEx(pixnNode, L"EntryPayloadId", &pExtension->sczEntryPayloadId); | 63 | hr = XmlGetAttributeEx(pixnNode, L"EntryPayloadSourcePath", &scz); |
63 | ExitOnFailure(hr, "Failed to get @EntryPayloadId."); | 64 | ExitOnFailure(hr, "Failed to get @EntryPayloadSourcePath."); |
64 | 65 | ||
65 | hr = PayloadFindById(pBaPayloads, pExtension->sczEntryPayloadId, &pExtension->pEntryPayload); | 66 | hr = PayloadFindEmbeddedBySourcePath(pBaPayloads->sdhPayloads, scz, &pExtension->pEntryPayload); |
66 | ExitOnFailure(hr, "Failed to find BundleExtension EntryPayload '%ls'.", pExtension->sczEntryPayloadId); | 67 | ExitOnFailure(hr, "Failed to find BundleExtension EntryPayload '%ls'.", pExtension->sczId); |
67 | 68 | ||
68 | // prepare next iteration | 69 | // prepare next iteration |
69 | ReleaseNullObject(pixnNode); | 70 | ReleaseNullObject(pixnNode); |
@@ -72,6 +73,7 @@ EXTERN_C HRESULT BurnExtensionParseFromXml( | |||
72 | hr = S_OK; | 73 | hr = S_OK; |
73 | 74 | ||
74 | LExit: | 75 | LExit: |
76 | ReleaseStr(scz); | ||
75 | ReleaseObject(pixnNode); | 77 | ReleaseObject(pixnNode); |
76 | ReleaseObject(pixnNodes); | 78 | ReleaseObject(pixnNodes); |
77 | 79 | ||
@@ -92,7 +94,6 @@ EXTERN_C void BurnExtensionUninitialize( | |||
92 | { | 94 | { |
93 | BURN_EXTENSION* pExtension = &pBurnExtensions->rgExtensions[i]; | 95 | BURN_EXTENSION* pExtension = &pBurnExtensions->rgExtensions[i]; |
94 | 96 | ||
95 | ReleaseStr(pExtension->sczEntryPayloadId); | ||
96 | ReleaseStr(pExtension->sczId); | 97 | ReleaseStr(pExtension->sczId); |
97 | } | 98 | } |
98 | MemFree(pBurnExtensions->rgExtensions); | 99 | MemFree(pBurnExtensions->rgExtensions); |
diff --git a/src/burn/engine/burnextension.h b/src/burn/engine/burnextension.h index 370ddd2d..3529ef38 100644 --- a/src/burn/engine/burnextension.h +++ b/src/burn/engine/burnextension.h | |||
@@ -13,7 +13,6 @@ typedef struct _BURN_EXTENSION_ENGINE_CONTEXT BURN_EXTENSION_ENGINE_CONTEXT; | |||
13 | 13 | ||
14 | typedef struct _BURN_EXTENSION | 14 | typedef struct _BURN_EXTENSION |
15 | { | 15 | { |
16 | LPWSTR sczEntryPayloadId; | ||
17 | LPWSTR sczId; | 16 | LPWSTR sczId; |
18 | 17 | ||
19 | BURN_PAYLOAD* pEntryPayload; | 18 | BURN_PAYLOAD* pEntryPayload; |
diff --git a/src/burn/engine/container.cpp b/src/burn/engine/container.cpp index c6f2ada8..aa123927 100644 --- a/src/burn/engine/container.cpp +++ b/src/burn/engine/container.cpp | |||
@@ -35,7 +35,7 @@ extern "C" HRESULT ContainersParseFromXml( | |||
35 | 35 | ||
36 | pContainers->cContainers = cNodes; | 36 | pContainers->cContainers = cNodes; |
37 | 37 | ||
38 | // parse search elements | 38 | // parse container elements |
39 | for (DWORD i = 0; i < cNodes; ++i) | 39 | for (DWORD i = 0; i < cNodes; ++i) |
40 | { | 40 | { |
41 | BURN_CONTAINER* pContainer = &pContainers->rgContainers[i]; | 41 | BURN_CONTAINER* pContainer = &pContainers->rgContainers[i]; |
@@ -181,6 +181,7 @@ extern "C" void ContainersUninitialize( | |||
181 | ReleaseStr(pContainer->downloadSource.sczUser); | 181 | ReleaseStr(pContainer->downloadSource.sczUser); |
182 | ReleaseStr(pContainer->downloadSource.sczPassword); | 182 | ReleaseStr(pContainer->downloadSource.sczPassword); |
183 | ReleaseStr(pContainer->sczUnverifiedPath); | 183 | ReleaseStr(pContainer->sczUnverifiedPath); |
184 | ReleaseDict(pContainer->sdhPayloads); | ||
184 | } | 185 | } |
185 | MemFree(pContainers->rgContainers); | 186 | MemFree(pContainers->rgContainers); |
186 | } | 187 | } |
diff --git a/src/burn/engine/container.h b/src/burn/engine/container.h index d454a248..f35f1da5 100644 --- a/src/burn/engine/container.h +++ b/src/burn/engine/container.h | |||
@@ -72,6 +72,9 @@ typedef struct _BURN_CONTAINER | |||
72 | LPWSTR sczFilePath; // relative path to container. | 72 | LPWSTR sczFilePath; // relative path to container. |
73 | DOWNLOAD_SOURCE downloadSource; | 73 | DOWNLOAD_SOURCE downloadSource; |
74 | 74 | ||
75 | DWORD cParsedPayloads; | ||
76 | STRINGDICT_HANDLE sdhPayloads; // value is BURN_PAYLOAD* | ||
77 | |||
75 | BYTE* pbHash; | 78 | BYTE* pbHash; |
76 | DWORD cbHash; | 79 | DWORD cbHash; |
77 | BURN_CONTAINER_VERIFICATION verification; | 80 | BURN_CONTAINER_VERIFICATION verification; |
diff --git a/src/burn/engine/manifest.h b/src/burn/engine/manifest.h index 8c527279..40748c52 100644 --- a/src/burn/engine/manifest.h +++ b/src/burn/engine/manifest.h | |||
@@ -2,8 +2,6 @@ | |||
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. | 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 | 3 | ||
4 | 4 | ||
5 | interface IBurnPayload; // forward declare. | ||
6 | |||
7 | #if defined(__cplusplus) | 5 | #if defined(__cplusplus) |
8 | extern "C" { | 6 | extern "C" { |
9 | #endif | 7 | #endif |
diff --git a/src/burn/engine/payload.cpp b/src/burn/engine/payload.cpp index 84c32eec..e0362a76 100644 --- a/src/burn/engine/payload.cpp +++ b/src/burn/engine/payload.cpp | |||
@@ -5,13 +5,6 @@ | |||
5 | 5 | ||
6 | // internal function declarations | 6 | // internal function declarations |
7 | 7 | ||
8 | static HRESULT FindEmbeddedBySourcePath( | ||
9 | __in BURN_PAYLOADS* pPayloads, | ||
10 | __in_opt BURN_CONTAINER* pContainer, | ||
11 | __in_z LPCWSTR wzStreamName, | ||
12 | __out BURN_PAYLOAD** ppPayload | ||
13 | ); | ||
14 | |||
15 | 8 | ||
16 | // function definitions | 9 | // function definitions |
17 | 10 | ||
@@ -29,6 +22,7 @@ extern "C" HRESULT PayloadsParseFromXml( | |||
29 | LPWSTR scz = NULL; | 22 | LPWSTR scz = NULL; |
30 | BOOL fChainPayload = pContainers && pLayoutPayloads; // These are required when parsing chain payloads. | 23 | BOOL fChainPayload = pContainers && pLayoutPayloads; // These are required when parsing chain payloads. |
31 | BOOL fValidFileSize = FALSE; | 24 | BOOL fValidFileSize = FALSE; |
25 | size_t cByteOffset = fChainPayload ? offsetof(BURN_PAYLOAD, sczKey) : offsetof(BURN_PAYLOAD, sczSourcePath); | ||
32 | 26 | ||
33 | // select payload nodes | 27 | // select payload nodes |
34 | hr = XmlSelectNodes(pixnBundle, L"Payload", &pixnNodes); | 28 | hr = XmlSelectNodes(pixnBundle, L"Payload", &pixnNodes); |
@@ -49,7 +43,11 @@ extern "C" HRESULT PayloadsParseFromXml( | |||
49 | 43 | ||
50 | pPayloads->cPayloads = cNodes; | 44 | pPayloads->cPayloads = cNodes; |
51 | 45 | ||
52 | // parse search elements | 46 | // create dictionary for payloads |
47 | hr = DictCreateWithEmbeddedKey(&pPayloads->sdhPayloads, pPayloads->cPayloads, reinterpret_cast<void**>(&pPayloads->rgPayloads), cByteOffset, DICT_FLAG_NONE); | ||
48 | ExitOnFailure(hr, "Failed to create dictionary for payloads."); | ||
49 | |||
50 | // parse payload elements | ||
53 | for (DWORD i = 0; i < cNodes; ++i) | 51 | for (DWORD i = 0; i < cNodes; ++i) |
54 | { | 52 | { |
55 | BURN_PAYLOAD* pPayload = &pPayloads->rgPayloads[i]; | 53 | BURN_PAYLOAD* pPayload = &pPayloads->rgPayloads[i]; |
@@ -104,6 +102,8 @@ extern "C" HRESULT PayloadsParseFromXml( | |||
104 | // find container | 102 | // find container |
105 | hr = ContainerFindById(pContainers, scz, &pPayload->pContainer); | 103 | hr = ContainerFindById(pContainers, scz, &pPayload->pContainer); |
106 | ExitOnFailure(hr, "Failed to to find container: %ls", scz); | 104 | ExitOnFailure(hr, "Failed to to find container: %ls", scz); |
105 | |||
106 | pPayload->pContainer->cParsedPayloads += 1; | ||
107 | } | 107 | } |
108 | 108 | ||
109 | // @LayoutOnly | 109 | // @LayoutOnly |
@@ -190,12 +190,37 @@ extern "C" HRESULT PayloadsParseFromXml( | |||
190 | } | 190 | } |
191 | } | 191 | } |
192 | 192 | ||
193 | hr = DictAddValue(pPayloads->sdhPayloads, pPayload); | ||
194 | ExitOnFailure(hr, "Failed to add payload to payloads dictionary."); | ||
195 | |||
193 | // prepare next iteration | 196 | // prepare next iteration |
194 | ReleaseNullObject(pixnNode); | 197 | ReleaseNullObject(pixnNode); |
195 | } | 198 | } |
196 | 199 | ||
197 | hr = S_OK; | 200 | hr = S_OK; |
198 | 201 | ||
202 | if (pContainers && pContainers->cContainers) | ||
203 | { | ||
204 | for (DWORD i = 0; i < pPayloads->cPayloads; ++i) | ||
205 | { | ||
206 | BURN_PAYLOAD* pPayload = &pPayloads->rgPayloads[i]; | ||
207 | BURN_CONTAINER* pContainer = pPayload->pContainer; | ||
208 | |||
209 | if (!pContainer) | ||
210 | { | ||
211 | continue; | ||
212 | } | ||
213 | else if (!pContainer->sdhPayloads) | ||
214 | { | ||
215 | hr = DictCreateWithEmbeddedKey(&pContainer->sdhPayloads, pContainer->cParsedPayloads, NULL, offsetof(BURN_PAYLOAD, sczSourcePath), DICT_FLAG_NONE); | ||
216 | ExitOnFailure(hr, "Failed to create dictionary for container payloads."); | ||
217 | } | ||
218 | |||
219 | hr = DictAddValue(pContainer->sdhPayloads, pPayload); | ||
220 | ExitOnFailure(hr, "Failed to add payload to container dictionary."); | ||
221 | } | ||
222 | } | ||
223 | |||
199 | LExit: | 224 | LExit: |
200 | ReleaseObject(pixnNodes); | 225 | ReleaseObject(pixnNodes); |
201 | ReleaseObject(pixnNode); | 226 | ReleaseObject(pixnNode); |
@@ -237,6 +262,8 @@ extern "C" void PayloadsUninitialize( | |||
237 | MemFree(pPayloads->rgPayloads); | 262 | MemFree(pPayloads->rgPayloads); |
238 | } | 263 | } |
239 | 264 | ||
265 | ReleaseDict(pPayloads->sdhPayloads); | ||
266 | |||
240 | // clear struct | 267 | // clear struct |
241 | memset(pPayloads, 0, sizeof(BURN_PAYLOADS)); | 268 | memset(pPayloads, 0, sizeof(BURN_PAYLOADS)); |
242 | } | 269 | } |
@@ -265,7 +292,7 @@ extern "C" HRESULT PayloadExtractUXContainer( | |||
265 | ExitOnFailure(hr, "Failed to get next stream."); | 292 | ExitOnFailure(hr, "Failed to get next stream."); |
266 | 293 | ||
267 | // find payload by stream name | 294 | // find payload by stream name |
268 | hr = PayloadFindEmbeddedBySourcePath(pPayloads, sczStreamName, &pPayload); | 295 | hr = PayloadFindEmbeddedBySourcePath(pPayloads->sdhPayloads, sczStreamName, &pPayload); |
269 | ExitOnFailure(hr, "Failed to find embedded payload: %ls", sczStreamName); | 296 | ExitOnFailure(hr, "Failed to find embedded payload: %ls", sczStreamName); |
270 | 297 | ||
271 | // make file path | 298 | // make file path |
@@ -313,51 +340,22 @@ extern "C" HRESULT PayloadFindById( | |||
313 | ) | 340 | ) |
314 | { | 341 | { |
315 | HRESULT hr = S_OK; | 342 | HRESULT hr = S_OK; |
316 | BURN_PAYLOAD* pPayload = NULL; | ||
317 | 343 | ||
318 | for (DWORD i = 0; i < pPayloads->cPayloads; ++i) | 344 | hr = DictGetValue(pPayloads->sdhPayloads, wzId, reinterpret_cast<void**>(ppPayload)); |
319 | { | ||
320 | pPayload = &pPayloads->rgPayloads[i]; | ||
321 | |||
322 | if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, pPayload->sczKey, -1, wzId, -1)) | ||
323 | { | ||
324 | *ppPayload = pPayload; | ||
325 | ExitFunction1(hr = S_OK); | ||
326 | } | ||
327 | } | ||
328 | 345 | ||
329 | hr = E_NOTFOUND; | ||
330 | |||
331 | LExit: | ||
332 | return hr; | 346 | return hr; |
333 | } | 347 | } |
334 | 348 | ||
335 | extern "C" HRESULT PayloadFindEmbeddedBySourcePath( | 349 | extern "C" HRESULT PayloadFindEmbeddedBySourcePath( |
336 | __in BURN_PAYLOADS* pPayloads, | 350 | __in STRINGDICT_HANDLE sdhPayloads, |
337 | __in_z LPCWSTR wzStreamName, | 351 | __in_z LPCWSTR wzStreamName, |
338 | __out BURN_PAYLOAD** ppPayload | 352 | __out BURN_PAYLOAD** ppPayload |
339 | ) | 353 | ) |
340 | { | 354 | { |
341 | HRESULT hr = S_OK; | 355 | HRESULT hr = S_OK; |
342 | BURN_PAYLOAD* pPayload = NULL; | ||
343 | 356 | ||
344 | for (DWORD i = 0; i < pPayloads->cPayloads; ++i) | 357 | hr = DictGetValue(sdhPayloads, wzStreamName, reinterpret_cast<void**>(ppPayload)); |
345 | { | ||
346 | pPayload = &pPayloads->rgPayloads[i]; | ||
347 | |||
348 | if (BURN_PAYLOAD_PACKAGING_EMBEDDED == pPayload->packaging) | ||
349 | { | ||
350 | if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, pPayload->sczSourcePath, -1, wzStreamName, -1)) | ||
351 | { | ||
352 | *ppPayload = pPayload; | ||
353 | ExitFunction1(hr = S_OK); | ||
354 | } | ||
355 | } | ||
356 | } | ||
357 | 358 | ||
358 | hr = E_NOTFOUND; | ||
359 | |||
360 | LExit: | ||
361 | return hr; | 359 | return hr; |
362 | } | 360 | } |
363 | 361 | ||
diff --git a/src/burn/engine/payload.h b/src/burn/engine/payload.h index c12fbe66..14738506 100644 --- a/src/burn/engine/payload.h +++ b/src/burn/engine/payload.h | |||
@@ -66,6 +66,7 @@ typedef struct _BURN_PAYLOADS | |||
66 | { | 66 | { |
67 | BURN_PAYLOAD* rgPayloads; | 67 | BURN_PAYLOAD* rgPayloads; |
68 | DWORD cPayloads; | 68 | DWORD cPayloads; |
69 | STRINGDICT_HANDLE sdhPayloads; // value is BURN_PAYLOAD* | ||
69 | } BURN_PAYLOADS; | 70 | } BURN_PAYLOADS; |
70 | 71 | ||
71 | typedef struct _BURN_PAYLOAD_GROUP_ITEM | 72 | typedef struct _BURN_PAYLOAD_GROUP_ITEM |
@@ -109,7 +110,7 @@ HRESULT PayloadFindById( | |||
109 | __out BURN_PAYLOAD** ppPayload | 110 | __out BURN_PAYLOAD** ppPayload |
110 | ); | 111 | ); |
111 | HRESULT PayloadFindEmbeddedBySourcePath( | 112 | HRESULT PayloadFindEmbeddedBySourcePath( |
112 | __in BURN_PAYLOADS* pPayloads, | 113 | __in STRINGDICT_HANDLE sdhPayloads, |
113 | __in_z LPCWSTR wzStreamName, | 114 | __in_z LPCWSTR wzStreamName, |
114 | __out BURN_PAYLOAD** ppPayload | 115 | __out BURN_PAYLOAD** ppPayload |
115 | ); | 116 | ); |
diff --git a/src/burn/engine/userexperience.h b/src/burn/engine/userexperience.h index 6a5ae697..584bef14 100644 --- a/src/burn/engine/userexperience.h +++ b/src/burn/engine/userexperience.h | |||
@@ -15,7 +15,7 @@ const DWORD MB_RETRYTRYAGAIN = 0xF; | |||
15 | 15 | ||
16 | // structs | 16 | // structs |
17 | 17 | ||
18 | typedef struct _BOOTSTRAPPER_ENGINE_CONTEXT BOOTSTRAPPER_ENGINE_CONTEXT; | 18 | typedef struct _BOOTSTRAPPER_ENGINE_CONTEXT BOOTSTRAPPER_ENGINE_CONTEXT; // forward declare |
19 | 19 | ||
20 | typedef struct _BURN_USER_EXPERIENCE | 20 | typedef struct _BURN_USER_EXPERIENCE |
21 | { | 21 | { |
diff --git a/src/libs/dutil/WixToolset.DUtil/dictutil.cpp b/src/libs/dutil/WixToolset.DUtil/dictutil.cpp index 0d0743eb..09b150df 100644 --- a/src/libs/dutil/WixToolset.DUtil/dictutil.cpp +++ b/src/libs/dutil/WixToolset.DUtil/dictutil.cpp | |||
@@ -72,6 +72,14 @@ struct STRINGDICT_STRUCT | |||
72 | 72 | ||
73 | const int STRINGDICT_HANDLE_BYTES = sizeof(STRINGDICT_STRUCT); | 73 | const int STRINGDICT_HANDLE_BYTES = sizeof(STRINGDICT_STRUCT); |
74 | 74 | ||
75 | static HRESULT CreateDict( | ||
76 | __out_bcount(STRINGDICT_HANDLE_BYTES) STRINGDICT_HANDLE* psdHandle, | ||
77 | __in DICT_TYPE dtType, | ||
78 | __in DWORD dwNumExpectedItems, | ||
79 | __in_opt void** ppvArray, | ||
80 | __in size_t cByteOffset, | ||
81 | __in DICT_FLAG dfFlags | ||
82 | ); | ||
75 | static HRESULT StringHash( | 83 | static HRESULT StringHash( |
76 | __in const STRINGDICT_STRUCT *psd, | 84 | __in const STRINGDICT_STRUCT *psd, |
77 | __in DWORD dwNumBuckets, | 85 | __in DWORD dwNumBuckets, |
@@ -135,41 +143,7 @@ extern "C" HRESULT DAPI DictCreateWithEmbeddedKey( | |||
135 | __in DICT_FLAG dfFlags | 143 | __in DICT_FLAG dfFlags |
136 | ) | 144 | ) |
137 | { | 145 | { |
138 | HRESULT hr = S_OK; | 146 | return CreateDict(psdHandle, DICT_EMBEDDED_KEY, dwNumExpectedItems, ppvArray, cByteOffset, dfFlags); |
139 | |||
140 | DictExitOnNull(psdHandle, hr, E_INVALIDARG, "Handle not specified while creating dict"); | ||
141 | |||
142 | // Allocate the handle | ||
143 | *psdHandle = static_cast<STRINGDICT_HANDLE>(MemAlloc(sizeof(STRINGDICT_STRUCT), FALSE)); | ||
144 | DictExitOnNull(*psdHandle, hr, E_OUTOFMEMORY, "Failed to allocate dictionary object"); | ||
145 | |||
146 | STRINGDICT_STRUCT *psd = static_cast<STRINGDICT_STRUCT *>(*psdHandle); | ||
147 | |||
148 | // Fill out the new handle's values | ||
149 | psd->dtType = DICT_EMBEDDED_KEY; | ||
150 | psd->dfFlags = dfFlags; | ||
151 | psd->cByteOffset = cByteOffset; | ||
152 | psd->dwBucketSizeIndex = 0; | ||
153 | psd->dwNumItems = 0; | ||
154 | psd->ppvItemList = NULL; | ||
155 | psd->ppvValueArray = ppvArray; | ||
156 | |||
157 | // Make psd->dwBucketSizeIndex point to the appropriate spot in the prime | ||
158 | // array based on expected number of items and items to buckets ratio | ||
159 | // Careful: the "-1" in "countof(MAX_BUCKET_SIZES)-1" ensures we don't end | ||
160 | // this loop past the end of the array! | ||
161 | while (psd->dwBucketSizeIndex < (countof(MAX_BUCKET_SIZES)-1) && | ||
162 | MAX_BUCKET_SIZES[psd->dwBucketSizeIndex] < dwNumExpectedItems * MAX_BUCKETS_TO_ITEMS_RATIO) | ||
163 | { | ||
164 | ++psd->dwBucketSizeIndex; | ||
165 | } | ||
166 | |||
167 | // Finally, allocate our initial buckets | ||
168 | psd->ppvBuckets = static_cast<void**>(MemAlloc(sizeof(void *) * MAX_BUCKET_SIZES[psd->dwBucketSizeIndex], TRUE)); | ||
169 | DictExitOnNull(psd->ppvBuckets, hr, E_OUTOFMEMORY, "Failed to allocate buckets for dictionary"); | ||
170 | |||
171 | LExit: | ||
172 | return hr; | ||
173 | } | 147 | } |
174 | 148 | ||
175 | // The dict will store a set of keys, with no values associated with them. Use DictAddKey() and DictKeyExists() with this dictionary type. | 149 | // The dict will store a set of keys, with no values associated with them. Use DictAddKey() and DictKeyExists() with this dictionary type. |
@@ -179,41 +153,7 @@ extern "C" HRESULT DAPI DictCreateStringList( | |||
179 | __in DICT_FLAG dfFlags | 153 | __in DICT_FLAG dfFlags |
180 | ) | 154 | ) |
181 | { | 155 | { |
182 | HRESULT hr = S_OK; | 156 | return CreateDict(psdHandle, DICT_STRING_LIST, dwNumExpectedItems, NULL, 0, dfFlags); |
183 | |||
184 | DictExitOnNull(psdHandle, hr, E_INVALIDARG, "Handle not specified while creating dict"); | ||
185 | |||
186 | // Allocate the handle | ||
187 | *psdHandle = static_cast<STRINGDICT_HANDLE>(MemAlloc(sizeof(STRINGDICT_STRUCT), FALSE)); | ||
188 | DictExitOnNull(*psdHandle, hr, E_OUTOFMEMORY, "Failed to allocate dictionary object"); | ||
189 | |||
190 | STRINGDICT_STRUCT *psd = static_cast<STRINGDICT_STRUCT *>(*psdHandle); | ||
191 | |||
192 | // Fill out the new handle's values | ||
193 | psd->dtType = DICT_STRING_LIST; | ||
194 | psd->dfFlags = dfFlags; | ||
195 | psd->cByteOffset = 0; | ||
196 | psd->dwBucketSizeIndex = 0; | ||
197 | psd->dwNumItems = 0; | ||
198 | psd->ppvItemList = NULL; | ||
199 | psd->ppvValueArray = NULL; | ||
200 | |||
201 | // Make psd->dwBucketSizeIndex point to the appropriate spot in the prime | ||
202 | // array based on expected number of items and items to buckets ratio | ||
203 | // Careful: the "-1" in "countof(MAX_BUCKET_SIZES)-1" ensures we don't end | ||
204 | // this loop past the end of the array! | ||
205 | while (psd->dwBucketSizeIndex < (countof(MAX_BUCKET_SIZES)-1) && | ||
206 | MAX_BUCKET_SIZES[psd->dwBucketSizeIndex] < dwNumExpectedItems * MAX_BUCKETS_TO_ITEMS_RATIO) | ||
207 | { | ||
208 | ++psd->dwBucketSizeIndex; | ||
209 | } | ||
210 | |||
211 | // Finally, allocate our initial buckets | ||
212 | psd->ppvBuckets = static_cast<void**>(MemAlloc(sizeof(void *) * MAX_BUCKET_SIZES[psd->dwBucketSizeIndex], TRUE)); | ||
213 | DictExitOnNull(psd->ppvBuckets, hr, E_OUTOFMEMORY, "Failed to allocate buckets for dictionary"); | ||
214 | |||
215 | LExit: | ||
216 | return hr; | ||
217 | } | 157 | } |
218 | 158 | ||
219 | extern "C" HRESULT DAPI DictCreateStringListFromArray( | 159 | extern "C" HRESULT DAPI DictCreateStringListFromArray( |
@@ -467,6 +407,54 @@ extern "C" void DAPI DictDestroy( | |||
467 | ReleaseMem(psd); | 407 | ReleaseMem(psd); |
468 | } | 408 | } |
469 | 409 | ||
410 | static HRESULT CreateDict( | ||
411 | __out_bcount(STRINGDICT_HANDLE_BYTES) STRINGDICT_HANDLE* psdHandle, | ||
412 | __in DICT_TYPE dtType, | ||
413 | __in DWORD dwNumExpectedItems, | ||
414 | __in_opt void** ppvArray, | ||
415 | __in size_t cByteOffset, | ||
416 | __in DICT_FLAG dfFlags | ||
417 | ) | ||
418 | { | ||
419 | HRESULT hr = S_OK; | ||
420 | |||
421 | DictExitOnNull(psdHandle, hr, E_INVALIDARG, "Handle not specified while creating dict."); | ||
422 | |||
423 | // Allocate the handle | ||
424 | *psdHandle = static_cast<STRINGDICT_HANDLE>(MemAlloc(sizeof(STRINGDICT_STRUCT), TRUE)); | ||
425 | DictExitOnNull(*psdHandle, hr, E_OUTOFMEMORY, "Failed to allocate dictionary object."); | ||
426 | |||
427 | STRINGDICT_STRUCT* psd = static_cast<STRINGDICT_STRUCT*>(*psdHandle); | ||
428 | |||
429 | // Fill out the new handle's values | ||
430 | psd->dtType = dtType; | ||
431 | psd->dfFlags = dfFlags; | ||
432 | psd->cByteOffset = cByteOffset; | ||
433 | psd->ppvValueArray = ppvArray; | ||
434 | |||
435 | // Make psd->dwBucketSizeIndex point to the appropriate spot in the prime | ||
436 | // array based on expected number of items and items to buckets ratio | ||
437 | // Careful: the "-1" in "countof(MAX_BUCKET_SIZES)-1" ensures we don't end | ||
438 | // this loop past the end of the array! | ||
439 | while (psd->dwBucketSizeIndex < (countof(MAX_BUCKET_SIZES) - 1) && | ||
440 | MAX_BUCKET_SIZES[psd->dwBucketSizeIndex] < dwNumExpectedItems * MAX_BUCKETS_TO_ITEMS_RATIO) | ||
441 | { | ||
442 | ++psd->dwBucketSizeIndex; | ||
443 | } | ||
444 | |||
445 | hr = MemAllocArray(reinterpret_cast<LPVOID*>(&psd->ppvBuckets), sizeof(void*), MAX_BUCKET_SIZES[psd->dwBucketSizeIndex]); | ||
446 | DictExitOnFailure(hr, "Failed to allocate buckets for dictionary."); | ||
447 | |||
448 | if (dwNumExpectedItems) | ||
449 | { | ||
450 | hr = MemAllocArray(reinterpret_cast<LPVOID*>(&psd->ppvItemList), sizeof(void*), dwNumExpectedItems); | ||
451 | DictExitOnFailure(hr, "Failed to pre-allocate item list for dictionary."); | ||
452 | } | ||
453 | |||
454 | LExit: | ||
455 | return hr; | ||
456 | } | ||
457 | |||
470 | static HRESULT StringHash( | 458 | static HRESULT StringHash( |
471 | __in const STRINGDICT_STRUCT *psd, | 459 | __in const STRINGDICT_STRUCT *psd, |
472 | __in DWORD dwNumBuckets, | 460 | __in DWORD dwNumBuckets, |
diff --git a/src/test/burn/TestData/Manual/BundleB/Bundle.wxs b/src/test/burn/TestData/Manual/BundleB/Bundle.wxs new file mode 100644 index 00000000..615d4b1d --- /dev/null +++ b/src/test/burn/TestData/Manual/BundleB/Bundle.wxs | |||
@@ -0,0 +1,56 @@ | |||
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 | <?ifndef Version?> | ||
4 | <?define Version = 1.0.0.0?> | ||
5 | <?endif?> | ||
6 | |||
7 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal"> | ||
8 | <!-- The only difference from the template should be the SplashScreen --> | ||
9 | <Bundle Name="~$(var.TestGroupName) - $(var.BundleName)" Version="$(var.Version)" UpgradeCode="$(var.UpgradeCode)" Compressed="yes" SplashScreenSourceFile="..\BafThmutilTesting\theme\star_transparent.bmp"> | ||
10 | <Log Prefix="~$(var.TestGroupName)_$(var.BundleName)" /> | ||
11 | |||
12 | <Variable Name="TestGroupName" Value="$(var.TestGroupName)" /> | ||
13 | |||
14 | <?ifdef SoftwareTag?> | ||
15 | <SoftwareTag Regid="regid.1995-08.com.example" InstallPath="[CommonAppDataFolder]regid.1995-08.com.example" /> | ||
16 | <?endif?> | ||
17 | |||
18 | <?ifndef BA?> | ||
19 | <!-- pulled in through the PackageGroupRef below --> | ||
20 | <?elseif $(var.BA) = "TestBAdnc"?> | ||
21 | <!-- pulled in through the PackageGroupRef below --> | ||
22 | <?elseif $(var.BA) = "TestBA_x64"?> | ||
23 | <!-- pulled in through the PackageGroupRef below --> | ||
24 | <?elseif $(var.BA) = "TestBAdnc_x64"?> | ||
25 | <!-- pulled in through the PackageGroupRef below --> | ||
26 | <?elseif $(var.BA) = "WixBA"?> | ||
27 | <!-- pulled in through the PackageGroupRef below --> | ||
28 | <?elseif $(var.BA) = "WixBAdnc_x64"?> | ||
29 | <!-- pulled in through the PackageGroupRef below --> | ||
30 | <?elseif $(var.BA) = "hyperlinkLicense"?> | ||
31 | <BootstrapperApplication> | ||
32 | <bal:WixStandardBootstrapperApplication LicenseUrl="" Theme="hyperlinkLicense" /> | ||
33 | </BootstrapperApplication> | ||
34 | <?else?> | ||
35 | <BootstrapperApplicationRef Id="$(var.BA)" /> | ||
36 | <?endif?> | ||
37 | |||
38 | <Chain> | ||
39 | <?ifndef BA?> | ||
40 | <PackageGroupRef Id="TestBA" /> | ||
41 | <?elseif $(var.BA) = "TestBAdnc"?> | ||
42 | <PackageGroupRef Id="TestBAdnc" /> | ||
43 | <?elseif $(var.BA) = "TestBA_x64"?> | ||
44 | <PackageGroupRef Id="TestBA_x64" /> | ||
45 | <?elseif $(var.BA) = "TestBAdnc_x64"?> | ||
46 | <PackageGroupRef Id="TestBAdnc_x64" /> | ||
47 | <?elseif $(var.BA) = "WixBA"?> | ||
48 | <PackageGroupRef Id="WixBA" /> | ||
49 | <?elseif $(var.BA) = "WixBAdnc_x64"?> | ||
50 | <PackageGroupRef Id="WixBAdnc_x64" /> | ||
51 | <?endif?> | ||
52 | |||
53 | <PackageGroupRef Id="BundlePackages" /> | ||
54 | </Chain> | ||
55 | </Bundle> | ||
56 | </Wix> | ||
diff --git a/src/test/burn/TestData/Manual/BundleB/BundleB.wixproj b/src/test/burn/TestData/Manual/BundleB/BundleB.wixproj new file mode 100644 index 00000000..35c92246 --- /dev/null +++ b/src/test/burn/TestData/Manual/BundleB/BundleB.wixproj | |||
@@ -0,0 +1,32 @@ | |||
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 | <Project Sdk="WixToolset.Sdk"> | ||
3 | <PropertyGroup> | ||
4 | <OutputType>Bundle</OutputType> | ||
5 | <BA>hyperlinkLicense</BA> | ||
6 | <UpgradeCode>{5DE2F206-3C37-4265-81F7-095284E16B08}</UpgradeCode> | ||
7 | <HarvestDirectoryAdditionalOptions>-generate payloadgroup</HarvestDirectoryAdditionalOptions> | ||
8 | </PropertyGroup> | ||
9 | <ItemGroup> | ||
10 | <HarvestDirectory Include="BAPayloads"> | ||
11 | <ComponentGroupName>BAPayloads</ComponentGroupName> | ||
12 | <DirectoryRefId>BAPayloads</DirectoryRefId> | ||
13 | <Transforms>ba.xslt</Transforms> | ||
14 | </HarvestDirectory> | ||
15 | <HarvestDirectory Include="PackagePayloads"> | ||
16 | <ComponentGroupName>PackagePayloads</ComponentGroupName> | ||
17 | <DirectoryRefId>PackagePayloads</DirectoryRefId> | ||
18 | <Transforms>package.xslt</Transforms> | ||
19 | </HarvestDirectory> | ||
20 | </ItemGroup> | ||
21 | <ItemGroup> | ||
22 | <ProjectReference Include="..\PackageA\PackageA.wixproj" /> | ||
23 | </ItemGroup> | ||
24 | <ItemGroup> | ||
25 | <PackageReference Include="WixToolset.Bal.wixext" /> | ||
26 | </ItemGroup> | ||
27 | <!-- We do this dynamically to avoid committing so many files to source control. --> | ||
28 | <Target Name="CreateThousandsOfFiles" AfterTargets="BeforeBuild"> | ||
29 | <Exec Command='"$(BaseOutputPath)$(Configuration)\netcoreapp3.1\win-x86\testexe.exe" /gf "BAPayloads|10000' WorkingDirectory="$(MSBuildProjectDirectory)" /> | ||
30 | <Exec Command='"$(BaseOutputPath)$(Configuration)\netcoreapp3.1\win-x86\testexe.exe" /gf "PackagePayloads|10000' WorkingDirectory="$(MSBuildProjectDirectory)" /> | ||
31 | </Target> | ||
32 | </Project> \ No newline at end of file | ||
diff --git a/src/test/burn/TestData/Manual/BundleB/BundleB.wxs b/src/test/burn/TestData/Manual/BundleB/BundleB.wxs new file mode 100644 index 00000000..3b189b15 --- /dev/null +++ b/src/test/burn/TestData/Manual/BundleB/BundleB.wxs | |||
@@ -0,0 +1,15 @@ | |||
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 | |||
4 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal"> | ||
5 | <Fragment> | ||
6 | <BootstrapperApplication> | ||
7 | <PayloadGroupRef Id="BAPayloads" /> | ||
8 | </BootstrapperApplication> | ||
9 | <PackageGroup Id="BundlePackages"> | ||
10 | <MsiPackage Id="PackageA" SourceFile="$(var.PackageA.TargetPath)"> | ||
11 | <PayloadGroupRef Id="PackagePayloads" /> | ||
12 | </MsiPackage> | ||
13 | </PackageGroup> | ||
14 | </Fragment> | ||
15 | </Wix> | ||
diff --git a/src/test/burn/TestData/Manual/BundleB/ba.xslt b/src/test/burn/TestData/Manual/BundleB/ba.xslt new file mode 100644 index 00000000..54bc7fe6 --- /dev/null +++ b/src/test/burn/TestData/Manual/BundleB/ba.xslt | |||
@@ -0,0 +1,21 @@ | |||
1 | <?xml version="1.0" encoding="utf-8"?> | ||
2 | <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" | ||
3 | xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" | ||
4 | xmlns:wix="http://wixtoolset.org/schemas/v4/wxs" | ||
5 | > | ||
6 | <xsl:output method="xml" indent="yes"/> | ||
7 | |||
8 | <xsl:template match="@* | node()"> | ||
9 | <xsl:copy> | ||
10 | <xsl:apply-templates select="@* | node()"/> | ||
11 | </xsl:copy> | ||
12 | </xsl:template> | ||
13 | |||
14 | <xsl:template match="wix:Payload" > | ||
15 | <xsl:copy> | ||
16 | <xsl:apply-templates select="@* | node()"/> | ||
17 | <xsl:attribute name="Id">ba_<xsl:value-of select="substring(@SourceFile, 11)" /></xsl:attribute> | ||
18 | <xsl:attribute name="SourceFile">BAPayloads<xsl:value-of select="substring(@SourceFile, 10)" /></xsl:attribute> | ||
19 | </xsl:copy> | ||
20 | </xsl:template> | ||
21 | </xsl:stylesheet> | ||
diff --git a/src/test/burn/TestData/Manual/BundleB/package.xslt b/src/test/burn/TestData/Manual/BundleB/package.xslt new file mode 100644 index 00000000..304ff78b --- /dev/null +++ b/src/test/burn/TestData/Manual/BundleB/package.xslt | |||
@@ -0,0 +1,21 @@ | |||
1 | <?xml version="1.0" encoding="utf-8"?> | ||
2 | <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" | ||
3 | xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" | ||
4 | xmlns:wix="http://wixtoolset.org/schemas/v4/wxs" | ||
5 | > | ||
6 | <xsl:output method="xml" indent="yes"/> | ||
7 | |||
8 | <xsl:template match="@* | node()"> | ||
9 | <xsl:copy> | ||
10 | <xsl:apply-templates select="@* | node()"/> | ||
11 | </xsl:copy> | ||
12 | </xsl:template> | ||
13 | |||
14 | <xsl:template match="wix:Payload" > | ||
15 | <xsl:copy> | ||
16 | <xsl:apply-templates select="@* | node()"/> | ||
17 | <xsl:attribute name="Id">package_<xsl:value-of select="substring(@SourceFile, 11)" /></xsl:attribute> | ||
18 | <xsl:attribute name="SourceFile">PackagePayloads<xsl:value-of select="substring(@SourceFile, 10)" /></xsl:attribute> | ||
19 | </xsl:copy> | ||
20 | </xsl:template> | ||
21 | </xsl:stylesheet> | ||
diff --git a/src/test/burn/TestExe/Task.cs b/src/test/burn/TestExe/Task.cs index 7d39bfd9..59f774fb 100644 --- a/src/test/burn/TestExe/Task.cs +++ b/src/test/burn/TestExe/Task.cs | |||
@@ -59,6 +59,24 @@ namespace TestExe | |||
59 | } | 59 | } |
60 | } | 60 | } |
61 | 61 | ||
62 | public class GenerateFilesTask : Task | ||
63 | { | ||
64 | public GenerateFilesTask(string Data) : base(Data) { } | ||
65 | |||
66 | public override void RunTask() | ||
67 | { | ||
68 | string[] tokens = this.data.Split(new char[] { '|' }, 2); | ||
69 | string folderPath = System.Environment.ExpandEnvironmentVariables(tokens[0]); | ||
70 | long size = long.Parse(tokens[1]); | ||
71 | Directory.CreateDirectory(folderPath); | ||
72 | var bytes = new byte[0]; | ||
73 | for (long i = 1; i <= size; i++) | ||
74 | { | ||
75 | File.WriteAllBytes(Path.Combine(folderPath, $"{i}.txt"), bytes); | ||
76 | } | ||
77 | } | ||
78 | } | ||
79 | |||
62 | public class LargeFileTask : Task | 80 | public class LargeFileTask : Task |
63 | { | 81 | { |
64 | public LargeFileTask(string Data) : base(Data) { } | 82 | public LargeFileTask(string Data) : base(Data) { } |
@@ -163,6 +181,10 @@ namespace TestExe | |||
163 | t = new SleepRandomTask(args[i + 1]); | 181 | t = new SleepRandomTask(args[i + 1]); |
164 | tasks.Add(t); | 182 | tasks.Add(t); |
165 | break; | 183 | break; |
184 | case "/gf": | ||
185 | t = new GenerateFilesTask(args[i + 1]); | ||
186 | tasks.Add(t); | ||
187 | break; | ||
166 | case "/lf": | 188 | case "/lf": |
167 | t = new LargeFileTask(args[i + 1]); | 189 | t = new LargeFileTask(args[i + 1]); |
168 | tasks.Add(t); | 190 | tasks.Add(t); |
diff --git a/src/wix/WixToolset.Core.Burn/Bind/BindBundleCommand.cs b/src/wix/WixToolset.Core.Burn/Bind/BindBundleCommand.cs index 4a4f06f3..97007022 100644 --- a/src/wix/WixToolset.Core.Burn/Bind/BindBundleCommand.cs +++ b/src/wix/WixToolset.Core.Burn/Bind/BindBundleCommand.cs | |||
@@ -239,15 +239,18 @@ namespace WixToolset.Core.Burn | |||
239 | { | 239 | { |
240 | foreach (var facade in facades.Values) | 240 | foreach (var facade in facades.Values) |
241 | { | 241 | { |
242 | facade.PackageSymbol.Size = 0; | 242 | // Use temporary variable to avoid excessive number of PreviousValues. |
243 | long packageSize = 0; | ||
243 | 244 | ||
244 | var packagePayloads = packagesPayloads[facade.PackageId]; | 245 | var packagePayloads = packagesPayloads[facade.PackageId]; |
245 | 246 | ||
246 | foreach (var payload in packagePayloads.Values) | 247 | foreach (var payload in packagePayloads.Values) |
247 | { | 248 | { |
248 | facade.PackageSymbol.Size += payload.FileSize.Value; | 249 | packageSize += payload.FileSize.Value; |
249 | } | 250 | } |
250 | 251 | ||
252 | facade.PackageSymbol.Size = packageSize; | ||
253 | |||
251 | if (!facade.PackageSymbol.InstallSize.HasValue) | 254 | if (!facade.PackageSymbol.InstallSize.HasValue) |
252 | { | 255 | { |
253 | facade.PackageSymbol.InstallSize = facade.PackageSymbol.Size; | 256 | facade.PackageSymbol.InstallSize = facade.PackageSymbol.Size; |
diff --git a/src/wix/WixToolset.Core.Burn/Bundles/CreateBurnManifestCommand.cs b/src/wix/WixToolset.Core.Burn/Bundles/CreateBurnManifestCommand.cs index 429b3565..5a7241ab 100644 --- a/src/wix/WixToolset.Core.Burn/Bundles/CreateBurnManifestCommand.cs +++ b/src/wix/WixToolset.Core.Burn/Bundles/CreateBurnManifestCommand.cs | |||
@@ -604,12 +604,15 @@ namespace WixToolset.Core.Burn.Bundles | |||
604 | 604 | ||
605 | // Write the BundleExtension elements. | 605 | // Write the BundleExtension elements. |
606 | var bundleExtensions = this.Section.Symbols.OfType<WixBundleExtensionSymbol>(); | 606 | var bundleExtensions = this.Section.Symbols.OfType<WixBundleExtensionSymbol>(); |
607 | var uxPayloadsById = this.UXContainerPayloads.ToDictionary(p => p.Id.Id); | ||
607 | 608 | ||
608 | foreach (var bundleExtension in bundleExtensions) | 609 | foreach (var bundleExtension in bundleExtensions) |
609 | { | 610 | { |
611 | var entryPayload = uxPayloadsById[bundleExtension.PayloadRef]; | ||
612 | |||
610 | writer.WriteStartElement("BundleExtension"); | 613 | writer.WriteStartElement("BundleExtension"); |
611 | writer.WriteAttributeString("Id", bundleExtension.Id.Id); | 614 | writer.WriteAttributeString("Id", bundleExtension.Id.Id); |
612 | writer.WriteAttributeString("EntryPayloadId", bundleExtension.PayloadRef); | 615 | writer.WriteAttributeString("EntryPayloadSourcePath", entryPayload.EmbeddedId); |
613 | 616 | ||
614 | writer.WriteEndElement(); | 617 | writer.WriteEndElement(); |
615 | } | 618 | } |
diff --git a/src/wix/WixToolset.Core/Compile/CompilerPayload.cs b/src/wix/WixToolset.Core/Compile/CompilerPayload.cs index 3f423034..ea63ee8c 100644 --- a/src/wix/WixToolset.Core/Compile/CompilerPayload.cs +++ b/src/wix/WixToolset.Core/Compile/CompilerPayload.cs | |||
@@ -143,7 +143,7 @@ namespace WixToolset.Core | |||
143 | } | 143 | } |
144 | } | 144 | } |
145 | 145 | ||
146 | public WixBundlePayloadSymbol CreatePayloadSymbol(ComplexReferenceParentType parentType, string parentId, ComplexReferenceChildType previousType = ComplexReferenceChildType.Unknown, string previousId = null) | 146 | public WixBundlePayloadSymbol CreatePayloadSymbol(ComplexReferenceParentType parentType, string parentId) |
147 | { | 147 | { |
148 | WixBundlePayloadSymbol symbol = null; | 148 | WixBundlePayloadSymbol symbol = null; |
149 | 149 | ||
@@ -179,7 +179,7 @@ namespace WixToolset.Core | |||
179 | Version = this.Version, | 179 | Version = this.Version, |
180 | }); | 180 | }); |
181 | 181 | ||
182 | this.Core.CreateGroupAndOrderingRows(this.SourceLineNumbers, parentType, parentId, ComplexReferenceChildType.Payload, symbol.Id.Id, previousType, previousId); | 182 | this.Core.CreateGroupAndOrderingRows(this.SourceLineNumbers, parentType, parentId, ComplexReferenceChildType.Payload, symbol.Id.Id, ComplexReferenceChildType.Unknown, null); |
183 | } | 183 | } |
184 | 184 | ||
185 | return symbol; | 185 | return symbol; |
diff --git a/src/wix/WixToolset.Core/Compiler_Bundle.cs b/src/wix/WixToolset.Core/Compiler_Bundle.cs index 3e238b82..a72d434d 100644 --- a/src/wix/WixToolset.Core/Compiler_Bundle.cs +++ b/src/wix/WixToolset.Core/Compiler_Bundle.cs | |||
@@ -351,7 +351,7 @@ namespace WixToolset.Core | |||
351 | this.ParsePayloadGroupElement(child, ComplexReferenceParentType.Layout, Compiler.BundleLayoutOnlyPayloads); | 351 | this.ParsePayloadGroupElement(child, ComplexReferenceParentType.Layout, Compiler.BundleLayoutOnlyPayloads); |
352 | break; | 352 | break; |
353 | case "PayloadGroupRef": | 353 | case "PayloadGroupRef": |
354 | this.ParsePayloadGroupRefElement(child, ComplexReferenceParentType.Layout, Compiler.BundleLayoutOnlyPayloads, ComplexReferenceChildType.Unknown, null); | 354 | this.ParsePayloadGroupRefElement(child, ComplexReferenceParentType.Layout, Compiler.BundleLayoutOnlyPayloads); |
355 | break; | 355 | break; |
356 | case "RelatedBundle": | 356 | case "RelatedBundle": |
357 | this.ParseRelatedBundleElement(child); | 357 | this.ParseRelatedBundleElement(child); |
@@ -649,8 +649,6 @@ namespace WixToolset.Core | |||
649 | { | 649 | { |
650 | var sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node); | 650 | var sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node); |
651 | Identifier id = null; | 651 | Identifier id = null; |
652 | Identifier previousId = null; | ||
653 | var previousType = ComplexReferenceChildType.Unknown; | ||
654 | 652 | ||
655 | foreach (var attrib in node.Attributes()) | 653 | foreach (var attrib in node.Attributes()) |
656 | { | 654 | { |
@@ -675,16 +673,13 @@ namespace WixToolset.Core | |||
675 | switch (child.Name.LocalName) | 673 | switch (child.Name.LocalName) |
676 | { | 674 | { |
677 | case "BootstrapperApplicationDll": | 675 | case "BootstrapperApplicationDll": |
678 | previousId = this.ParseBootstrapperApplicationDllElement(child, id, previousType, previousId); | 676 | this.ParseBootstrapperApplicationDllElement(child, id); |
679 | previousType = ComplexReferenceChildType.Payload; | ||
680 | break; | 677 | break; |
681 | case "Payload": | 678 | case "Payload": |
682 | previousId = this.ParsePayloadElement(child, ComplexReferenceParentType.Container, Compiler.BurnUXContainerId, previousType, previousId); | 679 | this.ParsePayloadElement(child, ComplexReferenceParentType.Container, Compiler.BurnUXContainerId); |
683 | previousType = ComplexReferenceChildType.Payload; | ||
684 | break; | 680 | break; |
685 | case "PayloadGroupRef": | 681 | case "PayloadGroupRef": |
686 | previousId = this.ParsePayloadGroupRefElement(child, ComplexReferenceParentType.Container, Compiler.BurnUXContainerId, previousType, previousId); | 682 | this.ParsePayloadGroupRefElement(child, ComplexReferenceParentType.Container, Compiler.BurnUXContainerId); |
687 | previousType = ComplexReferenceChildType.PayloadGroup; | ||
688 | break; | 683 | break; |
689 | default: | 684 | default: |
690 | this.Core.UnexpectedElement(node, child); | 685 | this.Core.UnexpectedElement(node, child); |
@@ -708,9 +703,7 @@ namespace WixToolset.Core | |||
708 | /// </summary> | 703 | /// </summary> |
709 | /// <param name="node">Element to parse</param> | 704 | /// <param name="node">Element to parse</param> |
710 | /// <param name="defaultId"></param> | 705 | /// <param name="defaultId"></param> |
711 | /// <param name="previousType"></param> | 706 | private Identifier ParseBootstrapperApplicationDllElement(XElement node, Identifier defaultId) |
712 | /// <param name="previousId"></param> | ||
713 | private Identifier ParseBootstrapperApplicationDllElement(XElement node, Identifier defaultId, ComplexReferenceChildType previousType, Identifier previousId) | ||
714 | { | 707 | { |
715 | var sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node); | 708 | var sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node); |
716 | var compilerPayload = new CompilerPayload(this.Core, sourceLineNumbers, node) | 709 | var compilerPayload = new CompilerPayload(this.Core, sourceLineNumbers, node) |
@@ -805,7 +798,7 @@ namespace WixToolset.Core | |||
805 | 798 | ||
806 | if (!this.Core.EncounteredError) | 799 | if (!this.Core.EncounteredError) |
807 | { | 800 | { |
808 | compilerPayload.CreatePayloadSymbol(ComplexReferenceParentType.Container, Compiler.BurnUXContainerId.Id, previousType, previousId?.Id); | 801 | compilerPayload.CreatePayloadSymbol(ComplexReferenceParentType.Container, Compiler.BurnUXContainerId.Id); |
809 | this.Core.AddSymbol(new WixBundleContainerSymbol(sourceLineNumbers, Compiler.BurnUXContainerId) | 802 | this.Core.AddSymbol(new WixBundleContainerSymbol(sourceLineNumbers, Compiler.BurnUXContainerId) |
810 | { | 803 | { |
811 | Name = "bundle-ux.cab", | 804 | Name = "bundle-ux.cab", |
@@ -829,8 +822,6 @@ namespace WixToolset.Core | |||
829 | { | 822 | { |
830 | var sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node); | 823 | var sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node); |
831 | string id = null; | 824 | string id = null; |
832 | Identifier previousId = null; | ||
833 | var previousType = ComplexReferenceChildType.Unknown; | ||
834 | 825 | ||
835 | foreach (var attrib in node.Attributes()) | 826 | foreach (var attrib in node.Attributes()) |
836 | { | 827 | { |
@@ -859,12 +850,10 @@ namespace WixToolset.Core | |||
859 | switch (child.Name.LocalName) | 850 | switch (child.Name.LocalName) |
860 | { | 851 | { |
861 | case "Payload": | 852 | case "Payload": |
862 | previousId = this.ParsePayloadElement(child, ComplexReferenceParentType.Container, Compiler.BurnUXContainerId, previousType, previousId); | 853 | this.ParsePayloadElement(child, ComplexReferenceParentType.Container, Compiler.BurnUXContainerId); |
863 | previousType = ComplexReferenceChildType.Payload; | ||
864 | break; | 854 | break; |
865 | case "PayloadGroupRef": | 855 | case "PayloadGroupRef": |
866 | previousId = this.ParsePayloadGroupRefElement(child, ComplexReferenceParentType.Container, Compiler.BurnUXContainerId, previousType, previousId); | 856 | this.ParsePayloadGroupRefElement(child, ComplexReferenceParentType.Container, Compiler.BurnUXContainerId); |
867 | previousType = ComplexReferenceChildType.PayloadGroup; | ||
868 | break; | 857 | break; |
869 | default: | 858 | default: |
870 | this.Core.UnexpectedElement(node, child); | 859 | this.Core.UnexpectedElement(node, child); |
@@ -1195,8 +1184,6 @@ namespace WixToolset.Core | |||
1195 | { | 1184 | { |
1196 | var sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node); | 1185 | var sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node); |
1197 | var compilerPayload = new CompilerPayload(this.Core, sourceLineNumbers, node); | 1186 | var compilerPayload = new CompilerPayload(this.Core, sourceLineNumbers, node); |
1198 | Identifier previousId = null; | ||
1199 | var previousType = ComplexReferenceChildType.Unknown; | ||
1200 | 1187 | ||
1201 | // This list lets us evaluate extension attributes *after* all core attributes | 1188 | // This list lets us evaluate extension attributes *after* all core attributes |
1202 | // have been parsed and dealt with, regardless of authoring order. | 1189 | // have been parsed and dealt with, regardless of authoring order. |
@@ -1241,9 +1228,7 @@ namespace WixToolset.Core | |||
1241 | this.Core.ParseExtensionAttribute(node, extensionAttribute, context); | 1228 | this.Core.ParseExtensionAttribute(node, extensionAttribute, context); |
1242 | } | 1229 | } |
1243 | 1230 | ||
1244 | compilerPayload.CreatePayloadSymbol(ComplexReferenceParentType.Container, Compiler.BurnUXContainerId.Id, previousType, previousId?.Id); | 1231 | compilerPayload.CreatePayloadSymbol(ComplexReferenceParentType.Container, Compiler.BurnUXContainerId.Id); |
1245 | previousId = compilerPayload.Id; | ||
1246 | previousType = ComplexReferenceChildType.Payload; | ||
1247 | 1232 | ||
1248 | foreach (var child in node.Elements()) | 1233 | foreach (var child in node.Elements()) |
1249 | { | 1234 | { |
@@ -1252,12 +1237,10 @@ namespace WixToolset.Core | |||
1252 | switch (child.Name.LocalName) | 1237 | switch (child.Name.LocalName) |
1253 | { | 1238 | { |
1254 | case "Payload": | 1239 | case "Payload": |
1255 | previousId = this.ParsePayloadElement(child, ComplexReferenceParentType.Container, Compiler.BurnUXContainerId, previousType, previousId); | 1240 | this.ParsePayloadElement(child, ComplexReferenceParentType.Container, Compiler.BurnUXContainerId); |
1256 | previousType = ComplexReferenceChildType.Payload; | ||
1257 | break; | 1241 | break; |
1258 | case "PayloadGroupRef": | 1242 | case "PayloadGroupRef": |
1259 | previousId = this.ParsePayloadGroupRefElement(child, ComplexReferenceParentType.Container, Compiler.BurnUXContainerId, previousType, previousId); | 1243 | this.ParsePayloadGroupRefElement(child, ComplexReferenceParentType.Container, Compiler.BurnUXContainerId); |
1260 | previousType = ComplexReferenceChildType.PayloadGroup; | ||
1261 | break; | 1244 | break; |
1262 | default: | 1245 | default: |
1263 | this.Core.UnexpectedElement(node, child); | 1246 | this.Core.UnexpectedElement(node, child); |
@@ -1388,12 +1371,9 @@ namespace WixToolset.Core | |||
1388 | /// <param name="node">Element to parse</param> | 1371 | /// <param name="node">Element to parse</param> |
1389 | /// <param name="parentType">ComplexReferenceParentType of parent element. (BA or PayloadGroup)</param> | 1372 | /// <param name="parentType">ComplexReferenceParentType of parent element. (BA or PayloadGroup)</param> |
1390 | /// <param name="parentId">Identifier of parent element.</param> | 1373 | /// <param name="parentId">Identifier of parent element.</param> |
1391 | /// <param name="previousType"></param> | 1374 | private Identifier ParsePayloadElement(XElement node, ComplexReferenceParentType parentType, Identifier parentId) |
1392 | /// <param name="previousId"></param> | ||
1393 | private Identifier ParsePayloadElement(XElement node, ComplexReferenceParentType parentType, Identifier parentId, ComplexReferenceChildType previousType, Identifier previousId) | ||
1394 | { | 1375 | { |
1395 | Debug.Assert(ComplexReferenceParentType.PayloadGroup == parentType || ComplexReferenceParentType.Package == parentType || ComplexReferenceParentType.Container == parentType); | 1376 | Debug.Assert(ComplexReferenceParentType.PayloadGroup == parentType || ComplexReferenceParentType.Package == parentType || ComplexReferenceParentType.Container == parentType); |
1396 | Debug.Assert(ComplexReferenceChildType.Unknown == previousType || ComplexReferenceChildType.PayloadGroup == previousType || ComplexReferenceChildType.Payload == previousType); | ||
1397 | 1377 | ||
1398 | var sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node); | 1378 | var sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node); |
1399 | var compilerPayload = new CompilerPayload(this.Core, sourceLineNumbers, node); | 1379 | var compilerPayload = new CompilerPayload(this.Core, sourceLineNumbers, node); |
@@ -1470,7 +1450,7 @@ namespace WixToolset.Core | |||
1470 | } | 1450 | } |
1471 | } | 1451 | } |
1472 | 1452 | ||
1473 | compilerPayload.CreatePayloadSymbol(parentType, parentId?.Id, previousType, previousId?.Id); | 1453 | compilerPayload.CreatePayloadSymbol(parentType, parentId?.Id); |
1474 | 1454 | ||
1475 | return compilerPayload.Id; | 1455 | return compilerPayload.Id; |
1476 | } | 1456 | } |
@@ -1514,8 +1494,6 @@ namespace WixToolset.Core | |||
1514 | id = Identifier.Invalid; | 1494 | id = Identifier.Invalid; |
1515 | } | 1495 | } |
1516 | 1496 | ||
1517 | var previousType = ComplexReferenceChildType.Unknown; | ||
1518 | Identifier previousId = null; | ||
1519 | foreach (var child in node.Elements()) | 1497 | foreach (var child in node.Elements()) |
1520 | { | 1498 | { |
1521 | if (CompilerCore.WixNamespace == child.Name.Namespace) | 1499 | if (CompilerCore.WixNamespace == child.Name.Namespace) |
@@ -1536,12 +1514,10 @@ namespace WixToolset.Core | |||
1536 | packageType = WixBundlePackageType.Msu; | 1514 | packageType = WixBundlePackageType.Msu; |
1537 | break; | 1515 | break; |
1538 | case "Payload": | 1516 | case "Payload": |
1539 | previousId = this.ParsePayloadElement(child, ComplexReferenceParentType.PayloadGroup, id, previousType, previousId); | 1517 | this.ParsePayloadElement(child, ComplexReferenceParentType.PayloadGroup, id); |
1540 | previousType = ComplexReferenceChildType.Payload; | ||
1541 | break; | 1518 | break; |
1542 | case "PayloadGroupRef": | 1519 | case "PayloadGroupRef": |
1543 | previousId = this.ParsePayloadGroupRefElement(child, ComplexReferenceParentType.PayloadGroup, id, previousType, previousId); | 1520 | this.ParsePayloadGroupRefElement(child, ComplexReferenceParentType.PayloadGroup, id); |
1544 | previousType = ComplexReferenceChildType.PayloadGroup; | ||
1545 | break; | 1521 | break; |
1546 | default: | 1522 | default: |
1547 | this.Core.UnexpectedElement(node, child); | 1523 | this.Core.UnexpectedElement(node, child); |
@@ -1551,12 +1527,9 @@ namespace WixToolset.Core | |||
1551 | if (packageType.HasValue) | 1527 | if (packageType.HasValue) |
1552 | { | 1528 | { |
1553 | var compilerPayload = this.ParsePackagePayloadElement(null, child, packageType.Value, null); | 1529 | var compilerPayload = this.ParsePackagePayloadElement(null, child, packageType.Value, null); |
1554 | var payloadSymbol = compilerPayload.CreatePayloadSymbol(ComplexReferenceParentType.PayloadGroup, id?.Id, previousType, previousId?.Id); | 1530 | var payloadSymbol = compilerPayload.CreatePayloadSymbol(ComplexReferenceParentType.PayloadGroup, id?.Id); |
1555 | if (payloadSymbol != null) | 1531 | if (payloadSymbol != null) |
1556 | { | 1532 | { |
1557 | previousId = payloadSymbol.Id; | ||
1558 | previousType = ComplexReferenceChildType.Payload; | ||
1559 | |||
1560 | this.CreatePackagePayloadSymbol(payloadSymbol.SourceLineNumbers, packageType.Value, payloadSymbol.Id, ComplexReferenceParentType.PayloadGroup, id); | 1533 | this.CreatePackagePayloadSymbol(payloadSymbol.SourceLineNumbers, packageType.Value, payloadSymbol.Id, ComplexReferenceParentType.PayloadGroup, id); |
1561 | } | 1534 | } |
1562 | } | 1535 | } |
@@ -1582,12 +1555,9 @@ namespace WixToolset.Core | |||
1582 | /// <param name="node">Element to parse.</param> | 1555 | /// <param name="node">Element to parse.</param> |
1583 | /// <param name="parentType">ComplexReferenceParentType of parent element (BA or PayloadGroup).</param> | 1556 | /// <param name="parentType">ComplexReferenceParentType of parent element (BA or PayloadGroup).</param> |
1584 | /// <param name="parentId">Identifier of parent element.</param> | 1557 | /// <param name="parentId">Identifier of parent element.</param> |
1585 | /// <param name="previousType"></param> | 1558 | private Identifier ParsePayloadGroupRefElement(XElement node, ComplexReferenceParentType parentType, Identifier parentId) |
1586 | /// <param name="previousId"></param> | ||
1587 | private Identifier ParsePayloadGroupRefElement(XElement node, ComplexReferenceParentType parentType, Identifier parentId, ComplexReferenceChildType previousType, Identifier previousId) | ||
1588 | { | 1559 | { |
1589 | Debug.Assert(ComplexReferenceParentType.Layout == parentType || ComplexReferenceParentType.PayloadGroup == parentType || ComplexReferenceParentType.Package == parentType || ComplexReferenceParentType.Container == parentType); | 1560 | Debug.Assert(ComplexReferenceParentType.Layout == parentType || ComplexReferenceParentType.PayloadGroup == parentType || ComplexReferenceParentType.Package == parentType || ComplexReferenceParentType.Container == parentType); |
1590 | Debug.Assert(ComplexReferenceChildType.Unknown == previousType || ComplexReferenceChildType.PayloadGroup == previousType || ComplexReferenceChildType.Payload == previousType); | ||
1591 | 1561 | ||
1592 | var sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node); | 1562 | var sourceLineNumbers = Preprocessor.GetSourceLineNumbers(node); |
1593 | Identifier id = null; | 1563 | Identifier id = null; |
@@ -1620,7 +1590,7 @@ namespace WixToolset.Core | |||
1620 | 1590 | ||
1621 | this.Core.ParseForExtensionElements(node); | 1591 | this.Core.ParseForExtensionElements(node); |
1622 | 1592 | ||
1623 | this.Core.CreateGroupAndOrderingRows(sourceLineNumbers, parentType, parentId?.Id, ComplexReferenceChildType.PayloadGroup, id?.Id, previousType, previousId?.Id); | 1593 | this.Core.CreateGroupAndOrderingRows(sourceLineNumbers, parentType, parentId?.Id, ComplexReferenceChildType.PayloadGroup, id?.Id, ComplexReferenceChildType.Unknown, null); |
1624 | 1594 | ||
1625 | return id; | 1595 | return id; |
1626 | } | 1596 | } |
@@ -2259,10 +2229,10 @@ namespace WixToolset.Core | |||
2259 | } | 2229 | } |
2260 | break; | 2230 | break; |
2261 | case "Payload": | 2231 | case "Payload": |
2262 | this.ParsePayloadElement(child, ComplexReferenceParentType.Package, id, ComplexReferenceChildType.Unknown, null); | 2232 | this.ParsePayloadElement(child, ComplexReferenceParentType.Package, id); |
2263 | break; | 2233 | break; |
2264 | case "PayloadGroupRef": | 2234 | case "PayloadGroupRef": |
2265 | this.ParsePayloadGroupRefElement(child, ComplexReferenceParentType.Package, id, ComplexReferenceChildType.Unknown, null); | 2235 | this.ParsePayloadGroupRefElement(child, ComplexReferenceParentType.Package, id); |
2266 | break; | 2236 | break; |
2267 | case "Provides": | 2237 | case "Provides": |
2268 | this.ParseProvidesElement(child, packageType, id.Id, out _); | 2238 | this.ParseProvidesElement(child, packageType, id.Id, out _); |
diff --git a/src/wix/WixToolset.Core/Link/WixGroupingOrdering.cs b/src/wix/WixToolset.Core/Link/WixGroupingOrdering.cs index f9de82a9..152f897b 100644 --- a/src/wix/WixToolset.Core/Link/WixGroupingOrdering.cs +++ b/src/wix/WixToolset.Core/Link/WixGroupingOrdering.cs | |||
@@ -645,13 +645,14 @@ namespace WixToolset.Core.Link | |||
645 | this.AddAfter(nestedAfterItems, messageHandler); | 645 | this.AddAfter(nestedAfterItems, messageHandler); |
646 | } | 646 | } |
647 | 647 | ||
648 | // We *don't* propagate ordering information from Packages or | 648 | // We *don't* propagate ordering information from Packages, PayloadGroups, or |
649 | // Containers to their children, because ordering doesn't matter | 649 | // Containers to their children, because ordering doesn't matter |
650 | // for them, and a Payload in two Packages (or Containers) can | 650 | // for them, and a Payload in two Packages (or Containers) can |
651 | // cause a circular reference to occur. | 651 | // cause a circular reference to occur. |
652 | private bool ShouldItemPropagateChildOrdering() | 652 | private bool ShouldItemPropagateChildOrdering() |
653 | { | 653 | { |
654 | if (String.Equals(nameof(ComplexReferenceParentType.Package), this.Type, StringComparison.Ordinal) || | 654 | if (String.Equals(nameof(ComplexReferenceParentType.Package), this.Type, StringComparison.Ordinal) || |
655 | String.Equals(nameof(ComplexReferenceParentType.PayloadGroup), this.Type, StringComparison.Ordinal) || | ||
655 | String.Equals(nameof(ComplexReferenceParentType.Container), this.Type, StringComparison.Ordinal)) | 656 | String.Equals(nameof(ComplexReferenceParentType.Container), this.Type, StringComparison.Ordinal)) |
656 | { | 657 | { |
657 | return false; | 658 | return false; |
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/BundleManifestFixture.cs b/src/wix/test/WixToolsetTest.CoreIntegration/BundleManifestFixture.cs index 19d0a2fc..534086b6 100644 --- a/src/wix/test/WixToolsetTest.CoreIntegration/BundleManifestFixture.cs +++ b/src/wix/test/WixToolsetTest.CoreIntegration/BundleManifestFixture.cs | |||
@@ -211,15 +211,11 @@ namespace WixToolsetTest.CoreIntegration | |||
211 | 211 | ||
212 | var bundleExtensions = extractResult.SelectManifestNodes("/burn:BurnManifest/burn:BundleExtension"); | 212 | var bundleExtensions = extractResult.SelectManifestNodes("/burn:BurnManifest/burn:BundleExtension"); |
213 | Assert.Equal(1, bundleExtensions.Count); | 213 | Assert.Equal(1, bundleExtensions.Count); |
214 | Assert.Equal("<BundleExtension Id='ExampleBext' EntryPayloadId='ExampleBext' />", bundleExtensions[0].GetTestXml()); | 214 | Assert.Equal("<BundleExtension Id='ExampleBext' EntryPayloadSourcePath='u1' />", bundleExtensions[0].GetTestXml()); |
215 | 215 | ||
216 | var bundleExtensionPayloads = extractResult.SelectManifestNodes("/burn:BurnManifest/burn:UX/burn:Payload[@Id='ExampleBext']"); | 216 | var bundleExtensionPayloads = extractResult.SelectManifestNodes("/burn:BurnManifest/burn:UX/burn:Payload[@Id='ExampleBext']"); |
217 | Assert.Equal(1, bundleExtensionPayloads.Count); | 217 | Assert.Equal(1, bundleExtensionPayloads.Count); |
218 | var ignored = new Dictionary<string, List<string>> | 218 | Assert.Equal("<Payload Id='ExampleBext' FilePath='fakebext.dll' SourcePath='u1' />", bundleExtensionPayloads[0].GetTestXml()); |
219 | { | ||
220 | { "Payload", new List<string> { "FileSize", "Hash", "SourcePath" } }, | ||
221 | }; | ||
222 | Assert.Equal("<Payload Id='ExampleBext' FilePath='fakebext.dll' SourcePath='*' />", bundleExtensionPayloads[0].GetTestXml(ignored)); | ||
223 | } | 219 | } |
224 | } | 220 | } |
225 | 221 | ||
@@ -259,7 +255,7 @@ namespace WixToolsetTest.CoreIntegration | |||
259 | 255 | ||
260 | var bundleExtensions = extractResult.SelectManifestNodes("/burn:BurnManifest/burn:BundleExtension"); | 256 | var bundleExtensions = extractResult.SelectManifestNodes("/burn:BurnManifest/burn:BundleExtension"); |
261 | Assert.Equal(1, bundleExtensions.Count); | 257 | Assert.Equal(1, bundleExtensions.Count); |
262 | Assert.Equal("<BundleExtension Id='ExampleBundleExtension' EntryPayloadId='ExampleBundleExtension' />", bundleExtensions[0].GetTestXml()); | 258 | Assert.Equal("<BundleExtension Id='ExampleBundleExtension' EntryPayloadSourcePath='u1' />", bundleExtensions[0].GetTestXml()); |
263 | 259 | ||
264 | var extensionSearches = extractResult.SelectManifestNodes("/burn:BurnManifest/burn:ExtensionSearch"); | 260 | var extensionSearches = extractResult.SelectManifestNodes("/burn:BurnManifest/burn:ExtensionSearch"); |
265 | Assert.Equal(2, extensionSearches.Count); | 261 | Assert.Equal(2, extensionSearches.Count); |