ConfigurationProcessor.h (10748B)
1 // Copyright (c) Microsoft Corporation. 2 // Licensed under the MIT License. 3 #pragma once 4 #include "ConfigurationProcessor.g.h" 5 #include <winrt/Windows.Foundation.h> 6 #include <winrt/Windows.Foundation.Collections.h> 7 #include <winrt/Windows.Storage.Streams.h> 8 #include "ConfigThreadGlobals.h" 9 #include "ConfigurationStatus.h" 10 #include "Database/ConfigurationDatabase.h" 11 #include <winget/AsyncTokens.h> 12 #include "ShutdownSynchronization.h" 13 #include <winget/ILifetimeWatcher.h> 14 15 #include <functional> 16 #include <mutex> 17 #include <string_view> 18 19 namespace winrt::Microsoft::Management::Configuration::implementation 20 { 21 struct ConfigurationProcessor : ConfigurationProcessorT<ConfigurationProcessor, winrt::cloaked<AppInstaller::WinRT::ILifetimeWatcher>>, AppInstaller::WinRT::LifetimeWatcherBase 22 { 23 using ConfigurationSetChangeData = Configuration::ConfigurationSetChangeData; 24 using ConfigurationUnit = Configuration::ConfigurationUnit; 25 using ApplyConfigurationSetResult = Configuration::ApplyConfigurationSetResult; 26 using TestConfigurationSetResult = Configuration::TestConfigurationSetResult; 27 using TestConfigurationUnitResult = Configuration::TestConfigurationUnitResult; 28 using GetConfigurationUnitSettingsResult = Configuration::GetConfigurationUnitSettingsResult; 29 using GetAllConfigurationUnitSettingsResult = Configuration::GetAllConfigurationUnitSettingsResult; 30 using GetConfigurationSetDetailsResult = Configuration::GetConfigurationSetDetailsResult; 31 using GetConfigurationUnitDetailsResult = Configuration::GetConfigurationUnitDetailsResult; 32 33 #if !defined(INCLUDE_ONLY_INTERFACE_METHODS) 34 ConfigurationProcessor(); 35 #endif 36 37 ConfigurationProcessor(const IConfigurationSetProcessorFactory& factory); 38 39 event_token Diagnostics(const Windows::Foundation::EventHandler<IDiagnosticInformation>& handler); 40 void Diagnostics(const event_token& token) noexcept; 41 42 DiagnosticLevel MinimumLevel(); 43 void MinimumLevel(DiagnosticLevel value); 44 45 hstring Caller() const; 46 void Caller(hstring value); 47 48 guid ActivityIdentifier(); 49 void ActivityIdentifier(const guid& value); 50 51 bool GenerateTelemetryEvents(); 52 void GenerateTelemetryEvents(bool value); 53 54 event_token ConfigurationChange(const Windows::Foundation::TypedEventHandler<Configuration::ConfigurationSet, Configuration::ConfigurationChangeData>& handler); 55 void ConfigurationChange(const event_token& token) noexcept; 56 57 Windows::Foundation::Collections::IVector<Configuration::ConfigurationSet> GetConfigurationHistory(); 58 Windows::Foundation::IAsyncOperation<Windows::Foundation::Collections::IVector<Configuration::ConfigurationSet>> GetConfigurationHistoryAsync(); 59 60 Configuration::OpenConfigurationSetResult OpenConfigurationSet(const Windows::Storage::Streams::IInputStream& stream); 61 Windows::Foundation::IAsyncOperation<Configuration::OpenConfigurationSetResult> OpenConfigurationSetAsync(const Windows::Storage::Streams::IInputStream& stream); 62 63 Windows::Foundation::Collections::IVector<ConfigurationConflict> CheckForConflicts( 64 const Windows::Foundation::Collections::IVectorView<Configuration::ConfigurationSet>& configurationSets, 65 bool includeConfigurationHistory); 66 Windows::Foundation::IAsyncOperation<Windows::Foundation::Collections::IVector<ConfigurationConflict>> CheckForConflictsAsync( 67 const Windows::Foundation::Collections::IVectorView<Configuration::ConfigurationSet>& configurationSets, 68 bool includeConfigurationHistory); 69 70 GetConfigurationSetDetailsResult GetSetDetails(const Configuration::ConfigurationSet& configurationSet, ConfigurationUnitDetailFlags detailFlags); 71 Windows::Foundation::IAsyncOperationWithProgress<GetConfigurationSetDetailsResult, GetConfigurationUnitDetailsResult> GetSetDetailsAsync(const Configuration::ConfigurationSet& configurationSet, ConfigurationUnitDetailFlags detailFlags); 72 73 GetConfigurationUnitDetailsResult GetUnitDetails(const ConfigurationUnit& unit, ConfigurationUnitDetailFlags detailFlags); 74 Windows::Foundation::IAsyncOperation<GetConfigurationUnitDetailsResult> GetUnitDetailsAsync(const ConfigurationUnit& unit, ConfigurationUnitDetailFlags detailFlags); 75 76 ApplyConfigurationSetResult ApplySet(const Configuration::ConfigurationSet& configurationSet, ApplyConfigurationSetFlags flags); 77 Windows::Foundation::IAsyncOperationWithProgress<ApplyConfigurationSetResult, ConfigurationSetChangeData> ApplySetAsync(const Configuration::ConfigurationSet& configurationSet, ApplyConfigurationSetFlags flags); 78 79 TestConfigurationSetResult TestSet(const Configuration::ConfigurationSet& configurationSet); 80 Windows::Foundation::IAsyncOperationWithProgress<TestConfigurationSetResult, TestConfigurationUnitResult> TestSetAsync(const Configuration::ConfigurationSet& configurationSet); 81 82 GetConfigurationUnitSettingsResult GetUnitSettings(const ConfigurationUnit& unit); 83 Windows::Foundation::IAsyncOperation<GetConfigurationUnitSettingsResult> GetUnitSettingsAsync(const ConfigurationUnit& unit); 84 85 GetAllConfigurationUnitSettingsResult GetAllUnitSettings(const ConfigurationUnit& unit); 86 Windows::Foundation::IAsyncOperation<GetAllConfigurationUnitSettingsResult> GetAllUnitSettingsAsync(const ConfigurationUnit& unit); 87 88 Configuration::GetAllConfigurationUnitsResult GetAllUnits(const ConfigurationUnit& unit); 89 Windows::Foundation::IAsyncOperation<Configuration::GetAllConfigurationUnitsResult> GetAllUnitsAsync(const ConfigurationUnit& unit); 90 91 Windows::Foundation::Collections::IVector<Configuration::IConfigurationUnitProcessorDetails> FindUnitProcessors(const Configuration::FindUnitProcessorsOptions& findOptions); 92 Windows::Foundation::IAsyncOperation<Windows::Foundation::Collections::IVector<Configuration::IConfigurationUnitProcessorDetails>> FindUnitProcessorsAsync(const Configuration::FindUnitProcessorsOptions& findOptions); 93 94 Configuration::ApplyConfigurationUnitResult ApplyUnit(const ConfigurationUnit& unit); 95 Windows::Foundation::IAsyncOperation<Configuration::ApplyConfigurationUnitResult> ApplyUnitAsync(const ConfigurationUnit& unit); 96 97 Configuration::TestConfigurationUnitResult TestUnit(const ConfigurationUnit& unit); 98 Windows::Foundation::IAsyncOperation<Configuration::TestConfigurationUnitResult> TestUnitAsync(const ConfigurationUnit& unit); 99 100 HRESULT STDMETHODCALLTYPE SetLifetimeWatcher(IUnknown* watcher); 101 102 #if !defined(INCLUDE_ONLY_INTERFACE_METHODS) 103 void ConfigurationSetProcessorFactory(const IConfigurationSetProcessorFactory& value); 104 105 // Sends diagnostics objects to the event. 106 void SendDiagnostics(DiagnosticLevel level, std::string_view message); 107 108 // Sends diagnostics objects to the event. 109 void SendDiagnostics(const IDiagnosticInformation& information); 110 111 // Indicate a configuration change occurred. 112 void ConfigurationChange(const Configuration::ConfigurationSet& set, const Configuration::ConfigurationChangeData& data); 113 114 private: 115 Windows::Foundation::Collections::IVector<Configuration::ConfigurationSet> GetConfigurationHistoryImpl(ShutdownAwareAsyncCancellation cancellation = {}); 116 117 GetConfigurationSetDetailsResult GetSetDetailsImpl( 118 const Configuration::ConfigurationSet& configurationSet, 119 ConfigurationUnitDetailFlags detailFlags, 120 ShutdownAwareAsyncProgress<GetConfigurationSetDetailsResult, GetConfigurationUnitDetailsResult> progress = {}); 121 122 GetConfigurationUnitDetailsResult GetUnitDetailsImpl(const ConfigurationUnit& unit, ConfigurationUnitDetailFlags detailFlags); 123 124 ApplyConfigurationSetResult ApplySetImpl( 125 const Configuration::ConfigurationSet& configurationSet, 126 ApplyConfigurationSetFlags flags, 127 ShutdownAwareAsyncProgress<ApplyConfigurationSetResult, ConfigurationSetChangeData> progress = {}); 128 129 TestConfigurationSetResult TestSetImpl( 130 const Configuration::ConfigurationSet& configurationSet, 131 ShutdownAwareAsyncProgress<TestConfigurationSetResult, TestConfigurationUnitResult> progress = {}); 132 133 GetConfigurationUnitSettingsResult GetUnitSettingsImpl(const ConfigurationUnit& unit, ShutdownAwareAsyncCancellation cancellation = {}); 134 135 GetAllConfigurationUnitSettingsResult GetAllUnitSettingsImpl(const ConfigurationUnit& unit, ShutdownAwareAsyncCancellation cancellation = {}); 136 137 Configuration::GetAllConfigurationUnitsResult GetAllUnitsImpl(const ConfigurationUnit& unit, ShutdownAwareAsyncCancellation cancellation = {}); 138 139 Windows::Foundation::Collections::IVector<Configuration::IConfigurationUnitProcessorDetails> FindUnitProcessorsImpl(const Configuration::FindUnitProcessorsOptions& findOptions, ShutdownAwareAsyncCancellation cancellation = {}); 140 141 Configuration::ApplyConfigurationUnitResult ApplyUnitImpl(const ConfigurationUnit& unit, ShutdownAwareAsyncCancellation cancellation = {}); 142 143 Configuration::TestConfigurationUnitResult TestUnitImpl(const ConfigurationUnit& unit, ShutdownAwareAsyncCancellation cancellation = {}); 144 145 IConfigurationGroupProcessor GetSetGroupProcessor(const Configuration::ConfigurationSet& configurationSet); 146 147 void SendDiagnosticsImpl(const IDiagnosticInformation& information); 148 149 IConfigurationSetProcessorFactory m_factory = nullptr; 150 event<Windows::Foundation::EventHandler<IDiagnosticInformation>> m_diagnostics; 151 event<Windows::Foundation::TypedEventHandler<Configuration::ConfigurationSet, Configuration::ConfigurationChangeData>> m_configurationChange; 152 ConfigThreadGlobals m_threadGlobals; 153 IConfigurationSetProcessorFactory::Diagnostics_revoker m_factoryDiagnosticsEventRevoker; 154 DiagnosticLevel m_minimumLevel = DiagnosticLevel::Informational; 155 std::recursive_mutex m_diagnosticsMutex; 156 ConfigurationDatabase m_database; 157 bool m_isHandlingDiagnostics = false; 158 std::shared_ptr<ConfigurationStatus::ChangeRegistration> m_changeRegistration; 159 #endif 160 }; 161 } 162 163 #if !defined(INCLUDE_ONLY_INTERFACE_METHODS) 164 namespace winrt::Microsoft::Management::Configuration::factory_implementation 165 { 166 struct ConfigurationProcessor : ConfigurationProcessorT<ConfigurationProcessor, implementation::ConfigurationProcessor> 167 { 168 }; 169 } 170 #endif