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 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_CONFLICT_RESOLVER_H_ 6 #define CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_CONFLICT_RESOLVER_H_ 7 8 #include <string> 9 #include <utility> 10 #include <vector> 11 12 #include "base/memory/scoped_ptr.h" 13 #include "base/memory/weak_ptr.h" 14 #include "chrome/browser/sync_file_system/drive_backend/sync_task.h" 15 #include "chrome/browser/sync_file_system/sync_callbacks.h" 16 #include "google_apis/drive/gdata_errorcode.h" 17 18 namespace drive { 19 class DriveServiceInterface; 20 } 21 22 namespace google_apis { 23 class FileResource; 24 } 25 26 namespace sync_file_system { 27 namespace drive_backend { 28 29 class MetadataDatabase; 30 class SyncEngineContext; 31 class TrackerIDSet; 32 33 // Resolves server side file confliction. 34 // If a remote file has an active tracker and multiple managed parents, 35 // ConflictResolver detaches the file from all parents other than the parent 36 // of the active tracker. 37 // If multiple trackers have the same local path or the same remote file, 38 // ConflictResolver picks up one of them and delete others. 39 class ConflictResolver : public SyncTask { 40 public: 41 typedef std::vector<std::string> FileIDList; 42 43 explicit ConflictResolver(SyncEngineContext* sync_context); 44 virtual ~ConflictResolver(); 45 virtual void RunPreflight(scoped_ptr<SyncTaskToken> token) OVERRIDE; 46 void RunExclusive(scoped_ptr<SyncTaskToken> token); 47 48 private: 49 typedef std::pair<std::string, std::string> FileIDAndETag; 50 51 void DetachFromNonPrimaryParents(scoped_ptr<SyncTaskToken> token); 52 void DidDetachFromParent(scoped_ptr<SyncTaskToken> token, 53 google_apis::GDataErrorCode error); 54 55 std::string PickPrimaryFile(const TrackerIDSet& trackers); 56 void RemoveNonPrimaryFiles(scoped_ptr<SyncTaskToken> token); 57 void DidRemoveFile(scoped_ptr<SyncTaskToken> token, 58 const std::string& file_id, 59 google_apis::GDataErrorCode error); 60 61 void UpdateFileMetadata(const std::string& file_id, 62 scoped_ptr<SyncTaskToken> token); 63 void DidGetRemoteMetadata(const std::string& file_id, 64 scoped_ptr<SyncTaskToken> token, 65 google_apis::GDataErrorCode error, 66 scoped_ptr<google_apis::FileResource> entry); 67 68 std::string target_file_id_; 69 std::vector<std::string> parents_to_remove_; 70 71 std::vector<FileIDAndETag> non_primary_file_ids_; 72 FileIDList deleted_file_ids_; 73 74 bool IsContextReady(); 75 drive::DriveServiceInterface* drive_service(); 76 MetadataDatabase* metadata_database(); 77 78 SyncEngineContext* sync_context_; // Not owned. 79 80 base::WeakPtrFactory<ConflictResolver> weak_ptr_factory_; 81 82 DISALLOW_COPY_AND_ASSIGN(ConflictResolver); 83 }; 84 85 } // namespace drive_backend 86 } // namespace sync_file_system 87 88 #endif // CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_CONFLICT_RESOLVER_H_ 89