aboutsummaryrefslogtreecommitdiff
path: root/src/balutil/balinfo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/balutil/balinfo.cpp')
-rw-r--r--src/balutil/balinfo.cpp99
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 );
10static HRESULT ParseBalPackageInfoFromXml(
11 __in BAL_INFO_PACKAGES* pPackages,
12 __in IXMLDOMDocument* pixdManifest
13 );
10 14
11 15
12DAPI_(HRESULT) BalInfoParseFromXml( 16DAPI_(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
47LExit: 54LExit:
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
107LExit: 120LExit:
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
301static 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
367LExit:
368 ReleaseStr(scz);
369 ReleaseObject(pNode);
370 ReleaseObject(pNodeList);
371
372 return hr;
373}