winget-cli

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

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 }