summaryrefslogtreecommitdiffstats
path: root/ppapi/native_client/src/trusted/plugin/plugin.cc
diff options
context:
space:
mode:
Diffstat (limited to 'ppapi/native_client/src/trusted/plugin/plugin.cc')
-rw-r--r--ppapi/native_client/src/trusted/plugin/plugin.cc111
1 files changed, 47 insertions, 64 deletions
diff --git a/ppapi/native_client/src/trusted/plugin/plugin.cc b/ppapi/native_client/src/trusted/plugin/plugin.cc
index 226cb59..b516879 100644
--- a/ppapi/native_client/src/trusted/plugin/plugin.cc
+++ b/ppapi/native_client/src/trusted/plugin/plugin.cc
@@ -53,6 +53,27 @@ const int64_t kSizeKBMin = 1;
const int64_t kSizeKBMax = 512*1024; // very large .nexe
const uint32_t kSizeKBBuckets = 100;
+// Converts a PP_FileHandle to a POSIX file descriptor.
+int32_t ConvertFileDescriptor(PP_FileHandle handle) {
+ PLUGIN_PRINTF(("ConvertFileDescriptor, handle=%d\n", handle));
+#if NACL_WINDOWS
+ int32_t file_desc = NACL_NO_FILE_DESC;
+ // On Windows, valid handles are 32 bit unsigned integers so this is safe.
+ file_desc = reinterpret_cast<intptr_t>(handle);
+ // Convert the Windows HANDLE from Pepper to a POSIX file descriptor.
+ int32_t posix_desc = _open_osfhandle(file_desc, _O_RDWR | _O_BINARY);
+ if (posix_desc == -1) {
+ // Close the Windows HANDLE if it can't be converted.
+ CloseHandle(reinterpret_cast<HANDLE>(file_desc));
+ return -1;
+ }
+ return posix_desc;
+#else
+ return handle;
+#endif
+}
+
+
} // namespace
void Plugin::ShutDownSubprocesses() {
@@ -338,14 +359,13 @@ Plugin::Plugin(PP_Instance pp_instance)
uses_nonsfi_mode_(false),
wrapper_factory_(NULL),
time_of_last_progress_event_(0),
- nexe_open_time_(-1),
manifest_id_(-1),
+ nexe_handle_(PP_kInvalidFileHandle),
nacl_interface_(NULL),
uma_interface_(this) {
PLUGIN_PRINTF(("Plugin::Plugin (this=%p, pp_instance=%"
NACL_PRId32 ")\n", static_cast<void*>(this), pp_instance));
callback_factory_.Initialize(this);
- nexe_downloader_.Initialize(this);
nacl_interface_ = GetNaClInterface();
CHECK(nacl_interface_ != NULL);
@@ -423,37 +443,14 @@ bool Plugin::HandleDocumentLoad(const pp::URLLoader& url_loader) {
}
void Plugin::NexeFileDidOpen(int32_t pp_error) {
- NaClFileInfo tmp_info(nexe_downloader_.GetFileInfo());
- NaClFileInfoAutoCloser info(&tmp_info);
-
- int64_t nexe_bytes_read = -1;
- if (pp_error == PP_OK && info.get_desc() != NACL_NO_FILE_DESC) {
- struct stat stat_buf;
- if (0 == fstat(info.get_desc(), &stat_buf))
- nexe_bytes_read = stat_buf.st_size;
- }
-
- int64_t now = NaClGetTimeOfDayMicroseconds();
- int64_t download_time;
- if (now < nexe_open_time_)
- download_time = 0;
- else
- download_time = now - nexe_open_time_;
-
- nacl_interface_->NexeFileDidOpen(
- pp_instance(),
- pp_error,
- info.get_desc(),
- nexe_downloader_.status_code(),
- nexe_bytes_read,
- nexe_downloader_.url().c_str(),
- download_time / 1000);
-
- if (nexe_bytes_read == -1)
+ if (pp_error != PP_OK)
return;
+ int32_t desc = ConvertFileDescriptor(nexe_handle_);
+ nexe_handle_ = PP_kInvalidFileHandle; // Clear out nexe handle.
+
nacl::scoped_ptr<nacl::DescWrapper>
- wrapper(wrapper_factory()->MakeFileDesc(info.Release().desc, O_RDONLY));
+ wrapper(wrapper_factory()->MakeFileDesc(desc, O_RDONLY));
NaClLog(4, "NexeFileDidOpen: invoking LoadNaClModule\n");
LoadNaClModule(
wrapper.release(),
@@ -556,36 +553,28 @@ void Plugin::ProcessNaClManifest(const nacl::string& manifest_json) {
PP_Bool uses_nonsfi_mode;
if (nacl_interface_->GetManifestProgramURL(pp_instance(),
manifest_id_, &pp_program_url, &pnacl_options, &uses_nonsfi_mode)) {
- std::string program_url = pp::Var(pp::PASS_REF, pp_program_url).AsString();
+ program_url_ = pp::Var(pp::PASS_REF, pp_program_url).AsString();
// TODO(teravest): Make ProcessNaClManifest take responsibility for more of
// this function.
- nacl_interface_->ProcessNaClManifest(pp_instance(), program_url.c_str());
+ nacl_interface_->ProcessNaClManifest(pp_instance(), program_url_.c_str());
uses_nonsfi_mode_ = PP_ToBool(uses_nonsfi_mode);
if (pnacl_options.translate) {
pp::CompletionCallback translate_callback =
callback_factory_.NewCallback(&Plugin::BitcodeDidTranslate);
pnacl_coordinator_.reset(
PnaclCoordinator::BitcodeToNative(this,
- program_url,
+ program_url_,
pnacl_options,
translate_callback));
return;
} else {
- nexe_open_time_ = NaClGetTimeOfDayMicroseconds();
- // Try the fast path first. This will only block if the file is installed.
- if (OpenURLFast(program_url, &nexe_downloader_)) {
- NexeFileDidOpen(PP_OK);
- } else {
- pp::CompletionCallback open_callback =
- callback_factory_.NewCallback(&Plugin::NexeFileDidOpen);
- // Will always call the callback on success or failure.
- CHECK(
- nexe_downloader_.Open(program_url,
- DOWNLOAD_TO_FILE,
- open_callback,
- true,
- &UpdateDownloadProgress));
- }
+ pp::CompletionCallback open_callback =
+ callback_factory_.NewCallback(&Plugin::NexeFileDidOpen);
+ // Will always call the callback on success or failure.
+ nacl_interface_->DownloadNexe(pp_instance(),
+ program_url_.c_str(),
+ &nexe_handle_,
+ open_callback.pp_completion_callback());
return;
}
}
@@ -693,9 +682,8 @@ bool Plugin::StreamAsFile(const nacl::string& url,
void Plugin::ReportLoadSuccess(uint64_t loaded_bytes, uint64_t total_bytes) {
- const nacl::string& url = nexe_downloader_.url();
nacl_interface_->ReportLoadSuccess(
- pp_instance(), url.c_str(), loaded_bytes, total_bytes);
+ pp_instance(), program_url_.c_str(), loaded_bytes, total_bytes);
}
@@ -731,10 +719,9 @@ void Plugin::UpdateDownloadProgress(
// Find the URL loader that sent this notification.
const FileDownloader* file_downloader =
plugin->FindFileDownloader(pp_resource);
- // If not a streamed file, it must be the .nexe loader.
- if (file_downloader == NULL)
- file_downloader = &plugin->nexe_downloader_;
- nacl::string url = file_downloader->url();
+ nacl::string url;
+ if (file_downloader)
+ url = file_downloader->url();
LengthComputable length_computable = (total_bytes_to_be_received >= 0) ?
LENGTH_IS_COMPUTABLE : LENGTH_IS_NOT_COMPUTABLE;
@@ -750,17 +737,13 @@ void Plugin::UpdateDownloadProgress(
const FileDownloader* Plugin::FindFileDownloader(
PP_Resource url_loader) const {
const FileDownloader* file_downloader = NULL;
- if (url_loader == nexe_downloader_.url_loader()) {
- file_downloader = &nexe_downloader_;
- } else {
- std::set<FileDownloader*>::const_iterator it = url_downloaders_.begin();
- while (it != url_downloaders_.end()) {
- if (url_loader == (*it)->url_loader()) {
- file_downloader = (*it);
- break;
- }
- ++it;
+ std::set<FileDownloader*>::const_iterator it = url_downloaders_.begin();
+ while (it != url_downloaders_.end()) {
+ if (url_loader == (*it)->url_loader()) {
+ file_downloader = (*it);
+ break;
}
+ ++it;
}
return file_downloader;
}