aboutsummaryrefslogtreecommitdiff
path: root/src/burn/engine/search.cpp
diff options
context:
space:
mode:
authorRaul Metsma <raul@metsma.ee>2025-05-26 10:52:16 +0300
committerRob Mensching <rob@firegiant.com>2025-12-13 14:23:15 -0800
commit56072818e7f18611ba7d5e717a6b3dafc952f440 (patch)
tree9ba670ef6085179f979d084dc2175cbb0d757adc /src/burn/engine/search.cpp
parent48b80e2d67c1f98ab5fe4aee28d849e36a1828d9 (diff)
downloadwix-56072818e7f18611ba7d5e717a6b3dafc952f440.tar.gz
wix-56072818e7f18611ba7d5e717a6b3dafc952f440.tar.bz2
wix-56072818e7f18611ba7d5e717a6b3dafc952f440.zip
Add exists option to ProductSearchResult for matching other search types
(e.g. FileSearch, DirectorySearch, RegistrySearch) Signed-off-by: Raul Metsma <raul@metsma.ee>
Diffstat (limited to 'src/burn/engine/search.cpp')
-rw-r--r--src/burn/engine/search.cpp13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/burn/engine/search.cpp b/src/burn/engine/search.cpp
index b5218600..626ffb28 100644
--- a/src/burn/engine/search.cpp
+++ b/src/burn/engine/search.cpp
@@ -334,6 +334,10 @@ extern "C" HRESULT SearchesParseFromXml(
334 { 334 {
335 pSearch->MsiProductSearch.Type = BURN_MSI_PRODUCT_SEARCH_TYPE_ASSIGNMENT; 335 pSearch->MsiProductSearch.Type = BURN_MSI_PRODUCT_SEARCH_TYPE_ASSIGNMENT;
336 } 336 }
337 else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, scz, -1, L"exists", -1))
338 {
339 pSearch->MsiProductSearch.Type = BURN_MSI_PRODUCT_SEARCH_TYPE_EXISTS;
340 }
337 else 341 else
338 { 342 {
339 ExitWithRootFailure(hr, E_INVALIDARG, "Invalid value for @Type: %ls", scz); 343 ExitWithRootFailure(hr, E_INVALIDARG, "Invalid value for @Type: %ls", scz);
@@ -1144,6 +1148,7 @@ static HRESULT MsiProductSearch(
1144 case BURN_MSI_PRODUCT_SEARCH_TYPE_LANGUAGE: 1148 case BURN_MSI_PRODUCT_SEARCH_TYPE_LANGUAGE:
1145 wzProperty = INSTALLPROPERTY_LANGUAGE; 1149 wzProperty = INSTALLPROPERTY_LANGUAGE;
1146 break; 1150 break;
1151 case BURN_MSI_PRODUCT_SEARCH_TYPE_EXISTS: __fallthrough;
1147 case BURN_MSI_PRODUCT_SEARCH_TYPE_STATE: 1152 case BURN_MSI_PRODUCT_SEARCH_TYPE_STATE:
1148 wzProperty = INSTALLPROPERTY_PRODUCTSTATE; 1153 wzProperty = INSTALLPROPERTY_PRODUCTSTATE;
1149 break; 1154 break;
@@ -1218,6 +1223,7 @@ static HRESULT MsiProductSearch(
1218 case BURN_MSI_PRODUCT_SEARCH_TYPE_LANGUAGE: 1223 case BURN_MSI_PRODUCT_SEARCH_TYPE_LANGUAGE:
1219 // is supposed to remain empty 1224 // is supposed to remain empty
1220 break; 1225 break;
1226 case BURN_MSI_PRODUCT_SEARCH_TYPE_EXISTS: __fallthrough;
1221 case BURN_MSI_PRODUCT_SEARCH_TYPE_STATE: 1227 case BURN_MSI_PRODUCT_SEARCH_TYPE_STATE:
1222 value.Type = BURN_VARIANT_TYPE_NUMERIC; 1228 value.Type = BURN_VARIANT_TYPE_NUMERIC;
1223 value.llValue = INSTALLSTATE_ABSENT; 1229 value.llValue = INSTALLSTATE_ABSENT;
@@ -1237,6 +1243,7 @@ static HRESULT MsiProductSearch(
1237 case BURN_MSI_PRODUCT_SEARCH_TYPE_LANGUAGE: 1243 case BURN_MSI_PRODUCT_SEARCH_TYPE_LANGUAGE:
1238 type = BURN_VARIANT_TYPE_STRING; 1244 type = BURN_VARIANT_TYPE_STRING;
1239 break; 1245 break;
1246 case BURN_MSI_PRODUCT_SEARCH_TYPE_EXISTS: __fallthrough;
1240 case BURN_MSI_PRODUCT_SEARCH_TYPE_STATE: __fallthrough; 1247 case BURN_MSI_PRODUCT_SEARCH_TYPE_STATE: __fallthrough;
1241 case BURN_MSI_PRODUCT_SEARCH_TYPE_ASSIGNMENT: 1248 case BURN_MSI_PRODUCT_SEARCH_TYPE_ASSIGNMENT:
1242 type = BURN_VARIANT_TYPE_NUMERIC; 1249 type = BURN_VARIANT_TYPE_NUMERIC;
@@ -1245,6 +1252,12 @@ static HRESULT MsiProductSearch(
1245 hr = BVariantChangeType(&value, type); 1252 hr = BVariantChangeType(&value, type);
1246 ExitOnFailure(hr, "Failed to change value type."); 1253 ExitOnFailure(hr, "Failed to change value type.");
1247 1254
1255 // Alter value here after value has changed to numberic type.
1256 if (BURN_MSI_PRODUCT_SEARCH_TYPE_EXISTS == pSearch->MsiProductSearch.Type)
1257 {
1258 value.llValue = (value.llValue == INSTALLSTATE_ABSENT) ? 0 : 1;
1259 }
1260
1248 // Set variable. 1261 // Set variable.
1249 hr = VariableSetVariant(pVariables, pSearch->sczVariable, &value); 1262 hr = VariableSetVariant(pVariables, pSearch->sczVariable, &value);
1250 ExitOnFailure(hr, "Failed to set variable."); 1263 ExitOnFailure(hr, "Failed to set variable.");