OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 // | 4 // |
5 // Objects that handle file operations for downloads, on the download thread. | 5 // Objects that handle file operations for downloads, on the download thread. |
6 // | 6 // |
7 // The DownloadFileManager owns a set of DownloadFile objects, each of which | 7 // The DownloadFileManager owns a set of DownloadFile objects, each of which |
8 // represent one in progress download and performs the disk IO for that | 8 // represent one in progress download and performs the disk IO for that |
9 // download. The DownloadFileManager itself is a singleton object owned by the | 9 // download. The DownloadFileManager itself is a singleton object owned by the |
10 // ResourceDispatcherHost. | 10 // ResourceDispatcherHost. |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
53 #include "base/ref_counted.h" | 53 #include "base/ref_counted.h" |
54 #include "base/timer.h" | 54 #include "base/timer.h" |
55 #include "chrome/browser/power_save_blocker.h" | 55 #include "chrome/browser/power_save_blocker.h" |
56 #include "googleurl/src/gurl.h" | 56 #include "googleurl/src/gurl.h" |
57 | 57 |
58 namespace net { | 58 namespace net { |
59 class IOBuffer; | 59 class IOBuffer; |
60 } | 60 } |
61 struct DownloadCreateInfo; | 61 struct DownloadCreateInfo; |
62 class DownloadManager; | 62 class DownloadManager; |
63 class MessageLoop; | |
64 class ResourceDispatcherHost; | 63 class ResourceDispatcherHost; |
65 class URLRequestContextGetter; | 64 class URLRequestContextGetter; |
66 | 65 |
67 // DownloadBuffer -------------------------------------------------------------- | 66 // DownloadBuffer -------------------------------------------------------------- |
68 | 67 |
69 // This container is created and populated on the io_thread, and passed to the | 68 // This container is created and populated on the io_thread, and passed to the |
70 // file_thread for writing. In order to avoid flooding the file_thread with too | 69 // file_thread for writing. In order to avoid flooding the file_thread with too |
71 // many small write messages, each write is appended to the DownloadBuffer while | 70 // many small write messages, each write is appended to the DownloadBuffer while |
72 // waiting for the task to run on the file_thread. Access to the write buffers | 71 // waiting for the task to run on the file_thread. Access to the write buffers |
73 // is synchronized via the lock. Each entry in 'contents' represents one data | 72 // is synchronized via the lock. Each entry in 'contents' represents one data |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
161 DISALLOW_COPY_AND_ASSIGN(DownloadFile); | 160 DISALLOW_COPY_AND_ASSIGN(DownloadFile); |
162 }; | 161 }; |
163 | 162 |
164 | 163 |
165 // DownloadFileManager --------------------------------------------------------- | 164 // DownloadFileManager --------------------------------------------------------- |
166 | 165 |
167 // Manages all in progress downloads. | 166 // Manages all in progress downloads. |
168 class DownloadFileManager | 167 class DownloadFileManager |
169 : public base::RefCountedThreadSafe<DownloadFileManager> { | 168 : public base::RefCountedThreadSafe<DownloadFileManager> { |
170 public: | 169 public: |
171 DownloadFileManager(MessageLoop* ui_loop, ResourceDispatcherHost* rdh); | 170 DownloadFileManager(ResourceDispatcherHost* rdh); |
172 ~DownloadFileManager(); | 171 ~DownloadFileManager(); |
173 | 172 |
174 // Lifetime management functions, called on the UI thread. | 173 // Called on shutdown on the UI thread. |
175 void Initialize(); | |
176 void Shutdown(); | 174 void Shutdown(); |
177 | 175 |
178 // Called on the IO thread | 176 // Called on the IO thread |
179 int GetNextId(); | 177 int GetNextId(); |
180 | 178 |
181 // Handlers for notifications sent from the IO thread and run on the | 179 // Handlers for notifications sent from the IO thread and run on the |
182 // download thread. | 180 // download thread. |
183 void StartDownload(DownloadCreateInfo* info); | 181 void StartDownload(DownloadCreateInfo* info); |
184 void UpdateDownload(int id, DownloadBuffer* buffer); | 182 void UpdateDownload(int id, DownloadBuffer* buffer); |
185 void CancelDownload(int id); | 183 void CancelDownload(int id); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
225 #endif | 223 #endif |
226 | 224 |
227 // The download manager has provided a final name for a download. Sent from | 225 // The download manager has provided a final name for a download. Sent from |
228 // the UI thread and run on the download thread. | 226 // the UI thread and run on the download thread. |
229 void OnFinalDownloadName(int id, const FilePath& full_path, | 227 void OnFinalDownloadName(int id, const FilePath& full_path, |
230 DownloadManager* download_manager); | 228 DownloadManager* download_manager); |
231 | 229 |
232 // Timer notifications. | 230 // Timer notifications. |
233 void UpdateInProgressDownloads(); | 231 void UpdateInProgressDownloads(); |
234 | 232 |
235 MessageLoop* file_loop() const { return file_loop_; } | |
236 | |
237 // Called by the download manager to delete non validated dangerous downloads. | 233 // Called by the download manager to delete non validated dangerous downloads. |
238 static void DeleteFile(const FilePath& path); | 234 static void DeleteFile(const FilePath& path); |
239 | 235 |
240 private: | 236 private: |
241 // Timer helpers for updating the UI about the current progress of a download. | 237 // Timer helpers for updating the UI about the current progress of a download. |
242 void StartUpdateTimer(); | 238 void StartUpdateTimer(); |
243 void StopUpdateTimer(); | 239 void StopUpdateTimer(); |
244 | 240 |
245 // Clean up helper that runs on the download thread. | 241 // Clean up helper that runs on the download thread. |
246 void OnShutdown(); | 242 void OnShutdown(); |
(...skipping 12 matching lines...) Expand all Loading... |
259 // Unique ID for each DownloadFile. | 255 // Unique ID for each DownloadFile. |
260 int next_id_; | 256 int next_id_; |
261 | 257 |
262 // A map of all in progress downloads. | 258 // A map of all in progress downloads. |
263 typedef base::hash_map<int, DownloadFile*> DownloadFileMap; | 259 typedef base::hash_map<int, DownloadFile*> DownloadFileMap; |
264 DownloadFileMap downloads_; | 260 DownloadFileMap downloads_; |
265 | 261 |
266 // Throttle updates to the UI thread. | 262 // Throttle updates to the UI thread. |
267 base::RepeatingTimer<DownloadFileManager> update_timer_; | 263 base::RepeatingTimer<DownloadFileManager> update_timer_; |
268 | 264 |
269 // The MessageLoop that the DownloadManagers live on. | |
270 MessageLoop* ui_loop_; | |
271 | |
272 // The MessageLoop that the this objects primarily operates on. | |
273 MessageLoop* file_loop_; | |
274 | |
275 // Used only for DCHECKs! | |
276 MessageLoop* io_loop_; | |
277 | |
278 ResourceDispatcherHost* resource_dispatcher_host_; | 265 ResourceDispatcherHost* resource_dispatcher_host_; |
279 | 266 |
280 // Tracking which DownloadManager to send data to, called only on UI thread. | 267 // Tracking which DownloadManager to send data to, called only on UI thread. |
281 // DownloadManagerMap maps download IDs to their DownloadManager. | 268 // DownloadManagerMap maps download IDs to their DownloadManager. |
282 typedef base::hash_map<int, DownloadManager*> DownloadManagerMap; | 269 typedef base::hash_map<int, DownloadManager*> DownloadManagerMap; |
283 DownloadManagerMap managers_; | 270 DownloadManagerMap managers_; |
284 | 271 |
285 // RequestMap maps a DownloadManager to all in-progress download IDs. | 272 // RequestMap maps a DownloadManager to all in-progress download IDs. |
286 // Called only on the UI thread. | 273 // Called only on the UI thread. |
287 typedef base::hash_set<int> DownloadRequests; | 274 typedef base::hash_set<int> DownloadRequests; |
288 typedef std::map<DownloadManager*, DownloadRequests> RequestMap; | 275 typedef std::map<DownloadManager*, DownloadRequests> RequestMap; |
289 RequestMap requests_; | 276 RequestMap requests_; |
290 | 277 |
291 // Used for progress updates on the UI thread, mapping download->id() to bytes | 278 // Used for progress updates on the UI thread, mapping download->id() to bytes |
292 // received so far. Written to by the file thread and read by the UI thread. | 279 // received so far. Written to by the file thread and read by the UI thread. |
293 typedef base::hash_map<int, int64> ProgressMap; | 280 typedef base::hash_map<int, int64> ProgressMap; |
294 ProgressMap ui_progress_; | 281 ProgressMap ui_progress_; |
295 Lock progress_lock_; | 282 Lock progress_lock_; |
296 | 283 |
297 DISALLOW_COPY_AND_ASSIGN(DownloadFileManager); | 284 DISALLOW_COPY_AND_ASSIGN(DownloadFileManager); |
298 }; | 285 }; |
299 | 286 |
300 #endif // CHROME_BROWSER_DOWNLOAD_DOWNLOAD_FILE_H_ | 287 #endif // CHROME_BROWSER_DOWNLOAD_DOWNLOAD_FILE_H_ |
OLD | NEW |