Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(72)

Side by Side Diff: ppapi/proxy/ppp_content_decryptor_proxy.cc

Issue 10545036: Add PPAPI decryptor interfaces. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix PP_Resource/HostResource usage (hopefully), and update comments. Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2012 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/ppp_content_decryptor_proxy.h"
6
7 #include "ppapi/c/pp_bool.h"
8 #include "ppapi/proxy/host_dispatcher.h"
9 #include "ppapi/proxy/plugin_globals.h"
10 #include "ppapi/proxy/plugin_resource_tracker.h"
11 #include "ppapi/proxy/ppapi_messages.h"
12 #include "ppapi/proxy/serialized_var.h"
13 #include "ppapi/thunk/enter.h"
14 #include "ppapi/thunk/ppb_instance_api.h"
15 #include "ppapi/thunk/thunk.h"
16
17 using ppapi::thunk::PPB_Instance_API;
18
19 namespace ppapi {
20 namespace proxy {
21
22 namespace {
23
24 PP_Bool GenerateKeyRequest(PP_Instance instance,
25 PP_Var key_system,
26 PP_Var init_data) {
27 HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
28 if (!dispatcher) {
29 // TODO(tomfinegan): NOTREACHED safe here/throughout?
dmichael (off chromium) 2012/08/08 22:24:02 Should be fine. If the dispatcher's not there, we'
30 return PP_FALSE;
31 }
32
33 return PP_FromBool(dispatcher->Send(
34 new PpapiMsg_PPPContentDecryptor_GenerateKeyRequest(
35 API_ID_PPP_CONTENT_DECRYPTOR_DEV,
36 instance,
37 SerializedVarSendInput(dispatcher, key_system),
38 SerializedVarSendInput(dispatcher, init_data))));
39 }
40
41 PP_Bool AddKey(PP_Instance instance,
42 PP_Var session_id,
43 PP_Var key) {
44 HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
45 if (!dispatcher) {
46 return PP_FALSE;
47 }
48
49 return PP_FromBool(dispatcher->Send(
50 new PpapiMsg_PPPContentDecryptor_AddKey(
51 API_ID_PPP_CONTENT_DECRYPTOR_DEV,
52 instance,
53 SerializedVarSendInput(dispatcher, session_id),
54 SerializedVarSendInput(dispatcher, key))));
55 }
56
57 PP_Bool CancelKeyRequest(PP_Instance instance, PP_Var session_id) {
58 HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
59 if (!dispatcher) {
60 return PP_FALSE;
61 }
62
63 return PP_FromBool(dispatcher->Send(
64 new PpapiMsg_PPPContentDecryptor_CancelKeyRequest(
65 API_ID_PPP_CONTENT_DECRYPTOR_DEV,
66 instance,
67 SerializedVarSendInput(dispatcher, session_id))));
68 }
69
70 PP_Bool Decrypt(PP_Instance instance,
71 PP_Resource encrypted_block,
72 uint64_t request_id) {
73 HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
74 if (!dispatcher) {
75 return PP_FALSE;
76 }
77
78 HostResource host_resource;
79 host_resource.SetHostResource(instance, encrypted_block);
80
81 return PP_FromBool(dispatcher->Send(
82 new PpapiMsg_PPPContentDecryptor_Decrypt(
83 API_ID_PPP_CONTENT_DECRYPTOR_DEV,
84 instance,
85 host_resource,
86 request_id)));
87 }
88
89 PP_Bool DecryptAndDecode(PP_Instance instance,
90 PP_Resource encrypted_block,
91 uint64_t request_id) {
92 HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
93 if (!dispatcher) {
94 return PP_FALSE;
95 }
96
97 HostResource host_resource;
98 host_resource.SetHostResource(instance, encrypted_block);
99
100 return PP_FromBool(dispatcher->Send(
101 new PpapiMsg_PPPContentDecryptor_DecryptAndDecode(
102 API_ID_PPP_CONTENT_DECRYPTOR_DEV,
103 instance,
104 host_resource,
105 request_id)));
106 }
107
108 static const PPP_ContentDecryptor_Dev content_decryptor_interface = {
109 &GenerateKeyRequest,
110 &AddKey,
111 &CancelKeyRequest,
112 &Decrypt,
113 &DecryptAndDecode
114 };
115
116 InterfaceProxy* CreateContentDecryptorPPPProxy(Dispatcher* dispatcher) {
117 return new PPP_ContentDecryptor_Proxy(dispatcher);
118 }
119
120 } // namespace
121
122 PPP_ContentDecryptor_Proxy::PPP_ContentDecryptor_Proxy(Dispatcher* dispatcher)
123 : InterfaceProxy(dispatcher),
124 ppp_decryptor_impl_(NULL) {
125 if (dispatcher->IsPlugin()) {
126 ppp_decryptor_impl_ = static_cast<const PPP_ContentDecryptor_Dev*>(
127 dispatcher->local_get_interface()(PPP_CONTENTDECRYPTOR_DEV_INTERFACE));
dmichael (off chromium) 2012/08/08 22:24:02 As mentioned elsewhere, you should instead be gett
128 }
129 }
130
131 PPP_ContentDecryptor_Proxy::~PPP_ContentDecryptor_Proxy() {
132 }
133
134 // static
135 const InterfaceProxy::Info* PPP_ContentDecryptor_Proxy::GetInfo() {
136 static const Info info = {
137 &content_decryptor_interface,
138 PPP_CONTENTDECRYPTOR_DEV_INTERFACE,
139 API_ID_PPP_VIDEO_DECODER_DEV,
140 false,
141 &CreateContentDecryptorPPPProxy,
142 };
143 return &info;
144 }
145
146 bool PPP_ContentDecryptor_Proxy::OnMessageReceived(const IPC::Message& msg) {
147 bool handled = true;
148 IPC_BEGIN_MESSAGE_MAP(PPP_ContentDecryptor_Proxy, msg)
149 IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_GenerateKeyRequest,
150 OnPluginMsgGenerateKeyRequest)
151 IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_AddKey,
152 OnPluginMsgAddKey)
153 IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_CancelKeyRequest,
154 OnPluginMsgCancelKeyRequest)
155 IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_Decrypt,
156 OnPluginMsgDecrypt)
157 IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_DecryptAndDecode,
158 OnPluginMsgDecryptAndDecode)
159 IPC_MESSAGE_UNHANDLED(handled = false)
160 IPC_END_MESSAGE_MAP()
161 DCHECK(handled);
162 return handled;
163 }
164
165 void PPP_ContentDecryptor_Proxy::OnPluginMsgGenerateKeyRequest(
166 PP_Instance instance,
167 SerializedVarReceiveInput key_system,
168 SerializedVarReceiveInput init_data) {
169 if (ppp_decryptor_impl_) {
170 // TODO(tomfinegan):
171 // 1) Is CallWhileUnlocked necessary here/throughout?
dmichael (off chromium) 2012/08/08 22:24:02 Yes, you must do CallWhileUnlocked every time you
Tom Finegan 2012/08/09 22:45:17 Done.
172 // 2) What about return values? Log/DCHECK?
dmichael (off chromium) 2012/08/08 22:24:02 I'm not sure what you mean? You definitely don't w
Tom Finegan 2012/08/09 22:45:17 You grokked what I was getting at; CallWhileUnlock
173 ppp_decryptor_impl_->GenerateKeyRequest(instance,
174 key_system.Get(dispatcher()),
175 init_data.Get(dispatcher()));
176 }
177 }
178
179 void PPP_ContentDecryptor_Proxy::OnPluginMsgAddKey(
180 PP_Instance instance,
181 SerializedVarReceiveInput session_id,
182 SerializedVarReceiveInput key) {
183 if (ppp_decryptor_impl_) {
184 ppp_decryptor_impl_->AddKey(instance,
185 session_id.Get(dispatcher()),
186 key.Get(dispatcher()));
187 }
188 }
189
190 void PPP_ContentDecryptor_Proxy::OnPluginMsgCancelKeyRequest(
191 PP_Instance instance,
192 SerializedVarReceiveInput session_id) {
193 if (ppp_decryptor_impl_) {
194 ppp_decryptor_impl_->CancelKeyRequest(instance,
195 session_id.Get(dispatcher()));
196 }
197 }
198
199 void PPP_ContentDecryptor_Proxy::OnPluginMsgDecrypt(
200 PP_Instance instance,
201 const HostResource& encrypted_block,
202 uint64_t request_id) {
203 if (ppp_decryptor_impl_) {
204 PP_Resource plugin_resource =
205 PluginGlobals::Get()->plugin_resource_tracker()->
206 PluginResourceForHostResource(encrypted_block);
207 ppp_decryptor_impl_->Decrypt(instance, plugin_resource, request_id);
208 }
209 }
210
211 void PPP_ContentDecryptor_Proxy::OnPluginMsgDecryptAndDecode(
212 PP_Instance instance,
213 const HostResource& encrypted_block,
214 uint64_t request_id) {
215 if (ppp_decryptor_impl_) {
216 PP_Resource plugin_resource =
217 PluginGlobals::Get()->plugin_resource_tracker()->
218 PluginResourceForHostResource(encrypted_block);
219 ppp_decryptor_impl_->DecryptAndDecode(instance,
220 plugin_resource,
221 request_id);
222 }
223 }
224
225 } // namespace proxy
226 } // namespace ppapi
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698