ConfigurationStatus.h (4955B)
1 // Copyright (c) Microsoft Corporation. 2 // Licensed under the MIT License. 3 #pragma once 4 #include "Database/ConfigurationDatabase.h" 5 #include "ConfigurationSetChangeData.h" 6 #include <winrt/Microsoft.Management.Configuration.h> 7 #include <map> 8 #include <memory> 9 #include <mutex> 10 #include <optional> 11 #include <vector> 12 13 14 namespace winrt::Microsoft::Management::Configuration::implementation 15 { 16 // Forward declarations 17 struct ConfigurationProcessor; 18 struct ConfigurationSet; 19 struct ConfigurationSetChangeData; 20 21 namespace details 22 { 23 struct ChangeListener; 24 } 25 26 // Provides access to overall configuration status information. 27 struct ConfigurationStatus 28 { 29 private: 30 struct private_construction {}; 31 32 public: 33 friend details::ChangeListener; 34 35 ConfigurationStatus(private_construction); 36 37 ConfigurationStatus(const ConfigurationStatus&) = delete; 38 ConfigurationStatus& operator=(const ConfigurationStatus&) = delete; 39 40 ConfigurationStatus(ConfigurationStatus&&) = delete; 41 ConfigurationStatus& operator=(ConfigurationStatus&&) = delete; 42 43 ~ConfigurationStatus(); 44 45 // Gets the singleton instance. 46 static std::shared_ptr<ConfigurationStatus> Instance(); 47 48 // Get various set state information 49 ConfigurationSetState GetSetState(const guid& instanceIdentifier); 50 clock::time_point GetSetFirstApply(const guid& instanceIdentifier); 51 clock::time_point GetSetApplyBegun(const guid& instanceIdentifier); 52 clock::time_point GetSetApplyEnded(const guid& instanceIdentifier); 53 ConfigurationUnitState GetUnitState(const guid& instanceIdentifier); 54 IConfigurationUnitResultInformation GetUnitResultInformation(const guid& instanceIdentifier); 55 56 // Record state changes 57 void UpdateSetState(const guid& setInstanceIdentifier, ConfigurationSetState state); 58 void UpdateSetState(const guid& setInstanceIdentifier, bool inQueue); 59 void UpdateUnitState(const guid& setInstanceIdentifier, const com_ptr<implementation::ConfigurationSetChangeData>& changeData); 60 61 // Keeps data for a set change listener. 62 struct SetChangeRegistration 63 { 64 SetChangeRegistration(const guid& instanceIdentifier, ConfigurationSet* configurationSet); 65 66 SetChangeRegistration(const SetChangeRegistration&) = delete; 67 SetChangeRegistration& operator=(const SetChangeRegistration&) = delete; 68 69 SetChangeRegistration(SetChangeRegistration&&) = delete; 70 SetChangeRegistration& operator=(SetChangeRegistration&&) = delete; 71 72 ~SetChangeRegistration(); 73 74 private: 75 std::shared_ptr<ConfigurationStatus> m_status; 76 guid m_instanceIdentifier; 77 ConfigurationSet* m_configurationSet; 78 }; 79 80 std::shared_ptr<SetChangeRegistration> RegisterForSetChange(ConfigurationSet& set); 81 void RemoveSetChangeRegistration(const guid& instanceIdentifier, ConfigurationSet* configurationSet) noexcept; 82 83 // Keeps data for a change listener. 84 struct ChangeRegistration 85 { 86 ChangeRegistration(const guid& instanceIdentifier); 87 88 ChangeRegistration(const ChangeRegistration&) = delete; 89 ChangeRegistration& operator=(const ChangeRegistration&) = delete; 90 91 ChangeRegistration(ChangeRegistration&&) = delete; 92 ChangeRegistration& operator=(ChangeRegistration&&) = delete; 93 94 ~ChangeRegistration(); 95 96 private: 97 std::shared_ptr<ConfigurationStatus> m_status; 98 guid m_instanceIdentifier; 99 }; 100 101 std::shared_ptr<ChangeRegistration> RegisterForChange(ConfigurationProcessor& processor); 102 void RemoveChangeRegistration(const guid& instanceIdentifier) noexcept; 103 104 private: 105 void EnableChangeListeningIfNeeded(); 106 void DisableChangeListeningIfNeeded(); 107 108 void SignalChangeListeners(); 109 110 ConfigurationDatabase& Database(); 111 112 bool HasSetChangeRegistration(const guid& setInstanceIdentifier); 113 bool HasChangeRegistrations(); 114 115 void SetChangeDetected(const guid& setInstanceIdentifier, com_ptr<ConfigurationSetChangeData>& data, const std::optional<GUID>& unitInstanceIdentifier); 116 void ChangeDetected(const Configuration::ConfigurationSet& set, const Configuration::ConfigurationChangeData& data); 117 118 ConfigurationDatabase m_database; 119 120 std::mutex m_changeRegistrationsMutex; 121 std::multimap<guid, ConfigurationSet*> m_setChangeRegistrations; 122 std::vector<std::pair<guid, ConfigurationProcessor*>> m_changeRegistrations; 123 124 // Keep this last to ensure it is destroyed first 125 std::unique_ptr<details::ChangeListener> m_changeListener; 126 }; 127 }