12385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#ifndef CHROME_BROWSER_SYNC_FILE_SYSTEM_LOCAL_LOCAL_FILE_SYNC_SERVICE_H_
62385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#define CHROME_BROWSER_SYNC_FILE_SYSTEM_LOCAL_LOCAL_FILE_SYNC_SERVICE_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <set>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/observer_list.h"
172385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "chrome/browser/sync_file_system/local/local_origin_change_observer.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync_file_system/remote_change_processor.h"
192385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "chrome/browser/sync_file_system/sync_callbacks.h"
202385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "chrome/browser/sync_file_system/sync_status_code.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL;
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Profile;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace storage {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FileSystemContext;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace leveldb {
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class Env;
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace storage {
34d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class ScopedFile;
35d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
36d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace sync_file_system {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FileChange;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LocalChangeProcessor;
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LocalFileSyncContext;
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct LocalFileSyncInfo;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Maintains local file change tracker and sync status.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Owned by SyncFileSystemService (which is a per-profile object).
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LocalFileSyncService
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public RemoteChangeProcessor,
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      public LocalOriginChangeObserver,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public base::SupportsWeakPtr<LocalFileSyncService> {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  typedef base::Callback<LocalChangeProcessor*(const GURL& origin)>
52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      GetLocalChangeProcessorCallback;
53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class Observer {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Observer() {}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~Observer() {}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This is called when there're one or more local changes available.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |pending_changes_hint| indicates the pending queue length to help sync
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // scheduling but the value may not be accurately reflect the real-time
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // value.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void OnLocalChangeAvailable(int64 pending_changes_hint) = 0;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(Observer);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef base::Callback<void(SyncStatusCode status,
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              bool has_pending_changes)>
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      HasPendingLocalChangeCallback;
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static scoped_ptr<LocalFileSyncService> Create(Profile* profile);
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static scoped_ptr<LocalFileSyncService> CreateForTesting(
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Profile* profile,
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      leveldb::Env* env_override);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~LocalFileSyncService();
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Shutdown();
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MaybeInitializeFileSystemContext(
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& app_origin,
8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      storage::FileSystemContext* file_system_context,
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const SyncStatusCallback& callback);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddChangeObserver(Observer* observer);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Registers |url| to wait until sync is enabled for |url|.
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |on_syncable_callback| is to be called when |url| becomes syncable
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // (i.e. when we have no pending writes and the file is successfully locked
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // for sync).
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Calling this method again while this already has another URL waiting
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // for sync will overwrite the previously registered URL.
9403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void RegisterURLForWaitingSync(const storage::FileSystemURL& url,
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 const base::Closure& on_syncable_callback);
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Synchronize one (or a set of) local change(s) to the remote server
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // using local_change_processor given by SetLocalChangeProcessor().
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |processor| must have same or longer lifetime than this service.
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // It is invalid to call this method before calling SetLocalChangeProcessor().
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ProcessLocalChange(const SyncFileCallback& callback);
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Sets a local change processor. The value is ignored if
104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // SetLocalChangeProcessorCallback() is called separately.
105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Either this or SetLocalChangeProcessorCallback() must be called before
106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // any ProcessLocalChange().
107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void SetLocalChangeProcessor(LocalChangeProcessor* local_change_processor);
108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Sets a closure which gets a local change processor for the given origin.
110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Note that once this is called it overrides the direct processor setting
111a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // done by SetLocalChangeProcessor().
112a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Either this or SetLocalChangeProcessor() must be called before any
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ProcessLocalChange().
114a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  //
115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // TODO(kinuko): Remove this method once we stop using multiple backends
116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // (crbug.com/324215), or deprecate the other if we keep doing so.
117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void SetLocalChangeProcessorCallback(
118a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      const GetLocalChangeProcessorCallback& get_local_change_processor);
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns true via |callback| if the given file |url| has local pending
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // changes.
12203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void HasPendingLocalChanges(const storage::FileSystemURL& url,
12303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                              const HasPendingLocalChangeCallback& callback);
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void PromoteDemotedChanges(const base::Closure& callback);
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the metadata of a remote file pointed by |url|.
12803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  virtual void GetLocalFileMetadata(const storage::FileSystemURL& url,
12903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                    const SyncFileMetadataCallback& callback);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // RemoteChangeProcessor overrides.
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void PrepareForProcessRemoteChange(
13303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      const storage::FileSystemURL& url,
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const PrepareChangeCallback& callback) OVERRIDE;
13503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  virtual void ApplyRemoteChange(const FileChange& change,
13603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                 const base::FilePath& local_path,
13703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                 const storage::FileSystemURL& url,
13803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                 const SyncStatusCallback& callback) OVERRIDE;
1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void FinalizeRemoteSync(
14003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      const storage::FileSystemURL& url,
1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      bool clear_local_changes,
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::Closure& completion_callback) OVERRIDE;
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void RecordFakeLocalChange(
14403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      const storage::FileSystemURL& url,
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const FileChange& change,
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const SyncStatusCallback& callback) OVERRIDE;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // LocalOriginChangeObserver override.
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnChangesAvailableInOrigins(
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::set<GURL>& origins) OVERRIDE;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called when a particular origin (app) is disabled/enabled while
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the service is running. This may be called for origins/apps that
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // are not initialized for the service.
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetOriginEnabled(const GURL& origin, bool enabled);
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
15803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  typedef std::map<GURL, storage::FileSystemContext*> OriginToContext;
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class OriginChangeMapTest;
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class OriginChangeMap {
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    typedef std::map<GURL, int64> Map;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OriginChangeMap();
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~OriginChangeMap();
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Sets |origin| to the next origin to process. (For now we simply apply
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // round-robin to pick the next origin to avoid starvation.)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Returns false if no origins to process.
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool NextOriginToProcess(GURL* origin);
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 GetTotalChangeCount() const;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Update change_count_map_ for |origin|.
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void SetOriginChangeCount(const GURL& origin, int64 changes);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    void SetOriginEnabled(const GURL& origin, bool enabled);
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Per-origin changes (cached info, could be stale).
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Map change_count_map_;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Map::iterator next_;
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Holds a set of disabled (but initialized) origins.
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::set<GURL> disabled_origins_;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  LocalFileSyncService(Profile* profile, leveldb::Env* env_override);
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidInitializeFileSystemContext(
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& app_origin,
19303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      storage::FileSystemContext* file_system_context,
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const SyncStatusCallback& callback,
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SyncStatusCode status);
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DidInitializeForRemoteSync(
19703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      const storage::FileSystemURL& url,
19803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      storage::FileSystemContext* file_system_context,
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const PrepareChangeCallback& callback,
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SyncStatusCode status);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Runs local_sync_callback_ and resets it.
20303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void RunLocalSyncCallback(SyncStatusCode status,
20403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                            const storage::FileSystemURL& url);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
206a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Callback for ApplyRemoteChange.
207a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void DidApplyRemoteChange(
208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      const SyncStatusCallback& callback,
209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      SyncStatusCode status);
210a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callbacks for ProcessLocalChange.
21203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void DidGetFileForLocalSync(SyncStatusCode status,
21303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                              const LocalFileSyncInfo& sync_file_info,
21403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                              storage::ScopedFile snapshot);
21503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void ProcessNextChangeForURL(storage::ScopedFile snapshot,
21603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                               const LocalFileSyncInfo& sync_file_info,
21703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                               const FileChange& last_change,
21803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                               const FileChangeList& changes,
21903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                               SyncStatusCode status);
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // A thin wrapper of get_local_change_processor_.
222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  LocalChangeProcessor* GetLocalChangeProcessor(
22303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      const storage::FileSystemURL& url);
224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Profile* profile_;
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<LocalFileSyncContext> sync_context_;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Origin to context map. (Assuming that as far as we're in the same
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // profile single origin wouldn't belong to multiple FileSystemContexts.)
2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  OriginToContext origin_to_contexts_;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Origins which have pending changes but have not been initialized yet.
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // (Used only for handling dirty files left in the local tracker database
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // after a restart.)
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::set<GURL> pending_origins_with_changes_;
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OriginChangeMap origin_change_map_;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This callback is non-null while a local sync is running (i.e.
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ProcessLocalChange has been called and has not been returned yet).
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SyncFileCallback local_sync_callback_;
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LocalChangeProcessor* local_change_processor_;
245a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  GetLocalChangeProcessorCallback get_local_change_processor_;
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ObserverList<Observer> change_observers_;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(LocalFileSyncService);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace sync_file_system
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2542385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#endif  // CHROME_BROWSER_SYNC_FILE_SYSTEM_LOCAL_LOCAL_FILE_SYNC_SERVICE_H_
255