Home | History | Annotate | Download | only in local
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_SYNC_FILE_SYSTEM_LOCAL_CANNED_SYNCABLE_FILE_SYSTEM_H_
      6 #define CHROME_BROWSER_SYNC_FILE_SYSTEM_LOCAL_CANNED_SYNCABLE_FILE_SYSTEM_H_
      7 
      8 #include <string>
      9 #include <vector>
     10 
     11 #include "base/callback_forward.h"
     12 #include "base/files/scoped_temp_dir.h"
     13 #include "base/message_loop/message_loop.h"
     14 #include "base/observer_list_threadsafe.h"
     15 #include "base/platform_file.h"
     16 #include "chrome/browser/sync_file_system/local/local_file_sync_status.h"
     17 #include "chrome/browser/sync_file_system/sync_status_code.h"
     18 #include "webkit/browser/fileapi/file_system_operation.h"
     19 #include "webkit/browser/fileapi/file_system_url.h"
     20 #include "webkit/browser/quota/quota_callbacks.h"
     21 #include "webkit/common/fileapi/file_system_types.h"
     22 #include "webkit/common/fileapi/file_system_util.h"
     23 #include "webkit/common/quota/quota_types.h"
     24 
     25 namespace base {
     26 class MessageLoopProxy;
     27 class SingleThreadTaskRunner;
     28 class Thread;
     29 }
     30 
     31 namespace fileapi {
     32 class FileSystemContext;
     33 class FileSystemOperationRunner;
     34 class FileSystemURL;
     35 }
     36 
     37 namespace net {
     38 class URLRequestContext;
     39 }
     40 
     41 namespace quota {
     42 class QuotaManager;
     43 }
     44 
     45 namespace sync_file_system {
     46 
     47 class LocalFileSyncContext;
     48 class SyncFileSystemBackend;
     49 
     50 // A canned syncable filesystem for testing.
     51 // This internally creates its own QuotaManager and FileSystemContext
     52 // (as we do so for each isolated application).
     53 class CannedSyncableFileSystem
     54     : public LocalFileSyncStatus::Observer {
     55  public:
     56   typedef base::Callback<void(base::PlatformFileError)> StatusCallback;
     57   typedef base::Callback<void(int64)> WriteCallback;
     58   typedef fileapi::FileSystemOperation::FileEntryList FileEntryList;
     59 
     60   CannedSyncableFileSystem(const GURL& origin,
     61                            base::SingleThreadTaskRunner* io_task_runner,
     62                            base::SingleThreadTaskRunner* file_task_runner);
     63   virtual ~CannedSyncableFileSystem();
     64 
     65   // SetUp must be called before using this instance.
     66   void SetUp();
     67 
     68   // TearDown must be called before destructing this instance.
     69   void TearDown();
     70 
     71   // Creates a FileSystemURL for the given (utf8) path string.
     72   fileapi::FileSystemURL URL(const std::string& path) const;
     73 
     74   // Initialize this with given |sync_context| if it hasn't
     75   // been initialized.
     76   sync_file_system::SyncStatusCode MaybeInitializeFileSystemContext(
     77       LocalFileSyncContext* sync_context);
     78 
     79   // Opens a new syncable file system.
     80   base::PlatformFileError OpenFileSystem();
     81 
     82   // Register sync status observers. Unlike original
     83   // LocalFileSyncStatus::Observer implementation the observer methods
     84   // are called on the same thread where AddSyncStatusObserver were called.
     85   void AddSyncStatusObserver(LocalFileSyncStatus::Observer* observer);
     86   void RemoveSyncStatusObserver(LocalFileSyncStatus::Observer* observer);
     87 
     88   // Accessors.
     89   fileapi::FileSystemContext* file_system_context() {
     90     return file_system_context_.get();
     91   }
     92   quota::QuotaManager* quota_manager() { return quota_manager_.get(); }
     93   GURL origin() const { return origin_; }
     94   fileapi::FileSystemType type() const { return type_; }
     95   quota::StorageType storage_type() const {
     96     return FileSystemTypeToQuotaStorageType(type_);
     97   }
     98 
     99   // Helper routines to perform file system operations.
    100   // OpenFileSystem() must have been called before calling any of them.
    101   // They create an operation and run it on IO task runner, and the operation
    102   // posts a task on file runner.
    103   base::PlatformFileError CreateDirectory(const fileapi::FileSystemURL& url);
    104   base::PlatformFileError CreateFile(const fileapi::FileSystemURL& url);
    105   base::PlatformFileError Copy(const fileapi::FileSystemURL& src_url,
    106                                const fileapi::FileSystemURL& dest_url);
    107   base::PlatformFileError Move(const fileapi::FileSystemURL& src_url,
    108                                const fileapi::FileSystemURL& dest_url);
    109   base::PlatformFileError TruncateFile(const fileapi::FileSystemURL& url,
    110                                        int64 size);
    111   base::PlatformFileError TouchFile(const fileapi::FileSystemURL& url,
    112                                     const base::Time& last_access_time,
    113                                     const base::Time& last_modified_time);
    114   base::PlatformFileError Remove(const fileapi::FileSystemURL& url,
    115                                  bool recursive);
    116   base::PlatformFileError FileExists(const fileapi::FileSystemURL& url);
    117   base::PlatformFileError DirectoryExists(const fileapi::FileSystemURL& url);
    118   base::PlatformFileError VerifyFile(const fileapi::FileSystemURL& url,
    119                                      const std::string& expected_data);
    120   base::PlatformFileError GetMetadataAndPlatformPath(
    121       const fileapi::FileSystemURL& url,
    122       base::PlatformFileInfo* info,
    123       base::FilePath* platform_path);
    124   base::PlatformFileError ReadDirectory(const fileapi::FileSystemURL& url,
    125                                         FileEntryList* entries);
    126 
    127   // Returns the # of bytes written (>=0) or an error code (<0).
    128   int64 Write(net::URLRequestContext* url_request_context,
    129               const fileapi::FileSystemURL& url, const GURL& blob_url);
    130   int64 WriteString(const fileapi::FileSystemURL& url, const std::string& data);
    131 
    132   // Purges the file system local storage.
    133   base::PlatformFileError DeleteFileSystem();
    134 
    135   // Retrieves the quota and usage.
    136   quota::QuotaStatusCode GetUsageAndQuota(int64* usage, int64* quota);
    137 
    138   // ChangeTracker related methods. They run on file task runner.
    139   void GetChangedURLsInTracker(fileapi::FileSystemURLSet* urls);
    140   void ClearChangeForURLInTracker(const fileapi::FileSystemURL& url);
    141 
    142   SyncFileSystemBackend* backend();
    143   fileapi::FileSystemOperationRunner* operation_runner();
    144 
    145   // LocalFileSyncStatus::Observer overrides.
    146   virtual void OnSyncEnabled(const fileapi::FileSystemURL& url) OVERRIDE;
    147   virtual void OnWriteEnabled(const fileapi::FileSystemURL& url) OVERRIDE;
    148 
    149   // Operation methods body.
    150   // They can be also called directly if the caller is already on IO thread.
    151   void DoCreateDirectory(const fileapi::FileSystemURL& url,
    152                          const StatusCallback& callback);
    153   void DoCreateFile(const fileapi::FileSystemURL& url,
    154                     const StatusCallback& callback);
    155   void DoCopy(const fileapi::FileSystemURL& src_url,
    156               const fileapi::FileSystemURL& dest_url,
    157               const StatusCallback& callback);
    158   void DoMove(const fileapi::FileSystemURL& src_url,
    159               const fileapi::FileSystemURL& dest_url,
    160               const StatusCallback& callback);
    161   void DoTruncateFile(const fileapi::FileSystemURL& url,
    162                       int64 size,
    163                       const StatusCallback& callback);
    164   void DoTouchFile(const fileapi::FileSystemURL& url,
    165                    const base::Time& last_access_time,
    166                    const base::Time& last_modified_time,
    167                    const StatusCallback& callback);
    168   void DoRemove(const fileapi::FileSystemURL& url,
    169                 bool recursive,
    170                 const StatusCallback& callback);
    171   void DoFileExists(const fileapi::FileSystemURL& url,
    172                     const StatusCallback& callback);
    173   void DoDirectoryExists(const fileapi::FileSystemURL& url,
    174                          const StatusCallback& callback);
    175   void DoVerifyFile(const fileapi::FileSystemURL& url,
    176                     const std::string& expected_data,
    177                     const StatusCallback& callback);
    178   void DoGetMetadataAndPlatformPath(const fileapi::FileSystemURL& url,
    179                                     base::PlatformFileInfo* info,
    180                                     base::FilePath* platform_path,
    181                                     const StatusCallback& callback);
    182   void DoReadDirectory(const fileapi::FileSystemURL& url,
    183                        FileEntryList* entries,
    184                        const StatusCallback& callback);
    185   void DoWrite(net::URLRequestContext* url_request_context,
    186                const fileapi::FileSystemURL& url,
    187                const GURL& blob_url,
    188                const WriteCallback& callback);
    189   void DoWriteString(const fileapi::FileSystemURL& url,
    190                      const std::string& data,
    191                      const WriteCallback& callback);
    192   void DoGetUsageAndQuota(int64* usage,
    193                           int64* quota,
    194                           const quota::StatusCallback& callback);
    195 
    196  private:
    197   typedef ObserverListThreadSafe<LocalFileSyncStatus::Observer> ObserverList;
    198 
    199   // Callbacks.
    200   void DidOpenFileSystem(base::PlatformFileError result,
    201                          const std::string& name,
    202                          const GURL& root);
    203   void DidInitializeFileSystemContext(sync_file_system::SyncStatusCode status);
    204 
    205   void InitializeSyncStatusObserver();
    206 
    207   base::ScopedTempDir data_dir_;
    208   const std::string service_name_;
    209 
    210   scoped_refptr<quota::QuotaManager> quota_manager_;
    211   scoped_refptr<fileapi::FileSystemContext> file_system_context_;
    212   const GURL origin_;
    213   const fileapi::FileSystemType type_;
    214   GURL root_url_;
    215   base::PlatformFileError result_;
    216   sync_file_system::SyncStatusCode sync_status_;
    217 
    218   scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
    219   scoped_refptr<base::SingleThreadTaskRunner> file_task_runner_;
    220 
    221   // Boolean flags mainly for helping debug.
    222   bool is_filesystem_set_up_;
    223   bool is_filesystem_opened_;
    224 
    225   scoped_refptr<ObserverList> sync_status_observers_;
    226 
    227   DISALLOW_COPY_AND_ASSIGN(CannedSyncableFileSystem);
    228 };
    229 
    230 }  // namespace sync_file_system
    231 
    232 #endif  // CHROME_BROWSER_SYNC_FILE_SYSTEM_LOCAL_CANNED_SYNCABLE_FILE_SYSTEM_H_
    233