OLD | NEW |
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 "ppapi/native_client/src/trusted/plugin/pnacl_resources.h" | 5 #include "ppapi/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 "ppapi/c/pp_errors.h" | 10 #include "ppapi/c/pp_errors.h" |
11 #include "ppapi/native_client/src/trusted/plugin/file_utils.h" | |
12 #include "ppapi/native_client/src/trusted/plugin/plugin.h" | 11 #include "ppapi/native_client/src/trusted/plugin/plugin.h" |
13 #include "ppapi/native_client/src/trusted/plugin/pnacl_coordinator.h" | 12 #include "ppapi/native_client/src/trusted/plugin/pnacl_coordinator.h" |
14 #include "ppapi/native_client/src/trusted/plugin/utility.h" | 13 #include "ppapi/native_client/src/trusted/plugin/utility.h" |
15 #include "third_party/jsoncpp/source/include/json/reader.h" | 14 #include "third_party/jsoncpp/source/include/json/reader.h" |
16 #include "third_party/jsoncpp/source/include/json/value.h" | 15 #include "third_party/jsoncpp/source/include/json/value.h" |
17 | 16 |
18 namespace plugin { | 17 namespace plugin { |
19 | 18 |
20 static const char kPnaclBaseUrl[] = "chrome://pnacl-translator/"; | 19 static const char kPnaclBaseUrl[] = "chrome://pnacl-translator/"; |
21 | 20 |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
99 PLUGIN_PRINTF(("PnaclResources::ReadResourceInfo\n")); | 98 PLUGIN_PRINTF(("PnaclResources::ReadResourceInfo\n")); |
100 | 99 |
101 nacl::string full_url = PnaclUrls::GetBaseUrl() + resource_info_url; | 100 nacl::string full_url = PnaclUrls::GetBaseUrl() + resource_info_url; |
102 PLUGIN_PRINTF(("Resolved resources info url: %s\n", full_url.c_str())); | 101 PLUGIN_PRINTF(("Resolved resources info url: %s\n", full_url.c_str())); |
103 nacl::string resource_info_filename = | 102 nacl::string resource_info_filename = |
104 PnaclUrls::PnaclComponentURLToFilename(full_url); | 103 PnaclUrls::PnaclComponentURLToFilename(full_url); |
105 | 104 |
106 PLUGIN_PRINTF(("Pnacl-converted resources info url: %s\n", | 105 PLUGIN_PRINTF(("Pnacl-converted resources info url: %s\n", |
107 resource_info_filename.c_str())); | 106 resource_info_filename.c_str())); |
108 | 107 |
109 int32_t fd = GetPnaclFD(plugin_, resource_info_filename.c_str()); | 108 PP_Var pp_llc_tool_name_var; |
110 if (fd < 0) { | 109 PP_Var pp_ld_tool_name_var; |
111 // File-open failed. Assume this means that the file is | 110 if (!plugin_->nacl_interface()->GetPnaclResourceInfo( |
112 // not actually installed. | 111 plugin_->pp_instance(), |
113 coordinator_->ReportNonPpapiError(PP_NACL_ERROR_PNACL_RESOURCE_FETCH, | 112 resource_info_filename.c_str(), |
114 nacl::string("The Portable Native Client (pnacl) component is not " | 113 &pp_llc_tool_name_var, |
115 "installed. Please consult chrome://components for more " | 114 &pp_ld_tool_name_var)) { |
116 "information.")); | 115 coordinator_->ExitWithError(); |
117 return; | |
118 } | 116 } |
119 | 117 |
120 nacl::string json_buffer; | 118 pp::Var llc_tool_name(pp::PASS_REF, pp_llc_tool_name_var); |
121 file_utils::StatusCode status = file_utils::SlurpFile(fd, json_buffer); | 119 pp::Var ld_tool_name(pp::PASS_REF, pp_ld_tool_name_var); |
122 if (status != file_utils::PLUGIN_FILE_SUCCESS) { | 120 llc_tool_name_ = llc_tool_name.AsString(); |
123 coordinator_->ReportNonPpapiError(PP_NACL_ERROR_PNACL_RESOURCE_FETCH, | 121 ld_tool_name_ = ld_tool_name.AsString(); |
124 nacl::string("PnaclResources::ReadResourceInfo reading " | |
125 "failed for: ") + resource_info_filename); | |
126 return; | |
127 } | |
128 | |
129 // Finally, we have the resource info JSON data in json_buffer. | |
130 PLUGIN_PRINTF(("Resource info JSON data:\n%s\n", json_buffer.c_str())); | |
131 if (!ParseResourceInfo(json_buffer)) | |
132 return; | |
133 | |
134 // Done. Queue the completion callback. | |
135 pp::Core* core = pp::Module::Get()->core(); | 122 pp::Core* core = pp::Module::Get()->core(); |
136 core->CallOnMainThread(0, resource_info_read_cb, PP_OK); | 123 core->CallOnMainThread(0, resource_info_read_cb, PP_OK); |
137 } | 124 } |
138 | 125 |
139 bool PnaclResources::ParseResourceInfo(const nacl::string& buf) { | |
140 // Expect the JSON file to contain a top-level object (dictionary). | |
141 Json::Reader json_reader; | |
142 Json::Value json_data; | |
143 if (!json_reader.parse(buf, json_data)) { | |
144 std::string errmsg = nacl::string("JSON parse error: ") + | |
145 json_reader.getFormatedErrorMessages(); | |
146 coordinator_->ReportNonPpapiError(PP_NACL_ERROR_PNACL_RESOURCE_FETCH, | |
147 nacl::string("Parsing resource info failed: ") + errmsg + "\n"); | |
148 return false; | |
149 } | |
150 | |
151 if (!json_data.isObject()) { | |
152 coordinator_->ReportNonPpapiError(PP_NACL_ERROR_PNACL_RESOURCE_FETCH, | |
153 nacl::string("Parsing resource info failed: " | |
154 "Malformed JSON dictionary\n")); | |
155 return false; | |
156 } | |
157 | |
158 if (json_data.isMember("pnacl-llc-name")) { | |
159 Json::Value json_name = json_data["pnacl-llc-name"]; | |
160 if (json_name.isString()) { | |
161 llc_tool_name_ = json_name.asString(); | |
162 PLUGIN_PRINTF(("Set llc_tool_name=%s\n", llc_tool_name_.c_str())); | |
163 } | |
164 } | |
165 | |
166 if (json_data.isMember("pnacl-ld-name")) { | |
167 Json::Value json_name = json_data["pnacl-ld-name"]; | |
168 if (json_name.isString()) { | |
169 ld_tool_name_ = json_name.asString(); | |
170 PLUGIN_PRINTF(("Set ld_tool_name=%s\n", ld_tool_name_.c_str())); | |
171 } | |
172 } | |
173 return true; | |
174 } | |
175 | |
176 nacl::string PnaclResources::GetFullUrl( | 126 nacl::string PnaclResources::GetFullUrl( |
177 const nacl::string& partial_url, const nacl::string& sandbox_arch) const { | 127 const nacl::string& partial_url, const nacl::string& sandbox_arch) const { |
178 return PnaclUrls::GetBaseUrl() + sandbox_arch + "/" + partial_url; | 128 return PnaclUrls::GetBaseUrl() + sandbox_arch + "/" + partial_url; |
179 } | 129 } |
180 | 130 |
181 void PnaclResources::StartLoad( | 131 void PnaclResources::StartLoad( |
182 const pp::CompletionCallback& all_loaded_callback) { | 132 const pp::CompletionCallback& all_loaded_callback) { |
183 PLUGIN_PRINTF(("PnaclResources::StartLoad\n")); | 133 PLUGIN_PRINTF(("PnaclResources::StartLoad\n")); |
184 | 134 |
185 std::vector<nacl::string> resource_urls; | 135 std::vector<nacl::string> resource_urls; |
186 resource_urls.push_back(GetLlcUrl()); | 136 resource_urls.push_back(llc_tool_name_); |
187 resource_urls.push_back(GetLdUrl()); | 137 resource_urls.push_back(ld_tool_name_); |
188 | 138 |
189 PLUGIN_PRINTF(("PnaclResources::StartLoad -- local install of PNaCl.\n")); | 139 PLUGIN_PRINTF(("PnaclResources::StartLoad -- local install of PNaCl.\n")); |
190 // Do a blocking load of each of the resources. | 140 // Do a blocking load of each of the resources. |
191 int32_t result = PP_OK; | 141 int32_t result = PP_OK; |
192 for (size_t i = 0; i < resource_urls.size(); ++i) { | 142 for (size_t i = 0; i < resource_urls.size(); ++i) { |
193 nacl::string full_url = GetFullUrl( | 143 nacl::string full_url = GetFullUrl( |
194 resource_urls[i], plugin_->nacl_interface()->GetSandboxArch()); | 144 resource_urls[i], plugin_->nacl_interface()->GetSandboxArch()); |
195 nacl::string filename = PnaclUrls::PnaclComponentURLToFilename(full_url); | 145 nacl::string filename = PnaclUrls::PnaclComponentURLToFilename(full_url); |
196 | 146 |
197 int32_t fd = PnaclResources::GetPnaclFD(plugin_, filename.c_str()); | 147 int32_t fd = PnaclResources::GetPnaclFD(plugin_, filename.c_str()); |
(...skipping 12 matching lines...) Expand all Loading... |
210 resource_wrappers_[resource_urls[i]] = | 160 resource_wrappers_[resource_urls[i]] = |
211 plugin_->wrapper_factory()->MakeFileDesc(fd, O_RDONLY); | 161 plugin_->wrapper_factory()->MakeFileDesc(fd, O_RDONLY); |
212 } | 162 } |
213 } | 163 } |
214 // We're done! Queue the callback. | 164 // We're done! Queue the callback. |
215 pp::Core* core = pp::Module::Get()->core(); | 165 pp::Core* core = pp::Module::Get()->core(); |
216 core->CallOnMainThread(0, all_loaded_callback, result); | 166 core->CallOnMainThread(0, all_loaded_callback, result); |
217 } | 167 } |
218 | 168 |
219 } // namespace plugin | 169 } // namespace plugin |
OLD | NEW |