// Copyright 2015 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 "ppapi/proxy/camera_device_resource.h"

#include "base/bind.h"
#include "ppapi/proxy/camera_capabilities_resource.h"
#include "ppapi/proxy/plugin_resource_tracker.h"
#include "ppapi/proxy/ppapi_messages.h"
#include "ppapi/shared_impl/var.h"

namespace ppapi {
namespace proxy {

CameraDeviceResource::CameraDeviceResource(Connection connection,
                                           PP_Instance instance)
    : PluginResource(connection, instance),
      open_state_(OpenState::BEFORE_OPEN) {
  SendCreate(RENDERER, PpapiHostMsg_CameraDevice_Create());
}

CameraDeviceResource::~CameraDeviceResource() {
}

int32_t CameraDeviceResource::Open(
    PP_Var device_id,
    const scoped_refptr<TrackedCallback>& callback) {
  if (open_state_ != OpenState::BEFORE_OPEN)
    return PP_ERROR_FAILED;

  if (TrackedCallback::IsPending(open_callback_))
    return PP_ERROR_INPROGRESS;

  scoped_refptr<StringVar> source_string_var(StringVar::FromPPVar(device_id));
  if (!source_string_var || source_string_var->value().empty())
    return PP_ERROR_BADARGUMENT;

  open_callback_ = callback;

  Call<PpapiPluginMsg_CameraDevice_OpenReply>(
      RENDERER, PpapiHostMsg_CameraDevice_Open(source_string_var->value()),
      base::Bind(&CameraDeviceResource::OnPluginMsgOpenReply,
                 base::Unretained(this)));
  return PP_OK_COMPLETIONPENDING;
}

void CameraDeviceResource::Close() {
  if (open_state_ == OpenState::CLOSED)
    return;

  if (TrackedCallback::IsPending(open_callback_)) {
    open_callback_->PostAbort();
    open_callback_ = nullptr;
  }

  if (TrackedCallback::IsPending(get_capabilities_callback_)) {
    get_capabilities_callback_->PostAbort();
    get_capabilities_callback_ = nullptr;
  }

  Post(RENDERER, PpapiHostMsg_CameraDevice_Close());

  open_state_ = OpenState::CLOSED;
}

int32_t CameraDeviceResource::GetCameraCapabilities(
    PP_Resource* capabilities,
    const scoped_refptr<TrackedCallback>& callback) {
  if (!is_opened())
    return PP_ERROR_FAILED;

  if (TrackedCallback::IsPending(get_capabilities_callback_))
    return PP_ERROR_INPROGRESS;

  if (camera_capabilities_.get()) {
    *capabilities = camera_capabilities_->GetReference();
    return PP_OK;
  }

  get_capabilities_callback_ = callback;
  Call<PpapiPluginMsg_CameraDevice_GetSupportedVideoCaptureFormatsReply>(
      RENDERER, PpapiHostMsg_CameraDevice_GetSupportedVideoCaptureFormats(),
      base::Bind(&CameraDeviceResource::OnPluginMsgGetVideoCaptureFormatsReply,
                 base::Unretained(this), capabilities));

  return PP_OK_COMPLETIONPENDING;
}

void CameraDeviceResource::OnPluginMsgOpenReply(
    const ResourceMessageReplyParams& params) {
  // The callback may have been aborted by Close().
  if (TrackedCallback::IsPending(open_callback_)) {
    if (open_state_ == OpenState::BEFORE_OPEN && params.result() == PP_OK)
      open_state_ = OpenState::OPENED;

    open_callback_->Run(params.result());
  }
}

void CameraDeviceResource::OnPluginMsgGetVideoCaptureFormatsReply(
    PP_Resource* capabilities_output,
    const ResourceMessageReplyParams& params,
    const std::vector<PP_VideoCaptureFormat>& formats) {
  if (!TrackedCallback::IsPending(get_capabilities_callback_))
    return;

  // Return camera capabilities.
  int32_t result = params.result();
  scoped_refptr<TrackedCallback> callback;
  callback.swap(get_capabilities_callback_);
  if (result == PP_OK) {
    camera_capabilities_ =
        new CameraCapabilitiesResource(pp_instance(), formats);
    *capabilities_output = camera_capabilities_->GetReference();
  }
  callback->Run(result == PP_OK ? PP_OK : PP_ERROR_FAILED);
}

}  // namespace proxy
}  // namespace ppapi
