// 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_MANAGER_QUERY_CONTENT_PROTECTION_TASK_H_
#define UI_DISPLAY_MANAGER_QUERY_CONTENT_PROTECTION_TASK_H_

#include <cstddef>
#include <cstdint>

#include "base/callback.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "ui/display/manager/content_protection_manager.h"
#include "ui/display/manager/display_manager_export.h"
#include "ui/display/types/display_constants.h"

namespace display {

class DisplayLayoutManager;
class NativeDisplayDelegate;

class DISPLAY_MANAGER_EXPORT QueryContentProtectionTask
    : public ContentProtectionManager::Task {
 public:
  // |connection_mask| includes mirroring displays, and a protection method is
  // only included in |protection_mask| if also enabled on mirroring displays.
  using ResponseCallback = base::OnceCallback<
      void(Status status, uint32_t connection_mask, uint32_t protection_mask)>;

  QueryContentProtectionTask(DisplayLayoutManager* layout_manager,
                             NativeDisplayDelegate* native_display_delegate,
                             int64_t display_id,
                             ResponseCallback callback);
  ~QueryContentProtectionTask() override;

  void Run() override;

 private:
  void OnGetHDCPState(bool success, HDCPState state);

  DisplayLayoutManager* const layout_manager_;            // Not owned.
  NativeDisplayDelegate* const native_display_delegate_;  // Not owned.

  const int64_t display_id_;

  ResponseCallback callback_;

  uint32_t connection_mask_ = DISPLAY_CONNECTION_TYPE_NONE;
  uint32_t protection_mask_ = CONTENT_PROTECTION_METHOD_NONE;
  uint32_t no_protection_mask_ = CONTENT_PROTECTION_METHOD_NONE;

  bool success_ = true;
  size_t pending_requests_ = 0;

  base::WeakPtrFactory<QueryContentProtectionTask> weak_ptr_factory_{this};

  DISALLOW_COPY_AND_ASSIGN(QueryContentProtectionTask);
};

}  // namespace display

#endif  // UI_DISPLAY_MANAGER_QUERY_CONTENT_PROTECTION_TASK_H_
