// 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 "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& callback) { if (open_state_ != OpenState::BEFORE_OPEN) return PP_ERROR_FAILED; if (TrackedCallback::IsPending(open_callback_)) return PP_ERROR_INPROGRESS; scoped_refptr source_string_var(StringVar::FromPPVar(device_id)); if (!source_string_var || source_string_var->value().empty()) return PP_ERROR_BADARGUMENT; open_callback_ = callback; Call( 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& 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( 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& formats) { if (!TrackedCallback::IsPending(get_capabilities_callback_)) return; // Return camera capabilities. int32_t result = params.result(); scoped_refptr 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