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 3 // found in the LICENSE file. 4 5 #ifndef CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_RESOURCE_HANDLER_H_ 6 #define CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_RESOURCE_HANDLER_H_ 7 8 #include <string> 9 10 #include "base/callback.h" 11 #include "base/memory/scoped_ptr.h" 12 #include "base/timer/timer.h" 13 #include "content/browser/loader/resource_handler.h" 14 #include "content/public/browser/download_interrupt_reasons.h" 15 #include "content/public/browser/download_manager.h" 16 #include "content/public/browser/download_save_info.h" 17 #include "content/public/browser/download_url_parameters.h" 18 19 namespace net { 20 class URLRequest; 21 } // namespace net 22 23 namespace content { 24 class ByteStreamReader; 25 class ByteStreamWriter; 26 class DownloadRequestHandle; 27 class PowerSaveBlocker; 28 struct DownloadCreateInfo; 29 30 // Forwards data to the download thread. 31 class CONTENT_EXPORT DownloadResourceHandler 32 : public ResourceHandler, 33 public base::SupportsWeakPtr<DownloadResourceHandler> { 34 public: 35 struct DownloadTabInfo; 36 37 // Size of the buffer used between the DownloadResourceHandler and the 38 // downstream receiver of its output. 39 static const int kDownloadByteStreamSize; 40 41 // started_cb will be called exactly once on the UI thread. 42 // |id| should be invalid if the id should be automatically assigned. 43 DownloadResourceHandler( 44 uint32 id, 45 net::URLRequest* request, 46 const DownloadUrlParameters::OnStartedCallback& started_cb, 47 scoped_ptr<DownloadSaveInfo> save_info); 48 49 virtual bool OnUploadProgress(uint64 position, uint64 size) OVERRIDE; 50 51 virtual bool OnRequestRedirected(const net::RedirectInfo& redirect_info, 52 ResourceResponse* response, 53 bool* defer) OVERRIDE; 54 55 // Send the download creation information to the download thread. 56 virtual bool OnResponseStarted(ResourceResponse* response, 57 bool* defer) OVERRIDE; 58 59 // Pass-through implementation. 60 virtual bool OnWillStart(const GURL& url, bool* defer) OVERRIDE; 61 62 // Pass-through implementation. 63 virtual bool OnBeforeNetworkStart(const GURL& url, bool* defer) OVERRIDE; 64 65 // Create a new buffer, which will be handed to the download thread for file 66 // writing and deletion. 67 virtual bool OnWillRead(scoped_refptr<net::IOBuffer>* buf, 68 int* buf_size, 69 int min_size) OVERRIDE; 70 71 virtual bool OnReadCompleted(int bytes_read, bool* defer) OVERRIDE; 72 73 virtual void OnResponseCompleted(const net::URLRequestStatus& status, 74 const std::string& security_info, 75 bool* defer) OVERRIDE; 76 77 // N/A to this flavor of DownloadHandler. 78 virtual void OnDataDownloaded(int bytes_downloaded) OVERRIDE; 79 80 void PauseRequest(); 81 void ResumeRequest(); 82 83 // May result in this object being deleted by its owner. 84 void CancelRequest(); 85 86 std::string DebugString() const; 87 88 private: 89 virtual ~DownloadResourceHandler(); 90 91 // Arrange for started_cb_ to be called on the UI thread with the 92 // below values, nulling out started_cb_. Should only be called 93 // on the IO thread. 94 void CallStartedCB(DownloadItem* item, 95 DownloadInterruptReason interrupt_reason); 96 97 uint32 download_id_; 98 // This is read only on the IO thread, but may only 99 // be called on the UI thread. 100 DownloadUrlParameters::OnStartedCallback started_cb_; 101 scoped_ptr<DownloadSaveInfo> save_info_; 102 103 // Stores information about the download that must be acquired on the UI 104 // thread before StartOnUIThread is called. 105 // Created on IO thread, but only accessed on UI thread. |tab_info_| holds 106 // the pointer until we pass it off to StartOnUIThread or DeleteSoon. 107 DownloadTabInfo* tab_info_; 108 109 // Data flow 110 scoped_refptr<net::IOBuffer> read_buffer_; // From URLRequest. 111 scoped_ptr<ByteStreamWriter> stream_writer_; // To rest of system. 112 113 // Keeps the system from sleeping while this ResourceHandler is alive. If the 114 // system enters power saving mode while a request is alive, it can cause the 115 // request to fail and the associated download will be interrupted. 116 scoped_ptr<PowerSaveBlocker> power_save_blocker_; 117 118 // The following are used to collect stats. 119 base::TimeTicks download_start_time_; 120 base::TimeTicks last_read_time_; 121 base::TimeTicks last_stream_pause_time_; 122 base::TimeDelta total_pause_time_; 123 size_t last_buffer_size_; 124 int64 bytes_read_; 125 126 int pause_count_; 127 bool was_deferred_; 128 129 // For DCHECKing 130 bool on_response_started_called_; 131 132 static const int kReadBufSize = 32768; // bytes 133 static const int kThrottleTimeMs = 200; // milliseconds 134 135 DISALLOW_COPY_AND_ASSIGN(DownloadResourceHandler); 136 }; 137 138 } // namespace content 139 140 #endif // CONTENT_BROWSER_DOWNLOAD_DOWNLOAD_RESOURCE_HANDLER_H_ 141