Home | History | Annotate | Download | only in plugin
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "ppapi/native_client/src/trusted/plugin/pnacl_resources.h"
      6 
      7 #include "native_client/src/include/portability_io.h"
      8 #include "native_client/src/shared/platform/nacl_check.h"
      9 #include "native_client/src/trusted/desc/nacl_desc_wrapper.h"
     10 #include "ppapi/c/pp_errors.h"
     11 #include "ppapi/native_client/src/trusted/plugin/plugin.h"
     12 #include "ppapi/native_client/src/trusted/plugin/utility.h"
     13 
     14 namespace plugin {
     15 
     16 namespace {
     17 
     18 static const char kPnaclBaseUrl[] = "chrome://pnacl-translator/";
     19 
     20 std::string GetFullUrl(const std::string& partial_url) {
     21   return std::string(kPnaclBaseUrl) + GetNaClInterface()->GetSandboxArch() +
     22          "/" + partial_url;
     23 }
     24 
     25 }  // namespace
     26 
     27 PnaclResources::PnaclResources(Plugin* plugin)
     28     : plugin_(plugin) {
     29   llc_file_info_ = kInvalidNaClFileInfo;
     30   ld_file_info_ = kInvalidNaClFileInfo;
     31 }
     32 
     33 PnaclResources::~PnaclResources() {
     34   if (llc_file_info_.handle != PP_kInvalidFileHandle)
     35     CloseFileHandle(llc_file_info_.handle);
     36   if (ld_file_info_.handle != PP_kInvalidFileHandle)
     37     CloseFileHandle(ld_file_info_.handle);
     38 }
     39 
     40 bool PnaclResources::ReadResourceInfo() {
     41   PP_Var pp_llc_tool_name_var;
     42   PP_Var pp_ld_tool_name_var;
     43   if (!plugin_->nacl_interface()->GetPnaclResourceInfo(
     44           plugin_->pp_instance(),
     45           &pp_llc_tool_name_var,
     46           &pp_ld_tool_name_var)) {
     47     return false;
     48   }
     49   pp::Var llc_tool_name(pp::PASS_REF, pp_llc_tool_name_var);
     50   pp::Var ld_tool_name(pp::PASS_REF, pp_ld_tool_name_var);
     51   llc_tool_name_ = GetFullUrl(llc_tool_name.AsString());
     52   ld_tool_name_ = GetFullUrl(ld_tool_name.AsString());
     53   return true;
     54 }
     55 
     56 PP_NaClFileInfo PnaclResources::TakeLlcFileInfo() {
     57   PP_NaClFileInfo to_return = llc_file_info_;
     58   llc_file_info_ = kInvalidNaClFileInfo;
     59   return to_return;
     60 }
     61 
     62 PP_NaClFileInfo PnaclResources::TakeLdFileInfo() {
     63   PP_NaClFileInfo to_return = ld_file_info_;
     64   ld_file_info_ = kInvalidNaClFileInfo;
     65   return to_return;
     66 }
     67 
     68 bool PnaclResources::StartLoad() {
     69   PLUGIN_PRINTF(("PnaclResources::StartLoad\n"));
     70 
     71   // Do a blocking load of each of the resources.
     72   plugin_->nacl_interface()->GetReadExecPnaclFd(llc_tool_name_.c_str(),
     73                                                 &llc_file_info_);
     74   plugin_->nacl_interface()->GetReadExecPnaclFd(ld_tool_name_.c_str(),
     75                                                 &ld_file_info_);
     76   return (llc_file_info_.handle != PP_kInvalidFileHandle &&
     77           ld_file_info_.handle != PP_kInvalidFileHandle);
     78 }
     79 
     80 }  // namespace plugin
     81