| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 #include "chrome/browser/download/download_file_manager.h" | 5 #include "chrome/browser/download/download_file_manager.h" |
| 6 | 6 |
| 7 #include "base/file_util.h" | 7 #include "base/file_util.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/stl_util-inl.h" | 9 #include "base/stl_util-inl.h" |
| 10 #include "base/task.h" | 10 #include "base/task.h" |
| (...skipping 17 matching lines...) Expand all Loading... |
| 28 | 28 |
| 29 namespace { | 29 namespace { |
| 30 | 30 |
| 31 // Throttle updates to the UI thread so that a fast moving download doesn't | 31 // Throttle updates to the UI thread so that a fast moving download doesn't |
| 32 // cause it to become unresponsive (in milliseconds). | 32 // cause it to become unresponsive (in milliseconds). |
| 33 const int kUpdatePeriodMs = 500; | 33 const int kUpdatePeriodMs = 500; |
| 34 | 34 |
| 35 } // namespace | 35 } // namespace |
| 36 | 36 |
| 37 DownloadFileManager::DownloadFileManager(ResourceDispatcherHost* rdh) | 37 DownloadFileManager::DownloadFileManager(ResourceDispatcherHost* rdh) |
| 38 : next_id_(0), | 38 : resource_dispatcher_host_(rdh) { |
| 39 resource_dispatcher_host_(rdh) { | |
| 40 } | 39 } |
| 41 | 40 |
| 42 DownloadFileManager::~DownloadFileManager() { | 41 DownloadFileManager::~DownloadFileManager() { |
| 43 DCHECK(downloads_.empty()); | 42 DCHECK(downloads_.empty()); |
| 44 } | 43 } |
| 45 | 44 |
| 46 void DownloadFileManager::Shutdown() { | 45 void DownloadFileManager::Shutdown() { |
| 47 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 46 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 48 BrowserThread::PostTask( | 47 BrowserThread::PostTask( |
| 49 BrowserThread::FILE, FROM_HERE, | 48 BrowserThread::FILE, FROM_HERE, |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 227 DownloadFile* download_file = it->second; | 226 DownloadFile* download_file = it->second; |
| 228 VLOG(20) << __FUNCTION__ << "()" | 227 VLOG(20) << __FUNCTION__ << "()" |
| 229 << " download_file = " << download_file->DebugString(); | 228 << " download_file = " << download_file->DebugString(); |
| 230 download_file->Cancel(); | 229 download_file->Cancel(); |
| 231 | 230 |
| 232 EraseDownload(id); | 231 EraseDownload(id); |
| 233 } | 232 } |
| 234 | 233 |
| 235 void DownloadFileManager::CompleteDownload(int id) { | 234 void DownloadFileManager::CompleteDownload(int id) { |
| 236 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 235 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
| 236 DVLOG(1) << __FUNCTION__ << " " << id; |
| 237 | 237 |
| 238 if (!ContainsKey(downloads_, id)) | 238 if (!ContainsKey(downloads_, id)) |
| 239 return; | 239 return; |
| 240 | 240 |
| 241 DownloadFile* download_file = downloads_[id]; | 241 DownloadFile* download_file = downloads_[id]; |
| 242 | 242 |
| 243 VLOG(20) << " " << __FUNCTION__ << "()" | 243 DVLOG(1) << " " << __FUNCTION__ << "()" |
| 244 << " id = " << id | 244 << " id = " << id |
| 245 << " download_file = " << download_file->DebugString(); | 245 << " download_file = " << download_file->DebugString(); |
| 246 | 246 |
| 247 download_file->Detach(); | 247 download_file->Detach(); |
| 248 | 248 |
| 249 EraseDownload(id); | 249 EraseDownload(id); |
| 250 } | 250 } |
| 251 | 251 |
| 252 void DownloadFileManager::OnDownloadManagerShutdown(DownloadManager* manager) { | 252 void DownloadFileManager::OnDownloadManagerShutdown(DownloadManager* manager) { |
| 253 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 253 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 282 void DownloadFileManager::RenameInProgressDownloadFile( | 282 void DownloadFileManager::RenameInProgressDownloadFile( |
| 283 int id, const FilePath& full_path) { | 283 int id, const FilePath& full_path) { |
| 284 VLOG(20) << __FUNCTION__ << "()" << " id = " << id | 284 VLOG(20) << __FUNCTION__ << "()" << " id = " << id |
| 285 << " full_path = \"" << full_path.value() << "\""; | 285 << " full_path = \"" << full_path.value() << "\""; |
| 286 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 286 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
| 287 | 287 |
| 288 DownloadFile* download_file = GetDownloadFile(id); | 288 DownloadFile* download_file = GetDownloadFile(id); |
| 289 if (!download_file) | 289 if (!download_file) |
| 290 return; | 290 return; |
| 291 | 291 |
| 292 VLOG(20) << __FUNCTION__ << "()" | 292 DVLOG(1) << __FUNCTION__ << "()" |
| 293 << " download_file = " << download_file->DebugString(); | 293 << " download_file = " << download_file->DebugString(); |
| 294 | 294 |
| 295 if (!download_file->Rename(full_path)) { | 295 if (!download_file->Rename(full_path)) { |
| 296 DVLOG(1) << __FUNCTION__ << " " << id; |
| 296 // Error. Between the time the UI thread generated 'full_path' to the time | 297 // Error. Between the time the UI thread generated 'full_path' to the time |
| 297 // this code runs, something happened that prevents us from renaming. | 298 // this code runs, something happened that prevents us from renaming. |
| 298 CancelDownloadOnRename(id); | 299 CancelDownloadOnRename(id); |
| 299 } | 300 } |
| 300 } | 301 } |
| 301 | 302 |
| 302 // The DownloadManager in the UI thread has provided a final name for the | 303 // The DownloadManager in the UI thread has provided a final name for the |
| 303 // download specified by 'id'. Rename the download that's in the process | 304 // download specified by 'id'. Rename the download that's in the process |
| 304 // of completing. | 305 // of completing. |
| 305 // | 306 // |
| 306 // There are 2 possible rename cases where this method can be called: | 307 // There are 2 possible rename cases where this method can be called: |
| 307 // 1. foo.crdownload -> foo (final, safe) | 308 // 1. foo.crdownload -> foo (final, safe) |
| 308 // 2. Unconfirmed.xxx.crdownload -> xxx (final, validated) | 309 // 2. Unconfirmed.xxx.crdownload -> xxx (final, validated) |
| 309 void DownloadFileManager::RenameCompletingDownloadFile( | 310 void DownloadFileManager::RenameCompletingDownloadFile( |
| 310 int id, const FilePath& full_path, bool overwrite_existing_file) { | 311 int id, const FilePath& full_path, bool overwrite_existing_file) { |
| 311 VLOG(20) << __FUNCTION__ << "()" << " id = " << id | 312 DVLOG(1) << __FUNCTION__ << "()" << " id = " << id |
| 312 << " overwrite_existing_file = " << overwrite_existing_file | 313 << " overwrite_existing_file = " << overwrite_existing_file |
| 313 << " full_path = \"" << full_path.value() << "\""; | 314 << " full_path = \"" << full_path.value() << "\""; |
| 314 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 315 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
| 315 | 316 |
| 316 DownloadFile* download_file = GetDownloadFile(id); | 317 DownloadFile* download_file = GetDownloadFile(id); |
| 318 DVLOG(1) << __FUNCTION__ << " " << download_file; |
| 317 if (!download_file) | 319 if (!download_file) |
| 318 return; | 320 return; |
| 319 | 321 |
| 320 DCHECK(download_file->GetDownloadManager()); | 322 DCHECK(download_file->GetDownloadManager()); |
| 321 DownloadManager* download_manager = download_file->GetDownloadManager(); | 323 DownloadManager* download_manager = download_file->GetDownloadManager(); |
| 322 | 324 |
| 323 VLOG(20) << __FUNCTION__ << "()" | 325 VLOG(20) << __FUNCTION__ << "()" |
| 324 << " download_file = " << download_file->DebugString(); | 326 << " download_file = " << download_file->DebugString(); |
| 325 | 327 |
| 326 int uniquifier = 0; | 328 int uniquifier = 0; |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 396 << " id = " << id | 398 << " id = " << id |
| 397 << " download_file = " << download_file->DebugString(); | 399 << " download_file = " << download_file->DebugString(); |
| 398 | 400 |
| 399 downloads_.erase(id); | 401 downloads_.erase(id); |
| 400 | 402 |
| 401 delete download_file; | 403 delete download_file; |
| 402 | 404 |
| 403 if (downloads_.empty()) | 405 if (downloads_.empty()) |
| 404 StopUpdateTimer(); | 406 StopUpdateTimer(); |
| 405 } | 407 } |
| OLD | NEW |