15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_SYNC_FILE_SYSTEM_SYNC_FILE_SYSTEM_SERVICE_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_SYNC_FILE_SYSTEM_SYNC_FILE_SYSTEM_SERVICE_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include <map>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback_forward.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/memory/scoped_vector.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/weak_ptr.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/observer_list.h"
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/timer.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_observer.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sync_file_system/conflict_resolution_policy.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sync_file_system/file_status_observer.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync_file_system/remote_file_sync_service.h"
222385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "chrome/browser/sync_file_system/sync_callbacks.h"
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/sync_file_system/sync_process_runner.h"
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/sync_file_system/sync_service_state.h"
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/sync_file_system/task_logger.h"
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/keyed_service/core/keyed_service.h"
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/browser/extension_registry_observer.h"
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class Profile;
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ProfileSyncServiceBase;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace storage {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FileSystemContext;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace sync_file_system {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class LocalFileSyncService;
40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class LocalSyncRunner;
41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class RemoteSyncRunner;
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SyncEventObserver;
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SyncFileSystemService
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : public KeyedService,
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      public SyncProcessRunner::Client,
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      public ProfileSyncServiceObserver,
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      public FileStatusObserver,
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      public extensions::ExtensionRegistryObserver,
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      public base::SupportsWeakPtr<SyncFileSystemService> {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  typedef base::Callback<void(const base::ListValue&)> DumpFilesCallback;
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  typedef base::Callback<void(const RemoteFileSyncService::OriginStatusMap&)>
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ExtensionStatusMapCallback;
557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // KeyedService implementation.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Shutdown() OVERRIDE;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void InitializeForApp(storage::FileSystemContext* file_system_context,
6003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                        const GURL& app_origin,
6103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                        const SyncStatusCallback& callback);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void GetExtensionStatusMap(const ExtensionStatusMapCallback& callback);
647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void DumpFiles(const GURL& origin, const DumpFilesCallback& callback);
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void DumpDatabase(const DumpFilesCallback& callback);
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns the file |url|'s sync status.
6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void GetFileSyncStatus(const storage::FileSystemURL& url,
6903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                         const SyncFileStatusCallback& callback);
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AddSyncEventObserver(SyncEventObserver* observer);
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RemoveSyncEventObserver(SyncEventObserver* observer);
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  LocalChangeProcessor* GetLocalChangeProcessor(const GURL& origin);
75d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // SyncProcessRunner::Client implementations.
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void OnSyncIdle() OVERRIDE;
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual SyncServiceState GetSyncServiceState() OVERRIDE;
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual SyncFileSystemService* GetSyncService() OVERRIDE;
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void OnPromotionCompleted(int* num_running_jobs);
8203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void CheckIfIdle();
8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  TaskLogger* task_logger() { return &task_logger_; }
85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void CallOnIdleForTesting(const base::Closure& callback);
8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) private:
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class SyncFileSystemServiceFactory;
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class SyncFileSystemServiceTest;
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  friend class SyncFileSystemTest;
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend struct base::DefaultDeleter<SyncFileSystemService>;
93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  friend class LocalSyncRunner;
94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  friend class RemoteSyncRunner;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit SyncFileSystemService(Profile* profile);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SyncFileSystemService();
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Initialize(scoped_ptr<LocalFileSyncService> local_file_service,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  scoped_ptr<RemoteFileSyncService> remote_file_service);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Callbacks for InitializeForApp.
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DidInitializeFileSystem(const GURL& app_origin,
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               const SyncStatusCallback& callback,
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               SyncStatusCode status);
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DidRegisterOrigin(const GURL& app_origin,
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         const SyncStatusCallback& callback,
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         SyncStatusCode status);
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void DidInitializeFileSystemForDump(const GURL& app_origin,
1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                      const DumpFilesCallback& callback,
1127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                      SyncStatusCode status);
113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void DidDumpFiles(const GURL& app_origin,
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                    const DumpFilesCallback& callback,
115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                    scoped_ptr<base::ListValue> files);
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void DidDumpDatabase(const DumpFilesCallback& callback,
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                       scoped_ptr<base::ListValue> list);
119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void DidGetExtensionStatusMap(
121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const ExtensionStatusMapCallback& callback,
122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      scoped_ptr<RemoteFileSyncService::OriginStatusMap> status_map);
1237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overrides sync_enabled_ setting. This should be called only by tests.
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetSyncEnabledForTesting(bool enabled);
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DidGetLocalChangeStatus(const SyncFileStatusCallback& callback,
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               SyncStatusCode status,
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               bool has_pending_local_changes);
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
131a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void OnRemoteServiceStateUpdated(RemoteServiceState state,
132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                   const std::string& description);
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // extensions::ExtensionRegistryObserver implementations.
135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void OnExtensionInstalled(
136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content::BrowserContext* browser_context,
137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const extensions::Extension* extension,
138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      bool is_update) OVERRIDE;
139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void OnExtensionUnloaded(
140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content::BrowserContext* browser_context,
141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const extensions::Extension* extension,
142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      extensions::UnloadedExtensionInfo::Reason reason) OVERRIDE;
143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void OnExtensionUninstalled(
144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content::BrowserContext* browser_context,
1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      const extensions::Extension* extension,
1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::UninstallReason reason) OVERRIDE;
147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void OnExtensionLoaded(
148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content::BrowserContext* browser_context,
149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const extensions::Extension* extension) OVERRIDE;
150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // ProfileSyncServiceObserver implementation.
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnStateChanged() OVERRIDE;
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // SyncFileStatusObserver implementation.
15503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  virtual void OnFileStatusChanged(const storage::FileSystemURL& url,
15603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                   SyncFileStatus sync_status,
15703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                   SyncAction action_taken,
15803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                   SyncDirection direction) OVERRIDE;
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check the profile's sync preference settings and call
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // remote_file_service_->SetSyncEnabled() to update the status.
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |profile_sync_service| must be non-null.
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UpdateSyncEnabledStatus(ProfileSyncServiceBase* profile_sync_service);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Runs the SyncProcessRunner method of all sync runners (e.g. for Local sync
166a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // and Remote sync).
167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void RunForEachSyncRunners(void(SyncProcessRunner::*method)());
168a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
169a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Returns the appropriate RemoteFileSyncService for the given origin/app.
170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // (crbug.com/324215)
171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  RemoteFileSyncService* GetRemoteService(const GURL& origin);
172a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile_;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  scoped_ptr<LocalFileSyncService> local_service_;
176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  scoped_ptr<RemoteFileSyncService> remote_service_;
177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
178a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Holds all SyncProcessRunners.
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ScopedVector<SyncProcessRunner> local_sync_runners_;
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ScopedVector<SyncProcessRunner> remote_sync_runners_;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Indicates if sync is currently enabled or not.
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool sync_enabled_;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  TaskLogger task_logger_;
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ObserverList<SyncEventObserver> observers_;
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  bool promoting_demoted_changes_;
18903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  base::Closure idle_callback_;
19003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SyncFileSystemService);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace sync_file_system
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_SYNC_FILE_SYSTEM_SYNC_FILE_SYSTEM_SERVICE_H_
197