// 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 "content/renderer/pepper/pepper_camera_device_host.h" #include "content/renderer/pepper/pepper_platform_camera_device.h" #include "content/renderer/pepper/renderer_ppapi_host_impl.h" #include "content/renderer/render_frame_impl.h" #include "ppapi/host/dispatch_host_message.h" #include "ppapi/proxy/ppapi_messages.h" namespace content { PepperCameraDeviceHost::PepperCameraDeviceHost(RendererPpapiHostImpl* host, PP_Instance instance, PP_Resource resource) : ResourceHost(host->GetPpapiHost(), instance, resource), renderer_ppapi_host_(host) { } PepperCameraDeviceHost::~PepperCameraDeviceHost() { DetachPlatformCameraDevice(); } bool PepperCameraDeviceHost::Init() { return !!renderer_ppapi_host_->GetPluginInstance(pp_instance()); } int32_t PepperCameraDeviceHost::OnResourceMessageReceived( const IPC::Message& msg, ppapi::host::HostMessageContext* context) { int32_t result = PP_ERROR_FAILED; PPAPI_BEGIN_MESSAGE_MAP(PepperCameraDeviceHost, msg) PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_CameraDevice_Open, OnOpen) PPAPI_DISPATCH_HOST_RESOURCE_CALL_0( PpapiHostMsg_CameraDevice_GetSupportedVideoCaptureFormats, OnGetSupportedVideoCaptureFormats) PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_CameraDevice_Close, OnClose) PPAPI_END_MESSAGE_MAP() return result; } void PepperCameraDeviceHost::OnInitialized(bool succeeded) { if (!open_reply_context_.is_valid()) return; if (succeeded) { open_reply_context_.params.set_result(PP_OK); } else { DetachPlatformCameraDevice(); open_reply_context_.params.set_result(PP_ERROR_FAILED); } host()->SendReply(open_reply_context_, PpapiPluginMsg_CameraDevice_OpenReply()); open_reply_context_ = ppapi::host::ReplyMessageContext(); } void PepperCameraDeviceHost::OnVideoCaptureFormatsEnumerated( const std::vector& formats) { if (!video_capture_formats_reply_context_.is_valid()) return; if (formats.size() > 0) video_capture_formats_reply_context_.params.set_result(PP_OK); else video_capture_formats_reply_context_.params.set_result(PP_ERROR_FAILED); host()->SendReply( video_capture_formats_reply_context_, PpapiPluginMsg_CameraDevice_GetSupportedVideoCaptureFormatsReply( formats)); video_capture_formats_reply_context_ = ppapi::host::ReplyMessageContext(); } int32_t PepperCameraDeviceHost::OnOpen(ppapi::host::HostMessageContext* context, const std::string& device_id) { if (open_reply_context_.is_valid()) return PP_ERROR_INPROGRESS; if (platform_camera_device_.get()) return PP_ERROR_FAILED; GURL document_url = renderer_ppapi_host_->GetDocumentURL(pp_instance()); if (!document_url.is_valid()) return PP_ERROR_FAILED; platform_camera_device_.reset(new PepperPlatformCameraDevice( renderer_ppapi_host_->GetRenderFrameForInstance(pp_instance()) ->GetRoutingID(), device_id, this)); open_reply_context_ = context->MakeReplyMessageContext(); return PP_OK_COMPLETIONPENDING; } int32_t PepperCameraDeviceHost::OnClose( ppapi::host::HostMessageContext* context) { DetachPlatformCameraDevice(); return PP_OK; } int32_t PepperCameraDeviceHost::OnGetSupportedVideoCaptureFormats( ppapi::host::HostMessageContext* context) { if (video_capture_formats_reply_context_.is_valid()) return PP_ERROR_INPROGRESS; if (!platform_camera_device_) return PP_ERROR_FAILED; video_capture_formats_reply_context_ = context->MakeReplyMessageContext(); platform_camera_device_->GetSupportedVideoCaptureFormats(); return PP_OK_COMPLETIONPENDING; } void PepperCameraDeviceHost::DetachPlatformCameraDevice() { if (platform_camera_device_) { platform_camera_device_->DetachEventHandler(); platform_camera_device_.reset(); } } } // namespace content