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