// Copyright 2017 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.

#include "media/cdm/library_cdm/clear_key_cdm/cdm_file_adapter.h"

#include <memory>

#include "base/bind.h"
#include "base/logging.h"
#include "media/cdm/library_cdm/cdm_host_proxy.h"

namespace media {

namespace {

CdmFileAdapter::Status ConvertStatus(cdm::FileIOClient::Status status) {
  switch (status) {
    case cdm::FileIOClient::Status::kSuccess:
      return CdmFileAdapter::Status::kSuccess;
    case cdm::FileIOClient::Status::kInUse:
      return CdmFileAdapter::Status::kInUse;
    case cdm::FileIOClient::Status::kError:
      return CdmFileAdapter::Status::kError;
  }

  NOTREACHED();
  return CdmFileAdapter::Status::kError;
}

}  // namespace

CdmFileAdapter::CdmFileAdapter(CdmHostProxy* cdm_host_proxy) {
  file_io_ = cdm_host_proxy->CreateFileIO(this);
}

CdmFileAdapter::~CdmFileAdapter() {
  DCHECK(!open_cb_);
  DCHECK(!read_cb_);
  DCHECK(!write_cb_);
  file_io_->Close();
}

void CdmFileAdapter::Open(const std::string& name, FileOpenedCB open_cb) {
  DVLOG(2) << __func__;
  open_cb_ = std::move(open_cb);
  file_io_->Open(name.data(), name.length());
}

void CdmFileAdapter::Read(ReadCB read_cb) {
  DVLOG(2) << __func__;
  read_cb_ = std::move(read_cb);
  file_io_->Read();
}

void CdmFileAdapter::Write(const std::vector<uint8_t>& data, WriteCB write_cb) {
  DVLOG(2) << __func__;
  write_cb_ = std::move(write_cb);
  file_io_->Write(data.data(), data.size());
}

void CdmFileAdapter::OnOpenComplete(cdm::FileIOClient::Status status) {
  std::move(open_cb_).Run(ConvertStatus(status));
}

void CdmFileAdapter::OnReadComplete(cdm::FileIOClient::Status status,
                                    const uint8_t* data,
                                    uint32_t data_size) {
  std::move(read_cb_).Run(
      status == FileIOClient::Status::kSuccess && data_size > 0,
      std::vector<uint8_t>(data, data + data_size));
}

void CdmFileAdapter::OnWriteComplete(cdm::FileIOClient::Status status) {
  std::move(write_cb_).Run(status == FileIOClient::Status::kSuccess);
}

}  // namespace media
