17d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
27d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
37d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// found in the LICENSE file.
47d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
57d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/renderer/pepper/pepper_flash_drm_renderer_host.h"
67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
77d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/files/file_path.h"
858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "content/public/renderer/pepper_plugin_instance.h"
97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/renderer/renderer_ppapi_host.h"
107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/c/pp_errors.h"
117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/host/dispatch_host_message.h"
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/host/host_message_context.h"
137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/host/ppapi_host.h"
147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/proxy/ppapi_messages.h"
157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// TODO(raymes): This is duplicated from pepper_flash_drm_host.cc but once
177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// FileRef is refactored to the browser, it won't need to be.
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace {
19a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochconst char kVoucherFilename[] = "plugin.vch";
207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}  // namespace
217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)PepperFlashDRMRendererHost::PepperFlashDRMRendererHost(
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    content::RendererPpapiHost* host,
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    PP_Instance instance,
257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    PP_Resource resource)
267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    : ResourceHost(host->GetPpapiHost(), instance, resource),
27d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      renderer_ppapi_host_(host),
28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      weak_factory_(this) {}
297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
30c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochPepperFlashDRMRendererHost::~PepperFlashDRMRendererHost() {}
317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int32_t PepperFlashDRMRendererHost::OnResourceMessageReceived(
337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const IPC::Message& msg,
347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    ppapi::host::HostMessageContext* context) {
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  PPAPI_BEGIN_MESSAGE_MAP(PepperFlashDRMRendererHost, msg)
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_FlashDRM_GetVoucherFile,
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                        OnGetVoucherFile)
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  PPAPI_END_MESSAGE_MAP()
397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return PP_ERROR_FAILED;
407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int32_t PepperFlashDRMRendererHost::OnGetVoucherFile(
437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    ppapi::host::HostMessageContext* context) {
4458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  content::PepperPluginInstance* plugin_instance =
457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      renderer_ppapi_host_->GetPluginInstance(pp_instance());
467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!plugin_instance)
477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return PP_ERROR_FAILED;
487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
49a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  base::FilePath plugin_dir = plugin_instance->GetModulePath().DirName();
507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DCHECK(!plugin_dir.empty());
51a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  base::FilePath voucher_file = plugin_dir.AppendASCII(kVoucherFilename);
527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
53d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  int renderer_pending_host_id =
54d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      plugin_instance->MakePendingFileRefRendererHost(voucher_file);
55d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (renderer_pending_host_id == 0)
56d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return PP_ERROR_FAILED;
57d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
58d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  std::vector<IPC::Message> create_msgs;
59a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  create_msgs.push_back(PpapiHostMsg_FileRef_CreateForRawFS(voucher_file));
60d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
61d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  renderer_ppapi_host_->CreateBrowserResourceHosts(
62d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      pp_instance(),
63d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      create_msgs,
64d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      base::Bind(&PepperFlashDRMRendererHost::DidCreateFileRefHosts,
65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                 weak_factory_.GetWeakPtr(),
66d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                 context->MakeReplyMessageContext(),
67d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                 voucher_file,
68d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                 renderer_pending_host_id));
69d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return PP_OK_COMPLETIONPENDING;
70d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
71d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
72d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void PepperFlashDRMRendererHost::DidCreateFileRefHosts(
73d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const ppapi::host::ReplyMessageContext& reply_context,
74d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const base::FilePath& external_path,
75d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    int renderer_pending_host_id,
76d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const std::vector<int>& browser_pending_host_ids) {
77a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  DCHECK_EQ(1U, browser_pending_host_ids.size());
78a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  int browser_pending_host_id = browser_pending_host_ids[0];
79d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
80d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ppapi::FileRefCreateInfo create_info =
81d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      ppapi::MakeExternalFileRefCreateInfo(external_path,
82d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                           std::string(),
83d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                           browser_pending_host_id,
84d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                           renderer_pending_host_id);
85d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  host()->SendReply(reply_context,
86d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                    PpapiPluginMsg_FlashDRM_GetVoucherFileReply(create_info));
877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
88