Index: ppapi/native_client/src/trusted/plugin/file_downloader.h |
diff --git a/ppapi/native_client/src/trusted/plugin/file_downloader.h b/ppapi/native_client/src/trusted/plugin/file_downloader.h |
index 7d87930f39af8d471ae7b00c48eb8a708e6a7a98..f72e7179a831b6e0eadfb710bd26cec59c065680 100644 |
--- a/ppapi/native_client/src/trusted/plugin/file_downloader.h |
+++ b/ppapi/native_client/src/trusted/plugin/file_downloader.h |
@@ -15,8 +15,9 @@ |
#include "ppapi/c/trusted/ppb_file_io_trusted.h" |
#include "ppapi/c/trusted/ppb_url_loader_trusted.h" |
#include "ppapi/cpp/file_io.h" |
-#include "ppapi/cpp/url_loader.h" |
#include "ppapi/cpp/instance.h" |
+#include "ppapi/cpp/url_loader.h" |
+#include "ppapi/cpp/url_response_info.h" |
#include "ppapi/utility/completion_callback_factory.h" |
namespace plugin { |
@@ -49,11 +50,13 @@ class FileDownloader { |
FileDownloader() |
: instance_(NULL), |
file_open_notify_callback_(pp::BlockUntilComplete()), |
+ stream_finish_callback_(pp::BlockUntilComplete()), |
file_handle_(PP_kInvalidFileHandle), |
file_io_trusted_interface_(NULL), |
url_loader_trusted_interface_(NULL), |
open_time_(-1), |
mode_(DOWNLOAD_NONE), |
+ open_and_stream_(true), |
url_scheme_(SCHEME_OTHER), |
data_stream_callback_source_(NULL) {} |
~FileDownloader() {} |
@@ -61,8 +64,9 @@ class FileDownloader { |
// Initialize() can only be called once during the lifetime of this instance. |
void Initialize(Plugin* instance); |
- // Issues a GET on |url| downloading the response into a file. The file is |
- // then opened and a file descriptor is made available. |
+ // Issues a GET on |url| to start downloading the response into a file, |
+ // and finish streaming it. |callback| will be run after streaming is |
+ // done or if an error prevents streaming from completing. |
// Returns true when callback is scheduled to be called on success or failure. |
// Returns false if callback is NULL, Initialize() has not been called or if |
// the PPB_FileIO_Trusted interface is not available. |
@@ -77,14 +81,22 @@ class FileDownloader { |
bool record_progress, |
PP_URLLoaderTrusted_StatusCallback progress_callback); |
- // Same as Open, but used for streaming the file data directly to the |
- // caller without buffering it. The callbacks provided by |
+ // Similar to Open(), but used for streaming the |url| data directly to the |
+ // caller without writing to a temporary file. The callbacks provided by |
// |stream_callback_source| are expected to copy the data before returning. |
- // |callback| will still be called when the stream is finished. |
+ // |callback| is called once the response headers are received, |
+ // and streaming must be completed separately via FinishStreaming(). |
bool OpenStream(const nacl::string& url, |
const pp::CompletionCallback& callback, |
StreamCallbackSource* stream_callback_source); |
+ // Finish streaming the response body for a URL request started by either |
+ // Open() or OpenStream(). If DownloadMode is DOWNLOAD_TO_FILE, |
+ // then the response body is streamed to a file, the file is opened and |
+ // a file descriptor is made available. Runs the given |callback| when |
+ // streaming is done. |
+ void FinishStreaming(const pp::CompletionCallback& callback); |
+ |
// Bypasses downloading and takes a handle to the open file. To get the fd, |
// call GetFileInfo(). |
void OpenFast(const nacl::string& url, PP_FileHandle file_handle, |
@@ -135,6 +147,7 @@ class FileDownloader { |
bool not_streaming() const; |
int status_code() const { return status_code_; } |
+ nacl::string GetResponseHeaders() const; |
private: |
NACL_DISALLOW_COPY_AND_ASSIGN(FileDownloader); |
@@ -150,17 +163,21 @@ class FileDownloader { |
// through a factory to take advantage of ref-counting. |
// DOWNLOAD_STREAM is similar to DOWNLOAD_TO_BUFFER except the downloaded |
// data is passed directly to the user instead of saved in a buffer. |
+ // The public Open*() functions start step 1), and the public FinishStreaming |
+ // function proceeds to step 2) and 3). |
bool InitialResponseIsValid(int32_t pp_error); |
void URLLoadStartNotify(int32_t pp_error); |
void URLLoadFinishNotify(int32_t pp_error); |
void URLBufferStartNotify(int32_t pp_error); |
void URLReadBodyNotify(int32_t pp_error); |
- void FileOpenNotify(int32_t pp_error); |
+ void StreamFinishNotify(int32_t pp_error); |
Plugin* instance_; |
nacl::string url_to_open_; |
nacl::string url_; |
+ pp::URLResponseInfo url_response_; |
pp::CompletionCallback file_open_notify_callback_; |
+ pp::CompletionCallback stream_finish_callback_; |
pp::FileIO file_reader_; |
PP_FileHandle file_handle_; |
struct NaClFileToken file_token_; |
@@ -171,6 +188,7 @@ class FileDownloader { |
int64_t open_time_; |
int32_t status_code_; |
DownloadMode mode_; |
+ bool open_and_stream_; |
static const uint32_t kTempBufferSize = 2048; |
std::vector<char> temp_buffer_; |
std::deque<char> buffer_; |