| Index: ppapi/native_client/src/trusted/plugin/file_downloader.cc
|
| diff --git a/ppapi/native_client/src/trusted/plugin/file_downloader.cc b/ppapi/native_client/src/trusted/plugin/file_downloader.cc
|
| index 4a1b6ad16effbd5d7706cd13ab0d5635da4f565a..7c6c045a5af13f42ed2db46a1778e2d7372cb689 100644
|
| --- a/ppapi/native_client/src/trusted/plugin/file_downloader.cc
|
| +++ b/ppapi/native_client/src/trusted/plugin/file_downloader.cc
|
| @@ -12,60 +12,14 @@
|
| #include "native_client/src/shared/platform/nacl_check.h"
|
| #include "native_client/src/shared/platform/nacl_time.h"
|
| #include "ppapi/c/pp_errors.h"
|
| -#include "ppapi/c/ppb_file_io.h"
|
| -#include "ppapi/cpp/file_io.h"
|
| -#include "ppapi/cpp/file_ref.h"
|
| #include "ppapi/cpp/url_request_info.h"
|
| #include "ppapi/cpp/url_response_info.h"
|
| #include "ppapi/native_client/src/trusted/plugin/callback_source.h"
|
| #include "ppapi/native_client/src/trusted/plugin/plugin.h"
|
| #include "ppapi/native_client/src/trusted/plugin/utility.h"
|
|
|
| -namespace {
|
| -
|
| -struct NaClFileInfo NoFileInfo() {
|
| - struct NaClFileInfo info;
|
| - memset(&info, 0, sizeof(info));
|
| - info.desc = -1;
|
| - return info;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| namespace plugin {
|
|
|
| -NaClFileInfoAutoCloser::NaClFileInfoAutoCloser()
|
| - : info_(NoFileInfo()) {}
|
| -
|
| -NaClFileInfoAutoCloser::NaClFileInfoAutoCloser(NaClFileInfo* pass_ownership)
|
| - : info_(*pass_ownership) {
|
| - *pass_ownership = NoFileInfo();
|
| -}
|
| -
|
| -void NaClFileInfoAutoCloser::FreeResources() {
|
| - if (-1 != get_desc()) {
|
| - PLUGIN_PRINTF(("NaClFileInfoAutoCloser::FreeResources close(%d)\n",
|
| - get_desc()));
|
| - close(get_desc());
|
| - }
|
| - info_.desc = -1;
|
| -}
|
| -
|
| -void NaClFileInfoAutoCloser::TakeOwnership(NaClFileInfo* pass_ownership) {
|
| - PLUGIN_PRINTF(("NaClFileInfoAutoCloser::set: taking ownership of %d\n",
|
| - pass_ownership->desc));
|
| - CHECK(pass_ownership->desc == -1 || pass_ownership->desc != get_desc());
|
| - FreeResources();
|
| - info_ = *pass_ownership;
|
| - *pass_ownership = NoFileInfo();
|
| -}
|
| -
|
| -NaClFileInfo NaClFileInfoAutoCloser::Release() {
|
| - NaClFileInfo info_to_return = info_;
|
| - info_ = NoFileInfo();
|
| - return info_to_return;
|
| -}
|
| -
|
| void FileDownloader::Initialize(Plugin* instance) {
|
| PLUGIN_PRINTF(("FileDownloader::FileDownloader (this=%p)\n",
|
| static_cast<void*>(this)));
|
| @@ -73,12 +27,7 @@ void FileDownloader::Initialize(Plugin* instance) {
|
| CHECK(instance_ == NULL); // Can only initialize once.
|
| instance_ = instance;
|
| callback_factory_.Initialize(this);
|
| - file_io_private_interface_ = static_cast<const PPB_FileIO_Private*>(
|
| - pp::Module::Get()->GetBrowserInterface(PPB_FILEIO_PRIVATE_INTERFACE));
|
| - url_loader_trusted_interface_ = static_cast<const PPB_URLLoaderTrusted*>(
|
| - pp::Module::Get()->GetBrowserInterface(PPB_URLLOADERTRUSTED_INTERFACE));
|
| temp_buffer_.resize(kTempBufferSize);
|
| - file_info_.FreeResources();
|
| }
|
|
|
| bool FileDownloader::OpenStream(
|
| @@ -86,27 +35,14 @@ bool FileDownloader::OpenStream(
|
| const pp::CompletionCallback& callback,
|
| StreamCallbackSource* stream_callback_source) {
|
| data_stream_callback_source_ = stream_callback_source;
|
| - return Open(url, DOWNLOAD_TO_BUFFER_AND_STREAM, callback, true, NULL);
|
| -}
|
| -
|
| -bool FileDownloader::Open(
|
| - const nacl::string& url,
|
| - DownloadMode mode,
|
| - const pp::CompletionCallback& callback,
|
| - bool record_progress,
|
| - PP_URLLoaderTrusted_StatusCallback progress_callback) {
|
| PLUGIN_PRINTF(("FileDownloader::Open (url=%s)\n", url.c_str()));
|
| - if (callback.pp_completion_callback().func == NULL ||
|
| - instance_ == NULL ||
|
| - file_io_private_interface_ == NULL)
|
| + if (callback.pp_completion_callback().func == NULL || instance_ == NULL)
|
| return false;
|
|
|
| - CHECK(instance_ != NULL);
|
| status_code_ = -1;
|
| url_ = url;
|
| file_open_notify_callback_ = callback;
|
| - mode_ = mode;
|
| - file_info_.FreeResources();
|
| + mode_ = DOWNLOAD_TO_BUFFER_AND_STREAM;
|
| pp::URLRequestInfo url_request(instance_);
|
|
|
| // Allow CORS.
|
| @@ -124,24 +60,11 @@ bool FileDownloader::Open(
|
| // Note that we have the only reference to the underlying objects, so
|
| // this will implicitly close any pending IO and destroy them.
|
| url_loader_ = pp::URLLoader(instance_);
|
| -
|
| - url_request.SetRecordDownloadProgress(record_progress);
|
| -
|
| - if (url_loader_trusted_interface_ != NULL) {
|
| - if (progress_callback != NULL) {
|
| - url_loader_trusted_interface_->RegisterStatusCallback(
|
| - url_loader_.pp_resource(), progress_callback);
|
| - }
|
| - }
|
| + url_request.SetRecordDownloadProgress(true);
|
|
|
| // Prepare the url request.
|
| url_request.SetURL(url_);
|
|
|
| - if (mode_ == DOWNLOAD_TO_FILE) {
|
| - file_reader_ = pp::FileIO(instance_);
|
| - url_request.SetStreamToFile(true);
|
| - }
|
| -
|
| // Request asynchronous download of the url providing an on-load callback.
|
| // As long as this step is guaranteed to be asynchronous, we can call
|
| // synchronously all other internal callbacks that eventually result in the
|
| @@ -191,11 +114,6 @@ void FileDownloader::URLLoadStartNotify(int32_t pp_error) {
|
| return;
|
| }
|
|
|
| - if (mode_ != DOWNLOAD_TO_BUFFER_AND_STREAM) {
|
| - FinishStreaming(file_open_notify_callback_);
|
| - return;
|
| - }
|
| -
|
| file_open_notify_callback_.RunAndClear(PP_OK);
|
| }
|
|
|
| @@ -204,81 +122,15 @@ void FileDownloader::FinishStreaming(
|
| stream_finish_callback_ = callback;
|
|
|
| // Finish streaming the body providing an optional callback.
|
| - if (mode_ == DOWNLOAD_TO_FILE) {
|
| - pp::CompletionCallback onload_callback =
|
| - callback_factory_.NewOptionalCallback(
|
| - &FileDownloader::URLLoadFinishNotify);
|
| - int32_t pp_error = url_loader_.FinishStreamingToFile(onload_callback);
|
| - bool async_notify_ok = (pp_error == PP_OK_COMPLETIONPENDING);
|
| - PLUGIN_PRINTF(("FileDownloader::FinishStreaming (async_notify_ok=%d)\n",
|
| - async_notify_ok));
|
| - if (!async_notify_ok) {
|
| - // Call manually to free allocated memory and report errors. This calls
|
| - // |stream_finish_callback_| with |pp_error| as the parameter.
|
| - onload_callback.RunAndClear(pp_error);
|
| - }
|
| - } else {
|
| - pp::CompletionCallback onread_callback =
|
| - callback_factory_.NewOptionalCallback(
|
| - &FileDownloader::URLReadBodyNotify);
|
| - int32_t temp_size = static_cast<int32_t>(temp_buffer_.size());
|
| - int32_t pp_error = url_loader_.ReadResponseBody(&temp_buffer_[0],
|
| - temp_size,
|
| - onread_callback);
|
| - bool async_notify_ok = (pp_error == PP_OK_COMPLETIONPENDING);
|
| - PLUGIN_PRINTF((
|
| - "FileDownloader::FinishStreaming (async_notify_ok=%d)\n",
|
| - async_notify_ok));
|
| - if (!async_notify_ok) {
|
| - onread_callback.RunAndClear(pp_error);
|
| - }
|
| - }
|
| -}
|
| -
|
| -void FileDownloader::URLLoadFinishNotify(int32_t pp_error) {
|
| - PLUGIN_PRINTF(("FileDownloader::URLLoadFinishNotify (pp_error=%"
|
| - NACL_PRId32")\n", pp_error));
|
| - if (pp_error != PP_OK) { // Streaming failed.
|
| - stream_finish_callback_.RunAndClear(pp_error);
|
| - return;
|
| - }
|
| -
|
| - // Validate response again on load (though it should be the same
|
| - // as it was during InitialResponseIsValid?).
|
| - url_response_ = url_loader_.GetResponseInfo();
|
| - CHECK(url_response_.GetStatusCode() == NACL_HTTP_STATUS_OK);
|
| -
|
| - // Record the full url from the response.
|
| - pp::Var full_url = url_response_.GetURL();
|
| - PLUGIN_PRINTF(("FileDownloader::URLLoadFinishNotify (full_url=%s)\n",
|
| - full_url.DebugString().c_str()));
|
| - if (!full_url.is_string()) {
|
| - stream_finish_callback_.RunAndClear(PP_ERROR_FAILED);
|
| - return;
|
| - }
|
| - full_url_ = full_url.AsString();
|
| -
|
| - // The file is now fully downloaded.
|
| - pp::FileRef file(url_response_.GetBodyAsFileRef());
|
| - if (file.is_null()) {
|
| - PLUGIN_PRINTF(("FileDownloader::URLLoadFinishNotify (file=NULL)\n"));
|
| - stream_finish_callback_.RunAndClear(PP_ERROR_FAILED);
|
| - return;
|
| - }
|
| -
|
| - // Open the file providing an optional callback.
|
| - pp::CompletionCallback onopen_callback =
|
| + pp::CompletionCallback onread_callback =
|
| callback_factory_.NewOptionalCallback(
|
| - &FileDownloader::StreamFinishNotify);
|
| - pp_error = file_reader_.Open(file, PP_FILEOPENFLAG_READ, onopen_callback);
|
| - bool async_notify_ok = (pp_error == PP_OK_COMPLETIONPENDING);
|
| - PLUGIN_PRINTF(("FileDownloader::URLLoadFinishNotify (async_notify_ok=%d)\n",
|
| - async_notify_ok));
|
| - if (!async_notify_ok) {
|
| - // Call manually to free allocated memory and report errors. This calls
|
| - // |stream_finish_callback_| with |pp_error| as the parameter.
|
| - onopen_callback.RunAndClear(pp_error);
|
| - }
|
| + &FileDownloader::URLReadBodyNotify);
|
| + int32_t temp_size = static_cast<int32_t>(temp_buffer_.size());
|
| + int32_t pp_error = url_loader_.ReadResponseBody(&temp_buffer_[0],
|
| + temp_size,
|
| + onread_callback);
|
| + if (pp_error != PP_OK_COMPLETIONPENDING)
|
| + onread_callback.RunAndClear(pp_error);
|
| }
|
|
|
| void FileDownloader::URLReadBodyNotify(int32_t pp_error) {
|
| @@ -287,18 +139,15 @@ void FileDownloader::URLReadBodyNotify(int32_t pp_error) {
|
| if (pp_error < PP_OK) {
|
| stream_finish_callback_.RunAndClear(pp_error);
|
| } else if (pp_error == PP_OK) {
|
| - if (mode_ == DOWNLOAD_TO_BUFFER_AND_STREAM) {
|
| - data_stream_callback_source_->GetCallback().RunAndClear(PP_OK);
|
| - }
|
| - StreamFinishNotify(PP_OK);
|
| + data_stream_callback_source_->GetCallback().RunAndClear(PP_OK);
|
| + stream_finish_callback_.RunAndClear(PP_OK);
|
| } else {
|
| - if (mode_ == DOWNLOAD_TO_BUFFER_AND_STREAM) {
|
| - PLUGIN_PRINTF(("Running data_stream_callback, temp_buffer_=%p\n",
|
| - &temp_buffer_[0]));
|
| - StreamCallback cb = data_stream_callback_source_->GetCallback();
|
| - *(cb.output()) = &temp_buffer_;
|
| - cb.RunAndClear(pp_error);
|
| - }
|
| + PLUGIN_PRINTF(("Running data_stream_callback, temp_buffer_=%p\n",
|
| + &temp_buffer_[0]));
|
| + StreamCallback cb = data_stream_callback_source_->GetCallback();
|
| + *(cb.output()) = &temp_buffer_;
|
| + cb.RunAndClear(pp_error);
|
| +
|
| pp::CompletionCallback onread_callback =
|
| callback_factory_.NewOptionalCallback(
|
| &FileDownloader::URLReadBodyNotify);
|
| @@ -306,10 +155,8 @@ void FileDownloader::URLReadBodyNotify(int32_t pp_error) {
|
| pp_error = url_loader_.ReadResponseBody(&temp_buffer_[0],
|
| temp_size,
|
| onread_callback);
|
| - bool async_notify_ok = (pp_error == PP_OK_COMPLETIONPENDING);
|
| - if (!async_notify_ok) {
|
| + if (pp_error != PP_OK_COMPLETIONPENDING)
|
| onread_callback.RunAndClear(pp_error);
|
| - }
|
| }
|
| }
|
|
|
| @@ -330,37 +177,4 @@ nacl::string FileDownloader::GetResponseHeaders() const {
|
| return headers.AsString();
|
| }
|
|
|
| -void FileDownloader::StreamFinishNotify(int32_t pp_error) {
|
| - PLUGIN_PRINTF((
|
| - "FileDownloader::StreamFinishNotify (pp_error=%" NACL_PRId32 ")\n",
|
| - pp_error));
|
| -
|
| - // Run the callback if we have an error, or if we don't have a file_reader_
|
| - // to get a file handle for.
|
| - if (pp_error != PP_OK || file_reader_.pp_resource() == 0) {
|
| - stream_finish_callback_.RunAndClear(pp_error);
|
| - return;
|
| - }
|
| -
|
| - pp::CompletionCallbackWithOutput<PP_FileHandle> cb =
|
| - callback_factory_.NewCallbackWithOutput(
|
| - &FileDownloader::GotFileHandleNotify);
|
| - file_io_private_interface_->RequestOSFileHandle(
|
| - file_reader_.pp_resource(), cb.output(), cb.pp_completion_callback());
|
| -}
|
| -
|
| -void FileDownloader::GotFileHandleNotify(int32_t pp_error,
|
| - PP_FileHandle handle) {
|
| - PLUGIN_PRINTF((
|
| - "FileDownloader::GotFileHandleNotify (pp_error=%" NACL_PRId32 ")\n",
|
| - pp_error));
|
| - if (pp_error == PP_OK) {
|
| - NaClFileInfo tmp_info = NoFileInfo();
|
| - tmp_info.desc = ConvertFileDescriptor(handle, false);
|
| - file_info_.TakeOwnership(&tmp_info);
|
| - }
|
| -
|
| - stream_finish_callback_.RunAndClear(pp_error);
|
| -}
|
| -
|
| } // namespace plugin
|
|
|