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