OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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 "build/build_config.h" | 5 #include "build/build_config.h" |
6 | 6 |
7 #include "content/browser/download/save_file_manager.h" | 7 #include "content/browser/download/save_file_manager.h" |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/files/file_util.h" | 10 #include "base/files/file_util.h" |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
61 // unique save ID. | 61 // unique save ID. |
62 int SaveFileManager::GetNextId() { | 62 int SaveFileManager::GetNextId() { |
63 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 63 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
64 return next_id_++; | 64 return next_id_++; |
65 } | 65 } |
66 | 66 |
67 void SaveFileManager::RegisterStartingRequest(const GURL& save_url, | 67 void SaveFileManager::RegisterStartingRequest(const GURL& save_url, |
68 SavePackage* save_package) { | 68 SavePackage* save_package) { |
69 // Make sure it runs in the UI thread. | 69 // Make sure it runs in the UI thread. |
70 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 70 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
71 int save_package_id = save_package->id(); | 71 SavePackageId save_package_id = save_package->id(); |
72 | 72 |
73 // Register this starting request. | 73 // Register this starting request. |
74 StartingRequestsMap& starting_requests = | 74 StartingRequestsMap& starting_requests = |
75 contents_starting_requests_[save_package_id]; | 75 contents_starting_requests_[save_package_id]; |
76 bool never_present = starting_requests.insert( | 76 bool never_present = starting_requests.insert( |
77 StartingRequestsMap::value_type(save_url.spec(), save_package)).second; | 77 StartingRequestsMap::value_type(save_url.spec(), save_package)).second; |
78 DCHECK(never_present); | 78 DCHECK(never_present); |
79 } | 79 } |
80 | 80 |
81 SavePackage* SaveFileManager::UnregisterStartingRequest(const GURL& save_url, | 81 SavePackage* SaveFileManager::UnregisterStartingRequest( |
82 int save_package_id) { | 82 const GURL& save_url, |
| 83 SavePackageId save_package_id) { |
83 // Make sure it runs in UI thread. | 84 // Make sure it runs in UI thread. |
84 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 85 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
85 | 86 |
86 ContentsToStartingRequestsMap::iterator it = | 87 ContentsToStartingRequestsMap::iterator it = |
87 contents_starting_requests_.find(save_package_id); | 88 contents_starting_requests_.find(save_package_id); |
88 if (it != contents_starting_requests_.end()) { | 89 if (it != contents_starting_requests_.end()) { |
89 StartingRequestsMap& requests = it->second; | 90 StartingRequestsMap& requests = it->second; |
90 StartingRequestsMap::iterator sit = requests.find(save_url.spec()); | 91 StartingRequestsMap::iterator sit = requests.find(save_url.spec()); |
91 if (sit == requests.end()) | 92 if (sit == requests.end()) |
92 return NULL; | 93 return NULL; |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
260 } | 261 } |
261 | 262 |
262 // The IO thread will call this when saving is completed or it got error when | 263 // The IO thread will call this when saving is completed or it got error when |
263 // fetching data. In the former case, we forward the message to OnSaveFinished | 264 // fetching data. In the former case, we forward the message to OnSaveFinished |
264 // in UI thread. In the latter case, the save ID will be -1, which means the | 265 // in UI thread. In the latter case, the save ID will be -1, which means the |
265 // saving action did not even start, so we need to call OnErrorFinished in UI | 266 // saving action did not even start, so we need to call OnErrorFinished in UI |
266 // thread, which will use the save URL to find corresponding request record and | 267 // thread, which will use the save URL to find corresponding request record and |
267 // delete it. | 268 // delete it. |
268 void SaveFileManager::SaveFinished(int save_id, | 269 void SaveFileManager::SaveFinished(int save_id, |
269 const GURL& save_url, | 270 const GURL& save_url, |
270 int save_package_id, | 271 SavePackageId save_package_id, |
271 bool is_success) { | 272 bool is_success) { |
272 DVLOG(20) << " " << __FUNCTION__ << "()" | 273 DVLOG(20) << " " << __FUNCTION__ << "()" |
273 << " save_id = " << save_id << " save_url = \"" << save_url.spec() | 274 << " save_id = " << save_id << " save_url = \"" << save_url.spec() |
274 << "\"" | 275 << "\"" |
275 << " save_package_id = " << save_package_id | 276 << " save_package_id = " << save_package_id |
276 << " is_success = " << is_success; | 277 << " is_success = " << is_success; |
277 DCHECK_CURRENTLY_ON(BrowserThread::FILE); | 278 DCHECK_CURRENTLY_ON(BrowserThread::FILE); |
278 SaveFileMap::iterator it = save_file_map_.find(save_id); | 279 SaveFileMap::iterator it = save_file_map_.find(save_id); |
279 if (it != save_file_map_.end()) { | 280 if (it != save_file_map_.end()) { |
280 SaveFile* save_file = it->second; | 281 SaveFile* save_file = it->second; |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
349 void SaveFileManager::OnSaveFinished(int save_id, | 350 void SaveFileManager::OnSaveFinished(int save_id, |
350 int64 bytes_so_far, | 351 int64 bytes_so_far, |
351 bool is_success) { | 352 bool is_success) { |
352 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 353 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
353 SavePackage* package = LookupPackage(save_id); | 354 SavePackage* package = LookupPackage(save_id); |
354 if (package) | 355 if (package) |
355 package->SaveFinished(save_id, bytes_so_far, is_success); | 356 package->SaveFinished(save_id, bytes_so_far, is_success); |
356 } | 357 } |
357 | 358 |
358 void SaveFileManager::OnErrorFinished(const GURL& save_url, | 359 void SaveFileManager::OnErrorFinished(const GURL& save_url, |
359 int save_package_id) { | 360 SavePackageId save_package_id) { |
360 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 361 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
361 SavePackage* save_package = | 362 SavePackage* save_package = |
362 UnregisterStartingRequest(save_url, save_package_id); | 363 UnregisterStartingRequest(save_url, save_package_id); |
363 if (save_package) | 364 if (save_package) |
364 save_package->SaveFailed(save_url); | 365 save_package->SaveFailed(save_url); |
365 } | 366 } |
366 | 367 |
367 // Notifications sent from the UI thread and run on the IO thread. | 368 // Notifications sent from the UI thread and run on the IO thread. |
368 | 369 |
369 void SaveFileManager::OnSaveURL(const GURL& url, | 370 void SaveFileManager::OnSaveURL(const GURL& url, |
370 const Referrer& referrer, | 371 const Referrer& referrer, |
371 int save_package_id, | 372 SavePackageId save_package_id, |
372 int render_process_host_id, | 373 int render_process_host_id, |
373 int render_view_routing_id, | 374 int render_view_routing_id, |
374 int render_frame_routing_id, | 375 int render_frame_routing_id, |
375 ResourceContext* context) { | 376 ResourceContext* context) { |
376 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 377 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
377 ResourceDispatcherHostImpl::Get()->BeginSaveFile( | 378 ResourceDispatcherHostImpl::Get()->BeginSaveFile( |
378 url, referrer, save_package_id, render_process_host_id, | 379 url, referrer, save_package_id, render_process_host_id, |
379 render_view_routing_id, render_frame_routing_id, context); | 380 render_view_routing_id, render_frame_routing_id, context); |
380 } | 381 } |
381 | 382 |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
433 save_file_map_.erase(it); | 434 save_file_map_.erase(it); |
434 delete save_file; | 435 delete save_file; |
435 } | 436 } |
436 } | 437 } |
437 | 438 |
438 // It is possible that SaveItem which has specified save_id has been canceled | 439 // It is possible that SaveItem which has specified save_id has been canceled |
439 // before this function runs. So if we can not find corresponding SaveFile by | 440 // before this function runs. So if we can not find corresponding SaveFile by |
440 // using specified save_id, just return. | 441 // using specified save_id, just return. |
441 void SaveFileManager::SaveLocalFile(const GURL& original_file_url, | 442 void SaveFileManager::SaveLocalFile(const GURL& original_file_url, |
442 int save_id, | 443 int save_id, |
443 int save_package_id) { | 444 SavePackageId save_package_id) { |
444 DCHECK_CURRENTLY_ON(BrowserThread::FILE); | 445 DCHECK_CURRENTLY_ON(BrowserThread::FILE); |
445 SaveFile* save_file = LookupSaveFile(save_id); | 446 SaveFile* save_file = LookupSaveFile(save_id); |
446 if (!save_file) | 447 if (!save_file) |
447 return; | 448 return; |
448 // If it has finished, just return. | 449 // If it has finished, just return. |
449 if (!save_file->InProgress()) | 450 if (!save_file->InProgress()) |
450 return; | 451 return; |
451 | 452 |
452 // Close the save file before the copy operation. | 453 // Close the save file before the copy operation. |
453 save_file->Finish(); | 454 save_file->Finish(); |
(...skipping 20 matching lines...) Expand all Loading... |
474 DCHECK_CURRENTLY_ON(BrowserThread::FILE); | 475 DCHECK_CURRENTLY_ON(BrowserThread::FILE); |
475 DCHECK(!full_path.empty()); | 476 DCHECK(!full_path.empty()); |
476 | 477 |
477 base::DeleteFile(full_path, is_dir); | 478 base::DeleteFile(full_path, is_dir); |
478 } | 479 } |
479 | 480 |
480 void SaveFileManager::RenameAllFiles(const FinalNameList& final_names, | 481 void SaveFileManager::RenameAllFiles(const FinalNameList& final_names, |
481 const base::FilePath& resource_dir, | 482 const base::FilePath& resource_dir, |
482 int render_process_id, | 483 int render_process_id, |
483 int render_frame_routing_id, | 484 int render_frame_routing_id, |
484 int save_package_id) { | 485 SavePackageId save_package_id) { |
485 DCHECK_CURRENTLY_ON(BrowserThread::FILE); | 486 DCHECK_CURRENTLY_ON(BrowserThread::FILE); |
486 | 487 |
487 if (!resource_dir.empty() && !base::PathExists(resource_dir)) | 488 if (!resource_dir.empty() && !base::PathExists(resource_dir)) |
488 base::CreateDirectory(resource_dir); | 489 base::CreateDirectory(resource_dir); |
489 | 490 |
490 for (FinalNameList::const_iterator i = final_names.begin(); | 491 for (FinalNameList::const_iterator i = final_names.begin(); |
491 i != final_names.end(); ++i) { | 492 i != final_names.end(); ++i) { |
492 SaveFileMap::iterator it = save_file_map_.find(i->first); | 493 SaveFileMap::iterator it = save_file_map_.find(i->first); |
493 if (it != save_file_map_.end()) { | 494 if (it != save_file_map_.end()) { |
494 SaveFile* save_file = it->second; | 495 SaveFile* save_file = it->second; |
495 DCHECK(!save_file->InProgress()); | 496 DCHECK(!save_file->InProgress()); |
496 save_file->Rename(i->second); | 497 save_file->Rename(i->second); |
497 delete save_file; | 498 delete save_file; |
498 save_file_map_.erase(it); | 499 save_file_map_.erase(it); |
499 } | 500 } |
500 } | 501 } |
501 | 502 |
502 BrowserThread::PostTask( | 503 BrowserThread::PostTask( |
503 BrowserThread::UI, FROM_HERE, | 504 BrowserThread::UI, FROM_HERE, |
504 base::Bind(&SaveFileManager::OnFinishSavePageJob, this, render_process_id, | 505 base::Bind(&SaveFileManager::OnFinishSavePageJob, this, render_process_id, |
505 render_frame_routing_id, save_package_id)); | 506 render_frame_routing_id, save_package_id)); |
506 } | 507 } |
507 | 508 |
508 void SaveFileManager::OnFinishSavePageJob(int render_process_id, | 509 void SaveFileManager::OnFinishSavePageJob(int render_process_id, |
509 int render_frame_routing_id, | 510 int render_frame_routing_id, |
510 int save_package_id) { | 511 SavePackageId save_package_id) { |
511 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 512 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
512 | 513 |
513 SavePackage* save_package = | 514 SavePackage* save_package = |
514 GetSavePackageFromRenderIds(render_process_id, render_frame_routing_id); | 515 GetSavePackageFromRenderIds(render_process_id, render_frame_routing_id); |
515 | 516 |
516 if (save_package && save_package->id() == save_package_id) | 517 if (save_package && save_package->id() == save_package_id) |
517 save_package->Finish(); | 518 save_package->Finish(); |
518 } | 519 } |
519 | 520 |
520 void SaveFileManager::RemoveSavedFileFromFileMap( | 521 void SaveFileManager::RemoveSavedFileFromFileMap( |
521 const SaveIDList& save_ids) { | 522 const SaveIDList& save_ids) { |
522 DCHECK_CURRENTLY_ON(BrowserThread::FILE); | 523 DCHECK_CURRENTLY_ON(BrowserThread::FILE); |
523 | 524 |
524 for (SaveIDList::const_iterator i = save_ids.begin(); | 525 for (SaveIDList::const_iterator i = save_ids.begin(); |
525 i != save_ids.end(); ++i) { | 526 i != save_ids.end(); ++i) { |
526 SaveFileMap::iterator it = save_file_map_.find(*i); | 527 SaveFileMap::iterator it = save_file_map_.find(*i); |
527 if (it != save_file_map_.end()) { | 528 if (it != save_file_map_.end()) { |
528 SaveFile* save_file = it->second; | 529 SaveFile* save_file = it->second; |
529 DCHECK(!save_file->InProgress()); | 530 DCHECK(!save_file->InProgress()); |
530 base::DeleteFile(save_file->FullPath(), false); | 531 base::DeleteFile(save_file->FullPath(), false); |
531 delete save_file; | 532 delete save_file; |
532 save_file_map_.erase(it); | 533 save_file_map_.erase(it); |
533 } | 534 } |
534 } | 535 } |
535 } | 536 } |
536 | 537 |
537 } // namespace content | 538 } // namespace content |
OLD | NEW |