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