local_file_sync_context.h revision d0247b1b59f9c528cb6df88b4f2b9afaf80d181e
190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// 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_CONTEXT_H_ 62385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#define CHROME_BROWSER_SYNC_FILE_SYSTEM_LOCAL_LOCAL_FILE_SYNC_CONTEXT_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <deque> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/observer_list.h" 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/timer.h" 222385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "chrome/browser/sync_file_system/local/local_file_sync_status.h" 232385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "chrome/browser/sync_file_system/sync_callbacks.h" 242385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "chrome/browser/sync_file_system/sync_status_code.h" 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SingleThreadTaskRunner; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace fileapi { 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FileSystemContext; 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FileSystemURL; 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 36d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)namespace webkit_blob { 37d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class ScopedFile; 38d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 39d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace sync_file_system { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FileChange; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LocalFileChangeTracker; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct LocalFileSyncInfo; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LocalOriginChangeObserver; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SyncableFileOperationRunner; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class works as a bridge between LocalFileSyncService (which is a 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// per-profile object) and FileSystemContext's (which is a per-storage-partition 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// object and may exist multiple in a profile). 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An instance of this class is shared by FileSystemContexts and outlives 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LocalFileSyncService. 532385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochclass LocalFileSyncContext 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public base::RefCountedThreadSafe<LocalFileSyncContext>, 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public LocalFileSyncStatus::Observer { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 57d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) enum SyncMode { 58d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) SYNC_EXCLUSIVE, 59d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) SYNC_SNAPSHOT, 60d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) }; 61d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef base::Callback<void( 63d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) SyncStatusCode status, 64d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const LocalFileSyncInfo& sync_file_info, 65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_ptr<webkit_blob::ScopedFile> snapshot)> 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LocalFileSyncInfoCallback; 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef base::Callback<void(SyncStatusCode status, 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool has_pending_changes)> 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HasPendingLocalChangeCallback; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) LocalFileSyncContext(const base::FilePath& base_path, 73d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::SingleThreadTaskRunner* ui_task_runner, 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SingleThreadTaskRunner* io_task_runner); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 76868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Initializes |file_system_context| for syncable file operations 77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // and registers the it into the internal map. 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calling this multiple times for the same file_system_context is valid. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This method must be called on UI thread. 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void MaybeInitializeFileSystemContext( 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& source_url, 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fileapi::FileSystemContext* file_system_context, 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SyncStatusCallback& callback); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when the corresponding LocalFileSyncService exits. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This method must be called on UI thread. 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ShutdownOnUIThread(); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Picks a file for next local sync and returns it after disabling writes 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for the file. 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This method must be called on UI thread. 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void GetFileForLocalSync(fileapi::FileSystemContext* file_system_context, 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LocalFileSyncInfoCallback& callback); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Clears all pending local changes for |url|. |done_callback| is called 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // when the changes are cleared. 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This method must be called on UI thread. 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ClearChangesForURL(fileapi::FileSystemContext* file_system_context, 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const fileapi::FileSystemURL& url, 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Closure& done_callback); 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 102d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Updates the on-disk dirty flag for |url| in the tracker DB. 103d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // This will clear the dirty flag if |sync_finish_status| is SYNC_STATUS_OK 104d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // or SYNC_STATUS_HAS_CONFLICT. 105d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // |done_callback| is called when the changes are committed. 106d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) void CommitChangeStatusForURL( 107d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) fileapi::FileSystemContext* file_system_context, 108d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const fileapi::FileSystemURL& url, 109d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) SyncStatusCode sync_finish_status, 110d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const base::Closure& done_callback); 111d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A local or remote sync has been finished (either successfully or 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // with an error). Clears the internal sync flag and enable writing for |url|. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This method must be called on UI thread. 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ClearSyncFlagForURL(const fileapi::FileSystemURL& url); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Prepares for sync |url| by disabling writes on |url|. 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the target |url| is being written and cannot start sync it 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // returns SYNC_STATUS_WRITING status code via |callback|. 120d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Otherwise returns the current change sets made on |url|. 121d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // 122d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // If |sync_mode| is SYNC_EXCLUSIVE this leaves the target file. 123d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // If |sync_mode| is SYNC_SNAPSHOT this creates a snapshot (if the 124d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // target file is not deleted) and unlocks the file before returning. 125d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This method must be called on UI thread. 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void PrepareForSync(fileapi::FileSystemContext* file_system_context, 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const fileapi::FileSystemURL& url, 129d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) SyncMode sync_mode, 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LocalFileSyncInfoCallback& callback); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Registers |url| to wait until sync is enabled for |url|. 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |on_syncable_callback| is to be called when |url| becomes syncable 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (i.e. when we have no pending writes and the file is successfully locked 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for sync). 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calling this method again while this already has another URL waiting 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for sync will overwrite the previously registered URL. 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This method must be called on UI thread. 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RegisterURLForWaitingSync(const fileapi::FileSystemURL& url, 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Closure& on_syncable_callback); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Applies a remote change. 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This method must be called on UI thread. 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ApplyRemoteChange( 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fileapi::FileSystemContext* file_system_context, 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FileChange& change, 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& local_path, 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const fileapi::FileSystemURL& url, 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SyncStatusCallback& callback); 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Records a fake local change in the local change tracker. 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RecordFakeLocalChange( 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fileapi::FileSystemContext* file_system_context, 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const fileapi::FileSystemURL& url, 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FileChange& change, 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SyncStatusCallback& callback); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This must be called on UI thread. 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GetFileMetadata( 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fileapi::FileSystemContext* file_system_context, 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const fileapi::FileSystemURL& url, 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SyncFileMetadataCallback& callback); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns true via |callback| if the given file |url| has local pending 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // changes. 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void HasPendingLocalChanges( 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fileapi::FileSystemContext* file_system_context, 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const fileapi::FileSystemURL& url, 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const HasPendingLocalChangeCallback& callback); 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // They must be called on UI thread. 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddOriginChangeObserver(LocalOriginChangeObserver* observer); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RemoveOriginChangeObserver(LocalOriginChangeObserver* observer); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OperationRunner is accessible only on IO thread. 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WeakPtr<SyncableFileOperationRunner> operation_runner() const; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SyncContext is accessible only on IO thread. 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocalFileSyncStatus* sync_status() const; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For testing; override the duration to notify changes from the 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // default value. 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_mock_notify_changes_duration_in_sec(int duration) { 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_notify_changes_duration_in_sec_ = duration; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // LocalFileSyncStatus::Observer overrides. They are called on IO thread. 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnSyncEnabled(const fileapi::FileSystemURL& url) OVERRIDE; 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnWriteEnabled(const fileapi::FileSystemURL& url) OVERRIDE; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) typedef base::Callback<void(base::PlatformFileError result)> StatusCallback; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::deque<SyncStatusCallback> StatusCallbackQueue; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::RefCountedThreadSafe<LocalFileSyncContext>; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class CannedSyncableFileSystem; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~LocalFileSyncContext(); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ShutdownOnIOThread(); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Starts a timer to eventually call NotifyAvailableChangesOnIOThread. 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The caller is expected to update origins_with_pending_changes_ before 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // calling this. 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ScheduleNotifyChangesUpdatedOnIOThread(); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called by the internal timer on IO thread to notify changes to UI thread. 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NotifyAvailableChangesOnIOThread(); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called from NotifyAvailableChangesOnIOThread. 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NotifyAvailableChanges(const std::set<GURL>& origins); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper routines for MaybeInitializeFileSystemContext. 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void InitializeFileSystemContextOnIOThread( 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& source_url, 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fileapi::FileSystemContext* file_system_context); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncStatusCode InitializeChangeTrackerOnFileThread( 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<LocalFileChangeTracker>* tracker_ptr, 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fileapi::FileSystemContext* file_system_context, 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::set<GURL>* origins_with_changes); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DidInitializeChangeTrackerOnIOThread( 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<LocalFileChangeTracker>* tracker_ptr, 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& source_url, 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fileapi::FileSystemContext* file_system_context, 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::set<GURL>* origins_with_changes, 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncStatusCode status); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DidInitialize( 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& source_url, 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fileapi::FileSystemContext* file_system_context, 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncStatusCode status); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper routines for GetFileForLocalSync. 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GetNextURLsForSyncOnFileThread( 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fileapi::FileSystemContext* file_system_context, 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::deque<fileapi::FileSystemURL>* urls); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void TryPrepareForLocalSync( 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fileapi::FileSystemContext* file_system_context, 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::deque<fileapi::FileSystemURL>* urls, 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LocalFileSyncInfoCallback& callback); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DidTryPrepareForLocalSync( 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fileapi::FileSystemContext* file_system_context, 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::deque<fileapi::FileSystemURL>* remaining_urls, 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LocalFileSyncInfoCallback& callback, 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncStatusCode status, 247d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const LocalFileSyncInfo& sync_file_info, 248d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_ptr<webkit_blob::ScopedFile> snapshot); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback routine for PrepareForSync and GetFileForLocalSync. 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DidGetWritingStatusForSync( 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fileapi::FileSystemContext* file_system_context, 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncStatusCode status, 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const fileapi::FileSystemURL& url, 255d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) SyncMode sync_mode, 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LocalFileSyncInfoCallback& callback); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 258d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Helper routine for sync/writing flag handling, primarily for 259d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // ClearSyncFlagForURL but is also called by other internal routines. 260d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // If |keep_url_in_writing| is true this increments the writing counter 261d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // for |url| (after clearing syncing flag), so that the caller can 262d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // continue to hold a shared lock on the URL. 263d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // (The counter must be manually decremented by EndWritingOnIOThread 264d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // if that's the case) 265d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) void ClearSyncFlagOnIOThread(const fileapi::FileSystemURL& url, 266d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) bool keep_url_in_writing); 267d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) void EndWritingOnIOThread(const fileapi::FileSystemURL& url); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void DidRemoveExistingEntryForApplyRemoteChange( 270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fileapi::FileSystemContext* file_system_context, 271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const FileChange& change, 272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath& local_path, 273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const fileapi::FileSystemURL& url, 274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const SyncStatusCallback& callback, 275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::PlatformFileError error); 276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback routine for ApplyRemoteChange. 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DidApplyRemoteChange( 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const fileapi::FileSystemURL& url, 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SyncStatusCallback& callback_on_ui, 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::PlatformFileError file_error); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DidGetFileMetadata( 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SyncFileMetadataCallback& callback, 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::PlatformFileError file_error, 2867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::PlatformFileInfo& file_info); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta NotifyChangesDuration(); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void DidCreateDirectoryForCopyIn( 291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fileapi::FileSystemContext* file_system_context, 292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath& local_file_path, 293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const fileapi::FileSystemURL& dest_url, 294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const StatusCallback& callback, 295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::PlatformFileError error); 296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 297d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const base::FilePath local_base_path_; 298d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Indicates if the sync service is shutdown on UI thread. 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool shutdown_on_ui_; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OperationRunner. This must be accessed only on IO thread. 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<SyncableFileOperationRunner> operation_runner_; 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keeps track of writing/syncing status. 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This must be accessed only on IO thread. 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<LocalFileSyncStatus> sync_status_; 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pointers to file system contexts that have been initialized for 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // synchronization (i.e. that own this instance). 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This must be accessed only on UI thread. 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::set<fileapi::FileSystemContext*> file_system_contexts_; 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Accessed only on UI thread. 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::map<fileapi::FileSystemContext*, StatusCallbackQueue> 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_initialize_callbacks_; 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A URL and associated callback waiting for sync is enabled. 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Accessed only on IO thread. 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fileapi::FileSystemURL url_waiting_sync_on_io_; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Closure url_syncable_callback_; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used only on IO thread for available changes notifications. 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time last_notified_changes_; 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::OneShotTimer<LocalFileSyncContext> > timer_on_io_; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<GURL> origins_with_pending_changes_; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObserverList<LocalOriginChangeObserver> origin_change_observers_; 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int mock_notify_changes_duration_in_sec_; 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(LocalFileSyncContext); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace sync_file_system 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3402385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#endif // CHROME_BROWSER_SYNC_FILE_SYSTEM_LOCAL_LOCAL_FILE_SYNC_CONTEXT_H_ 341