| 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/sync_file_system/drive_backend/local_to_remote_syncer.h
" | 5 #include "chrome/browser/sync_file_system/drive_backend/local_to_remote_syncer.h
" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/callback.h" | 10 #include "base/callback.h" |
| (...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 216 DCHECK(local_change_.IsAddOrUpdate()); | 216 DCHECK(local_change_.IsAddOrUpdate()); |
| 217 DCHECK_EQ(1u, missing_components.size()); | 217 DCHECK_EQ(1u, missing_components.size()); |
| 218 // The original target has remote parent folder and doesn't have remote active | 218 // The original target has remote parent folder and doesn't have remote active |
| 219 // file. | 219 // file. |
| 220 // Upload the file as a new file or create a folder. | 220 // Upload the file as a new file or create a folder. |
| 221 remote_parent_folder_tracker_ = active_ancestor_tracker.Pass(); | 221 remote_parent_folder_tracker_ = active_ancestor_tracker.Pass(); |
| 222 target_path_ = url_.path(); | 222 target_path_ = url_.path(); |
| 223 DCHECK(target_path_ == active_ancestor_path.Append(missing_components[0])); | 223 DCHECK(target_path_ == active_ancestor_path.Append(missing_components[0])); |
| 224 if (local_change_.file_type() == SYNC_FILE_TYPE_FILE) { | 224 if (local_change_.file_type() == SYNC_FILE_TYPE_FILE) { |
| 225 token->RecordLog("Detected a new file."); | 225 token->RecordLog("Detected a new file."); |
| 226 UploadNewFile(base::Bind( | 226 UploadNewFile(token.Pass()); |
| 227 &LocalToRemoteSyncer::SyncCompleted, | |
| 228 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token))); | |
| 229 return; | 227 return; |
| 230 } | 228 } |
| 231 | 229 |
| 232 token->RecordLog("Detected a new folder."); | 230 token->RecordLog("Detected a new folder."); |
| 233 CreateRemoteFolder(token.Pass()); | 231 CreateRemoteFolder(token.Pass()); |
| 234 } | 232 } |
| 235 | 233 |
| 236 void LocalToRemoteSyncer::SyncCompleted(scoped_ptr<SyncTaskToken> token, | 234 void LocalToRemoteSyncer::SyncCompleted(scoped_ptr<SyncTaskToken> token, |
| 237 SyncStatusCode status) { | 235 SyncStatusCode status) { |
| 238 if (status == SYNC_STATUS_OK && target_path_ != url_.path()) | 236 if (status == SYNC_STATUS_OK && target_path_ != url_.path()) |
| (...skipping 17 matching lines...) Expand all Loading... |
| 256 DCHECK(remote_file_tracker_->has_synced_details()); | 254 DCHECK(remote_file_tracker_->has_synced_details()); |
| 257 DCHECK(remote_file_tracker_->active()); | 255 DCHECK(remote_file_tracker_->active()); |
| 258 DCHECK(remote_file_tracker_->dirty()); | 256 DCHECK(remote_file_tracker_->dirty()); |
| 259 | 257 |
| 260 if (local_is_missing_) { | 258 if (local_is_missing_) { |
| 261 SyncCompleted(token.Pass(), SYNC_STATUS_OK); | 259 SyncCompleted(token.Pass(), SYNC_STATUS_OK); |
| 262 return; | 260 return; |
| 263 } | 261 } |
| 264 | 262 |
| 265 if (local_change_.IsFile()) { | 263 if (local_change_.IsFile()) { |
| 266 UploadNewFile(base::Bind(&LocalToRemoteSyncer::SyncCompleted, | 264 UploadNewFile(token.Pass()); |
| 267 weak_ptr_factory_.GetWeakPtr(), | |
| 268 base::Passed(&token))); | |
| 269 return; | 265 return; |
| 270 } | 266 } |
| 271 | 267 |
| 272 DCHECK(local_change_.IsDirectory()); | 268 DCHECK(local_change_.IsDirectory()); |
| 273 // Check if we can reuse the remote folder. | 269 // Check if we can reuse the remote folder. |
| 274 FileMetadata remote_file_metadata; | 270 FileMetadata remote_file_metadata; |
| 275 if (!metadata_database()->FindFileByFileID( | 271 if (!metadata_database()->FindFileByFileID( |
| 276 remote_file_tracker_->file_id(), &remote_file_metadata)) { | 272 remote_file_tracker_->file_id(), &remote_file_metadata)) { |
| 277 NOTREACHED(); | 273 NOTREACHED(); |
| 278 CreateRemoteFolder(token.Pass()); | 274 CreateRemoteFolder(token.Pass()); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 324 UploadExistingFile(token.Pass()); | 320 UploadExistingFile(token.Pass()); |
| 325 return; | 321 return; |
| 326 } | 322 } |
| 327 | 323 |
| 328 DCHECK_EQ(FILE_KIND_FOLDER, synced_details.file_kind()); | 324 DCHECK_EQ(FILE_KIND_FOLDER, synced_details.file_kind()); |
| 329 // Non-conflicting local file update to existing remote *folder*. | 325 // Non-conflicting local file update to existing remote *folder*. |
| 330 // Assuming this case as local folder deletion + local file creation, delete | 326 // Assuming this case as local folder deletion + local file creation, delete |
| 331 // the remote folder and upload the file. | 327 // the remote folder and upload the file. |
| 332 DeleteRemoteFile(base::Bind(&LocalToRemoteSyncer::DidDeleteForUploadNewFile, | 328 DeleteRemoteFile(base::Bind(&LocalToRemoteSyncer::DidDeleteForUploadNewFile, |
| 333 weak_ptr_factory_.GetWeakPtr(), | 329 weak_ptr_factory_.GetWeakPtr(), |
| 334 base::Bind(&LocalToRemoteSyncer::SyncCompleted, | 330 base::Passed(&token))); |
| 335 weak_ptr_factory_.GetWeakPtr(), | |
| 336 base::Passed(&token)))); | |
| 337 return; | 331 return; |
| 338 } | 332 } |
| 339 | 333 |
| 340 DCHECK(local_change_.IsDirectory()); | 334 DCHECK(local_change_.IsDirectory()); |
| 341 if (synced_details.file_kind() == FILE_KIND_FILE) { | 335 if (synced_details.file_kind() == FILE_KIND_FILE) { |
| 342 // Non-conflicting local folder creation to existing remote *file*. | 336 // Non-conflicting local folder creation to existing remote *file*. |
| 343 // Assuming this case as local file deletion + local folder creation, delete | 337 // Assuming this case as local file deletion + local folder creation, delete |
| 344 // the remote file and create a remote folder. | 338 // the remote file and create a remote folder. |
| 345 DeleteRemoteFile(base::Bind(&LocalToRemoteSyncer::DidDeleteForCreateFolder, | 339 DeleteRemoteFile(base::Bind(&LocalToRemoteSyncer::DidDeleteForCreateFolder, |
| 346 weak_ptr_factory_.GetWeakPtr(), | 340 weak_ptr_factory_.GetWeakPtr(), |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 543 if (!entry) { | 537 if (!entry) { |
| 544 NOTREACHED(); | 538 NOTREACHED(); |
| 545 callback.Run(SYNC_STATUS_FAILED); | 539 callback.Run(SYNC_STATUS_FAILED); |
| 546 return; | 540 return; |
| 547 } | 541 } |
| 548 | 542 |
| 549 metadata_database()->UpdateByFileResource(*entry, callback); | 543 metadata_database()->UpdateByFileResource(*entry, callback); |
| 550 } | 544 } |
| 551 | 545 |
| 552 void LocalToRemoteSyncer::DidDeleteForUploadNewFile( | 546 void LocalToRemoteSyncer::DidDeleteForUploadNewFile( |
| 553 const SyncStatusCallback& callback, | 547 scoped_ptr<SyncTaskToken> token, |
| 554 SyncStatusCode status) { | 548 SyncStatusCode status) { |
| 555 if (status == SYNC_STATUS_HAS_CONFLICT) { | 549 if (status == SYNC_STATUS_HAS_CONFLICT) { |
| 556 UpdateRemoteMetadata(remote_file_tracker_->file_id(), | 550 UpdateRemoteMetadata( |
| 557 base::Bind(&ReturnRetryOnSuccess, callback)); | 551 remote_file_tracker_->file_id(), |
| 552 base::Bind(&ReturnRetryOnSuccess, |
| 553 base::Bind(&LocalToRemoteSyncer::SyncCompleted, |
| 554 weak_ptr_factory_.GetWeakPtr(), |
| 555 base::Passed(&token)))); |
| 558 return; | 556 return; |
| 559 } | 557 } |
| 560 | 558 |
| 561 if (status != SYNC_STATUS_OK) { | 559 if (status != SYNC_STATUS_OK) { |
| 562 callback.Run(status); | 560 SyncCompleted(token.Pass(), status); |
| 563 return; | 561 return; |
| 564 } | 562 } |
| 565 | 563 |
| 566 UploadNewFile(callback); | 564 UploadNewFile(token.Pass()); |
| 567 } | 565 } |
| 568 | 566 |
| 569 void LocalToRemoteSyncer::DidDeleteForCreateFolder( | 567 void LocalToRemoteSyncer::DidDeleteForCreateFolder( |
| 570 scoped_ptr<SyncTaskToken> token, | 568 scoped_ptr<SyncTaskToken> token, |
| 571 SyncStatusCode status) { | 569 SyncStatusCode status) { |
| 572 if (status == SYNC_STATUS_HAS_CONFLICT) { | 570 if (status == SYNC_STATUS_HAS_CONFLICT) { |
| 573 UpdateRemoteMetadata( | 571 UpdateRemoteMetadata( |
| 574 remote_file_tracker_->file_id(), | 572 remote_file_tracker_->file_id(), |
| 575 base::Bind(&ReturnRetryOnSuccess, | 573 base::Bind(&ReturnRetryOnSuccess, |
| 576 base::Bind(&LocalToRemoteSyncer::SyncCompleted, | 574 base::Bind(&LocalToRemoteSyncer::SyncCompleted, |
| 577 weak_ptr_factory_.GetWeakPtr(), | 575 weak_ptr_factory_.GetWeakPtr(), |
| 578 base::Passed(&token)))); | 576 base::Passed(&token)))); |
| 579 return; | 577 return; |
| 580 } | 578 } |
| 581 | 579 |
| 582 if (status != SYNC_STATUS_OK) { | 580 if (status != SYNC_STATUS_OK) { |
| 583 SyncCompleted(token.Pass(), status); | 581 SyncCompleted(token.Pass(), status); |
| 584 return; | 582 return; |
| 585 } | 583 } |
| 586 | 584 |
| 587 CreateRemoteFolder(token.Pass()); | 585 CreateRemoteFolder(token.Pass()); |
| 588 } | 586 } |
| 589 | 587 |
| 590 void LocalToRemoteSyncer::UploadNewFile(const SyncStatusCallback& callback) { | 588 void LocalToRemoteSyncer::UploadNewFile(scoped_ptr<SyncTaskToken> token) { |
| 591 DCHECK(remote_parent_folder_tracker_); | 589 DCHECK(remote_parent_folder_tracker_); |
| 592 | 590 |
| 593 sync_action_ = SYNC_ACTION_ADDED; | 591 sync_action_ = SYNC_ACTION_ADDED; |
| 594 base::FilePath title = fileapi::VirtualPath::BaseName(target_path_); | 592 base::FilePath title = fileapi::VirtualPath::BaseName(target_path_); |
| 595 drive_uploader()->UploadNewFile( | 593 drive_uploader()->UploadNewFile( |
| 596 remote_parent_folder_tracker_->file_id(), | 594 remote_parent_folder_tracker_->file_id(), |
| 597 local_path_, | 595 local_path_, |
| 598 title.AsUTF8Unsafe(), | 596 title.AsUTF8Unsafe(), |
| 599 GetMimeTypeFromTitle(title), | 597 GetMimeTypeFromTitle(title), |
| 600 drive::DriveUploader::UploadNewFileOptions(), | 598 drive::DriveUploader::UploadNewFileOptions(), |
| 601 base::Bind(&LocalToRemoteSyncer::DidUploadNewFile, | 599 base::Bind(&LocalToRemoteSyncer::DidUploadNewFile, |
| 602 weak_ptr_factory_.GetWeakPtr(), | 600 weak_ptr_factory_.GetWeakPtr(), |
| 603 callback), | 601 base::Passed(&token)), |
| 604 google_apis::ProgressCallback()); | 602 google_apis::ProgressCallback()); |
| 605 } | 603 } |
| 606 | 604 |
| 607 void LocalToRemoteSyncer::DidUploadNewFile( | 605 void LocalToRemoteSyncer::DidUploadNewFile( |
| 608 const SyncStatusCallback& callback, | 606 scoped_ptr<SyncTaskToken> token, |
| 609 google_apis::GDataErrorCode error, | 607 google_apis::GDataErrorCode error, |
| 610 const GURL& upload_location, | 608 const GURL& upload_location, |
| 611 scoped_ptr<google_apis::FileResource> entry) { | 609 scoped_ptr<google_apis::FileResource> entry) { |
| 612 if (error == google_apis::HTTP_NOT_FOUND) | 610 if (error == google_apis::HTTP_NOT_FOUND) |
| 613 needs_remote_change_listing_ = true; | 611 needs_remote_change_listing_ = true; |
| 614 | 612 |
| 615 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); | 613 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); |
| 616 if (status != SYNC_STATUS_OK) { | 614 if (status != SYNC_STATUS_OK) { |
| 617 callback.Run(status); | 615 SyncCompleted(token.Pass(), status); |
| 618 return; | 616 return; |
| 619 } | 617 } |
| 620 | 618 |
| 621 if (!entry) { | 619 if (!entry) { |
| 622 NOTREACHED(); | 620 NOTREACHED(); |
| 623 callback.Run(SYNC_STATUS_FAILED); | 621 SyncCompleted(token.Pass(), SYNC_STATUS_FAILED); |
| 624 return; | 622 return; |
| 625 } | 623 } |
| 626 | 624 |
| 627 metadata_database()->ReplaceActiveTrackerWithNewResource( | 625 metadata_database()->ReplaceActiveTrackerWithNewResource( |
| 628 remote_parent_folder_tracker_->tracker_id(), *entry, callback); | 626 remote_parent_folder_tracker_->tracker_id(), *entry, |
| 627 base::Bind(&LocalToRemoteSyncer::SyncCompleted, |
| 628 weak_ptr_factory_.GetWeakPtr(), |
| 629 base::Passed(&token))); |
| 629 } | 630 } |
| 630 | 631 |
| 631 void LocalToRemoteSyncer::CreateRemoteFolder( | 632 void LocalToRemoteSyncer::CreateRemoteFolder( |
| 632 scoped_ptr<SyncTaskToken> token) { | 633 scoped_ptr<SyncTaskToken> token) { |
| 633 DCHECK(remote_parent_folder_tracker_); | 634 DCHECK(remote_parent_folder_tracker_); |
| 634 | 635 |
| 635 base::FilePath title = fileapi::VirtualPath::BaseName(target_path_); | 636 base::FilePath title = fileapi::VirtualPath::BaseName(target_path_); |
| 636 sync_action_ = SYNC_ACTION_ADDED; | 637 sync_action_ = SYNC_ACTION_ADDED; |
| 637 | 638 |
| 638 DCHECK(!folder_creator_); | 639 DCHECK(!folder_creator_); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 671 // The task will be finalized by the callback passed to MetadataDatabase | 672 // The task will be finalized by the callback passed to MetadataDatabase |
| 672 // in this case. | 673 // in this case. |
| 673 return; | 674 return; |
| 674 case MetadataDatabase::ACTIVATION_FAILED_ANOTHER_ACTIVE_TRACKER: | 675 case MetadataDatabase::ACTIVATION_FAILED_ANOTHER_ACTIVE_TRACKER: |
| 675 // The activation failed due to another tracker that has another parent. | 676 // The activation failed due to another tracker that has another parent. |
| 676 // Detach the folder from the current parent to avoid using this folder as | 677 // Detach the folder from the current parent to avoid using this folder as |
| 677 // active folder. | 678 // active folder. |
| 678 drive_service()->RemoveResourceFromDirectory( | 679 drive_service()->RemoveResourceFromDirectory( |
| 679 remote_parent_folder_tracker_->file_id(), file_id, | 680 remote_parent_folder_tracker_->file_id(), file_id, |
| 680 base::Bind(&LocalToRemoteSyncer::DidDetachResourceForCreationConflict, | 681 base::Bind(&LocalToRemoteSyncer::DidDetachResourceForCreationConflict, |
| 681 weak_ptr_factory_.GetWeakPtr(), | 682 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token))); |
| 682 base::Bind(&LocalToRemoteSyncer::SyncCompleted, | |
| 683 weak_ptr_factory_.GetWeakPtr(), | |
| 684 base::Passed(&token)))); | |
| 685 return; | 683 return; |
| 686 } | 684 } |
| 687 | 685 |
| 688 NOTREACHED(); | 686 NOTREACHED(); |
| 689 SyncCompleted(token.Pass(), SYNC_STATUS_FAILED); | 687 SyncCompleted(token.Pass(), SYNC_STATUS_FAILED); |
| 690 return; | 688 return; |
| 691 } | 689 } |
| 692 | 690 |
| 693 void LocalToRemoteSyncer::DidDetachResourceForCreationConflict( | 691 void LocalToRemoteSyncer::DidDetachResourceForCreationConflict( |
| 694 const SyncStatusCallback& callback, | 692 scoped_ptr<SyncTaskToken> token, |
| 695 google_apis::GDataErrorCode error) { | 693 google_apis::GDataErrorCode error) { |
| 696 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); | 694 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); |
| 697 if (status != SYNC_STATUS_OK) { | 695 if (status != SYNC_STATUS_OK) { |
| 698 callback.Run(status); | 696 SyncCompleted(token.Pass(), status); |
| 699 return; | 697 return; |
| 700 } | 698 } |
| 701 | 699 |
| 702 callback.Run(SYNC_STATUS_RETRY); | 700 SyncCompleted(token.Pass(), SYNC_STATUS_RETRY); |
| 703 } | 701 } |
| 704 | 702 |
| 705 bool LocalToRemoteSyncer::IsContextReady() { | 703 bool LocalToRemoteSyncer::IsContextReady() { |
| 706 return sync_context_->GetDriveService() && | 704 return sync_context_->GetDriveService() && |
| 707 sync_context_->GetDriveUploader() && | 705 sync_context_->GetDriveUploader() && |
| 708 sync_context_->GetMetadataDatabase(); | 706 sync_context_->GetMetadataDatabase(); |
| 709 } | 707 } |
| 710 | 708 |
| 711 drive::DriveServiceInterface* LocalToRemoteSyncer::drive_service() { | 709 drive::DriveServiceInterface* LocalToRemoteSyncer::drive_service() { |
| 712 set_used_network(true); | 710 set_used_network(true); |
| 713 return sync_context_->GetDriveService(); | 711 return sync_context_->GetDriveService(); |
| 714 } | 712 } |
| 715 | 713 |
| 716 drive::DriveUploaderInterface* LocalToRemoteSyncer::drive_uploader() { | 714 drive::DriveUploaderInterface* LocalToRemoteSyncer::drive_uploader() { |
| 717 set_used_network(true); | 715 set_used_network(true); |
| 718 return sync_context_->GetDriveUploader(); | 716 return sync_context_->GetDriveUploader(); |
| 719 } | 717 } |
| 720 | 718 |
| 721 MetadataDatabase* LocalToRemoteSyncer::metadata_database() { | 719 MetadataDatabase* LocalToRemoteSyncer::metadata_database() { |
| 722 return sync_context_->GetMetadataDatabase(); | 720 return sync_context_->GetMetadataDatabase(); |
| 723 } | 721 } |
| 724 | 722 |
| 725 } // namespace drive_backend | 723 } // namespace drive_backend |
| 726 } // namespace sync_file_system | 724 } // namespace sync_file_system |
| OLD | NEW |