ConfigurationSetUtilities.cpp (5365B)
1 // Copyright (c) Microsoft Corporation. 2 // Licensed under the MIT License. 3 #include "pch.h" 4 #include "ConfigurationSetUtilities.h" 5 #include <AppInstallerStrings.h> 6 7 using namespace std::string_view_literals; 8 9 namespace winrt::Microsoft::Management::Configuration::implementation 10 { 11 std::string_view GetConfigurationFieldName(ConfigurationField fieldName) 12 { 13 switch (fieldName) 14 { 15 case ConfigurationField::ConfigurationVersion: return "configurationVersion"sv; 16 case ConfigurationField::Properties: return "properties"sv; 17 case ConfigurationField::Resource: return "resource"sv; 18 case ConfigurationField::Directives: return "directives"sv; 19 case ConfigurationField::Settings: return "settings"sv; 20 case ConfigurationField::Assertions: return "assertions"sv; 21 case ConfigurationField::Id: return "id"sv; 22 case ConfigurationField::DependsOn: return "dependsOn"sv; 23 24 case ConfigurationField::Resources: return "resources"sv; 25 case ConfigurationField::ModuleDirective: return "module"sv; 26 case ConfigurationField::SecurityContextMetadata: return "securityContext"sv; 27 28 case ConfigurationField::Schema: return "$schema"sv; 29 case ConfigurationField::Metadata: return "metadata"sv; 30 case ConfigurationField::Parameters: return "parameters"sv; 31 case ConfigurationField::Variables: return "variables"sv; 32 case ConfigurationField::Type: return "type"sv; 33 case ConfigurationField::Description: return "description"sv; 34 case ConfigurationField::Name: return "name"sv; 35 case ConfigurationField::IsGroupMetadata: return "isGroup"sv; 36 case ConfigurationField::DefaultValue: return "defaultValue"sv; 37 case ConfigurationField::AllowedValues: return "allowedValues"sv; 38 case ConfigurationField::MinimumLength: return "minLength"sv; 39 case ConfigurationField::MaximumLength: return "maxLength"sv; 40 case ConfigurationField::MinimumValue: return "minValue"sv; 41 case ConfigurationField::MaximumValue: return "maxValue"sv; 42 case ConfigurationField::WingetMetadataRoot: return "winget"sv; 43 case ConfigurationField::ProcessorMetadata: return "processor"sv; 44 case ConfigurationField::ProcessorIdentifierMetadata: return "identifier"sv; 45 case ConfigurationField::ProcessorPropertiesMetadata: return "properties"sv; 46 } 47 48 THROW_HR(E_UNEXPECTED); 49 } 50 51 hstring GetConfigurationFieldNameHString(ConfigurationField fieldName) 52 { 53 return hstring{ AppInstaller::Utility::ConvertToUTF16(GetConfigurationFieldName(fieldName)) }; 54 } 55 56 bool TryParseSecurityContext(const hstring& value, SecurityContext& result) 57 { 58 std::wstring securityContextLower = AppInstaller::Utility::ToLower(value); 59 60 if (securityContextLower == L"elevated") 61 { 62 result = SecurityContext::Elevated; 63 } 64 else if (securityContextLower == L"restricted") 65 { 66 result = SecurityContext::Restricted; 67 } 68 else if (securityContextLower == L"current") 69 { 70 result = SecurityContext::Current; 71 } 72 else 73 { 74 return false; 75 } 76 77 return true; 78 } 79 80 SecurityContext ParseSecurityContext(const hstring& value) 81 { 82 SecurityContext result = SecurityContext::Current; 83 THROW_HR_IF(E_INVALIDARG, !TryParseSecurityContext(value, result)); 84 return result; 85 } 86 87 std::string_view ToString(SecurityContext value) 88 { 89 switch (value) 90 { 91 case SecurityContext::Current: return "current"; 92 case SecurityContext::Restricted: return "restricted"; 93 case SecurityContext::Elevated: return "elevated"; 94 } 95 96 THROW_HR(E_INVALIDARG); 97 } 98 99 std::wstring_view ToWString(SecurityContext value) 100 { 101 switch (value) 102 { 103 case SecurityContext::Current: return L"current"; 104 case SecurityContext::Restricted: return L"restricted"; 105 case SecurityContext::Elevated: return L"elevated"; 106 } 107 108 THROW_HR(E_INVALIDARG); 109 } 110 111 Windows::Foundation::Collections::ValueSet TryLookupValueSet(const Windows::Foundation::Collections::ValueSet& valueSet, ConfigurationField field) 112 { 113 Windows::Foundation::IInspectable value = valueSet.TryLookup(GetConfigurationFieldNameHString(field)); 114 115 if (value) 116 { 117 return value.try_as<Windows::Foundation::Collections::ValueSet>(); 118 } 119 120 return nullptr; 121 } 122 123 Windows::Foundation::IPropertyValue TryLookupProperty(const Windows::Foundation::Collections::ValueSet& valueSet, ConfigurationField field, Windows::Foundation::PropertyType type) 124 { 125 Windows::Foundation::IInspectable value = valueSet.TryLookup(GetConfigurationFieldNameHString(field)); 126 127 if (value) 128 { 129 Windows::Foundation::IPropertyValue property = value.try_as<Windows::Foundation::IPropertyValue>(); 130 if (property && (type == Windows::Foundation::PropertyType::Empty || property.Type() == type)) 131 { 132 return property; 133 } 134 } 135 136 return nullptr; 137 } 138 }