// Copyright 2020 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 MEDIA_RENDERERS_WIN_MEDIA_FOUNDATION_PROTECTION_MANAGER_H_
#define MEDIA_RENDERERS_WIN_MEDIA_FOUNDATION_PROTECTION_MANAGER_H_

#include <mfapi.h>
#include <mfidl.h>
#include <windows.media.protection.h>
#include <wrl.h>

#include "base/cancelable_callback.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/sequenced_task_runner.h"
#include "media/base/waiting.h"
#include "media/base/win/media_foundation_cdm_proxy.h"

namespace media {

// Implements IMFContentProtectionManager
// (https://docs.microsoft.com/en-us/windows/win32/api/mfidl/nn-mfidl-imfcontentprotectionmanager)
// and ABI::Windows::Media::Protection::IMediaProtectionManager
// (https://docs.microsoft.com/en-us/uwp/api/windows.media.protection.mediaprotectionmanager)
// required by IMFMediaEngineProtectedContent::SetContentProtectionManager in
// https://docs.microsoft.com/en-us/windows/win32/api/mfmediaengine/nf-mfmediaengine-imfmediaengineprotectedcontent-setcontentprotectionmanager.
//
class MediaFoundationProtectionManager
    : public Microsoft::WRL::RuntimeClass<
          Microsoft::WRL::RuntimeClassFlags<
              Microsoft::WRL::RuntimeClassType::WinRtClassicComMix |
              Microsoft::WRL::RuntimeClassType::InhibitRoOriginateError>,
          IMFContentProtectionManager,
          ABI::Windows::Media::Protection::IMediaProtectionManager> {
 public:
  MediaFoundationProtectionManager();
  ~MediaFoundationProtectionManager() override;

  HRESULT RuntimeClassInitialize(
      scoped_refptr<base::SequencedTaskRunner> task_runner,
      WaitingCB waiting_cb);
  HRESULT SetCdmProxy(scoped_refptr<MediaFoundationCdmProxy> cdm_proxy);

  // IMFContentProtectionManager.
  IFACEMETHODIMP BeginEnableContent(IMFActivate* enabler_activate,
                                    IMFTopology* topology,
                                    IMFAsyncCallback* callback,
                                    IUnknown* state) override;
  IFACEMETHODIMP EndEnableContent(IMFAsyncResult* async_result) override;

  // IMediaProtectionManager.
  // MFMediaEngine can query this interface to invoke get_Properties().
  IFACEMETHODIMP add_ServiceRequested(
      ABI::Windows::Media::Protection::IServiceRequestedEventHandler* handler,
      EventRegistrationToken* cookie) override;
  IFACEMETHODIMP remove_ServiceRequested(
      EventRegistrationToken cookie) override;
  IFACEMETHODIMP add_RebootNeeded(
      ABI::Windows::Media::Protection::IRebootNeededEventHandler* handler,
      EventRegistrationToken* cookie) override;
  IFACEMETHODIMP remove_RebootNeeded(EventRegistrationToken cookie) override;
  IFACEMETHODIMP add_ComponentLoadFailed(
      ABI::Windows::Media::Protection::IComponentLoadFailedEventHandler*
          handler,
      EventRegistrationToken* cookie) override;
  IFACEMETHODIMP remove_ComponentLoadFailed(
      EventRegistrationToken cookie) override;
  IFACEMETHODIMP get_Properties(
      ABI::Windows::Foundation::Collections::IPropertySet** value) override;

 private:
  HRESULT SetPMPServer(
      ABI::Windows::Media::Protection::IMediaProtectionPMPServer* pmp_server);

  // These methods are all running on `task_runner_` due to the threading
  // requirement of `base::CancelableOnceClosure`.
  void OnBeginEnableContent();
  void OnEndEnableContent();
  void OnWaitingForKeyTimeOut();

  scoped_refptr<base::SequencedTaskRunner> task_runner_;
  WaitingCB waiting_cb_;
  base::CancelableOnceClosure waiting_for_key_time_out_cb_;

  scoped_refptr<MediaFoundationCdmProxy> cdm_proxy_;
  Microsoft::WRL::ComPtr<ABI::Windows::Foundation::Collections::IPropertySet>
      property_set_;

  // This must be the last member.
  base::WeakPtrFactory<MediaFoundationProtectionManager> weak_factory_{this};
};

}  // namespace media

#endif  // MEDIA_RENDERERS_WIN_MEDIA_FOUNDATION_PROTECTION_MANAGER_H_
