summaryrefslogtreecommitdiff
path: root/src/burn/engine/container.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/burn/engine/container.cpp')
-rw-r--r--src/burn/engine/container.cpp50
1 files changed, 27 insertions, 23 deletions
diff --git a/src/burn/engine/container.cpp b/src/burn/engine/container.cpp
index 0cce3131..c6f2ada8 100644
--- a/src/burn/engine/container.cpp
+++ b/src/burn/engine/container.cpp
@@ -50,16 +50,9 @@ extern "C" HRESULT ContainersParseFromXml(
50 hr = XmlGetAttributeEx(pixnNode, L"Id", &pContainer->sczId); 50 hr = XmlGetAttributeEx(pixnNode, L"Id", &pContainer->sczId);
51 ExitOnFailure(hr, "Failed to get @Id."); 51 ExitOnFailure(hr, "Failed to get @Id.");
52 52
53 // @Primary
54 hr = XmlGetYesNoAttribute(pixnNode, L"Primary", &pContainer->fPrimary);
55 if (E_NOTFOUND != hr)
56 {
57 ExitOnFailure(hr, "Failed to get @Primary.");
58 }
59
60 // @Attached 53 // @Attached
61 hr = XmlGetYesNoAttribute(pixnNode, L"Attached", &pContainer->fAttached); 54 hr = XmlGetYesNoAttribute(pixnNode, L"Attached", &pContainer->fAttached);
62 if (E_NOTFOUND != hr || pContainer->fPrimary) // if it is a primary container, it has to be attached 55 if (E_NOTFOUND != hr)
63 { 56 {
64 ExitOnFailure(hr, "Failed to get @Attached."); 57 ExitOnFailure(hr, "Failed to get @Attached.");
65 } 58 }
@@ -87,10 +80,7 @@ extern "C" HRESULT ContainersParseFromXml(
87 { 80 {
88 // @FilePath 81 // @FilePath
89 hr = XmlGetAttributeEx(pixnNode, L"FilePath", &pContainer->sczFilePath); 82 hr = XmlGetAttributeEx(pixnNode, L"FilePath", &pContainer->sczFilePath);
90 if (E_NOTFOUND != hr) 83 ExitOnFailure(hr, "Failed to get @FilePath.");
91 {
92 ExitOnFailure(hr, "Failed to get @FilePath.");
93 }
94 } 84 }
95 85
96 // The source path starts as the file path. 86 // The source path starts as the file path.
@@ -99,23 +89,32 @@ extern "C" HRESULT ContainersParseFromXml(
99 89
100 // @DownloadUrl 90 // @DownloadUrl
101 hr = XmlGetAttributeEx(pixnNode, L"DownloadUrl", &pContainer->downloadSource.sczUrl); 91 hr = XmlGetAttributeEx(pixnNode, L"DownloadUrl", &pContainer->downloadSource.sczUrl);
102 if (E_NOTFOUND != hr || (!pContainer->fPrimary && !pContainer->sczSourcePath)) // if the package is not a primary package, it must have a source path or a download url 92 if (E_NOTFOUND != hr)
103 { 93 {
104 ExitOnFailure(hr, "Failed to get @DownloadUrl. Either @SourcePath or @DownloadUrl needs to be provided."); 94 ExitOnFailure(hr, "Failed to get @DownloadUrl.");
105 } 95 }
106 96
107 // @Hash 97 // @Hash
108 hr = XmlGetAttributeEx(pixnNode, L"Hash", &pContainer->sczHash); 98 hr = XmlGetAttributeEx(pixnNode, L"Hash", &pContainer->sczHash);
109 if (SUCCEEDED(hr)) 99 ExitOnFailure(hr, "Failed to get @Hash.");
110 { 100
111 hr = StrAllocHexDecode(pContainer->sczHash, &pContainer->pbHash, &pContainer->cbHash); 101 hr = StrAllocHexDecode(pContainer->sczHash, &pContainer->pbHash, &pContainer->cbHash);
112 ExitOnFailure(hr, "Failed to hex decode the Container/@Hash."); 102 ExitOnFailure(hr, "Failed to hex decode the Container/@Hash.");
113 } 103
114 else if (E_NOTFOUND != hr) 104 // @FileSize
105 hr = XmlGetAttributeEx(pixnNode, L"FileSize", &scz);
106 ExitOnFailure(hr, "Failed to get @FileSize.");
107
108 hr = StrStringToUInt64(scz, 0, &pContainer->qwFileSize);
109 ExitOnFailure(hr, "Failed to parse @FileSize.");
110
111 if (!pContainer->qwFileSize)
115 { 112 {
116 ExitOnFailure(hr, "Failed to get @Hash."); 113 ExitOnRootFailure(hr = E_INVALIDDATA, "File size is required when verifying by hash for container: %ls", pContainer->sczId);
117 } 114 }
118 115
116 pContainer->verification = BURN_CONTAINER_VERIFICATION_HASH;
117
119 // prepare next iteration 118 // prepare next iteration
120 ReleaseNullObject(pixnNode); 119 ReleaseNullObject(pixnNode);
121 } 120 }
@@ -136,6 +135,7 @@ extern "C" HRESULT ContainersInitialize(
136 ) 135 )
137{ 136{
138 HRESULT hr = S_OK; 137 HRESULT hr = S_OK;
138 DWORD64 qwSize = 0;
139 139
140 if (pContainers->rgContainers) 140 if (pContainers->rgContainers)
141 { 141 {
@@ -147,8 +147,13 @@ extern "C" HRESULT ContainersInitialize(
147 // manifest contained and get the offset to the container. 147 // manifest contained and get the offset to the container.
148 if (pContainer->fAttached) 148 if (pContainer->fAttached)
149 { 149 {
150 hr = SectionGetAttachedContainerInfo(pSection, pContainer->dwAttachedIndex, pContainer->type, &pContainer->qwAttachedOffset, &pContainer->qwFileSize, &pContainer->fActuallyAttached); 150 hr = SectionGetAttachedContainerInfo(pSection, pContainer->dwAttachedIndex, pContainer->type, &pContainer->qwAttachedOffset, &qwSize, &pContainer->fActuallyAttached);
151 ExitOnFailure(hr, "Failed to get attached container information."); 151 ExitOnFailure(hr, "Failed to get attached container information.");
152
153 if (qwSize != pContainer->qwFileSize)
154 {
155 ExitOnFailure(hr, "Attached container '%ls' size '%llu' didn't match size from manifest: '%llu'", pContainer->sczId, qwSize, pContainer->qwFileSize);
156 }
152 } 157 }
153 } 158 }
154 } 159 }
@@ -195,7 +200,6 @@ extern "C" HRESULT ContainerOpenUX(
195 200
196 // open attached container 201 // open attached container
197 container.type = BURN_CONTAINER_TYPE_CABINET; 202 container.type = BURN_CONTAINER_TYPE_CABINET;
198 container.fPrimary = TRUE;
199 container.fAttached = TRUE; 203 container.fAttached = TRUE;
200 container.dwAttachedIndex = 0; 204 container.dwAttachedIndex = 0;
201 205