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) 746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/files/file.h" 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "media/base/limits.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_bool.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_core.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/content_decryptor_private_serializer.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/host_dispatcher.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/plugin_globals.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/plugin_resource_tracker.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/ppapi_messages.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/ppb_buffer_proxy.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/serialized_var.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/shared_impl/scoped_pp_resource.h" 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ppapi/shared_impl/scoped_pp_var.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/var_tracker.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/enter.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/ppb_buffer_api.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/ppb_instance_api.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/thunk.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::thunk::EnterResourceNoLock; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::thunk::PPB_Buffer_API; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::thunk::PPB_Instance_API; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ppapi { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace proxy { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool DescribeHostBufferResource(PP_Resource resource, uint32_t* size) { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnterResourceNoLock<PPB_Buffer_API> enter(resource, true); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enter.failed()) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return enter.object()->Describe(size); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(dmichael): Refactor so this handle sharing code is in one place. 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool ShareHostBufferResourceToPlugin( 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostDispatcher* dispatcher, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Resource resource, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SharedMemoryHandle* shared_mem_handle) { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dispatcher || resource == 0 || !shared_mem_handle) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EnterResourceNoLock<PPB_Buffer_API> enter(resource, true); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enter.failed()) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int handle; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t result = enter.object()->GetSharedMemory(&handle); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result != PP_OK) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::PlatformFile platform_file = 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #if defined(OS_WIN) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<HANDLE>(static_cast<intptr_t>(handle)); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #elif defined(OS_POSIX) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handle; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #else 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #error Not implemented. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #endif 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *shared_mem_handle = dispatcher->ShareHandleWithRemote(platform_file, false); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_TRUE; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SerializedVarReceiveInput will decrement the reference count, but we want 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to give the recipient a reference. This utility function takes care of that 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// work for the message handlers defined below. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Var ExtractReceivedVarAndAddRef(Dispatcher* dispatcher, 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SerializedVarReceiveInput* serialized_var) { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var var = serialized_var->Get(dispatcher); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PpapiGlobals::Get()->GetVarTracker()->AddRefVar(var); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return var; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool InitializePppDecryptorBuffer(PP_Instance instance, 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostDispatcher* dispatcher, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Resource resource, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPPDecryptor_Buffer* buffer) { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!buffer) { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (resource == 0) { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer->resource = HostResource(); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer->handle = base::SharedMemoryHandle(); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer->size = 0; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostResource host_resource; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_resource.SetHostResource(instance, resource); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t size = 0; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (DescribeHostBufferResource(resource, &size) == PP_FALSE) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SharedMemoryHandle handle; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ShareHostBufferResourceToPlugin(dispatcher, 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resource, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &handle) == PP_FALSE) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer->resource = host_resource; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer->handle = handle; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer->size = size; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void Initialize(PP_Instance instance, 115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PP_Var key_system) { 11668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance); 11768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (!dispatcher) { 11868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) NOTREACHED(); 11968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return; 12068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 12168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 12268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) dispatcher->Send( 12368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) new PpapiMsg_PPPContentDecryptor_Initialize( 12468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE, 12568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) instance, 126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SerializedVarSendInput(dispatcher, key_system))); 12768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 12868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid SetServerCertificate(PP_Instance instance, 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci uint32_t promise_id, 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PP_Var server_certificate) { 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance); 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!dispatcher) { 1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NOTREACHED(); 1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ArrayBufferVar* server_certificate_buffer = 1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ArrayBufferVar::FromPPVar(server_certificate); 1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!server_certificate_buffer || 1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci server_certificate_buffer->ByteLength() < 1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci media::limits::kMinCertificateLength || 1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci server_certificate_buffer->ByteLength() > 1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci media::limits::kMaxCertificateLength) { 1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NOTREACHED(); 1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const uint8_t* server_certificate_ptr = 1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static_cast<const uint8_t*>(server_certificate_buffer->Map()); 1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const uint32_t server_certificate_size = 1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci server_certificate_buffer->ByteLength(); 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<uint8_t> server_certificate_vector( 1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci server_certificate_ptr, server_certificate_ptr + server_certificate_size); 1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dispatcher->Send(new PpapiMsg_PPPContentDecryptor_SetServerCertificate( 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE, 1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci instance, 1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci promise_id, 1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci server_certificate_vector)); 1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 163a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void CreateSession(PP_Instance instance, 164f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32_t promise_id, 165f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PP_Var init_data_type, 166f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PP_Var init_data, 167f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PP_SessionType session_type) { 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dispatcher) { 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) dispatcher->Send(new PpapiMsg_PPPContentDecryptor_CreateSession( 175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE, 176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) instance, 177f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) promise_id, 178f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SerializedVarSendInput(dispatcher, init_data_type), 179f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SerializedVarSendInput(dispatcher, init_data), 180f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) session_type)); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void LoadSession(PP_Instance instance, 184f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32_t promise_id, 1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PP_Var web_session_id) { 1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance); 1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!dispatcher) { 1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NOTREACHED(); 1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dispatcher->Send(new PpapiMsg_PPPContentDecryptor_LoadSession( 1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE, 1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) instance, 195f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) promise_id, 1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SerializedVarSendInput(dispatcher, web_session_id))); 1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 199f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void UpdateSession(PP_Instance instance, 200f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32_t promise_id, 201f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PP_Var web_session_id, 202f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PP_Var response) { 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dispatcher) { 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) dispatcher->Send(new PpapiMsg_PPPContentDecryptor_UpdateSession( 210a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE, 211a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) instance, 212f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) promise_id, 213f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SerializedVarSendInput(dispatcher, web_session_id), 214a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SerializedVarSendInput(dispatcher, response))); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid CloseSession(PP_Instance instance, 2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci uint32_t promise_id, 2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PP_Var web_session_id) { 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dispatcher) { 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci StringVar* session_id = StringVar::FromPPVar(web_session_id); 2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!session_id || 2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci session_id->value().length() > media::limits::kMaxWebSessionIdLength) { 2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NOTREACHED(); 2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dispatcher->Send(new PpapiMsg_PPPContentDecryptor_CloseSession( 234f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE, 235f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) instance, 236f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) promise_id, 2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci session_id->value())); 2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid RemoveSession(PP_Instance instance, 2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci uint32_t promise_id, 2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PP_Var web_session_id) { 2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance); 2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!dispatcher) { 2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NOTREACHED(); 2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci StringVar* session_id = StringVar::FromPPVar(web_session_id); 2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!session_id || 2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci session_id->value().length() > media::limits::kMaxWebSessionIdLength) { 2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NOTREACHED(); 2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dispatcher->Send(new PpapiMsg_PPPContentDecryptor_RemoveSession( 2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE, 2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci instance, 2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci promise_id, 2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci session_id->value())); 2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid GetUsableKeyIds(PP_Instance instance, 2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci uint32_t promise_id, 2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PP_Var web_session_id) { 2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance); 2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!dispatcher) { 2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NOTREACHED(); 2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci StringVar* session_id = StringVar::FromPPVar(web_session_id); 2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!session_id || 2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci session_id->value().length() > media::limits::kMaxWebSessionIdLength) { 2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NOTREACHED(); 2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dispatcher->Send(new PpapiMsg_PPPContentDecryptor_GetUsableKeyIds( 2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE, 2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci instance, 2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci promise_id, 2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci session_id->value())); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Decrypt(PP_Instance instance, 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Resource encrypted_block, 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PP_EncryptedBlockInfo* encrypted_block_info) { 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dispatcher) { 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPPDecryptor_Buffer buffer; 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!InitializePppDecryptorBuffer(instance, 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dispatcher, 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) encrypted_block, 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &buffer)) { 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string serialized_block_info; 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!SerializeBlockInfo(*encrypted_block_info, &serialized_block_info)) { 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // PluginResourceTracker in the plugin process assumes that resources that it 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // tracks have been addrefed on behalf of the plugin at the renderer side. So 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // we explicitly do it for |encryped_block| here. 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PpapiGlobals::Get()->GetResourceTracker()->AddRefResource(encrypted_block); 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dispatcher->Send( 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new PpapiMsg_PPPContentDecryptor_Decrypt( 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE, 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance, 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer, 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) serialized_block_info)); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InitializeAudioDecoder( 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Instance instance, 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PP_AudioDecoderConfig* decoder_config, 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Resource extra_data_buffer) { 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dispatcher) { 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string serialized_decoder_config; 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!SerializeBlockInfo(*decoder_config, &serialized_decoder_config)) { 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPPDecryptor_Buffer buffer; 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!InitializePppDecryptorBuffer(instance, 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dispatcher, 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_data_buffer, 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &buffer)) { 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // PluginResourceTracker in the plugin process assumes that resources that it 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // tracks have been addrefed on behalf of the plugin at the renderer side. So 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // we explicitly do it for |extra_data_buffer| here. 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PpapiGlobals::Get()->GetResourceTracker()->AddRefResource(extra_data_buffer); 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dispatcher->Send( 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new PpapiMsg_PPPContentDecryptor_InitializeAudioDecoder( 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE, 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance, 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) serialized_decoder_config, 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer)); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InitializeVideoDecoder( 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Instance instance, 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PP_VideoDecoderConfig* decoder_config, 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Resource extra_data_buffer) { 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dispatcher) { 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string serialized_decoder_config; 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!SerializeBlockInfo(*decoder_config, &serialized_decoder_config)) { 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPPDecryptor_Buffer buffer; 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!InitializePppDecryptorBuffer(instance, 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dispatcher, 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_data_buffer, 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &buffer)) { 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // PluginResourceTracker in the plugin process assumes that resources that it 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // tracks have been addrefed on behalf of the plugin at the renderer side. So 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // we explicitly do it for |extra_data_buffer| here. 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PpapiGlobals::Get()->GetResourceTracker()->AddRefResource(extra_data_buffer); 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dispatcher->Send( 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new PpapiMsg_PPPContentDecryptor_InitializeVideoDecoder( 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE, 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance, 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) serialized_decoder_config, 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer)); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeinitializeDecoder(PP_Instance instance, 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_DecryptorStreamType decoder_type, 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t request_id) { 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dispatcher) { 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dispatcher->Send( 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new PpapiMsg_PPPContentDecryptor_DeinitializeDecoder( 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE, 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance, 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decoder_type, 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_id)); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ResetDecoder(PP_Instance instance, 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_DecryptorStreamType decoder_type, 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t request_id) { 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dispatcher) { 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dispatcher->Send( 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new PpapiMsg_PPPContentDecryptor_ResetDecoder( 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE, 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance, 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decoder_type, 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_id)); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DecryptAndDecode(PP_Instance instance, 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_DecryptorStreamType decoder_type, 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Resource encrypted_buffer, 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PP_EncryptedBlockInfo* encrypted_block_info) { 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dispatcher) { 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPPDecryptor_Buffer buffer; 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!InitializePppDecryptorBuffer(instance, 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dispatcher, 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) encrypted_buffer, 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &buffer)) { 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string serialized_block_info; 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!SerializeBlockInfo(*encrypted_block_info, &serialized_block_info)) { 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // PluginResourceTracker in the plugin process assumes that resources that it 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // tracks have been addrefed on behalf of the plugin at the renderer side. So 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // we explicitly do it for |encrypted_buffer| here. 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PpapiGlobals::Get()->GetResourceTracker()->AddRefResource(encrypted_buffer); 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dispatcher->Send( 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new PpapiMsg_PPPContentDecryptor_DecryptAndDecode( 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE, 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance, 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decoder_type, 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer, 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) serialized_block_info)); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const PPP_ContentDecryptor_Private content_decryptor_interface = { 4741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &Initialize, 4751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &SetServerCertificate, 4761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &CreateSession, 4771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &LoadSession, 4781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &UpdateSession, 4791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &CloseSession, 4801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &RemoveSession, 4811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &GetUsableKeyIds, 4821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &Decrypt, 4831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &InitializeAudioDecoder, 4841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &InitializeVideoDecoder, 4851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &DeinitializeDecoder, 4861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &ResetDecoder, 4871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &DecryptAndDecode}; 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PPP_ContentDecryptor_Private_Proxy::PPP_ContentDecryptor_Private_Proxy( 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Dispatcher* dispatcher) 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : InterfaceProxy(dispatcher), 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppp_decryptor_impl_(NULL) { 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dispatcher->IsPlugin()) { 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppp_decryptor_impl_ = static_cast<const PPP_ContentDecryptor_Private*>( 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dispatcher->local_get_interface()( 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPP_CONTENTDECRYPTOR_PRIVATE_INTERFACE)); 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PPP_ContentDecryptor_Private_Proxy::~PPP_ContentDecryptor_Private_Proxy() { 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PPP_ContentDecryptor_Private* 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPP_ContentDecryptor_Private_Proxy::GetProxyInterface() { 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &content_decryptor_interface; 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PPP_ContentDecryptor_Private_Proxy::OnMessageReceived( 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IPC::Message& msg) { 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!dispatcher()->IsPlugin()) 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; // These are only valid from host->plugin. 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Don't allow the plugin to send these to the host. 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled = true; 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(PPP_ContentDecryptor_Private_Proxy, msg) 51968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_Initialize, 52068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) OnMsgInitialize) 5211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_SetServerCertificate, 5221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci OnMsgSetServerCertificate) 523a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_CreateSession, 524a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) OnMsgCreateSession) 5255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_LoadSession, 5265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnMsgLoadSession) 527a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_UpdateSession, 528a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) OnMsgUpdateSession) 5291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_CloseSession, 5301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci OnMsgCloseSession) 5311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_RemoveSession, 5321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci OnMsgRemoveSession) 5331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_GetUsableKeyIds, 5341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci OnMsgGetUsableKeyIds) 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_Decrypt, 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnMsgDecrypt) 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_InitializeAudioDecoder, 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnMsgInitializeAudioDecoder) 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_InitializeVideoDecoder, 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnMsgInitializeVideoDecoder) 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_DeinitializeDecoder, 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnMsgDeinitializeDecoder) 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_ResetDecoder, 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnMsgResetDecoder) 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(PpapiMsg_PPPContentDecryptor_DecryptAndDecode, 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnMsgDecryptAndDecode) 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_END_MESSAGE_MAP() 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(handled); 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handled; 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void PPP_ContentDecryptor_Private_Proxy::OnMsgInitialize( 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Instance instance, 555f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SerializedVarReceiveInput key_system) { 55668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (ppp_decryptor_impl_) { 55768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CallWhileUnlocked( 55868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ppp_decryptor_impl_->Initialize, 55968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) instance, 560f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ExtractReceivedVarAndAddRef(dispatcher(), &key_system)); 56168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 56268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 56368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 5641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid PPP_ContentDecryptor_Private_Proxy::OnMsgSetServerCertificate( 5651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PP_Instance instance, 5661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci uint32_t promise_id, 5671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<uint8_t> server_certificate) { 5681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (server_certificate.size() < media::limits::kMinCertificateLength || 5691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci server_certificate.size() > media::limits::kMaxCertificateLength) { 5701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NOTREACHED(); 5711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 5721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 5731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (ppp_decryptor_impl_) { 5751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ScopedPPVar server_certificate_var( 5761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ScopedPPVar::PassRef(), 5771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PpapiGlobals::Get() 5781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ->GetVarTracker() 5791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ->MakeArrayBufferPPVar(server_certificate.size(), 5801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &server_certificate[0])); 5811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CallWhileUnlocked(ppp_decryptor_impl_->SetServerCertificate, 5821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci instance, 5831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci promise_id, 5841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci server_certificate_var.get()); 5851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 5861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 5871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 588a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PPP_ContentDecryptor_Private_Proxy::OnMsgCreateSession( 58968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) PP_Instance instance, 590f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32_t promise_id, 591f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SerializedVarReceiveInput init_data_type, 592f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SerializedVarReceiveInput init_data, 593f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PP_SessionType session_type) { 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ppp_decryptor_impl_) { 595f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) CallWhileUnlocked( 596f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ppp_decryptor_impl_->CreateSession, 597f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) instance, 598f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) promise_id, 599f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ExtractReceivedVarAndAddRef(dispatcher(), &init_data_type), 600f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ExtractReceivedVarAndAddRef(dispatcher(), &init_data), 601f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) session_type); 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PPP_ContentDecryptor_Private_Proxy::OnMsgLoadSession( 6065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PP_Instance instance, 607f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32_t promise_id, 6085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SerializedVarReceiveInput web_session_id) { 6095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (ppp_decryptor_impl_) { 6105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CallWhileUnlocked( 6115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ppp_decryptor_impl_->LoadSession, 6125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) instance, 613f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) promise_id, 6145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ExtractReceivedVarAndAddRef(dispatcher(), &web_session_id)); 6155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 6165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 618a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PPP_ContentDecryptor_Private_Proxy::OnMsgUpdateSession( 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Instance instance, 620f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32_t promise_id, 621f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SerializedVarReceiveInput web_session_id, 622a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SerializedVarReceiveInput response) { 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ppp_decryptor_impl_) { 624f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) CallWhileUnlocked( 625f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ppp_decryptor_impl_->UpdateSession, 626f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) instance, 627f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) promise_id, 628f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ExtractReceivedVarAndAddRef(dispatcher(), &web_session_id), 629f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ExtractReceivedVarAndAddRef(dispatcher(), &response)); 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid PPP_ContentDecryptor_Private_Proxy::OnMsgCloseSession( 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Instance instance, 635f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32_t promise_id, 6361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& web_session_id) { 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ppp_decryptor_impl_) { 6381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ScopedPPVar web_session_id_var(ScopedPPVar::PassRef(), 6391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci StringVar::StringToPPVar(web_session_id)); 6401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CallWhileUnlocked(ppp_decryptor_impl_->CloseSession, 6411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci instance, 6421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci promise_id, 6431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci web_session_id_var.get()); 6441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 6451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 6461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid PPP_ContentDecryptor_Private_Proxy::OnMsgRemoveSession( 6481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PP_Instance instance, 6491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci uint32_t promise_id, 6501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& web_session_id) { 6511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (ppp_decryptor_impl_) { 6521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ScopedPPVar web_session_id_var(ScopedPPVar::PassRef(), 6531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci StringVar::StringToPPVar(web_session_id)); 6541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CallWhileUnlocked(ppp_decryptor_impl_->RemoveSession, 6551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci instance, 6561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci promise_id, 6571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci web_session_id_var.get()); 6581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 6591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 6601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid PPP_ContentDecryptor_Private_Proxy::OnMsgGetUsableKeyIds( 6621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PP_Instance instance, 6631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci uint32_t promise_id, 6641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& web_session_id) { 6651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (ppp_decryptor_impl_) { 6661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ScopedPPVar web_session_id_var(ScopedPPVar::PassRef(), 6671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci StringVar::StringToPPVar(web_session_id)); 6681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CallWhileUnlocked(ppp_decryptor_impl_->GetUsableKeyIds, 6691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci instance, 6701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci promise_id, 6711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci web_session_id_var.get()); 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPP_ContentDecryptor_Private_Proxy::OnMsgDecrypt( 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Instance instance, 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PPPDecryptor_Buffer& encrypted_buffer, 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& serialized_block_info) { 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedPPResource plugin_resource( 6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedPPResource::PassRef(), 6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PPB_Buffer_Proxy::AddProxyResource(encrypted_buffer.resource, 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) encrypted_buffer.handle, 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) encrypted_buffer.size)); 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ppp_decryptor_impl_) { 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_EncryptedBlockInfo block_info; 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!DeserializeBlockInfo(serialized_block_info, &block_info)) 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallWhileUnlocked(ppp_decryptor_impl_->Decrypt, 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance, 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) plugin_resource.get(), 6911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &block_info); 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPP_ContentDecryptor_Private_Proxy::OnMsgInitializeAudioDecoder( 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Instance instance, 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& serialized_decoder_config, 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PPPDecryptor_Buffer& extra_data_buffer) { 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedPPResource plugin_resource; 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (extra_data_buffer.size > 0) { 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) plugin_resource = ScopedPPResource( 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedPPResource::PassRef(), 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PPB_Buffer_Proxy::AddProxyResource(extra_data_buffer.resource, 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extra_data_buffer.handle, 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extra_data_buffer.size)); 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_AudioDecoderConfig decoder_config; 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!DeserializeBlockInfo(serialized_decoder_config, &decoder_config)) 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ppp_decryptor_impl_) { 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallWhileUnlocked( 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppp_decryptor_impl_->InitializeAudioDecoder, 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance, 7161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &decoder_config, 7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) plugin_resource.get()); 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPP_ContentDecryptor_Private_Proxy::OnMsgInitializeVideoDecoder( 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Instance instance, 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& serialized_decoder_config, 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PPPDecryptor_Buffer& extra_data_buffer) { 7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedPPResource plugin_resource; 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (extra_data_buffer.resource.host_resource() != 0) { 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) plugin_resource = ScopedPPResource( 7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedPPResource::PassRef(), 7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PPB_Buffer_Proxy::AddProxyResource(extra_data_buffer.resource, 7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extra_data_buffer.handle, 7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extra_data_buffer.size)); 7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_VideoDecoderConfig decoder_config; 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!DeserializeBlockInfo(serialized_decoder_config, &decoder_config)) 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ppp_decryptor_impl_) { 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallWhileUnlocked( 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppp_decryptor_impl_->InitializeVideoDecoder, 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance, 7421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &decoder_config, 7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) plugin_resource.get()); 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPP_ContentDecryptor_Private_Proxy::OnMsgDeinitializeDecoder( 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Instance instance, 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_DecryptorStreamType decoder_type, 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t request_id) { 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ppp_decryptor_impl_) { 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallWhileUnlocked( 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppp_decryptor_impl_->DeinitializeDecoder, 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance, 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decoder_type, 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_id); 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPP_ContentDecryptor_Private_Proxy::OnMsgResetDecoder( 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Instance instance, 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_DecryptorStreamType decoder_type, 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t request_id) { 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ppp_decryptor_impl_) { 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallWhileUnlocked( 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppp_decryptor_impl_->ResetDecoder, 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance, 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decoder_type, 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_id); 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPP_ContentDecryptor_Private_Proxy::OnMsgDecryptAndDecode( 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Instance instance, 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_DecryptorStreamType decoder_type, 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PPPDecryptor_Buffer& encrypted_buffer, 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& serialized_block_info) { 7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedPPResource plugin_resource; 7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (encrypted_buffer.resource.host_resource() != 0) { 7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) plugin_resource = ScopedPPResource( 7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedPPResource::PassRef(), 7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PPB_Buffer_Proxy::AddProxyResource(encrypted_buffer.resource, 7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) encrypted_buffer.handle, 7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) encrypted_buffer.size)); 7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ppp_decryptor_impl_) { 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_EncryptedBlockInfo block_info; 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!DeserializeBlockInfo(serialized_block_info, &block_info)) 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallWhileUnlocked( 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppp_decryptor_impl_->DecryptAndDecode, 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance, 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decoder_type, 7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) plugin_resource.get(), 7961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &block_info); 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace proxy 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ppapi 802