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 |