| Index: ppapi/native_client/src/trusted/plugin/pnacl_resources.cc
|
| diff --git a/ppapi/native_client/src/trusted/plugin/pnacl_resources.cc b/ppapi/native_client/src/trusted/plugin/pnacl_resources.cc
|
| index 12ef44916d34bfae12255d87bab687e1f2392e0f..1f0f8f418ee08df0bab517271c38ce0d0f74487c 100644
|
| --- a/ppapi/native_client/src/trusted/plugin/pnacl_resources.cc
|
| +++ b/ppapi/native_client/src/trusted/plugin/pnacl_resources.cc
|
| @@ -16,6 +16,15 @@
|
|
|
| namespace plugin {
|
|
|
| +namespace {
|
| +
|
| +nacl::string GetFullUrl(const nacl::string& partial_url) {
|
| + return PnaclUrls::GetBaseUrl() + GetNaClInterface()->GetSandboxArch() + "/" +
|
| + partial_url;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| static const char kPnaclBaseUrl[] = "chrome://pnacl-translator/";
|
|
|
| nacl::string PnaclUrls::GetBaseUrl() {
|
| @@ -55,41 +64,10 @@ nacl::string PnaclUrls::GetResourceInfoUrl() {
|
| //////////////////////////////////////////////////////////////////////
|
|
|
| PnaclResources::~PnaclResources() {
|
| - for (std::map<nacl::string, nacl::DescWrapper*>::iterator
|
| - i = resource_wrappers_.begin(), e = resource_wrappers_.end();
|
| - i != e;
|
| - ++i) {
|
| - delete i->second;
|
| - }
|
| - resource_wrappers_.clear();
|
| -}
|
| -
|
| -// static
|
| -int32_t PnaclResources::GetPnaclFD(Plugin* plugin, const char* filename) {
|
| - PP_FileHandle file_handle =
|
| - plugin->nacl_interface()->GetReadonlyPnaclFd(filename);
|
| - if (file_handle == PP_kInvalidFileHandle)
|
| - return -1;
|
| -
|
| -#if NACL_WINDOWS
|
| - //////// Now try the posix view.
|
| - int32_t posix_desc = _open_osfhandle(reinterpret_cast<intptr_t>(file_handle),
|
| - _O_RDONLY | _O_BINARY);
|
| - if (posix_desc == -1) {
|
| - PLUGIN_PRINTF((
|
| - "PnaclResources::GetPnaclFD failed to convert HANDLE to posix\n"));
|
| - // Close the Windows HANDLE if it can't be converted.
|
| - CloseHandle(file_handle);
|
| - }
|
| - return posix_desc;
|
| -#else
|
| - return file_handle;
|
| -#endif
|
| -}
|
| -
|
| -nacl::DescWrapper* PnaclResources::WrapperForUrl(const nacl::string& url) {
|
| - CHECK(resource_wrappers_.find(url) != resource_wrappers_.end());
|
| - return resource_wrappers_[url];
|
| + if (llc_file_handle_ != PP_kInvalidFileHandle)
|
| + CloseFileHandle(llc_file_handle_);
|
| + if (ld_file_handle_ != PP_kInvalidFileHandle)
|
| + CloseFileHandle(ld_file_handle_);
|
| }
|
|
|
| void PnaclResources::ReadResourceInfo(
|
| @@ -117,53 +95,52 @@ void PnaclResources::ReadResourceInfo(
|
|
|
| pp::Var llc_tool_name(pp::PASS_REF, pp_llc_tool_name_var);
|
| pp::Var ld_tool_name(pp::PASS_REF, pp_ld_tool_name_var);
|
| - llc_tool_name_ = llc_tool_name.AsString();
|
| - ld_tool_name_ = ld_tool_name.AsString();
|
| - pp::Core* core = pp::Module::Get()->core();
|
| - core->CallOnMainThread(0, resource_info_read_cb, PP_OK);
|
| + llc_tool_name_ = GetFullUrl(llc_tool_name.AsString());
|
| + ld_tool_name_ = GetFullUrl(ld_tool_name.AsString());
|
| + pp::Module::Get()->core()->CallOnMainThread(0, resource_info_read_cb, PP_OK);
|
| +}
|
| +
|
| +PP_FileHandle PnaclResources::TakeLlcFileHandle() {
|
| + PP_FileHandle to_return = llc_file_handle_;
|
| + llc_file_handle_ = PP_kInvalidFileHandle;
|
| + return to_return;
|
| }
|
|
|
| -nacl::string PnaclResources::GetFullUrl(
|
| - const nacl::string& partial_url, const nacl::string& sandbox_arch) const {
|
| - return PnaclUrls::GetBaseUrl() + sandbox_arch + "/" + partial_url;
|
| +PP_FileHandle PnaclResources::TakeLdFileHandle() {
|
| + PP_FileHandle to_return = ld_file_handle_;
|
| + ld_file_handle_ = PP_kInvalidFileHandle;
|
| + return to_return;
|
| }
|
|
|
| void PnaclResources::StartLoad(
|
| const pp::CompletionCallback& all_loaded_callback) {
|
| PLUGIN_PRINTF(("PnaclResources::StartLoad\n"));
|
|
|
| - std::vector<nacl::string> resource_urls;
|
| - resource_urls.push_back(llc_tool_name_);
|
| - resource_urls.push_back(ld_tool_name_);
|
| -
|
| - PLUGIN_PRINTF(("PnaclResources::StartLoad -- local install of PNaCl.\n"));
|
| // Do a blocking load of each of the resources.
|
| + nacl::string llc_filename =
|
| + PnaclUrls::PnaclComponentURLToFilename(llc_tool_name_);
|
| + llc_file_handle_ =
|
| + plugin_->nacl_interface()->GetReadonlyPnaclFd(llc_filename.c_str());
|
| +
|
| + nacl::string ld_filename =
|
| + PnaclUrls::PnaclComponentURLToFilename(ld_tool_name_);
|
| + ld_file_handle_ =
|
| + plugin_->nacl_interface()->GetReadonlyPnaclFd(ld_filename.c_str());
|
| +
|
| int32_t result = PP_OK;
|
| - for (size_t i = 0; i < resource_urls.size(); ++i) {
|
| - nacl::string full_url = GetFullUrl(
|
| - resource_urls[i], plugin_->nacl_interface()->GetSandboxArch());
|
| - nacl::string filename = PnaclUrls::PnaclComponentURLToFilename(full_url);
|
| -
|
| - int32_t fd = PnaclResources::GetPnaclFD(plugin_, filename.c_str());
|
| - if (fd < 0) {
|
| - // File-open failed. Assume this means that the file is
|
| - // not actually installed. This shouldn't actually occur since
|
| - // ReadResourceInfo() should happen first, and error out.
|
| - coordinator_->ReportNonPpapiError(
|
| - PP_NACL_ERROR_PNACL_RESOURCE_FETCH,
|
| - nacl::string("The Portable Native Client (pnacl) component is not "
|
| - "installed. Please consult chrome://components for more "
|
| - "information."));
|
| - result = PP_ERROR_FILENOTFOUND;
|
| - break;
|
| - } else {
|
| - resource_wrappers_[resource_urls[i]] =
|
| - plugin_->wrapper_factory()->MakeFileDesc(fd, O_RDONLY);
|
| - }
|
| + if (llc_file_handle_ == PP_kInvalidFileHandle ||
|
| + ld_file_handle_ == PP_kInvalidFileHandle) {
|
| + // File-open failed. Assume this means that the file is
|
| + // not actually installed. This shouldn't actually occur since
|
| + // ReadResourceInfo() fail first.
|
| + coordinator_->ReportNonPpapiError(
|
| + PP_NACL_ERROR_PNACL_RESOURCE_FETCH,
|
| + nacl::string("The Portable Native Client (pnacl) component is not "
|
| + "installed. Please consult chrome://components for more "
|
| + "information."));
|
| + result = PP_ERROR_FILENOTFOUND;
|
| }
|
| - // We're done! Queue the callback.
|
| - pp::Core* core = pp::Module::Get()->core();
|
| - core->CallOnMainThread(0, all_loaded_callback, result);
|
| + pp::Module::Get()->core()->CallOnMainThread(0, all_loaded_callback, result);
|
| }
|
|
|
| } // namespace plugin
|
|
|