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