// Copyright 2013 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/output_protection_resource.h" #include "base/logging.h" #include "ppapi/proxy/plugin_globals.h" #include "ppapi/proxy/plugin_resource_tracker.h" #include "ppapi/proxy/ppapi_messages.h" #include "ppapi/shared_impl/proxy_lock.h" #include "ppapi/shared_impl/resource_tracker.h" #include "ppapi/shared_impl/tracked_callback.h" #include "ppapi/thunk/enter.h" #include "ppapi/thunk/ppb_output_protection_api.h" namespace ppapi { namespace proxy { OutputProtectionResource::OutputProtectionResource( Connection connection, PP_Instance instance) : PluginResource(connection, instance) { SendCreate(BROWSER, PpapiHostMsg_OutputProtection_Create()); } OutputProtectionResource::~OutputProtectionResource() { if (TrackedCallback::IsPending(query_status_callback_)) query_status_callback_->PostAbort(); if (TrackedCallback::IsPending(enable_protection_callback_)) enable_protection_callback_->PostAbort(); } thunk::PPB_OutputProtection_API* OutputProtectionResource::AsPPB_OutputProtection_API() { return this; } int32_t OutputProtectionResource::QueryStatus( uint32_t* link_mask, uint32_t* protection_mask, const scoped_refptr& callback) { if (!link_mask || !protection_mask) return PP_ERROR_BADARGUMENT; if (TrackedCallback::IsPending(query_status_callback_)) return PP_ERROR_INPROGRESS; query_status_callback_ = callback; Call( BROWSER, PpapiHostMsg_OutputProtection_QueryStatus(), base::Bind(&OutputProtectionResource::OnPluginMsgQueryStatusReply, base::Unretained(this), link_mask, protection_mask)); return PP_OK_COMPLETIONPENDING; } void OutputProtectionResource::OnPluginMsgQueryStatusReply( uint32_t* out_link_mask, uint32_t* out_protection_mask, const ResourceMessageReplyParams& params, uint32_t link_mask, uint32_t protection_mask) { // The callback may have been aborted. if (!TrackedCallback::IsPending(query_status_callback_)) return; int32_t result = params.result(); if (result == PP_OK) { DCHECK(out_link_mask); DCHECK(out_protection_mask); *out_link_mask = link_mask; *out_protection_mask = protection_mask; } query_status_callback_->Run(result); } int32_t OutputProtectionResource::EnableProtection( uint32_t desired_method_mask, const scoped_refptr& callback) { if (TrackedCallback::IsPending(enable_protection_callback_)) return PP_ERROR_INPROGRESS; enable_protection_callback_ = callback; Call( BROWSER, PpapiHostMsg_OutputProtection_EnableProtection(desired_method_mask), base::Bind(&OutputProtectionResource::OnPluginMsgEnableProtectionReply, base::Unretained(this))); return PP_OK_COMPLETIONPENDING; } void OutputProtectionResource::OnPluginMsgEnableProtectionReply( const ResourceMessageReplyParams& params) { // The callback may have been aborted. if (TrackedCallback::IsPending(enable_protection_callback_)) enable_protection_callback_->Run(params.result()); } } // namespace proxy } // namespace ppapi