Home | History | Annotate | Download | only in sync_file_system
      1 // Copyright (c) 2012 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_REMOTE_CHANGE_PROCESSOR_H_
      6 #define CHROME_BROWSER_SYNC_FILE_SYSTEM_REMOTE_CHANGE_PROCESSOR_H_
      7 
      8 #include "base/basictypes.h"
      9 #include "base/callback_forward.h"
     10 #include "chrome/browser/sync_file_system/sync_callbacks.h"
     11 #include "chrome/browser/sync_file_system/sync_status_code.h"
     12 
     13 namespace base {
     14 class FilePath;
     15 }
     16 
     17 namespace fileapi {
     18 class FileSystemURL;
     19 }
     20 
     21 namespace sync_file_system {
     22 
     23 class FileChange;
     24 class FileChangeList;
     25 class SyncFileMetadata;
     26 
     27 // Represents an interface to process one remote change and applies
     28 // it to the local file system.
     29 // This interface is to be implemented/backed by LocalSyncFileService.
     30 class RemoteChangeProcessor {
     31  public:
     32   // Callback type for PrepareForProcessRemoteChange.
     33   // |file_type| indicates the current file/directory type of the target
     34   // URL in the local filesystem. If the target URL does not exist it is
     35   // set to SYNC_FILE_TYPE_UNKNOWN.
     36   // |changes| indicates a set of pending changes for the target URL.
     37   typedef base::Callback<void(
     38       SyncStatusCode status,
     39       const SyncFileMetadata& metadata,
     40       const FileChangeList& changes)> PrepareChangeCallback;
     41 
     42   RemoteChangeProcessor() {}
     43   virtual ~RemoteChangeProcessor() {}
     44 
     45   // This must be called before processing the change for the |url|.
     46   // This tries to lock the target |url| and returns the local changes
     47   // if any. (The change returned by the callback is to make a decision
     48   // on conflict resolution, but NOT for applying local changes to the remote,
     49   // which is supposed to be done by LocalChangeProcessor)
     50   virtual void PrepareForProcessRemoteChange(
     51       const fileapi::FileSystemURL& url,
     52       const PrepareChangeCallback& callback) = 0;
     53 
     54   // This is called to apply the remote |change|. If the change type is
     55   // ADD_OR_UPDATE for a file, |local_path| needs to point to a
     56   // local file path that contains the latest file image (e.g. a path
     57   // to a temporary file which has the data downloaded from the server).
     58   // This may fail with an error but should NOT result in a conflict
     59   // (as we must have checked the change status in PrepareRemoteSync and
     60   // have disabled any further writing).
     61   virtual void ApplyRemoteChange(
     62       const FileChange& change,
     63       const base::FilePath& local_path,
     64       const fileapi::FileSystemURL& url,
     65       const SyncStatusCallback& callback) = 0;
     66 
     67   // Finalizes the remote sync started by PrepareForProcessRemoteChange.
     68   // This clears sync flag on |url| to unlock the file for future writes/sync.
     69   // Clears all local changes if |clear_local_changes| is true.
     70   // This should be set to true when the remote sync service reconciled or
     71   // processed the existing local changes while processing a remote change.
     72   virtual void FinalizeRemoteSync(
     73       const fileapi::FileSystemURL& url,
     74       bool clear_local_changes,
     75       const base::Closure& completion_callback) = 0;
     76 
     77   // Records a fake local change so that the change will be processed in the
     78   // next local sync.
     79   // This is called when the remote side wants to trigger a local sync
     80   // to propagate the local change to the remote change (e.g. to
     81   // resolve a conflict by uploading the local file).
     82   virtual void RecordFakeLocalChange(
     83       const fileapi::FileSystemURL& url,
     84       const FileChange& change,
     85       const SyncStatusCallback& callback) = 0;
     86 
     87  private:
     88   DISALLOW_COPY_AND_ASSIGN(RemoteChangeProcessor);
     89 };
     90 
     91 }  // namespace sync_file_system
     92 
     93 #endif  // CHROME_BROWSER_SYNC_FILE_SYSTEM_REMOTE_CHANGE_PROCESSOR_H_
     94