ConfigurationSetSerializer_0_2.cpp (5644B)
1 // Copyright (c) Microsoft Corporation. 2 // Licensed under the MIT License. 3 #include "pch.h" 4 #include "ConfigurationSetSerializer_0_2.h" 5 #include "ConfigurationSetUtilities.h" 6 7 #include <AppInstallerStrings.h> 8 9 using namespace AppInstaller::Utility; 10 using namespace AppInstaller::YAML; 11 using namespace winrt::Windows::Foundation; 12 13 namespace winrt::Microsoft::Management::Configuration::implementation 14 { 15 hstring ConfigurationSetSerializer_0_2::Serialize(ConfigurationSet* configurationSet) 16 { 17 std::vector<ConfigurationUnit> assertions; 18 std::vector<ConfigurationUnit> resources; 19 20 for (auto unit : configurationSet->Units()) 21 { 22 ConfigurationUnitIntent unitIntent = unit.Intent(); 23 24 if (unitIntent == ConfigurationUnitIntent::Assert) 25 { 26 assertions.emplace_back(unit); 27 } 28 else if (unitIntent == ConfigurationUnitIntent::Apply) 29 { 30 resources.emplace_back(unit); 31 } 32 } 33 34 Emitter emitter; 35 36 emitter << BeginMap; 37 emitter << Key << GetConfigurationFieldName(ConfigurationField::Properties); 38 39 emitter << BeginMap; 40 emitter << Key << GetConfigurationFieldName(ConfigurationField::ConfigurationVersion) << Value << ConvertToUTF8(configurationSet->SchemaVersion()); 41 42 if (!assertions.empty()) 43 { 44 emitter << Key << GetConfigurationFieldName(ConfigurationField::Assertions); 45 WriteYamlConfigurationUnits(emitter, assertions); 46 } 47 48 if (!resources.empty()) 49 { 50 emitter << Key << GetConfigurationFieldName(ConfigurationField::Resources); 51 WriteYamlConfigurationUnits(emitter, resources); 52 } 53 54 emitter << EndMap; 55 emitter << EndMap; 56 57 std::wostringstream result; 58 result << GetSchemaVersionCommentPrefix() << static_cast<std::wstring_view>(configurationSet->SchemaVersion()) << L"\n" << ConvertToUTF16(emitter.str()); 59 return hstring{ std::move(result).str() }; 60 } 61 62 std::string ConfigurationSetSerializer_0_2::SerializeMetadataWithEnvironment(const Windows::Foundation::Collections::ValueSet& metadata, const Configuration::ConfigurationEnvironment& environment) 63 { 64 Emitter emitter; 65 WriteYamlValueSet(emitter, metadata, GetMetadataWithEnvironmentOverrides(false, environment.Context())); 66 return emitter.str(); 67 } 68 69 void ConfigurationSetSerializer_0_2::WriteYamlConfigurationUnits(AppInstaller::YAML::Emitter& emitter, const std::vector<ConfigurationUnit>& units) 70 { 71 emitter << BeginSeq; 72 73 for (const auto& unit : units) 74 { 75 // Resource 76 emitter << BeginMap; 77 emitter << Key << GetConfigurationFieldName(ConfigurationField::Resource) << Value << AppInstaller::Utility::ConvertToUTF8(GetResourceName(unit)); 78 79 // Id 80 if (!unit.Identifier().empty()) 81 { 82 emitter << Key << GetConfigurationFieldName(ConfigurationField::Id) << Value << AppInstaller::Utility::ConvertToUTF8(unit.Identifier()); 83 } 84 85 // Dependencies 86 if (unit.Dependencies().Size() > 0) 87 { 88 emitter << Key << GetConfigurationFieldName(ConfigurationField::DependsOn); 89 emitter << BeginSeq; 90 91 for (const auto& dependency : unit.Dependencies()) 92 { 93 emitter << AppInstaller::Utility::ConvertToUTF8(dependency); 94 } 95 96 emitter << EndSeq; 97 } 98 99 // Directives 100 WriteResourceDirectives(emitter, unit); 101 102 // Settings 103 const auto& settings = unit.Settings(); 104 emitter << Key << GetConfigurationFieldName(ConfigurationField::Settings); 105 WriteYamlValueSet(emitter, settings); 106 107 emitter << EndMap; 108 } 109 110 emitter << EndSeq; 111 } 112 113 winrt::hstring ConfigurationSetSerializer_0_2::GetResourceName(const ConfigurationUnit& unit) 114 { 115 const auto& metadata = unit.Metadata(); 116 const auto moduleKey = GetConfigurationFieldNameHString(ConfigurationField::ModuleDirective); 117 if (metadata.HasKey(moduleKey)) 118 { 119 auto object = metadata.Lookup(moduleKey); 120 auto property = object.try_as<IPropertyValue>(); 121 if (property && property.Type() == PropertyType::String) 122 { 123 return property.GetString() + '/' + unit.Type(); 124 } 125 } 126 127 return unit.Type(); 128 } 129 130 void ConfigurationSetSerializer_0_2::WriteResourceDirectives(AppInstaller::YAML::Emitter& emitter, const ConfigurationUnit& unit) 131 { 132 WriteYamlValueSetIfNotEmpty(emitter, ConfigurationField::Directives, unit.Metadata(), GetMetadataWithEnvironmentOverrides(true, unit.Environment().Context())); 133 } 134 135 ConfigurationSetSerializer::OverrideMap ConfigurationSetSerializer_0_2::GetMetadataWithEnvironmentOverrides(bool includeModuleOverride, SecurityContext securityContext) 136 { 137 ConfigurationSetSerializer::OverrideMap result { 138 { ConfigurationField::SecurityContextMetadata, (securityContext != SecurityContext::Current ? PropertyValue::CreateString(ToWString(securityContext)) : nullptr)} 139 }; 140 141 if (includeModuleOverride) 142 { 143 result.emplace_back(ConfigurationField::ModuleDirective, nullptr); 144 } 145 146 return result; 147 } 148 }