winget-cli

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

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 }