aboutsummaryrefslogtreecommitdiff
path: root/src/burn/engine/payload.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/burn/engine/payload.cpp')
-rw-r--r--src/burn/engine/payload.cpp80
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
8static 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
199LExit: 224LExit:
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
331LExit:
332 return hr; 346 return hr;
333} 347}
334 348
335extern "C" HRESULT PayloadFindEmbeddedBySourcePath( 349extern "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
360LExit:
361 return hr; 359 return hr;
362} 360}
363 361