diff options
Diffstat (limited to 'src/balutil/balinfo.cpp')
-rw-r--r-- | src/balutil/balinfo.cpp | 99 |
1 files changed, 92 insertions, 7 deletions
diff --git a/src/balutil/balinfo.cpp b/src/balutil/balinfo.cpp index b36e3741..492c8e08 100644 --- a/src/balutil/balinfo.cpp +++ b/src/balutil/balinfo.cpp | |||
@@ -7,6 +7,10 @@ static HRESULT ParsePackagesFromXml( | |||
7 | __in BAL_INFO_PACKAGES* pPackages, | 7 | __in BAL_INFO_PACKAGES* pPackages, |
8 | __in IXMLDOMDocument* pixdManifest | 8 | __in IXMLDOMDocument* pixdManifest |
9 | ); | 9 | ); |
10 | static HRESULT ParseBalPackageInfoFromXml( | ||
11 | __in BAL_INFO_PACKAGES* pPackages, | ||
12 | __in IXMLDOMDocument* pixdManifest | ||
13 | ); | ||
10 | 14 | ||
11 | 15 | ||
12 | DAPI_(HRESULT) BalInfoParseFromXml( | 16 | DAPI_(HRESULT) BalInfoParseFromXml( |
@@ -44,6 +48,9 @@ DAPI_(HRESULT) BalInfoParseFromXml( | |||
44 | hr = ParsePackagesFromXml(&pBundle->packages, pixdManifest); | 48 | hr = ParsePackagesFromXml(&pBundle->packages, pixdManifest); |
45 | BalExitOnFailure(hr, "Failed to parse package information from bootstrapper application data."); | 49 | BalExitOnFailure(hr, "Failed to parse package information from bootstrapper application data."); |
46 | 50 | ||
51 | hr = ParseBalPackageInfoFromXml(&pBundle->packages, pixdManifest); | ||
52 | BalExitOnFailure(hr, "Failed to parse bal package information from bootstrapper application data."); | ||
53 | |||
47 | LExit: | 54 | LExit: |
48 | ReleaseObject(pNode); | 55 | ReleaseObject(pNode); |
49 | 56 | ||
@@ -55,7 +62,8 @@ DAPI_(HRESULT) BalInfoAddRelatedBundleAsPackage( | |||
55 | __in BAL_INFO_PACKAGES* pPackages, | 62 | __in BAL_INFO_PACKAGES* pPackages, |
56 | __in LPCWSTR wzId, | 63 | __in LPCWSTR wzId, |
57 | __in BOOTSTRAPPER_RELATION_TYPE relationType, | 64 | __in BOOTSTRAPPER_RELATION_TYPE relationType, |
58 | __in BOOL /*fPerMachine*/ | 65 | __in BOOL /*fPerMachine*/, |
66 | __out_opt BAL_INFO_PACKAGE** ppPackage | ||
59 | ) | 67 | ) |
60 | { | 68 | { |
61 | HRESULT hr = S_OK; | 69 | HRESULT hr = S_OK; |
@@ -104,6 +112,11 @@ DAPI_(HRESULT) BalInfoAddRelatedBundleAsPackage( | |||
104 | 112 | ||
105 | // TODO: try to look up the DisplayName and Description in Add/Remove Programs with the wzId. | 113 | // TODO: try to look up the DisplayName and Description in Add/Remove Programs with the wzId. |
106 | 114 | ||
115 | if (ppPackage) | ||
116 | { | ||
117 | *ppPackage = pPackage; | ||
118 | } | ||
119 | |||
107 | LExit: | 120 | LExit: |
108 | return hr; | 121 | return hr; |
109 | } | 122 | } |
@@ -139,10 +152,13 @@ DAPI_(void) BalInfoUninitialize( | |||
139 | ReleaseStr(pBundle->packages.rgPackages[i].sczDisplayName); | 152 | ReleaseStr(pBundle->packages.rgPackages[i].sczDisplayName); |
140 | ReleaseStr(pBundle->packages.rgPackages[i].sczDescription); | 153 | ReleaseStr(pBundle->packages.rgPackages[i].sczDescription); |
141 | ReleaseStr(pBundle->packages.rgPackages[i].sczId); | 154 | ReleaseStr(pBundle->packages.rgPackages[i].sczId); |
155 | ReleaseStr(pBundle->packages.rgPackages[i].sczDisplayInternalUICondition); | ||
142 | ReleaseStr(pBundle->packages.rgPackages[i].sczProductCode); | 156 | ReleaseStr(pBundle->packages.rgPackages[i].sczProductCode); |
143 | ReleaseStr(pBundle->packages.rgPackages[i].sczUpgradeCode); | 157 | ReleaseStr(pBundle->packages.rgPackages[i].sczUpgradeCode); |
144 | ReleaseStr(pBundle->packages.rgPackages[i].sczVersion); | 158 | ReleaseStr(pBundle->packages.rgPackages[i].sczVersion); |
145 | ReleaseStr(pBundle->packages.rgPackages[i].sczInstallCondition); | 159 | ReleaseStr(pBundle->packages.rgPackages[i].sczInstallCondition); |
160 | ReleaseStr(pBundle->packages.rgPackages[i].sczPrereqLicenseFile); | ||
161 | ReleaseStr(pBundle->packages.rgPackages[i].sczPrereqLicenseUrl); | ||
146 | } | 162 | } |
147 | 163 | ||
148 | ReleaseMem(pBundle->packages.rgPackages); | 164 | ReleaseMem(pBundle->packages.rgPackages); |
@@ -218,12 +234,6 @@ static HRESULT ParsePackagesFromXml( | |||
218 | hr = XmlGetYesNoAttribute(pNode, L"Vital", &prgPackages[iPackage].fVital); | 234 | hr = XmlGetYesNoAttribute(pNode, L"Vital", &prgPackages[iPackage].fVital); |
219 | ExitOnFailure(hr, "Failed to get vital setting for package."); | 235 | ExitOnFailure(hr, "Failed to get vital setting for package."); |
220 | 236 | ||
221 | hr = XmlGetYesNoAttribute(pNode, L"DisplayInternalUI", &prgPackages[iPackage].fDisplayInternalUI); | ||
222 | if (E_NOTFOUND != hr) | ||
223 | { | ||
224 | ExitOnFailure(hr, "Failed to get DisplayInternalUI setting for package."); | ||
225 | } | ||
226 | |||
227 | hr = XmlGetAttributeEx(pNode, L"ProductCode", &prgPackages[iPackage].sczProductCode); | 237 | hr = XmlGetAttributeEx(pNode, L"ProductCode", &prgPackages[iPackage].sczProductCode); |
228 | if (E_NOTFOUND != hr) | 238 | if (E_NOTFOUND != hr) |
229 | { | 239 | { |
@@ -286,3 +296,78 @@ LExit: | |||
286 | 296 | ||
287 | return hr; | 297 | return hr; |
288 | } | 298 | } |
299 | |||
300 | |||
301 | static HRESULT ParseBalPackageInfoFromXml( | ||
302 | __in BAL_INFO_PACKAGES* pPackages, | ||
303 | __in IXMLDOMDocument* pixdManifest | ||
304 | ) | ||
305 | { | ||
306 | HRESULT hr = S_OK; | ||
307 | IXMLDOMNodeList* pNodeList = NULL; | ||
308 | IXMLDOMNode* pNode = NULL; | ||
309 | LPWSTR scz = NULL; | ||
310 | BAL_INFO_PACKAGE* pPackage = NULL; | ||
311 | |||
312 | hr = XmlSelectNodes(pixdManifest, L"/BootstrapperApplicationData/WixBalPackageInfo", &pNodeList); | ||
313 | ExitOnFailure(hr, "Failed to select all packages."); | ||
314 | |||
315 | while (S_OK == (hr = XmlNextElement(pNodeList, &pNode, NULL))) | ||
316 | { | ||
317 | hr = XmlGetAttributeEx(pNode, L"PackageId", &scz); | ||
318 | ExitOnFailure(hr, "Failed to get package identifier for WixBalPackageInfo."); | ||
319 | |||
320 | hr = BalInfoFindPackageById(pPackages, scz, &pPackage); | ||
321 | ExitOnFailure(hr, "Failed to find package specified in WixBalPackageInfo: %ls", scz); | ||
322 | |||
323 | hr = XmlGetAttributeEx(pNode, L"DisplayInternalUICondition", &pPackage->sczDisplayInternalUICondition); | ||
324 | if (E_NOTFOUND != hr) | ||
325 | { | ||
326 | ExitOnFailure(hr, "Failed to get DisplayInternalUICondition setting for package."); | ||
327 | } | ||
328 | |||
329 | ReleaseNullObject(pNode); | ||
330 | } | ||
331 | ExitOnFailure(hr, "Failed to parse all WixBalPackageInfo elements."); | ||
332 | |||
333 | hr = XmlSelectNodes(pixdManifest, L"/BootstrapperApplicationData/WixMbaPrereqInformation", &pNodeList); | ||
334 | ExitOnFailure(hr, "Failed to select all packages."); | ||
335 | |||
336 | while (S_OK == (hr = XmlNextElement(pNodeList, &pNode, NULL))) | ||
337 | { | ||
338 | hr = XmlGetAttributeEx(pNode, L"PackageId", &scz); | ||
339 | ExitOnFailure(hr, "Failed to get package identifier for WixMbaPrereqInformation."); | ||
340 | |||
341 | hr = BalInfoFindPackageById(pPackages, scz, &pPackage); | ||
342 | ExitOnFailure(hr, "Failed to find package specified in WixMbaPrereqInformation: %ls", scz); | ||
343 | |||
344 | pPackage->fPrereqPackage = TRUE; | ||
345 | |||
346 | hr = XmlGetAttributeEx(pNode, L"LicenseFile", &pPackage->sczPrereqLicenseFile); | ||
347 | if (E_NOTFOUND != hr) | ||
348 | { | ||
349 | ExitOnFailure(hr, "Failed to get LicenseFile setting for prereq package."); | ||
350 | } | ||
351 | |||
352 | hr = XmlGetAttributeEx(pNode, L"LicenseUrl", &pPackage->sczPrereqLicenseUrl); | ||
353 | if (E_NOTFOUND != hr) | ||
354 | { | ||
355 | ExitOnFailure(hr, "Failed to get LicenseUrl setting for prereq package."); | ||
356 | } | ||
357 | |||
358 | ReleaseNullObject(pNode); | ||
359 | } | ||
360 | ExitOnFailure(hr, "Failed to parse all WixMbaPrereqInformation elements."); | ||
361 | |||
362 | if (S_FALSE == hr) | ||
363 | { | ||
364 | hr = S_OK; | ||
365 | } | ||
366 | |||
367 | LExit: | ||
368 | ReleaseStr(scz); | ||
369 | ReleaseObject(pNode); | ||
370 | ReleaseObject(pNodeList); | ||
371 | |||
372 | return hr; | ||
373 | } | ||