diff options
| author | Sean Hall <r.sean.hall@gmail.com> | 2020-05-15 17:18:36 +1000 |
|---|---|---|
| committer | Sean Hall <r.sean.hall@gmail.com> | 2020-05-16 21:47:46 +1000 |
| commit | 9010bd828e70e91523ed74733cc371eec09f58bb (patch) | |
| tree | 9d40b796b6b29474122bcf0fb99bc717f83e7cf1 /src/balutil/balinfo.cpp | |
| parent | 780cd25e41f2d2982807a0a2a24a734684d27fe6 (diff) | |
| download | wix-9010bd828e70e91523ed74733cc371eec09f58bb.tar.gz wix-9010bd828e70e91523ed74733cc371eec09f58bb.tar.bz2 wix-9010bd828e70e91523ed74733cc371eec09f58bb.zip | |
WIXFEAT:6164 Update BAL_INFO_PACKAGE with bal specific data.
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 | } | ||
