1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "ppapi/proxy/output_protection_resource.h"
6
7#include "base/logging.h"
8#include "ppapi/proxy/plugin_globals.h"
9#include "ppapi/proxy/plugin_resource_tracker.h"
10#include "ppapi/proxy/ppapi_messages.h"
11#include "ppapi/shared_impl/proxy_lock.h"
12#include "ppapi/shared_impl/resource_tracker.h"
13#include "ppapi/shared_impl/tracked_callback.h"
14#include "ppapi/thunk/enter.h"
15#include "ppapi/thunk/ppb_output_protection_api.h"
16
17namespace ppapi {
18namespace proxy {
19
20OutputProtectionResource::OutputProtectionResource(
21    Connection connection,
22    PP_Instance instance)
23    : PluginResource(connection, instance) {
24  SendCreate(BROWSER, PpapiHostMsg_OutputProtection_Create());
25}
26
27OutputProtectionResource::~OutputProtectionResource() {
28  if (TrackedCallback::IsPending(query_status_callback_))
29    query_status_callback_->PostAbort();
30  if (TrackedCallback::IsPending(enable_protection_callback_))
31    enable_protection_callback_->PostAbort();
32}
33
34thunk::PPB_OutputProtection_API*
35    OutputProtectionResource::AsPPB_OutputProtection_API() {
36  return this;
37}
38
39int32_t OutputProtectionResource::QueryStatus(
40    uint32_t* link_mask,
41    uint32_t* protection_mask,
42    const scoped_refptr<TrackedCallback>& callback) {
43  if (!link_mask || !protection_mask)
44    return PP_ERROR_BADARGUMENT;
45  if (TrackedCallback::IsPending(query_status_callback_))
46    return PP_ERROR_INPROGRESS;
47
48  query_status_callback_ = callback;
49
50  Call<PpapiPluginMsg_OutputProtection_QueryStatusReply>(
51      BROWSER,
52      PpapiHostMsg_OutputProtection_QueryStatus(),
53      base::Bind(&OutputProtectionResource::OnPluginMsgQueryStatusReply,
54                 base::Unretained(this),
55                 link_mask,
56                 protection_mask));
57  return PP_OK_COMPLETIONPENDING;
58}
59
60void OutputProtectionResource::OnPluginMsgQueryStatusReply(
61    uint32_t* out_link_mask,
62    uint32_t* out_protection_mask,
63    const ResourceMessageReplyParams& params,
64    uint32_t link_mask,
65    uint32_t protection_mask) {
66  // The callback may have been aborted.
67  if (!TrackedCallback::IsPending(query_status_callback_))
68    return;
69
70  int32_t result = params.result();
71
72  if (result == PP_OK) {
73    DCHECK(out_link_mask);
74    DCHECK(out_protection_mask);
75    *out_link_mask = link_mask;
76    *out_protection_mask = protection_mask;
77  }
78  query_status_callback_->Run(result);
79}
80
81int32_t OutputProtectionResource::EnableProtection(
82    uint32_t desired_method_mask,
83    const scoped_refptr<TrackedCallback>& callback) {
84  if (TrackedCallback::IsPending(enable_protection_callback_))
85    return PP_ERROR_INPROGRESS;
86
87  enable_protection_callback_ = callback;
88
89  Call<PpapiPluginMsg_OutputProtection_EnableProtectionReply>(
90      BROWSER,
91      PpapiHostMsg_OutputProtection_EnableProtection(desired_method_mask),
92      base::Bind(&OutputProtectionResource::OnPluginMsgEnableProtectionReply,
93                 base::Unretained(this)));
94  return PP_OK_COMPLETIONPENDING;
95}
96
97void OutputProtectionResource::OnPluginMsgEnableProtectionReply(
98    const ResourceMessageReplyParams& params) {
99  // The callback may have been aborted.
100  if (TrackedCallback::IsPending(enable_protection_callback_))
101    enable_protection_callback_->Run(params.result());
102}
103
104}  // namespace proxy
105}  // namespace ppapi
106