ExperimentalFeature.cpp (3767B)
1 // Copyright (c) Microsoft Corporation. 2 // Licensed under the MIT License. 3 #include "pch.h" 4 #include "AppInstallerLogging.h" 5 #include "winget/ExperimentalFeature.h" 6 #include "winget/GroupPolicy.h" 7 #include "winget/UserSettings.h" 8 9 namespace AppInstaller::Settings 10 { 11 namespace 12 { 13 bool IsEnabledInternal(ExperimentalFeature::Feature feature, const UserSettings& userSettings) 14 { 15 if (feature == ExperimentalFeature::Feature::None) 16 { 17 return true; 18 } 19 20 #ifdef WINGET_DISABLE_EXPERIMENTAL_FEATURES 21 UNREFERENCED_PARAMETER(userSettings); 22 return false; 23 #else 24 25 if (!GroupPolicies().IsEnabled(TogglePolicy::Policy::ExperimentalFeatures)) 26 { 27 AICLI_LOG(Core, Info, << 28 "Experimental feature '" << ExperimentalFeature::GetFeature(feature).Name() << 29 "' is disabled due to group policy: " << TogglePolicy::GetPolicy(TogglePolicy::Policy::ExperimentalFeatures).RegValueName()); 30 return false; 31 } 32 33 switch (feature) 34 { 35 case ExperimentalFeature::Feature::ExperimentalCmd: 36 // ExperimentalArg depends on ExperimentalCmd, so instead of failing we could 37 // assume that if ExperimentalArg is enabled then ExperimentalCmd is as well. 38 return userSettings.Get<Setting::EFExperimentalCmd>() || userSettings.Get<Setting::EFExperimentalArg>(); 39 case ExperimentalFeature::Feature::ExperimentalArg: 40 return userSettings.Get<Setting::EFExperimentalArg>(); 41 case ExperimentalFeature::Feature::DirectMSI: 42 return userSettings.Get<Setting::EFDirectMSI>(); 43 case ExperimentalFeature::Feature::Resume: 44 return userSettings.Get<Setting::EFResume>(); 45 case ExperimentalFeature::Feature::Font: 46 return userSettings.Get<Setting::EFFonts>(); 47 default: 48 THROW_HR(E_UNEXPECTED); 49 } 50 #endif 51 } 52 } 53 54 bool ExperimentalFeature::IsEnabled(Feature feature) 55 { 56 return IsEnabledInternal(feature, User()); 57 } 58 59 #ifndef AICLI_DISABLE_TEST_HOOKS 60 bool ExperimentalFeature::IsEnabled(Feature feature, const UserSettings& userSettings) 61 { 62 return IsEnabledInternal(feature, userSettings); 63 } 64 #endif 65 66 ExperimentalFeature ExperimentalFeature::GetFeature(ExperimentalFeature::Feature feature) 67 { 68 switch (feature) 69 { 70 case Feature::ExperimentalCmd: 71 return ExperimentalFeature{ "Command Sample", "experimentalCmd", "https://aka.ms/winget-settings", Feature::ExperimentalCmd }; 72 case Feature::ExperimentalArg: 73 return ExperimentalFeature{ "Argument Sample", "experimentalArg", "https://aka.ms/winget-settings", Feature::ExperimentalArg }; 74 case Feature::DirectMSI: 75 return ExperimentalFeature{ "Direct MSI Installation", "directMSI", "https://aka.ms/winget-settings", Feature::DirectMSI }; 76 case Feature::Resume: 77 return ExperimentalFeature{ "Resume", "resume", "https://aka.ms/winget-settings", Feature::Resume }; 78 case Feature::Font: 79 return ExperimentalFeature{ "Font", "Font", "https://aka.ms/winget-settings", Feature::Font }; 80 81 default: 82 THROW_HR(E_UNEXPECTED); 83 } 84 } 85 86 std::vector<ExperimentalFeature> ExperimentalFeature::GetAllFeatures() 87 { 88 std::vector<ExperimentalFeature> result; 89 90 for (Feature_t i = 0x1; i < static_cast<Feature_t>(Feature::Max); i = i << 1) 91 { 92 result.emplace_back(GetFeature(static_cast<Feature>(i))); 93 } 94 95 return result; 96 } 97 }