diff options
| author | Sean Hall <r.sean.hall@gmail.com> | 2021-06-09 11:30:46 -0500 |
|---|---|---|
| committer | Sean Hall <r.sean.hall@gmail.com> | 2021-06-09 13:47:53 -0500 |
| commit | 56105916271ff9a7c0bfa237b45b9b3fab9c570b (patch) | |
| tree | 828aff9543e541b42ed45198e6bd3e0aa065c137 /src/burn/engine/payload.cpp | |
| parent | d47c73dbcd0a314cf3346b9b1294063ed4a124c4 (diff) | |
| download | wix-56105916271ff9a7c0bfa237b45b9b3fab9c570b.tar.gz wix-56105916271ff9a7c0bfa237b45b9b3fab9c570b.tar.bz2 wix-56105916271ff9a7c0bfa237b45b9b3fab9c570b.zip | |
Fix building and perf for bundles with 1000s of package and BA payloads
Fixes other half of #5300
Diffstat (limited to '')
| -rw-r--r-- | src/burn/engine/payload.cpp | 80 |
1 files changed, 39 insertions, 41 deletions
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 | ||
