// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef UI_DISPLAY_CHROMEOS_APPLY_CONTENT_PROTECTION_TASK_H_ #define UI_DISPLAY_CHROMEOS_APPLY_CONTENT_PROTECTION_TASK_H_ #include #include #include "base/memory/weak_ptr.h" #include "ui/display/chromeos/display_configurator.h" namespace ui { class DisplayLayoutManager; class DisplaySnapshot; class NativeDisplayDelegate; // In order to apply content protection the task executes in the following // manner: // 1) Run() // a) Query NativeDisplayDelegate for HDCP state on capable displays // b) OnHDCPStateUpdate() called for each display as response to (a) // 2) ApplyProtections() // a) Compute preferred HDCP state for capable displays // b) Call into NativeDisplayDelegate to set HDCP state on capable displays // c) OnHDCPStateApplied() called for each display as reponse to (b) // 3) Call |callback_| to signal end of task. // // Note, in steps 1a and 2a, if no HDCP capable displays are found or if errors // are reported, the task finishes early and skips to step 3. class DISPLAY_EXPORT ApplyContentProtectionTask { public: typedef base::Callback ResponseCallback; ApplyContentProtectionTask( DisplayLayoutManager* layout_manager, NativeDisplayDelegate* native_display_delegate, const DisplayConfigurator::ContentProtections& requests, const ResponseCallback& callback); ~ApplyContentProtectionTask(); void Run(); private: // Callback to NatvieDisplayDelegate::GetHDCPState() void OnHDCPStateUpdate(int64_t display_id, bool success, HDCPState state); // Callback to NativeDisplayDelegate::SetHDCPState() void OnHDCPStateApplied(bool success); void ApplyProtections(); uint32_t GetDesiredProtectionMask(int64_t display_id) const; DisplayLayoutManager* layout_manager_; // Not owned. NativeDisplayDelegate* native_display_delegate_; // Not owned. DisplayConfigurator::ContentProtections requests_; // Callback used to respond once the task finishes. ResponseCallback callback_; // Mapping between display IDs and the HDCP state returned by // NativeDisplayDelegate. std::map display_hdcp_state_map_; // Tracks the status of the NativeDisplayDelegate responses. This will be true // if all the queries were successful, false otherwise. bool query_status_; // Tracks the number of NativeDisplayDelegate requests sent but not answered // yet. size_t pending_requests_; base::WeakPtrFactory weak_ptr_factory_; DISALLOW_COPY_AND_ASSIGN(ApplyContentProtectionTask); }; } // namespace ui #endif // UI_DISPLAY_CHROMEOS_APPLY_CONTENT_PROTECTION_TASK_H_