#ifndef CHROMEOS_COMPONENTS_CDM_FACTORY_DAEMON_OUTPUT_PROTECTION_IMPL_H_
#define CHROMEOS_COMPONENTS_CDM_FACTORY_DAEMON_OUTPUT_PROTECTION_IMPL_H_
#include <memory>
#include <vector>
#include "base/component_export.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "chromeos/components/cdm_factory_daemon/mojom/output_protection.mojom.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "ui/display/display_observer.h"
#include "ui/display/manager/content_protection_manager.h"
#include "ui/display/types/display_snapshot.h"
namespace chromeos {
class COMPONENT_EXPORT(CDM_FACTORY_DAEMON) OutputProtectionImpl
: public cdm::mojom::OutputProtection,
public display::DisplayObserver {
public:
class DisplaySystemDelegate {
public:
virtual ~DisplaySystemDelegate() = default;
virtual void ApplyContentProtection(
display::ContentProtectionManager::ClientId client_id,
int64_t display_id,
uint32_t protection_mask,
display::ContentProtectionManager::ApplyContentProtectionCallback
callback) = 0;
virtual void QueryContentProtection(
display::ContentProtectionManager::ClientId client_id,
int64_t display_id,
display::ContentProtectionManager::QueryContentProtectionCallback
callback) = 0;
virtual display::ContentProtectionManager::ClientId RegisterClient() = 0;
virtual void UnregisterClient(
display::ContentProtectionManager::ClientId client_id) = 0;
virtual const std::vector<
raw_ptr<display::DisplaySnapshot, VectorExperimental>>&
cached_displays() const = 0;
};
static void Create(
mojo::PendingReceiver<cdm::mojom::OutputProtection> receiver,
std::unique_ptr<DisplaySystemDelegate> delegate = nullptr);
explicit OutputProtectionImpl(
std::unique_ptr<DisplaySystemDelegate> delegate);
OutputProtectionImpl(const OutputProtectionImpl&) = delete;
OutputProtectionImpl& operator=(const OutputProtectionImpl&) = delete;
~OutputProtectionImpl() override;
void QueryStatus(QueryStatusCallback callback) override;
void EnableProtection(
cdm::mojom::OutputProtection::ProtectionType desired_protection,
EnableProtectionCallback callback) override;
private:
void Initialize();
void EnableProtectionCallbackAggregator(
std::vector<int64_t> remaining_displays,
EnableProtectionCallback callback,
bool aggregate_success,
bool success);
void QueryStatusCallbackAggregator(std::vector<int64_t> remaining_displays,
QueryStatusCallback callback,
bool aggregate_success,
uint32_t aggregate_link_mask,
uint32_t aggregate_protection_mask,
uint32_t aggregate_no_protection_mask,
bool success,
uint32_t link_mask,
uint32_t protection_mask);
void HandleDisplayChange();
void OnDisplayAdded(const display::Display& display) override;
void OnDisplayMetricsChanged(const display::Display& display,
uint32_t changed_metrics) override;
void OnDisplaysRemoved(const display::Displays& removed_displays) override;
void ReportOutputProtectionQuery();
void ReportOutputProtectionQueryResult(uint32_t link_mask,
uint32_t protection_mask);
std::unique_ptr<DisplaySystemDelegate> delegate_;
display::ContentProtectionManager::ClientId client_id_;
std::optional<display::ScopedOptionalDisplayObserver> display_observer_;
std::vector<int64_t> display_id_list_;
uint32_t desired_protection_mask_{0};
bool uma_for_output_protection_query_reported_ = false;
bool uma_for_output_protection_positive_result_reported_ = false;
base::WeakPtrFactory<OutputProtectionImpl> weak_factory_{this};
};
}
#endif