winget-cli

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

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 }