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