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