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)
5ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "ppapi/native_client/src/trusted/plugin/pnacl_resources.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "native_client/src/include/portability_io.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "native_client/src/shared/platform/nacl_check.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "native_client/src/trusted/desc/nacl_desc_wrapper.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_errors.h"
11ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "ppapi/native_client/src/trusted/plugin/plugin.h"
12ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "ppapi/native_client/src/trusted/plugin/utility.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace plugin {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace {
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static const char kPnaclBaseUrl[] = "chrome://pnacl-translator/";
1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistd::string GetFullUrl(const std::string& partial_url) {
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return std::string(kPnaclBaseUrl) + GetNaClInterface()->GetSandboxArch() +
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)         "/" + partial_url;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
27116680a4aac90f2aa7413d9095a592090648e557Ben MurdochPnaclResources::PnaclResources(Plugin* plugin)
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    : plugin_(plugin) {
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  llc_file_info_ = kInvalidNaClFileInfo;
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ld_file_info_ = kInvalidNaClFileInfo;
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PnaclResources::~PnaclResources() {
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (llc_file_info_.handle != PP_kInvalidFileHandle)
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    CloseFileHandle(llc_file_info_.handle);
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (ld_file_info_.handle != PP_kInvalidFileHandle)
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    CloseFileHandle(ld_file_info_.handle);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool PnaclResources::ReadResourceInfo() {
41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  PP_Var pp_llc_tool_name_var;
42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  PP_Var pp_ld_tool_name_var;
43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (!plugin_->nacl_interface()->GetPnaclResourceInfo(
44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          plugin_->pp_instance(),
45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          &pp_llc_tool_name_var,
46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          &pp_ld_tool_name_var)) {
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return false;
4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  pp::Var llc_tool_name(pp::PASS_REF, pp_llc_tool_name_var);
50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  pp::Var ld_tool_name(pp::PASS_REF, pp_ld_tool_name_var);
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  llc_tool_name_ = GetFullUrl(llc_tool_name.AsString());
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ld_tool_name_ = GetFullUrl(ld_tool_name.AsString());
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return true;
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
56116680a4aac90f2aa7413d9095a592090648e557Ben MurdochPP_NaClFileInfo PnaclResources::TakeLlcFileInfo() {
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  PP_NaClFileInfo to_return = llc_file_info_;
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  llc_file_info_ = kInvalidNaClFileInfo;
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return to_return;
6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
62116680a4aac90f2aa7413d9095a592090648e557Ben MurdochPP_NaClFileInfo PnaclResources::TakeLdFileInfo() {
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  PP_NaClFileInfo to_return = ld_file_info_;
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ld_file_info_ = kInvalidNaClFileInfo;
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return to_return;
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool PnaclResources::StartLoad() {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PLUGIN_PRINTF(("PnaclResources::StartLoad\n"));
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Do a blocking load of each of the resources.
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  plugin_->nacl_interface()->GetReadExecPnaclFd(llc_tool_name_.c_str(),
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                                &llc_file_info_);
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  plugin_->nacl_interface()->GetReadExecPnaclFd(ld_tool_name_.c_str(),
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                                &ld_file_info_);
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return (llc_file_info_.handle != PP_kInvalidFileHandle &&
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          ld_file_info_.handle != PP_kInvalidFileHandle);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace plugin
81