| // Copyright 2017 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CONTENT_BROWSER_MEDIA_CDM_FILE_IMPL_H_ |
| #define CONTENT_BROWSER_MEDIA_CDM_FILE_IMPL_H_ |
| |
| #include <string> |
| #include <vector> |
| |
| #include "base/files/file.h" |
| #include "base/functional/callback_forward.h" |
| #include "base/memory/weak_ptr.h" |
| #include "base/threading/sequence_bound.h" |
| #include "base/threading/thread_checker.h" |
| #include "base/time/time.h" |
| #include "media/cdm/cdm_type.h" |
| #include "media/mojo/mojom/cdm_storage.mojom.h" |
| #include "mojo/public/cpp/bindings/associated_receiver.h" |
| #include "third_party/blink/public/common/storage_key/storage_key.h" |
| |
| namespace content { |
| class CdmStorageManager; |
| |
| // This class implements the media::mojom::CdmFile interface. |
| class CdmFileImpl final : public media::mojom::CdmFile { |
| public: |
| // Check whether |name| is valid as a usable file name. Returns true if it is, |
| // false otherwise. |
| static bool IsValidName(const std::string& name); |
| |
| // This "file" is actually just an entry in a custom backend for CDM, uniquely |
| // identified by a storage key, CDM type, and file name. File operations are |
| // routed through `manager` which is owned by the storage partition. |
| // This constructor is used by the CdmStorageManager. |
| CdmFileImpl( |
| CdmStorageManager* manager, |
| const blink::StorageKey& storage_key, |
| const media::CdmType& cdm_type, |
| const std::string& file_name, |
| mojo::PendingAssociatedReceiver<media::mojom::CdmFile> pending_receiver); |
| |
| CdmFileImpl(const CdmFileImpl&) = delete; |
| CdmFileImpl& operator=(const CdmFileImpl&) = delete; |
| |
| ~CdmFileImpl() final; |
| |
| // media::mojom::CdmFile implementation. |
| void Read(ReadCallback callback) final; |
| void Write(const std::vector<uint8_t>& data, WriteCallback callback) final; |
| |
| private: |
| void DidRead(std::optional<std::vector<uint8_t>> data); |
| void DidWrite(bool success); |
| |
| // Deletes |file_name_| asynchronously. |
| void DeleteFile(); |
| void DidDeleteFile(bool success); |
| |
| // Report file operation result and time to UMA. |
| void ReportFileOperationUMA(bool success, const std::string& operation); |
| |
| void OnReceiverDisconnect(); |
| |
| // This receiver is associated with the CdmStorageManager which creates it. |
| mojo::AssociatedReceiver<media::mojom::CdmFile> receiver_{this}; |
| |
| const std::string file_name_; |
| const media::CdmType cdm_type_; |
| const blink::StorageKey storage_key_; |
| |
| // Each of these callbacks is only valid while there is an in-progress read |
| // or write operation, respectively. |
| ReadCallback read_callback_; |
| WriteCallback write_callback_; |
| |
| // Time when the read or write operation starts. |
| base::TimeTicks start_time_; |
| |
| // New backing store which CDM file operations are routed through. |
| // CdmStorageManager owns the lifetime of this object and will outlive it. |
| const raw_ptr<CdmStorageManager> cdm_storage_manager_ = nullptr; |
| |
| THREAD_CHECKER(thread_checker_); |
| base::WeakPtrFactory<CdmFileImpl> weak_factory_{this}; |
| }; |
| |
| } // namespace content |
| |
| #endif // CONTENT_BROWSER_MEDIA_CDM_FILE_IMPL_H_ |