| Index: content/browser/download/download_request_core.h
|
| diff --git a/content/browser/download/download_request_core.h b/content/browser/download/download_request_core.h
|
| index c01fa98b8d2b7a6bedd09a3c854783e0ffcc6586..6982f04acdd02e5b2ac7d68de6b0c931b83e6fcf 100644
|
| --- a/content/browser/download/download_request_core.h
|
| +++ b/content/browser/download/download_request_core.h
|
| @@ -25,10 +25,13 @@ class DownloadManagerImpl;
|
| class ByteStreamReader;
|
| class ByteStreamWriter;
|
| class PowerSaveBlocker;
|
| -class UrlDownloader;
|
| struct DownloadCreateInfo;
|
|
|
| -// Forwards data to the download thread.
|
| +// This class encapsulates the core logic for reading data from a URLRequest and
|
| +// writing it into a ByteStream. It's common to both DownloadResourceHandler and
|
| +// UrlDownloader.
|
| +//
|
| +// Created, lives on and dies on the IO thread.
|
| class CONTENT_EXPORT DownloadRequestCore
|
| : public base::SupportsWeakPtr<DownloadRequestCore> {
|
| public:
|
| @@ -36,52 +39,68 @@ class CONTENT_EXPORT DownloadRequestCore
|
| // downstream receiver of its output.
|
| static const int kDownloadByteStreamSize;
|
|
|
| - // started_cb will be called exactly once on the UI thread.
|
| - // |id| should be invalid if the id should be automatically assigned.
|
| - DownloadRequestCore(
|
| - uint32 id,
|
| - net::URLRequest* request,
|
| - const DownloadUrlParameters::OnStartedCallback& started_cb,
|
| - scoped_ptr<DownloadSaveInfo> save_info,
|
| - base::WeakPtr<DownloadManagerImpl> download_manager);
|
| + // |request| *must* outlive the DownloadRequestCore. |save_info| must be
|
| + // valid.
|
| + //
|
| + // Invokes |on_ready_to_read_callback| if a previous call to OnReadCompleted()
|
| + // resulted in |defer| being set to true, and DownloadRequestCore is now ready
|
| + // to commence reading.
|
| + DownloadRequestCore(net::URLRequest* request,
|
| + scoped_ptr<DownloadSaveInfo> save_info,
|
| + const base::Closure& on_ready_to_read_callback);
|
| ~DownloadRequestCore();
|
|
|
| - // Send the download creation information to the download thread.
|
| - bool OnResponseStarted();
|
| -
|
| - // Create a new buffer, which will be handed to the download thread for file
|
| - // writing and deletion.
|
| + // Should be called when the URLRequest::Delegate receives OnResponseStarted.
|
| + // Constructs a DownloadCreateInfo and a ByteStreamReader that should be
|
| + // passed into DownloadManagerImpl::StartDownload().
|
| + //
|
| + // Only populates the response derived fields of DownloadCreateInfo, with the
|
| + // exception of |save_info|.
|
| + void OnResponseStarted(scoped_ptr<DownloadCreateInfo>* info,
|
| + scoped_ptr<ByteStreamReader>* stream_reader);
|
| +
|
| + // Starts a read cycle. Creates a new IOBuffer which can be passed into
|
| + // URLRequest::Read(). Call OnReadCompleted() when the Read operation
|
| + // completes.
|
| bool OnWillRead(scoped_refptr<net::IOBuffer>* buf,
|
| int* buf_size,
|
| int min_size);
|
|
|
| + // Should be called when the Read() operation completes. |defer| will be set
|
| + // to true if reading is to be suspended. In the latter case, once more data
|
| + // can be read, invokes the |on_ready_to_read_callback|.
|
| bool OnReadCompleted(int bytes_read, bool* defer);
|
|
|
| - void OnResponseCompleted(const net::URLRequestStatus& status);
|
| -
|
| + // Called to signal that the response is complete. If the return value is
|
| + // something other than DOWNLOAD_INTERRUPT_REASON_NONE, then the download
|
| + // should be considered interrupted.
|
| + //
|
| + // It is expected that once this method is invoked, the DownloadRequestCore
|
| + // object will be destroyed in short order without invoking any other methods
|
| + // other than the destructor.
|
| + DownloadInterruptReason OnResponseCompleted(
|
| + const net::URLRequestStatus& status);
|
| +
|
| + // Called if the request should suspend reading. A subsequent
|
| + // OnReadCompleted() will result in |defer| being set to true.
|
| + //
|
| + // Each PauseRequest() must be balanced with a call to ResumeRequest().
|
| void PauseRequest();
|
| +
|
| + // Balances a call to PauseRequest(). If no more pauses are outstanding and
|
| + // the reader end of the ByteStream is ready to receive more data,
|
| + // DownloadRequestCore will invoke the |on_ready_to_read_callback| to signal
|
| + // to the caller that the read cycles should commence.
|
| void ResumeRequest();
|
|
|
| std::string DebugString() const;
|
|
|
| - void set_downloader(UrlDownloader* downloader) { downloader_ = downloader; }
|
| -
|
| protected:
|
| net::URLRequest* request() const { return request_; }
|
|
|
| private:
|
| - // Arrange for started_cb_ to be called on the UI thread with the
|
| - // below values, nulling out started_cb_. Should only be called
|
| - // on the IO thread.
|
| - void CallStartedCB(DownloadItem* item,
|
| - DownloadInterruptReason interrupt_reason);
|
| -
|
| + base::Closure on_ready_to_read_callback_;
|
| net::URLRequest* request_;
|
| - uint32 download_id_;
|
| -
|
| - // This is read only on the IO thread, but may only
|
| - // be called on the UI thread.
|
| - DownloadUrlParameters::OnStartedCallback started_cb_;
|
| scoped_ptr<DownloadSaveInfo> save_info_;
|
|
|
| // Data flow
|
| @@ -104,16 +123,8 @@ class CONTENT_EXPORT DownloadRequestCore
|
| int pause_count_;
|
| bool was_deferred_;
|
|
|
| - // For DCHECKing
|
| - bool on_response_started_called_;
|
| -
|
| - UrlDownloader* downloader_;
|
| -
|
| - // DownloadManager passed in by the owner of DownloadRequestCore.
|
| - base::WeakPtr<DownloadManagerImpl> download_manager_;
|
| -
|
| + // Each successful OnWillRead will yield a buffer of this size.
|
| static const int kReadBufSize = 32768; // bytes
|
| - static const int kThrottleTimeMs = 200; // milliseconds
|
|
|
| DISALLOW_COPY_AND_ASSIGN(DownloadRequestCore);
|
| };
|
|
|