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)
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)nacl::string GetFullUrl(const nacl::string& partial_url) {
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return nacl::string(kPnaclBaseUrl) + GetNaClInterface()->GetSandboxArch() +
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)         "/" + partial_url;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PnaclResources::~PnaclResources() {
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (llc_file_handle_ != PP_kInvalidFileHandle)
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    CloseFileHandle(llc_file_handle_);
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (ld_file_handle_ != PP_kInvalidFileHandle)
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    CloseFileHandle(ld_file_handle_);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void PnaclResources::ReadResourceInfo(
3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const pp::CompletionCallback& resource_info_read_cb) {
36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  PP_Var pp_llc_tool_name_var;
37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  PP_Var pp_ld_tool_name_var;
38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (!plugin_->nacl_interface()->GetPnaclResourceInfo(
39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          plugin_->pp_instance(),
4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          "chrome://pnacl-translator/pnacl.json",
41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          &pp_llc_tool_name_var,
42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          &pp_ld_tool_name_var)) {
4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    pp::Module::Get()->core()->CallOnMainThread(0,
4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                                resource_info_read_cb,
4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                                PP_ERROR_FAILED);
4646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return;
4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  pp::Var llc_tool_name(pp::PASS_REF, pp_llc_tool_name_var);
49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  pp::Var ld_tool_name(pp::PASS_REF, pp_ld_tool_name_var);
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  llc_tool_name_ = GetFullUrl(llc_tool_name.AsString());
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ld_tool_name_ = GetFullUrl(ld_tool_name.AsString());
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  pp::Module::Get()->core()->CallOnMainThread(0, resource_info_read_cb, PP_OK);
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)PP_FileHandle PnaclResources::TakeLlcFileHandle() {
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  PP_FileHandle to_return = llc_file_handle_;
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  llc_file_handle_ = PP_kInvalidFileHandle;
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return to_return;
5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)PP_FileHandle PnaclResources::TakeLdFileHandle() {
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  PP_FileHandle to_return = ld_file_handle_;
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ld_file_handle_ = PP_kInvalidFileHandle;
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return to_return;
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void PnaclResources::StartLoad(
6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const pp::CompletionCallback& all_loaded_callback) {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PLUGIN_PRINTF(("PnaclResources::StartLoad\n"));
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Do a blocking load of each of the resources.
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  llc_file_handle_ =
7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      plugin_->nacl_interface()->GetReadonlyPnaclFd(llc_tool_name_.c_str());
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ld_file_handle_ =
7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      plugin_->nacl_interface()->GetReadonlyPnaclFd(ld_tool_name_.c_str());
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
77a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  int32_t result = PP_OK;
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (llc_file_handle_ == PP_kInvalidFileHandle ||
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ld_file_handle_ == PP_kInvalidFileHandle) {
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    result = PP_ERROR_FILENOTFOUND;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  pp::Module::Get()->core()->CallOnMainThread(0, all_loaded_callback, result);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace plugin
86