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