ppp_content_decryptor_private_proxy.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/ppp_content_decryptor_private_proxy.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/platform_file.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_bool.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_core.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/content_decryptor_private_serializer.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/host_dispatcher.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/plugin_globals.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/plugin_resource_tracker.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/ppapi_messages.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/ppb_buffer_proxy.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/serialized_var.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/shared_impl/scoped_pp_resource.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/var_tracker.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/enter.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/ppb_buffer_api.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/ppb_instance_api.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/thunk.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::thunk::EnterResourceNoLock;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::thunk::PPB_Buffer_API;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::thunk::PPB_Instance_API;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ppapi {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace proxy {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool DescribeHostBufferResource(PP_Resource resource, uint32_t* size) {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnterResourceNoLock<PPB_Buffer_API> enter(resource, true);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.failed())
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PP_FALSE;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return enter.object()->Describe(size);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(dmichael): Refactor so this handle sharing code is in one place.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool ShareHostBufferResourceToPlugin(
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HostDispatcher* dispatcher,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Resource resource,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::SharedMemoryHandle* shared_mem_handle) {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!dispatcher || resource == 0 || !shared_mem_handle)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PP_FALSE;
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EnterResourceNoLock<PPB_Buffer_API> enter(resource, true);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.failed())
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PP_FALSE;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int handle;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32_t result = enter.object()->GetSharedMemory(&handle);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result != PP_OK)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PP_FALSE;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::PlatformFile platform_file =
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #if defined(OS_WIN)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<HANDLE>(static_cast<intptr_t>(handle));
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #elif defined(OS_POSIX)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      handle;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #else
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #error Not implemented.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #endif
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *shared_mem_handle = dispatcher->ShareHandleWithRemote(platform_file, false);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PP_TRUE;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SerializedVarReceiveInput will decrement the reference count, but we want
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to give the recipient a reference. This utility function takes care of that
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// work for the message handlers defined below.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Var ExtractReceivedVarAndAddRef(Dispatcher* dispatcher,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   SerializedVarReceiveInput* serialized_var) {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_Var var = serialized_var->Get(dispatcher);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PpapiGlobals::Get()->GetVarTracker()->AddRefVar(var);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return var;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool InitializePppDecryptorBuffer(PP_Instance instance,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  HostDispatcher* dispatcher,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  PP_Resource resource,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  PPPDecryptor_Buffer* buffer) {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!buffer) {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (resource == 0) {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buffer->resource = HostResource();
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buffer->handle = base::SharedMemoryHandle();
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buffer->size = 0;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostResource host_resource;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_resource.SetHostResource(instance, resource);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32_t size = 0;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (DescribeHostBufferResource(resource, &size) == PP_FALSE)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::SharedMemoryHandle handle;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ShareHostBufferResourceToPlugin(dispatcher,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      resource,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      &handle) == PP_FALSE)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buffer->resource = host_resource;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buffer->handle = handle;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buffer->size = size;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void Initialize(PP_Instance instance,
113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                PP_Var key_system) {
11468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
11568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (!dispatcher) {
11668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    NOTREACHED();
11768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return;
11868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
11968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
12068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  dispatcher->Send(
12168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      new PpapiMsg_PPPContentDecryptor_Initialize(
12268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE,
12368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          instance,
124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          SerializedVarSendInput(dispatcher, key_system)));
12568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
12668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
127a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void CreateSession(PP_Instance instance,
128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                   uint32_t session_id,
129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                   PP_Var type,
130a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                   PP_Var init_data) {
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!dispatcher) {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  dispatcher->Send(new PpapiMsg_PPPContentDecryptor_CreateSession(
138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE,
139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      instance,
140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      session_id,
141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      SerializedVarSendInput(dispatcher, type),
142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      SerializedVarSendInput(dispatcher, init_data)));
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void LoadSession(PP_Instance instance,
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 uint32_t session_id,
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 PP_Var web_session_id) {
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!dispatcher) {
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    NOTREACHED();
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  dispatcher->Send(new PpapiMsg_PPPContentDecryptor_LoadSession(
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE,
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      instance,
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      session_id,
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      SerializedVarSendInput(dispatcher, web_session_id)));
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
161a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void UpdateSession(PP_Instance instance, uint32_t session_id, PP_Var response) {
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!dispatcher) {
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
168a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  dispatcher->Send(new PpapiMsg_PPPContentDecryptor_UpdateSession(
169a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE,
170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      instance,
171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      session_id,
172a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      SerializedVarSendInput(dispatcher, response)));
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void ReleaseSession(PP_Instance instance, uint32_t session_id) {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!dispatcher) {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
182a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  dispatcher->Send(new PpapiMsg_PPPContentDecryptor_ReleaseSession(
183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE, instance, session_id));
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Decrypt(PP_Instance instance,
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             PP_Resource encrypted_block,
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             const PP_EncryptedBlockInfo* encrypted_block_info) {
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!dispatcher) {
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PPPDecryptor_Buffer buffer;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!InitializePppDecryptorBuffer(instance,
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    dispatcher,
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    encrypted_block,
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &buffer)) {
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string serialized_block_info;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!SerializeBlockInfo(*encrypted_block_info, &serialized_block_info)) {
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // PluginResourceTracker in the plugin process assumes that resources that it
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // tracks have been addrefed on behalf of the plugin at the renderer side. So
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // we explicitly do it for |encryped_block| here.
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PpapiGlobals::Get()->GetResourceTracker()->AddRefResource(encrypted_block);
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dispatcher->Send(
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new PpapiMsg_PPPContentDecryptor_Decrypt(
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE,
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          instance,
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          buffer,
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          serialized_block_info));
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InitializeAudioDecoder(
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Instance instance,
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PP_AudioDecoderConfig* decoder_config,
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Resource extra_data_buffer) {
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!dispatcher) {
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string serialized_decoder_config;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!SerializeBlockInfo(*decoder_config, &serialized_decoder_config)) {
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PPPDecryptor_Buffer buffer;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!InitializePppDecryptorBuffer(instance,
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    dispatcher,
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    extra_data_buffer,
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &buffer)) {
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // PluginResourceTracker in the plugin process assumes that resources that it
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // tracks have been addrefed on behalf of the plugin at the renderer side. So
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // we explicitly do it for |extra_data_buffer| here.
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PpapiGlobals::Get()->GetResourceTracker()->AddRefResource(extra_data_buffer);
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dispatcher->Send(
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new PpapiMsg_PPPContentDecryptor_InitializeAudioDecoder(
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE,
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          instance,
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          serialized_decoder_config,
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          buffer));
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InitializeVideoDecoder(
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Instance instance,
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PP_VideoDecoderConfig* decoder_config,
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Resource extra_data_buffer) {
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!dispatcher) {
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string serialized_decoder_config;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!SerializeBlockInfo(*decoder_config, &serialized_decoder_config)) {
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PPPDecryptor_Buffer buffer;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!InitializePppDecryptorBuffer(instance,
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    dispatcher,
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    extra_data_buffer,
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &buffer)) {
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // PluginResourceTracker in the plugin process assumes that resources that it
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // tracks have been addrefed on behalf of the plugin at the renderer side. So
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // we explicitly do it for |extra_data_buffer| here.
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PpapiGlobals::Get()->GetResourceTracker()->AddRefResource(extra_data_buffer);
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dispatcher->Send(
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new PpapiMsg_PPPContentDecryptor_InitializeVideoDecoder(
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE,
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          instance,
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          serialized_decoder_config,
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          buffer));
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeinitializeDecoder(PP_Instance instance,
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         PP_DecryptorStreamType decoder_type,
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         uint32_t request_id) {
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!dispatcher) {
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dispatcher->Send(
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new PpapiMsg_PPPContentDecryptor_DeinitializeDecoder(
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE,
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          instance,
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          decoder_type,
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          request_id));
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ResetDecoder(PP_Instance instance,
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  PP_DecryptorStreamType decoder_type,
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  uint32_t request_id) {
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!dispatcher) {
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dispatcher->Send(
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new PpapiMsg_PPPContentDecryptor_ResetDecoder(
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE,
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          instance,
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          decoder_type,
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          request_id));
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DecryptAndDecode(PP_Instance instance,
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      PP_DecryptorStreamType decoder_type,
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      PP_Resource encrypted_buffer,
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const PP_EncryptedBlockInfo* encrypted_block_info) {
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!dispatcher) {
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PPPDecryptor_Buffer buffer;
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!InitializePppDecryptorBuffer(instance,
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    dispatcher,
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    encrypted_buffer,
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    &buffer)) {
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string serialized_block_info;
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!SerializeBlockInfo(*encrypted_block_info, &serialized_block_info)) {
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // PluginResourceTracker in the plugin process assumes that resources that it
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // tracks have been addrefed on behalf of the plugin at the renderer side. So
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // we explicitly do it for |encrypted_buffer| here.
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PpapiGlobals::Get()->GetResourceTracker()->AddRefResource(encrypted_buffer);
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dispatcher->Send(
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new PpapiMsg_PPPContentDecryptor_DecryptAndDecode(
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE,
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          instance,
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          decoder_type,
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          buffer,
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          serialized_block_info));
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const PPP_ContentDecryptor_Private content_decryptor_interface = {
37468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  &Initialize,
375a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  &CreateSession,
3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  &LoadSession,
377a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  &UpdateSession,
378a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  &ReleaseSession,
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &Decrypt,
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &InitializeAudioDecoder,
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &InitializeVideoDecoder,
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &DeinitializeDecoder,
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &ResetDecoder,
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &DecryptAndDecode
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PPP_ContentDecryptor_Private_Proxy::PPP_ContentDecryptor_Private_Proxy(
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Dispatcher* dispatcher)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : InterfaceProxy(dispatcher),
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ppp_decryptor_impl_(NULL) {
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (dispatcher->IsPlugin()) {
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ppp_decryptor_impl_ = static_cast<const PPP_ContentDecryptor_Private*>(
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        dispatcher->local_get_interface()(
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            PPP_CONTENTDECRYPTOR_PRIVATE_INTERFACE));
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PPP_ContentDecryptor_Private_Proxy::~PPP_ContentDecryptor_Private_Proxy() {
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PPP_ContentDecryptor_Private*
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PPP_ContentDecryptor_Private_Proxy::GetProxyInterface() {
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return &content_decryptor_interface;
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PPP_ContentDecryptor_Private_Proxy::OnMessageReceived(
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const IPC::Message& msg) {
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!dispatcher()->IsPlugin())
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;  // These are only valid from host->plugin.
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   // Don't allow the plugin to send these to the host.
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool handled = true;
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(PPP_ContentDecryptor_Private_Proxy, msg)
41768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_Initialize,
41868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                        OnMsgInitialize)
419a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_CreateSession,
420a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        OnMsgCreateSession)
4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_LoadSession,
4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        OnMsgLoadSession)
423a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_UpdateSession,
424a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        OnMsgUpdateSession)
425a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_ReleaseSession,
426a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        OnMsgReleaseSession)
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_Decrypt,
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnMsgDecrypt)
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_InitializeAudioDecoder,
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnMsgInitializeAudioDecoder)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_InitializeVideoDecoder,
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnMsgInitializeVideoDecoder)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_DeinitializeDecoder,
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnMsgDeinitializeDecoder)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_ResetDecoder,
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnMsgResetDecoder)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_DecryptAndDecode,
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnMsgDecryptAndDecode)
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_UNHANDLED(handled = false)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_END_MESSAGE_MAP()
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(handled);
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return handled;
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void PPP_ContentDecryptor_Private_Proxy::OnMsgInitialize(
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Instance instance,
447f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SerializedVarReceiveInput key_system) {
44868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (ppp_decryptor_impl_) {
44968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    CallWhileUnlocked(
45068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        ppp_decryptor_impl_->Initialize,
45168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        instance,
452f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        ExtractReceivedVarAndAddRef(dispatcher(), &key_system));
45368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
45468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
45568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
456a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PPP_ContentDecryptor_Private_Proxy::OnMsgCreateSession(
45768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    PP_Instance instance,
458a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    uint32_t session_id,
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SerializedVarReceiveInput type,
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SerializedVarReceiveInput init_data) {
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ppp_decryptor_impl_) {
462a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    CallWhileUnlocked(ppp_decryptor_impl_->CreateSession,
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      instance,
464a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                      session_id,
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      ExtractReceivedVarAndAddRef(dispatcher(), &type),
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      ExtractReceivedVarAndAddRef(dispatcher(), &init_data));
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PPP_ContentDecryptor_Private_Proxy::OnMsgLoadSession(
4715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PP_Instance instance,
4725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    uint32_t session_id,
4735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SerializedVarReceiveInput web_session_id) {
4745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (ppp_decryptor_impl_) {
4755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CallWhileUnlocked(
4765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ppp_decryptor_impl_->LoadSession,
4775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        instance,
4785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        session_id,
4795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ExtractReceivedVarAndAddRef(dispatcher(), &web_session_id));
4805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
4815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
483a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PPP_ContentDecryptor_Private_Proxy::OnMsgUpdateSession(
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Instance instance,
485a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    uint32_t session_id,
486a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    SerializedVarReceiveInput response) {
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ppp_decryptor_impl_) {
488a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    CallWhileUnlocked(ppp_decryptor_impl_->UpdateSession,
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      instance,
490a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                      session_id,
491a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                      ExtractReceivedVarAndAddRef(dispatcher(), &response));
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PPP_ContentDecryptor_Private_Proxy::OnMsgReleaseSession(
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Instance instance,
497a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    uint32_t session_id) {
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ppp_decryptor_impl_) {
499a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    CallWhileUnlocked(ppp_decryptor_impl_->ReleaseSession,
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      instance,
501a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                      session_id);
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPP_ContentDecryptor_Private_Proxy::OnMsgDecrypt(
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Instance instance,
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PPPDecryptor_Buffer& encrypted_buffer,
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& serialized_block_info) {
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedPPResource plugin_resource(
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ScopedPPResource::PassRef(),
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PPB_Buffer_Proxy::AddProxyResource(encrypted_buffer.resource,
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                         encrypted_buffer.handle,
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                         encrypted_buffer.size));
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ppp_decryptor_impl_) {
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_EncryptedBlockInfo block_info;
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!DeserializeBlockInfo(serialized_block_info, &block_info))
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CallWhileUnlocked(ppp_decryptor_impl_->Decrypt,
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      instance,
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      plugin_resource.get(),
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const_cast<const PP_EncryptedBlockInfo*>(&block_info));
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPP_ContentDecryptor_Private_Proxy::OnMsgInitializeAudioDecoder(
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Instance instance,
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& serialized_decoder_config,
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PPPDecryptor_Buffer& extra_data_buffer) {
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedPPResource plugin_resource;
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (extra_data_buffer.size > 0) {
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    plugin_resource = ScopedPPResource(
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ScopedPPResource::PassRef(),
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PPB_Buffer_Proxy::AddProxyResource(extra_data_buffer.resource,
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           extra_data_buffer.handle,
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           extra_data_buffer.size));
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_AudioDecoderConfig decoder_config;
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!DeserializeBlockInfo(serialized_decoder_config, &decoder_config))
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ppp_decryptor_impl_) {
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CallWhileUnlocked(
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ppp_decryptor_impl_->InitializeAudioDecoder,
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        instance,
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const_cast<const PP_AudioDecoderConfig*>(&decoder_config),
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        plugin_resource.get());
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPP_ContentDecryptor_Private_Proxy::OnMsgInitializeVideoDecoder(
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Instance instance,
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& serialized_decoder_config,
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PPPDecryptor_Buffer& extra_data_buffer) {
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedPPResource plugin_resource;
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (extra_data_buffer.resource.host_resource() != 0) {
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    plugin_resource = ScopedPPResource(
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ScopedPPResource::PassRef(),
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PPB_Buffer_Proxy::AddProxyResource(extra_data_buffer.resource,
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           extra_data_buffer.handle,
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           extra_data_buffer.size));
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_VideoDecoderConfig decoder_config;
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!DeserializeBlockInfo(serialized_decoder_config, &decoder_config))
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ppp_decryptor_impl_) {
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CallWhileUnlocked(
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ppp_decryptor_impl_->InitializeVideoDecoder,
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        instance,
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const_cast<const PP_VideoDecoderConfig*>(&decoder_config),
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        plugin_resource.get());
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPP_ContentDecryptor_Private_Proxy::OnMsgDeinitializeDecoder(
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Instance instance,
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_DecryptorStreamType decoder_type,
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32_t request_id) {
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ppp_decryptor_impl_) {
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CallWhileUnlocked(
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ppp_decryptor_impl_->DeinitializeDecoder,
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        instance,
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        decoder_type,
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        request_id);
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPP_ContentDecryptor_Private_Proxy::OnMsgResetDecoder(
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Instance instance,
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_DecryptorStreamType decoder_type,
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32_t request_id) {
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ppp_decryptor_impl_) {
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CallWhileUnlocked(
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ppp_decryptor_impl_->ResetDecoder,
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        instance,
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        decoder_type,
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        request_id);
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPP_ContentDecryptor_Private_Proxy::OnMsgDecryptAndDecode(
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Instance instance,
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_DecryptorStreamType decoder_type,
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PPPDecryptor_Buffer& encrypted_buffer,
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& serialized_block_info) {
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedPPResource plugin_resource;
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (encrypted_buffer.resource.host_resource() != 0) {
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    plugin_resource = ScopedPPResource(
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ScopedPPResource::PassRef(),
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        PPB_Buffer_Proxy::AddProxyResource(encrypted_buffer.resource,
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           encrypted_buffer.handle,
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           encrypted_buffer.size));
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ppp_decryptor_impl_) {
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_EncryptedBlockInfo block_info;
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!DeserializeBlockInfo(serialized_block_info, &block_info))
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CallWhileUnlocked(
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ppp_decryptor_impl_->DecryptAndDecode,
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        instance,
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        decoder_type,
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        plugin_resource.get(),
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const_cast<const PP_EncryptedBlockInfo*>(&block_info));
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace proxy
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ppapi
632