// Copyright 2016 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/remoting/remoting_cdm.h"

#include "media/base/cdm_promise.h"

namespace media {
namespace remoting {

// TODO(xjz): Merge this with erickung's implementation.
RemotingCdm::RemotingCdm(
    const std::string& key_system,
    const GURL& security_origin,
    const CdmConfig& cdm_config,
    const SessionMessageCB& session_message_cb,
    const SessionClosedCB& session_closed_cb,
    const SessionKeysChangeCB& session_keys_change_cb,
    const SessionExpirationUpdateCB& session_expiration_update_cb,
    const CdmCreatedCB& cdm_created_cb,
    std::unique_ptr<RemotingCdmController> remoting_cdm_controller)
    : remoting_cdm_controller_(std::move(remoting_cdm_controller)),
      remoting_cdm_context_(this) {
  DCHECK(remoting_cdm_controller_);

  // TODO(xjz): Not implemented. Need to merge with erickung's implementation.
}

RemotingCdm::~RemotingCdm() = default;

void RemotingCdm::SetServerCertificate(
    const std::vector<uint8_t>& certificate,
    std::unique_ptr<SimpleCdmPromise> promise) {
  // TODO(xjz): Merge with erickung's implementation.
  NOTIMPLEMENTED();
}

void RemotingCdm::CreateSessionAndGenerateRequest(
    CdmSessionType session_type,
    EmeInitDataType init_data_type,
    const std::vector<uint8_t>& init_data,
    std::unique_ptr<NewSessionCdmPromise> promise) {
  // TODO(xjz): Merge with erickung's implementation.
  NOTIMPLEMENTED();
}

void RemotingCdm::LoadSession(CdmSessionType session_type,
                              const std::string& session_id,
                              std::unique_ptr<NewSessionCdmPromise> promise) {
  // TODO(xjz): Merge with erickung's implementation.
  NOTIMPLEMENTED();
}

void RemotingCdm::UpdateSession(const std::string& session_id,
                                const std::vector<uint8_t>& response,
                                std::unique_ptr<SimpleCdmPromise> promise) {
  // TODO(xjz): Merge with erickung's implementation.
  NOTIMPLEMENTED();
}

void RemotingCdm::CloseSession(const std::string& session_id,
                               std::unique_ptr<SimpleCdmPromise> promise) {
  // TODO(xjz): Merge with erickung's implementation.
  NOTIMPLEMENTED();
}

void RemotingCdm::RemoveSession(const std::string& session_id,
                                std::unique_ptr<SimpleCdmPromise> promise) {
  // TODO(xjz): Merge with erickung's implementation.
  NOTIMPLEMENTED();
}

CdmContext* RemotingCdm::GetCdmContext() {
  return &remoting_cdm_context_;
}

}  // namespace remoting
}  // namespace media
