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