| 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 |