Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(72)

Side by Side Diff: chrome/browser/sync_file_system/drive_backend/local_to_remote_syncer.cc

Issue 330283002: [SyncFS] Replace callback with token in UploadNewFile (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/sync_file_system/drive_backend/local_to_remote_syncer.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « chrome/browser/sync_file_system/drive_backend/local_to_remote_syncer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698