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 "chrome/browser/chromeos/drive/file_system/copy_operation.h" | 5 #include "chrome/browser/chromeos/drive/file_system/copy_operation.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
10 #include "base/task_runner_util.h" | 10 #include "base/task_runner_util.h" |
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
344 FileChange::FILE_TYPE_FILE, | 344 FileChange::FILE_TYPE_FILE, |
345 FileChange::ADD_OR_UPDATE); | 345 FileChange::ADD_OR_UPDATE); |
346 observer_->OnFileChangedByOperation(changed_file); | 346 observer_->OnFileChangedByOperation(changed_file); |
347 } | 347 } |
348 | 348 |
349 if (error != FILE_ERROR_OK || !*should_copy_on_server) { | 349 if (error != FILE_ERROR_OK || !*should_copy_on_server) { |
350 params->callback.Run(error); | 350 params->callback.Run(error); |
351 return; | 351 return; |
352 } | 352 } |
353 | 353 |
354 base::FilePath new_title = params->dest_file_path.BaseName(); | 354 if (params->parent_entry.resource_id().empty()) { |
355 if (params->src_entry.file_specific_info().is_hosted_document()) { | 355 // Parent entry may be being synced. |
| 356 const bool waiting = observer_->WaitForSyncComplete( |
| 357 params->parent_entry.local_id(), |
| 358 base::Bind(&CopyOperation::CopyAfterParentSync, |
| 359 weak_ptr_factory_.GetWeakPtr(), *params)); |
| 360 if (!waiting) |
| 361 params->callback.Run(FILE_ERROR_NOT_FOUND); |
| 362 } else { |
| 363 CopyAfterGetParentResourceId(*params, ¶ms->parent_entry, FILE_ERROR_OK); |
| 364 } |
| 365 } |
| 366 |
| 367 void CopyOperation::CopyAfterParentSync(const CopyParams& params, |
| 368 FileError error) { |
| 369 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 370 DCHECK(!params.callback.is_null()); |
| 371 |
| 372 if (error != FILE_ERROR_OK) { |
| 373 params.callback.Run(error); |
| 374 return; |
| 375 } |
| 376 |
| 377 ResourceEntry* parent = new ResourceEntry; |
| 378 base::PostTaskAndReplyWithResult( |
| 379 blocking_task_runner_, |
| 380 FROM_HERE, |
| 381 base::Bind(&internal::ResourceMetadata::GetResourceEntryById, |
| 382 base::Unretained(metadata_), |
| 383 params.parent_entry.local_id(), parent), |
| 384 base::Bind(&CopyOperation::CopyAfterGetParentResourceId, |
| 385 weak_ptr_factory_.GetWeakPtr(), params, base::Owned(parent))); |
| 386 } |
| 387 |
| 388 void CopyOperation::CopyAfterGetParentResourceId(const CopyParams& params, |
| 389 const ResourceEntry* parent, |
| 390 FileError error) { |
| 391 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 392 DCHECK(!params.callback.is_null()); |
| 393 |
| 394 if (error != FILE_ERROR_OK) { |
| 395 params.callback.Run(error); |
| 396 return; |
| 397 } |
| 398 |
| 399 base::FilePath new_title = params.dest_file_path.BaseName(); |
| 400 if (params.src_entry.file_specific_info().is_hosted_document()) { |
356 // Drop the document extension, which should not be in the title. | 401 // Drop the document extension, which should not be in the title. |
357 // TODO(yoshiki): Remove this code with crbug.com/223304. | 402 // TODO(yoshiki): Remove this code with crbug.com/223304. |
358 new_title = new_title.RemoveExtension(); | 403 new_title = new_title.RemoveExtension(); |
359 } | 404 } |
360 | 405 |
361 base::Time last_modified = | 406 base::Time last_modified = |
362 params->preserve_last_modified ? | 407 params.preserve_last_modified ? |
363 base::Time::FromInternalValue( | 408 base::Time::FromInternalValue( |
364 params->src_entry.file_info().last_modified()) : base::Time(); | 409 params.src_entry.file_info().last_modified()) : base::Time(); |
365 | 410 |
366 CopyResourceOnServer( | 411 CopyResourceOnServer( |
367 params->src_entry.resource_id(), params->parent_entry.resource_id(), | 412 params.src_entry.resource_id(), parent->resource_id(), |
368 new_title.AsUTF8Unsafe(), last_modified, params->callback); | 413 new_title.AsUTF8Unsafe(), last_modified, params.callback); |
369 } | 414 } |
370 | 415 |
371 void CopyOperation::TransferFileFromLocalToRemote( | 416 void CopyOperation::TransferFileFromLocalToRemote( |
372 const base::FilePath& local_src_path, | 417 const base::FilePath& local_src_path, |
373 const base::FilePath& remote_dest_path, | 418 const base::FilePath& remote_dest_path, |
374 const FileOperationCallback& callback) { | 419 const FileOperationCallback& callback) { |
375 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 420 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
376 DCHECK(!callback.is_null()); | 421 DCHECK(!callback.is_null()); |
377 | 422 |
378 std::string* gdoc_resource_id = new std::string; | 423 std::string* gdoc_resource_id = new std::string; |
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
616 FileChange changed_file; | 661 FileChange changed_file; |
617 changed_file.Update(remote_dest_path, *entry, FileChange::ADD_OR_UPDATE); | 662 changed_file.Update(remote_dest_path, *entry, FileChange::ADD_OR_UPDATE); |
618 observer_->OnFileChangedByOperation(changed_file); | 663 observer_->OnFileChangedByOperation(changed_file); |
619 observer_->OnEntryUpdatedByOperation(*local_id); | 664 observer_->OnEntryUpdatedByOperation(*local_id); |
620 } | 665 } |
621 callback.Run(error); | 666 callback.Run(error); |
622 } | 667 } |
623 | 668 |
624 } // namespace file_system | 669 } // namespace file_system |
625 } // namespace drive | 670 } // namespace drive |
OLD | NEW |