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.cpp127
1 files changed, 77 insertions, 50 deletions
diff --git a/src/burn/engine/payload.cpp b/src/burn/engine/payload.cpp
index 72eb3476..392a3dd4 100644
--- a/src/burn/engine/payload.cpp
+++ b/src/burn/engine/payload.cpp
@@ -27,6 +27,8 @@ extern "C" HRESULT PayloadsParseFromXml(
27 IXMLDOMNode* pixnNode = NULL; 27 IXMLDOMNode* pixnNode = NULL;
28 DWORD cNodes = 0; 28 DWORD cNodes = 0;
29 LPWSTR scz = NULL; 29 LPWSTR scz = NULL;
30 BOOL fChainPayload = pContainers && pLayoutPayloads; // These are required when parsing chain payloads.
31 BOOL fValidFileSize = FALSE;
30 32
31 // select payload nodes 33 // select payload nodes
32 hr = XmlSelectNodes(pixnBundle, L"Payload", &pixnNodes); 34 hr = XmlSelectNodes(pixnBundle, L"Payload", &pixnNodes);
@@ -51,6 +53,7 @@ extern "C" HRESULT PayloadsParseFromXml(
51 for (DWORD i = 0; i < cNodes; ++i) 53 for (DWORD i = 0; i < cNodes; ++i)
52 { 54 {
53 BURN_PAYLOAD* pPayload = &pPayloads->rgPayloads[i]; 55 BURN_PAYLOAD* pPayload = &pPayloads->rgPayloads[i];
56 fValidFileSize = FALSE;
54 57
55 hr = XmlNextElement(pixnNodes, &pixnNode, NULL); 58 hr = XmlNextElement(pixnNodes, &pixnNode, NULL);
56 ExitOnFailure(hr, "Failed to get next node."); 59 ExitOnFailure(hr, "Failed to get next node.");
@@ -63,27 +66,36 @@ extern "C" HRESULT PayloadsParseFromXml(
63 hr = XmlGetAttributeEx(pixnNode, L"FilePath", &pPayload->sczFilePath); 66 hr = XmlGetAttributeEx(pixnNode, L"FilePath", &pPayload->sczFilePath);
64 ExitOnFailure(hr, "Failed to get @FilePath."); 67 ExitOnFailure(hr, "Failed to get @FilePath.");
65 68
66 // @Packaging 69 // @SourcePath
67 hr = XmlGetAttributeEx(pixnNode, L"Packaging", &scz); 70 hr = XmlGetAttributeEx(pixnNode, L"SourcePath", &pPayload->sczSourcePath);
68 ExitOnFailure(hr, "Failed to get @Packaging."); 71 ExitOnFailure(hr, "Failed to get @SourcePath.");
69 72
70 if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, scz, -1, L"embedded", -1)) 73 if (!fChainPayload)
71 { 74 {
75 // All non-chain payloads are embedded in the UX container.
72 pPayload->packaging = BURN_PAYLOAD_PACKAGING_EMBEDDED; 76 pPayload->packaging = BURN_PAYLOAD_PACKAGING_EMBEDDED;
73 } 77 }
74 else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, scz, -1, L"external", -1))
75 {
76 pPayload->packaging = BURN_PAYLOAD_PACKAGING_EXTERNAL;
77 }
78 else 78 else
79 { 79 {
80 hr = E_INVALIDARG; 80 // @Packaging
81 ExitOnFailure(hr, "Invalid value for @Packaging: %ls", scz); 81 hr = XmlGetAttributeEx(pixnNode, L"Packaging", &scz);
82 } 82 ExitOnFailure(hr, "Failed to get @Packaging.");
83 83
84 // @Container 84 if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, scz, -1, L"embedded", -1))
85 if (pContainers) 85 {
86 { 86 pPayload->packaging = BURN_PAYLOAD_PACKAGING_EMBEDDED;
87 }
88 else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, scz, -1, L"external", -1))
89 {
90 pPayload->packaging = BURN_PAYLOAD_PACKAGING_EXTERNAL;
91 }
92 else
93 {
94 hr = E_INVALIDARG;
95 ExitOnFailure(hr, "Invalid value for @Packaging: %ls", scz);
96 }
97
98 // @Container
87 hr = XmlGetAttributeEx(pixnNode, L"Container", &scz); 99 hr = XmlGetAttributeEx(pixnNode, L"Container", &scz);
88 if (E_NOTFOUND != hr || BURN_PAYLOAD_PACKAGING_EMBEDDED == pPayload->packaging) 100 if (E_NOTFOUND != hr || BURN_PAYLOAD_PACKAGING_EMBEDDED == pPayload->packaging)
89 { 101 {
@@ -93,52 +105,67 @@ extern "C" HRESULT PayloadsParseFromXml(
93 hr = ContainerFindById(pContainers, scz, &pPayload->pContainer); 105 hr = ContainerFindById(pContainers, scz, &pPayload->pContainer);
94 ExitOnFailure(hr, "Failed to to find container: %ls", scz); 106 ExitOnFailure(hr, "Failed to to find container: %ls", scz);
95 } 107 }
96 }
97 108
98 // @LayoutOnly 109 // @LayoutOnly
99 hr = XmlGetYesNoAttribute(pixnNode, L"LayoutOnly", &pPayload->fLayoutOnly); 110 hr = XmlGetYesNoAttribute(pixnNode, L"LayoutOnly", &pPayload->fLayoutOnly);
100 if (E_NOTFOUND != hr) 111 if (E_NOTFOUND != hr)
101 { 112 {
102 ExitOnFailure(hr, "Failed to get @LayoutOnly."); 113 ExitOnFailure(hr, "Failed to get @LayoutOnly.");
103 } 114 }
104 115
105 // @SourcePath 116 // @DownloadUrl
106 hr = XmlGetAttributeEx(pixnNode, L"SourcePath", &pPayload->sczSourcePath); 117 hr = XmlGetAttributeEx(pixnNode, L"DownloadUrl", &pPayload->downloadSource.sczUrl);
107 ExitOnFailure(hr, "Failed to get @SourcePath."); 118 if (E_NOTFOUND != hr)
119 {
120 ExitOnFailure(hr, "Failed to get @DownloadUrl.");
121 }
108 122
109 // @DownloadUrl 123 // @FileSize
110 hr = XmlGetAttributeEx(pixnNode, L"DownloadUrl", &pPayload->downloadSource.sczUrl); 124 hr = XmlGetAttributeEx(pixnNode, L"FileSize", &scz);
111 if (E_NOTFOUND != hr) 125 if (E_NOTFOUND != hr)
112 { 126 {
113 ExitOnFailure(hr, "Failed to get @DownloadUrl."); 127 ExitOnFailure(hr, "Failed to get @FileSize.");
114 }
115 128
116 // @FileSize 129 hr = StrStringToUInt64(scz, 0, &pPayload->qwFileSize);
117 hr = XmlGetAttributeEx(pixnNode, L"FileSize", &scz); 130 ExitOnFailure(hr, "Failed to parse @FileSize.");
118 if (E_NOTFOUND != hr)
119 {
120 ExitOnFailure(hr, "Failed to get @FileSize.");
121 131
122 hr = StrStringToUInt64(scz, 0, &pPayload->qwFileSize); 132 fValidFileSize = TRUE;
123 ExitOnFailure(hr, "Failed to parse @FileSize."); 133 }
124 } 134
135 // @Hash
136 hr = XmlGetAttributeEx(pixnNode, L"Hash", &scz);
137 if (E_NOTFOUND != hr)
138 {
139 ExitOnFailure(hr, "Failed to get @Hash.");
125 140
126 // @Hash 141 hr = StrAllocHexDecode(scz, &pPayload->pbHash, &pPayload->cbHash);
127 hr = XmlGetAttributeEx(pixnNode, L"Hash", &scz); 142 ExitOnFailure(hr, "Failed to hex decode the Payload/@Hash.");
128 ExitOnFailure(hr, "Failed to get @Hash.");
129 143
130 hr = StrAllocHexDecode(scz, &pPayload->pbHash, &pPayload->cbHash); 144 if (BURN_PAYLOAD_VERIFICATION_NONE == pPayload->verification)
131 ExitOnFailure(hr, "Failed to hex decode the Payload/@Hash."); 145 {
146 pPayload->verification = BURN_PAYLOAD_VERIFICATION_HASH;
147 }
148 }
132 149
133 if (pPayload->fLayoutOnly && pLayoutPayloads) 150 if (BURN_PAYLOAD_VERIFICATION_NONE == pPayload->verification)
134 { 151 {
135 hr = MemEnsureArraySize(reinterpret_cast<LPVOID*>(&pLayoutPayloads->rgItems), pLayoutPayloads->cItems + 1, sizeof(BURN_PAYLOAD_GROUP_ITEM), 5); 152 ExitOnRootFailure(hr = E_INVALIDDATA, "There was no verification information for payload: %ls", pPayload->sczKey);
136 ExitOnFailure(hr, "Failed to allocate memory for layout payloads."); 153 }
154 else if (BURN_PAYLOAD_VERIFICATION_HASH == pPayload->verification && !fValidFileSize)
155 {
156 ExitOnRootFailure(hr = E_INVALIDDATA, "File size is required when verifying by hash for payload: %ls", pPayload->sczKey);
157 }
137 158
138 pLayoutPayloads->rgItems[pLayoutPayloads->cItems].pPayload = pPayload; 159 if (pPayload->fLayoutOnly)
139 ++pLayoutPayloads->cItems; 160 {
161 hr = MemEnsureArraySize(reinterpret_cast<LPVOID*>(&pLayoutPayloads->rgItems), pLayoutPayloads->cItems + 1, sizeof(BURN_PAYLOAD_GROUP_ITEM), 5);
162 ExitOnFailure(hr, "Failed to allocate memory for layout payloads.");
140 163
141 pLayoutPayloads->qwTotalSize += pPayload->qwFileSize; 164 pLayoutPayloads->rgItems[pLayoutPayloads->cItems].pPayload = pPayload;
165 ++pLayoutPayloads->cItems;
166
167 pLayoutPayloads->qwTotalSize += pPayload->qwFileSize;
168 }
142 } 169 }
143 170
144 // prepare next iteration 171 // prepare next iteration