| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/chromeos/drive/file_system/download_operation.h" | 5 #include "chrome/browser/chromeos/drive/file_system/download_operation.h" |
| 6 | 6 |
| 7 #include "base/file_util.h" | 7 #include "base/file_util.h" |
| 8 #include "base/files/file_path.h" | 8 #include "base/files/file_path.h" |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/task_runner_util.h" | 10 #include "base/task_runner_util.h" |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 121 cache_file_path); | 121 cache_file_path); |
| 122 } | 122 } |
| 123 | 123 |
| 124 // Calls CheckPreConditionForEnsureFileDownloaded() with the entry specified by | 124 // Calls CheckPreConditionForEnsureFileDownloaded() with the entry specified by |
| 125 // the given file path. | 125 // the given file path. |
| 126 FileError CheckPreConditionForEnsureFileDownloadedByPath( | 126 FileError CheckPreConditionForEnsureFileDownloadedByPath( |
| 127 internal::ResourceMetadata* metadata, | 127 internal::ResourceMetadata* metadata, |
| 128 internal::FileCache* cache, | 128 internal::FileCache* cache, |
| 129 const base::FilePath& file_path, | 129 const base::FilePath& file_path, |
| 130 const base::FilePath& temporary_file_directory, | 130 const base::FilePath& temporary_file_directory, |
| 131 std::string* local_id, | |
| 132 base::FilePath* cache_file_path, | 131 base::FilePath* cache_file_path, |
| 133 ResourceEntry* entry) { | 132 ResourceEntry* entry) { |
| 134 FileError error = metadata->GetIdByPath(file_path, local_id); | 133 std::string local_id; |
| 134 FileError error = metadata->GetIdByPath(file_path, &local_id); |
| 135 if (error != FILE_ERROR_OK) | 135 if (error != FILE_ERROR_OK) |
| 136 return error; | 136 return error; |
| 137 return CheckPreConditionForEnsureFileDownloaded( | 137 return CheckPreConditionForEnsureFileDownloaded( |
| 138 metadata, cache, temporary_file_directory, *local_id, entry, | 138 metadata, cache, temporary_file_directory, local_id, entry, |
| 139 cache_file_path); | 139 cache_file_path); |
| 140 } | 140 } |
| 141 | 141 |
| 142 // Creates a file with unique name in |dir| and stores the path to |temp_file|. | 142 // Creates a file with unique name in |dir| and stores the path to |temp_file|. |
| 143 // Additionally, sets the permission of the file to allow read access from | 143 // Additionally, sets the permission of the file to allow read access from |
| 144 // others and group member users (i.e, "-rw-r--r--"). | 144 // others and group member users (i.e, "-rw-r--r--"). |
| 145 // We need this wrapper because Drive cache files may be read from other | 145 // We need this wrapper because Drive cache files may be read from other |
| 146 // processes (e.g., cros_disks for mounting zip files). | 146 // processes (e.g., cros_disks for mounting zip files). |
| 147 bool CreateTemporaryReadableFileInDir(const base::FilePath& dir, | 147 bool CreateTemporaryReadableFileInDir(const base::FilePath& dir, |
| 148 base::FilePath* temp_file) { | 148 base::FilePath* temp_file) { |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 312 base::Unretained(cache_), | 312 base::Unretained(cache_), |
| 313 local_id, | 313 local_id, |
| 314 temporary_file_directory_, | 314 temporary_file_directory_, |
| 315 drive_file_path, | 315 drive_file_path, |
| 316 cache_file_path, | 316 cache_file_path, |
| 317 entry), | 317 entry), |
| 318 base::Bind(&DownloadOperation::EnsureFileDownloadedAfterCheckPreCondition, | 318 base::Bind(&DownloadOperation::EnsureFileDownloadedAfterCheckPreCondition, |
| 319 weak_ptr_factory_.GetWeakPtr(), | 319 weak_ptr_factory_.GetWeakPtr(), |
| 320 base::Passed(¶ms), | 320 base::Passed(¶ms), |
| 321 context, | 321 context, |
| 322 base::Owned(new std::string(local_id)), | |
| 323 base::Owned(drive_file_path), | 322 base::Owned(drive_file_path), |
| 324 base::Owned(cache_file_path))); | 323 base::Owned(cache_file_path))); |
| 325 } | 324 } |
| 326 | 325 |
| 327 void DownloadOperation::EnsureFileDownloadedByPath( | 326 void DownloadOperation::EnsureFileDownloadedByPath( |
| 328 const base::FilePath& file_path, | 327 const base::FilePath& file_path, |
| 329 const ClientContext& context, | 328 const ClientContext& context, |
| 330 const GetFileContentInitializedCallback& initialized_callback, | 329 const GetFileContentInitializedCallback& initialized_callback, |
| 331 const google_apis::GetContentCallback& get_content_callback, | 330 const google_apis::GetContentCallback& get_content_callback, |
| 332 const GetFileCallback& completion_callback) { | 331 const GetFileCallback& completion_callback) { |
| 333 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 332 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 334 DCHECK(!completion_callback.is_null()); | 333 DCHECK(!completion_callback.is_null()); |
| 335 | 334 |
| 336 std::string* local_id = new std::string; | |
| 337 base::FilePath* drive_file_path = new base::FilePath(file_path); | 335 base::FilePath* drive_file_path = new base::FilePath(file_path); |
| 338 base::FilePath* cache_file_path = new base::FilePath; | 336 base::FilePath* cache_file_path = new base::FilePath; |
| 339 ResourceEntry* entry = new ResourceEntry; | 337 ResourceEntry* entry = new ResourceEntry; |
| 340 scoped_ptr<DownloadParams> params(new DownloadParams( | 338 scoped_ptr<DownloadParams> params(new DownloadParams( |
| 341 initialized_callback, get_content_callback, completion_callback, | 339 initialized_callback, get_content_callback, completion_callback, |
| 342 make_scoped_ptr(entry))); | 340 make_scoped_ptr(entry))); |
| 343 base::PostTaskAndReplyWithResult( | 341 base::PostTaskAndReplyWithResult( |
| 344 blocking_task_runner_.get(), | 342 blocking_task_runner_.get(), |
| 345 FROM_HERE, | 343 FROM_HERE, |
| 346 base::Bind(&CheckPreConditionForEnsureFileDownloadedByPath, | 344 base::Bind(&CheckPreConditionForEnsureFileDownloadedByPath, |
| 347 base::Unretained(metadata_), | 345 base::Unretained(metadata_), |
| 348 base::Unretained(cache_), | 346 base::Unretained(cache_), |
| 349 file_path, | 347 file_path, |
| 350 temporary_file_directory_, | 348 temporary_file_directory_, |
| 351 local_id, | |
| 352 cache_file_path, | 349 cache_file_path, |
| 353 entry), | 350 entry), |
| 354 base::Bind(&DownloadOperation::EnsureFileDownloadedAfterCheckPreCondition, | 351 base::Bind(&DownloadOperation::EnsureFileDownloadedAfterCheckPreCondition, |
| 355 weak_ptr_factory_.GetWeakPtr(), | 352 weak_ptr_factory_.GetWeakPtr(), |
| 356 base::Passed(¶ms), | 353 base::Passed(¶ms), |
| 357 context, | 354 context, |
| 358 base::Owned(local_id), | |
| 359 base::Owned(drive_file_path), | 355 base::Owned(drive_file_path), |
| 360 base::Owned(cache_file_path))); | 356 base::Owned(cache_file_path))); |
| 361 } | 357 } |
| 362 | 358 |
| 363 void DownloadOperation::EnsureFileDownloadedAfterCheckPreCondition( | 359 void DownloadOperation::EnsureFileDownloadedAfterCheckPreCondition( |
| 364 scoped_ptr<DownloadParams> params, | 360 scoped_ptr<DownloadParams> params, |
| 365 const ClientContext& context, | 361 const ClientContext& context, |
| 366 std::string* local_id, | |
| 367 base::FilePath* drive_file_path, | 362 base::FilePath* drive_file_path, |
| 368 base::FilePath* cache_file_path, | 363 base::FilePath* cache_file_path, |
| 369 FileError error) { | 364 FileError error) { |
| 370 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 365 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 371 DCHECK(params); | 366 DCHECK(params); |
| 372 DCHECK(local_id); | |
| 373 DCHECK(drive_file_path); | 367 DCHECK(drive_file_path); |
| 374 DCHECK(cache_file_path); | 368 DCHECK(cache_file_path); |
| 375 | 369 |
| 376 if (error != FILE_ERROR_OK) { | 370 if (error != FILE_ERROR_OK) { |
| 377 // During precondition check, an error is found. | 371 // During precondition check, an error is found. |
| 378 params->OnError(error); | 372 params->OnError(error); |
| 379 return; | 373 return; |
| 380 } | 374 } |
| 381 | 375 |
| 382 if (!cache_file_path->empty()) { | 376 if (!cache_file_path->empty()) { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 399 base::Bind(&PrepareForDownloadFile, | 393 base::Bind(&PrepareForDownloadFile, |
| 400 base::Unretained(cache_), | 394 base::Unretained(cache_), |
| 401 size, | 395 size, |
| 402 temporary_file_directory_, | 396 temporary_file_directory_, |
| 403 temp_download_file_path), | 397 temp_download_file_path), |
| 404 base::Bind( | 398 base::Bind( |
| 405 &DownloadOperation::EnsureFileDownloadedAfterPrepareForDownloadFile, | 399 &DownloadOperation::EnsureFileDownloadedAfterPrepareForDownloadFile, |
| 406 weak_ptr_factory_.GetWeakPtr(), | 400 weak_ptr_factory_.GetWeakPtr(), |
| 407 base::Passed(¶ms), | 401 base::Passed(¶ms), |
| 408 context, | 402 context, |
| 409 *local_id, | |
| 410 *drive_file_path, | 403 *drive_file_path, |
| 411 base::Owned(temp_download_file_path))); | 404 base::Owned(temp_download_file_path))); |
| 412 } | 405 } |
| 413 | 406 |
| 414 void DownloadOperation::EnsureFileDownloadedAfterPrepareForDownloadFile( | 407 void DownloadOperation::EnsureFileDownloadedAfterPrepareForDownloadFile( |
| 415 scoped_ptr<DownloadParams> params, | 408 scoped_ptr<DownloadParams> params, |
| 416 const ClientContext& context, | 409 const ClientContext& context, |
| 417 const std::string& local_id, | |
| 418 const base::FilePath& drive_file_path, | 410 const base::FilePath& drive_file_path, |
| 419 base::FilePath* temp_download_file_path, | 411 base::FilePath* temp_download_file_path, |
| 420 FileError error) { | 412 FileError error) { |
| 421 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 413 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 422 DCHECK(params); | 414 DCHECK(params); |
| 423 DCHECK(temp_download_file_path); | 415 DCHECK(temp_download_file_path); |
| 424 | 416 |
| 425 if (error != FILE_ERROR_OK) { | 417 if (error != FILE_ERROR_OK) { |
| 426 params->OnError(error); | 418 params->OnError(error); |
| 427 return; | 419 return; |
| 428 } | 420 } |
| 429 | 421 |
| 430 DownloadParams* params_ptr = params.get(); | 422 DownloadParams* params_ptr = params.get(); |
| 431 JobID id = scheduler_->DownloadFile( | 423 JobID id = scheduler_->DownloadFile( |
| 432 drive_file_path, | 424 drive_file_path, |
| 433 params_ptr->entry().file_info().size(), | 425 params_ptr->entry().file_info().size(), |
| 434 *temp_download_file_path, | 426 *temp_download_file_path, |
| 435 params_ptr->entry().resource_id(), | 427 params_ptr->entry().resource_id(), |
| 436 context, | 428 context, |
| 437 base::Bind(&DownloadOperation::EnsureFileDownloadedAfterDownloadFile, | 429 base::Bind(&DownloadOperation::EnsureFileDownloadedAfterDownloadFile, |
| 438 weak_ptr_factory_.GetWeakPtr(), | 430 weak_ptr_factory_.GetWeakPtr(), |
| 439 drive_file_path, | 431 drive_file_path, |
| 440 local_id, | |
| 441 base::Passed(¶ms)), | 432 base::Passed(¶ms)), |
| 442 params_ptr->get_content_callback()); | 433 params_ptr->get_content_callback()); |
| 443 | 434 |
| 444 // Notify via |initialized_callback| if necessary. | 435 // Notify via |initialized_callback| if necessary. |
| 445 params_ptr->OnStartDownloading( | 436 params_ptr->OnStartDownloading( |
| 446 base::Bind(&DownloadOperation::CancelJob, | 437 base::Bind(&DownloadOperation::CancelJob, |
| 447 weak_ptr_factory_.GetWeakPtr(), id)); | 438 weak_ptr_factory_.GetWeakPtr(), id)); |
| 448 } | 439 } |
| 449 | 440 |
| 450 void DownloadOperation::EnsureFileDownloadedAfterDownloadFile( | 441 void DownloadOperation::EnsureFileDownloadedAfterDownloadFile( |
| 451 const base::FilePath& drive_file_path, | 442 const base::FilePath& drive_file_path, |
| 452 const std::string& local_id, | |
| 453 scoped_ptr<DownloadParams> params, | 443 scoped_ptr<DownloadParams> params, |
| 454 google_apis::GDataErrorCode gdata_error, | 444 google_apis::GDataErrorCode gdata_error, |
| 455 const base::FilePath& downloaded_file_path) { | 445 const base::FilePath& downloaded_file_path) { |
| 456 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 446 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 457 | 447 |
| 448 const std::string& local_id = params->entry().local_id(); |
| 458 const std::string& md5 = params->entry().file_specific_info().md5(); | 449 const std::string& md5 = params->entry().file_specific_info().md5(); |
| 459 base::FilePath* cache_file_path = new base::FilePath; | 450 base::FilePath* cache_file_path = new base::FilePath; |
| 460 base::PostTaskAndReplyWithResult( | 451 base::PostTaskAndReplyWithResult( |
| 461 blocking_task_runner_.get(), | 452 blocking_task_runner_.get(), |
| 462 FROM_HERE, | 453 FROM_HERE, |
| 463 base::Bind(&UpdateLocalStateForDownloadFile, | 454 base::Bind(&UpdateLocalStateForDownloadFile, |
| 464 base::Unretained(cache_), | 455 base::Unretained(cache_), |
| 465 local_id, | 456 local_id, |
| 466 md5, | 457 md5, |
| 467 gdata_error, | 458 gdata_error, |
| (...skipping 22 matching lines...) Expand all Loading... |
| 490 observer_->OnDirectoryChangedByOperation(file_path.DirName()); | 481 observer_->OnDirectoryChangedByOperation(file_path.DirName()); |
| 491 params->OnComplete(*cache_file_path); | 482 params->OnComplete(*cache_file_path); |
| 492 } | 483 } |
| 493 | 484 |
| 494 void DownloadOperation::CancelJob(JobID job_id) { | 485 void DownloadOperation::CancelJob(JobID job_id) { |
| 495 scheduler_->CancelJob(job_id); | 486 scheduler_->CancelJob(job_id); |
| 496 } | 487 } |
| 497 | 488 |
| 498 } // namespace file_system | 489 } // namespace file_system |
| 499 } // namespace drive | 490 } // namespace drive |
| OLD | NEW |