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