Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(143)

Side by Side Diff: ppapi/native_client/src/trusted/plugin/pnacl_resources.cc

Issue 10689012: Add ability to load pnacl resources from DIR_PNACL_COMPONENT. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: lint Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "native_client/src/trusted/plugin/pnacl_resources.h" 5 #include "native_client/src/trusted/plugin/pnacl_resources.h"
6 6
7 #include "native_client/src/include/portability_io.h" 7 #include "native_client/src/include/portability_io.h"
8 #include "native_client/src/shared/platform/nacl_check.h" 8 #include "native_client/src/shared/platform/nacl_check.h"
9 #include "native_client/src/trusted/desc/nacl_desc_wrapper.h" 9 #include "native_client/src/trusted/desc/nacl_desc_wrapper.h"
10 #include "native_client/src/trusted/plugin/manifest.h" 10 #include "native_client/src/trusted/plugin/manifest.h"
11 #include "native_client/src/trusted/plugin/plugin.h" 11 #include "native_client/src/trusted/plugin/plugin.h"
12 #include "native_client/src/trusted/plugin/pnacl_coordinator.h" 12 #include "native_client/src/trusted/plugin/pnacl_coordinator.h"
13 #include "native_client/src/trusted/plugin/utility.h" 13 #include "native_client/src/trusted/plugin/utility.h"
14 14
15 #include "ppapi/c/pp_errors.h" 15 #include "ppapi/c/pp_errors.h"
16 16
17 namespace plugin { 17 namespace plugin {
18 18
19 const char PnaclUrls::kExtensionOrigin[] = 19 const char PnaclUrls::kExtensionOrigin[] =
20 "chrome-extension://gcodniebolpnpaiggndmcmmfpldlknih/"; 20 "chrome-extension://gcodniebolpnpaiggndmcmmfpldlknih/";
21 const char PnaclUrls::kPnaclComponentID[] =
22 "pnacl-component://";
21 const char PnaclUrls::kLlcUrl[] = "llc"; 23 const char PnaclUrls::kLlcUrl[] = "llc";
22 const char PnaclUrls::kLdUrl[] = "ld"; 24 const char PnaclUrls::kLdUrl[] = "ld";
23 25
26 bool PnaclUrls::UsePnaclExtension(const Plugin* plugin) {
27 // Use the chrome webstore extension for now, if --enable-pnacl is not
28 // explicitly requested. Eventually we will always behave as if
29 // --enable-pnacl is used and not use the chrome extension.
30 // Some UI work, etc. remains before --enable-pnacl is usable:
31 // http://code.google.com/p/nativeclient/issues/detail?id=2813
32 return !(plugin->nacl_interface()->IsPnaclEnabled());
33 }
34
35 nacl::string PnaclUrls::GetBaseUrl(bool use_extension) {
36 if (use_extension) {
37 return nacl::string(kExtensionOrigin) + GetSandboxISA() + "/";
38 } else {
39 return nacl::string(kPnaclComponentID) + GetSandboxISA() + "/";
40 }
41 }
42
43 bool PnaclUrls::IsPnaclComponent(const nacl::string& full_url) {
44 return full_url.find(kPnaclComponentID, 0) == 0;
45 }
46
47 nacl::string PnaclUrls::StripPnaclComponentPrefix(
48 const nacl::string& full_url) {
49 return full_url.substr(nacl::string(kPnaclComponentID).length());
50 }
51
52 //////////////////////////////////////////////////////////////////////
53
24 PnaclResources::~PnaclResources() { 54 PnaclResources::~PnaclResources() {
25 for (std::map<nacl::string, nacl::DescWrapper*>::iterator 55 for (std::map<nacl::string, nacl::DescWrapper*>::iterator
26 i = resource_wrappers_.begin(), e = resource_wrappers_.end(); 56 i = resource_wrappers_.begin(), e = resource_wrappers_.end();
27 i != e; 57 i != e;
28 ++i) { 58 ++i) {
29 delete i->second; 59 delete i->second;
30 } 60 }
31 resource_wrappers_.clear(); 61 resource_wrappers_.clear();
32 } 62 }
33 63
34 void PnaclResources::StartDownloads() { 64 // static
35 PLUGIN_PRINTF(("PnaclResources::StartDownloads\n")); 65 int32_t PnaclResources::GetPnaclFD(Plugin* plugin, const char* filename) {
36 // Create a counter (barrier) callback to track when all of the resources 66 PP_FileHandle file_handle =
37 // are loaded. 67 plugin->nacl_interface()->GetReadonlyPnaclFd(filename);
38 uint32_t resource_count = static_cast<uint32_t>(resource_urls_.size()); 68 if (file_handle == PP_kInvalidFileHandle)
39 delayed_callback_.reset( 69 return -1;
40 new DelayedCallback(all_loaded_callback_, resource_count));
41 70
42 // Schedule the downloads. 71 #if NACL_WINDOWS
72 //////// Now try the posix view.
73 int32_t posix_desc = _open_osfhandle(reinterpret_cast<intptr_t>(file_handle),
74 _O_RDONLY | _O_BINARY);
75 if (posix_desc == -1) {
76 PLUGIN_PRINTF((
77 "PnaclResources::GetPnaclFD failed to convert HANDLE to posix\n"));
78 // Close the Windows HANDLE if it can't be converted.
79 CloseHandle(file_handle);
80 }
81 return posix_desc;
82 #else
83 return file_handle;
84 #endif
85 }
86
87 nacl::DescWrapper* PnaclResources::WrapperForUrl(const nacl::string& url) {
88 CHECK(resource_wrappers_.find(url) != resource_wrappers_.end());
89 return resource_wrappers_[url];
90 }
91
92 void PnaclResources::StartLoad() {
93 PLUGIN_PRINTF(("PnaclResources::StartLoad\n"));
94
43 CHECK(resource_urls_.size() > 0); 95 CHECK(resource_urls_.size() > 0);
44 for (size_t i = 0; i < resource_urls_.size(); ++i) { 96 if (PnaclUrls::UsePnaclExtension(plugin_)) {
45 nacl::string full_url; 97 PLUGIN_PRINTF(("PnaclResources::StartLoad -- PNaCl chrome extension.\n"));
46 ErrorInfo error_info; 98 // Do a URL fetch.
47 if (!manifest_->ResolveURL(resource_urls_[i], &full_url, &error_info)) { 99 // Create a counter (barrier) callback to track when all of the resources
48 coordinator_->ReportNonPpapiError(nacl::string("failed to resolve ") + 100 // are loaded.
49 resource_urls_[i] + ": " + 101 uint32_t resource_count = static_cast<uint32_t>(resource_urls_.size());
50 error_info.message() + "."); 102 delayed_callback_.reset(
51 break; 103 new DelayedCallback(all_loaded_callback_, resource_count));
104
105 // Schedule the downloads.
106 for (size_t i = 0; i < resource_urls_.size(); ++i) {
107 nacl::string full_url;
108 ErrorInfo error_info;
109 if (!manifest_->ResolveURL(resource_urls_[i], &full_url, &error_info)) {
110 coordinator_->ReportNonPpapiError(nacl::string("failed to resolve ") +
111 resource_urls_[i] + ": " +
112 error_info.message() + ".");
113 break;
114 }
115 pp::CompletionCallback ready_callback =
116 callback_factory_.NewCallback(
117 &PnaclResources::ResourceReady,
118 resource_urls_[i],
119 full_url);
120 if (!plugin_->StreamAsFile(full_url,
121 ready_callback.pp_completion_callback())) {
122 coordinator_->ReportNonPpapiError(nacl::string("failed to download ") +
123 resource_urls_[i] + ".");
124 break;
125 }
52 } 126 }
53 pp::CompletionCallback ready_callback = 127 } else {
54 callback_factory_.NewCallback(&PnaclResources::ResourceReady, 128 PLUGIN_PRINTF(("PnaclResources::StartLoad -- local install of PNaCl.\n"));
55 resource_urls_[i], 129 // Do a blocking load of each of the resources.
56 full_url); 130 int32_t result = PP_OK;
57 if (!plugin_->StreamAsFile(full_url, 131 for (size_t i = 0; i < resource_urls_.size(); ++i) {
58 ready_callback.pp_completion_callback())) { 132 const nacl::string& url = resource_urls_[i];
59 coordinator_->ReportNonPpapiError(nacl::string("failed to download ") + 133 nacl::string full_url;
60 resource_urls_[i] + "."); 134 ErrorInfo error_info;
61 break; 135 if (!manifest_->ResolveURL(resource_urls_[i], &full_url, &error_info)) {
136 coordinator_->ReportNonPpapiError(nacl::string("failed to resolve ") +
137 url + ": " +
138 error_info.message() + ".");
139 break;
140 }
141 full_url = PnaclUrls::StripPnaclComponentPrefix(full_url);
142
143 int32_t fd = PnaclResources::GetPnaclFD(plugin_, full_url.c_str());
144 if (fd < 0) {
145 coordinator_->ReportNonPpapiError(
146 nacl::string("PnaclLocalResources::StartLoad failed for: ") +
147 full_url);
148 result = PP_ERROR_FILENOTFOUND;
149 break;
150 } else {
151 resource_wrappers_[url] =
152 plugin_->wrapper_factory()->MakeFileDesc(fd, O_RDONLY);
153 }
62 } 154 }
155 // We're done! Queue the callback.
156 pp::Core* core = pp::Module::Get()->core();
157 core->CallOnMainThread(0, all_loaded_callback_, result);
63 } 158 }
64 } 159 }
65 160
66 void PnaclResources::ResourceReady(int32_t pp_error, 161 void PnaclResources::ResourceReady(int32_t pp_error,
67 const nacl::string& url, 162 const nacl::string& url,
68 const nacl::string& full_url) { 163 const nacl::string& full_url) {
69 PLUGIN_PRINTF(("PnaclResources::ResourceReady (pp_error=%" 164 PLUGIN_PRINTF(("PnaclResources::ResourceReady (pp_error=%"
70 NACL_PRId32", url=%s)\n", pp_error, url.c_str())); 165 NACL_PRId32", url=%s)\n", pp_error, url.c_str()));
71 // pp_error is checked by GetLoadedFileDesc. 166 // pp_error is checked by GetLoadedFileDesc.
72 int32_t fd = coordinator_->GetLoadedFileDesc(pp_error, 167 int32_t fd = coordinator_->GetLoadedFileDesc(pp_error,
73 full_url, 168 full_url,
74 "resource " + url); 169 "resource " + url);
75 if (fd < 0) { 170 if (fd < 0) {
76 coordinator_->ReportPpapiError(pp_error, 171 coordinator_->ReportPpapiError(pp_error,
77 "PnaclResources::ResourceReady failed."); 172 "PnaclResources::ResourceReady failed.");
78 } else { 173 } else {
79 resource_wrappers_[url] = 174 resource_wrappers_[url] =
80 plugin_->wrapper_factory()->MakeFileDesc(fd, O_RDONLY); 175 plugin_->wrapper_factory()->MakeFileDesc(fd, O_RDONLY);
81 delayed_callback_->RunIfTime(); 176 delayed_callback_->RunIfTime();
82 } 177 }
83 } 178 }
84 179
85 } // namespace plugin 180 } // namespace plugin
OLDNEW
« no previous file with comments | « ppapi/native_client/src/trusted/plugin/pnacl_resources.h ('k') | ppapi/native_client/src/trusted/plugin/service_runtime.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698