diff options
Diffstat (limited to 'src/burn/engine/payload.cpp')
-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 | ||