1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "media/cdm/library_cdm/clear_key_cdm/cdm_file_adapter.h"
6 
7 #include <memory>
8 
9 #include "base/bind.h"
10 #include "base/logging.h"
11 #include "media/cdm/library_cdm/cdm_host_proxy.h"
12 
13 namespace media {
14 
15 namespace {
16 
ConvertStatus(cdm::FileIOClient::Status status)17 CdmFileAdapter::Status ConvertStatus(cdm::FileIOClient::Status status) {
18   switch (status) {
19     case cdm::FileIOClient::Status::kSuccess:
20       return CdmFileAdapter::Status::kSuccess;
21     case cdm::FileIOClient::Status::kInUse:
22       return CdmFileAdapter::Status::kInUse;
23     case cdm::FileIOClient::Status::kError:
24       return CdmFileAdapter::Status::kError;
25   }
26 
27   NOTREACHED();
28   return CdmFileAdapter::Status::kError;
29 }
30 
31 }  // namespace
32 
CdmFileAdapter(CdmHostProxy * cdm_host_proxy)33 CdmFileAdapter::CdmFileAdapter(CdmHostProxy* cdm_host_proxy) {
34   file_io_ = cdm_host_proxy->CreateFileIO(this);
35 }
36 
~CdmFileAdapter()37 CdmFileAdapter::~CdmFileAdapter() {
38   DCHECK(!open_cb_);
39   DCHECK(!read_cb_);
40   DCHECK(!write_cb_);
41   file_io_->Close();
42 }
43 
Open(const std::string & name,FileOpenedCB open_cb)44 void CdmFileAdapter::Open(const std::string& name, FileOpenedCB open_cb) {
45   DVLOG(2) << __func__;
46   open_cb_ = std::move(open_cb);
47   file_io_->Open(name.data(), name.length());
48 }
49 
Read(ReadCB read_cb)50 void CdmFileAdapter::Read(ReadCB read_cb) {
51   DVLOG(2) << __func__;
52   read_cb_ = std::move(read_cb);
53   file_io_->Read();
54 }
55 
Write(const std::vector<uint8_t> & data,WriteCB write_cb)56 void CdmFileAdapter::Write(const std::vector<uint8_t>& data, WriteCB write_cb) {
57   DVLOG(2) << __func__;
58   write_cb_ = std::move(write_cb);
59   file_io_->Write(data.data(), data.size());
60 }
61 
OnOpenComplete(cdm::FileIOClient::Status status)62 void CdmFileAdapter::OnOpenComplete(cdm::FileIOClient::Status status) {
63   std::move(open_cb_).Run(ConvertStatus(status));
64 }
65 
OnReadComplete(cdm::FileIOClient::Status status,const uint8_t * data,uint32_t data_size)66 void CdmFileAdapter::OnReadComplete(cdm::FileIOClient::Status status,
67                                     const uint8_t* data,
68                                     uint32_t data_size) {
69   std::move(read_cb_).Run(
70       status == FileIOClient::Status::kSuccess && data_size > 0,
71       std::vector<uint8_t>(data, data + data_size));
72 }
73 
OnWriteComplete(cdm::FileIOClient::Status status)74 void CdmFileAdapter::OnWriteComplete(cdm::FileIOClient::Status status) {
75   std::move(write_cb_).Run(status == FileIOClient::Status::kSuccess);
76 }
77 
78 }  // namespace media
79