Home | History | Annotate | Download | only in drive_backend
      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