Chromium Code Reviews| Index: webkit/fileapi/obfuscated_file_system_file_util.cc |
| diff --git a/webkit/fileapi/obfuscated_file_system_file_util.cc b/webkit/fileapi/obfuscated_file_system_file_util.cc |
| index 1e7c16e41cc8e4447d75567ff4e648c47749181d..90d920d8d364342de872afd93ed73a91cc3fe6c9 100644 |
| --- a/webkit/fileapi/obfuscated_file_system_file_util.cc |
| +++ b/webkit/fileapi/obfuscated_file_system_file_util.cc |
| @@ -5,6 +5,7 @@ |
| #include "webkit/fileapi/obfuscated_file_system_file_util.h" |
| #include <queue> |
| +#include <vector> |
| #include "base/file_util.h" |
| #include "base/format_macros.h" |
| @@ -18,12 +19,12 @@ |
| #include "webkit/fileapi/file_system_context.h" |
| #include "webkit/fileapi/file_system_operation_context.h" |
| #include "webkit/fileapi/file_system_path_manager.h" |
| +#include "webkit/fileapi/file_system_util.h" |
| #include "webkit/fileapi/quota_file_util.h" |
| #include "webkit/fileapi/sandbox_mount_point_provider.h" |
| -// TODO(ericu): Every instance of FileSystemFileUtil in this file should switch |
| -// to QuotaFileUtil as soon as I sort out FileSystemPathManager's and |
| -// SandboxMountPointProvider's lookups of the root path for a filesystem. |
| +// TODO(ericu): Make deleting an origin [or a type under the origin, if it's the |
| +// last type] remove the origin from origin_database_ as well. |
| namespace { |
| const int64 kFlushDelaySeconds = 10 * 60; // 10 minutes |
| @@ -102,7 +103,7 @@ PlatformFileError ObfuscatedFileSystemFileUtil::CreateOrOpen( |
| return base::PLATFORM_FILE_ERROR_NOT_A_FILE; |
| FilePath data_path = DataPathToLocalPath(context->src_origin_url(), |
| context->src_type(), file_info.data_path); |
| - return FileSystemFileUtil::GetInstance()->CreateOrOpen( |
| + return QuotaFileUtil::GetInstance()->CreateOrOpen( |
| context, data_path, file_flags, file_handle, created); |
| } |
| @@ -183,7 +184,7 @@ PlatformFileError ObfuscatedFileSystemFileUtil::GetFileInfo( |
| return base::PLATFORM_FILE_ERROR_INVALID_OPERATION; |
| FilePath data_path = DataPathToLocalPath(context->src_origin_url(), |
| context->src_type(), local_info.data_path); |
| - return FileSystemFileUtil::GetInstance()->GetFileInfo( |
| + return QuotaFileUtil::GetInstance()->GetFileInfo( |
| context, data_path, file_info, platform_file_path); |
| } |
| @@ -330,7 +331,7 @@ PlatformFileError ObfuscatedFileSystemFileUtil::CopyOrMoveFile( |
| if (overwrite) { |
| FilePath dest_data_path = DataPathToLocalPath(context->src_origin_url(), |
| context->src_type(), dest_file_info.data_path); |
| - return FileSystemFileUtil::GetInstance()->CopyOrMoveFile(context, |
| + return QuotaFileUtil::GetInstance()->CopyOrMoveFile(context, |
| src_data_path, dest_data_path, copy); |
| } else { |
| FileId dest_parent_id; |
| @@ -351,8 +352,7 @@ PlatformFileError ObfuscatedFileSystemFileUtil::CopyOrMoveFile( |
| FilePath dest_data_path = DataPathToLocalPath(context->src_origin_url(), |
| context->src_type(), dest_file_info.data_path); |
| if (base::PLATFORM_FILE_OK != |
| - FileSystemFileUtil::GetInstance()->DeleteFile( |
| - context, dest_data_path)) |
| + QuotaFileUtil::GetInstance()->DeleteFile(context, dest_data_path)) |
| LOG(WARNING) << "Leaked a backing file."; |
| return base::PLATFORM_FILE_OK; |
| } else { |
| @@ -394,7 +394,7 @@ PlatformFileError ObfuscatedFileSystemFileUtil::DeleteFile( |
| FilePath data_path = DataPathToLocalPath(context->src_origin_url(), |
| context->src_type(), file_info.data_path); |
| if (base::PLATFORM_FILE_OK != |
| - FileSystemFileUtil::GetInstance()->DeleteFile(context, data_path)) |
| + QuotaFileUtil::GetInstance()->DeleteFile(context, data_path)) |
| LOG(WARNING) << "Leaked a backing file."; |
| return base::PLATFORM_FILE_OK; |
| } |
| @@ -443,7 +443,7 @@ PlatformFileError ObfuscatedFileSystemFileUtil::Touch( |
| } |
| FilePath data_path = DataPathToLocalPath(context->src_origin_url(), |
| context->src_type(), file_info.data_path); |
| - return FileSystemFileUtil::GetInstance()->Touch( |
| + return QuotaFileUtil::GetInstance()->Touch( |
| context, data_path, last_access_time, last_modified_time); |
| } |
| FileId parent_id; |
| @@ -461,7 +461,7 @@ PlatformFileError ObfuscatedFileSystemFileUtil::Touch( |
| FilePath data_path = DataPathToLocalPath(context->src_origin_url(), |
| context->src_type(), file_info.data_path); |
| - return FileSystemFileUtil::GetInstance()->Touch(context, data_path, |
| + return QuotaFileUtil::GetInstance()->Touch(context, data_path, |
| last_access_time, last_modified_time); |
| } |
| @@ -474,7 +474,7 @@ PlatformFileError ObfuscatedFileSystemFileUtil::Truncate( |
| virtual_path); |
| if (local_path.empty()) |
| return base::PLATFORM_FILE_ERROR_NOT_FOUND; |
| - return FileSystemFileUtil::GetInstance()->Truncate( |
| + return QuotaFileUtil::GetInstance()->Truncate( |
| context, local_path, length); |
| } |
| @@ -603,6 +603,59 @@ class ObfuscatedFileSystemFileEnumerator |
| FileSystemDirectoryDatabase* db_; |
| }; |
| +class ObfuscatedFileSystemOriginEnumerator |
| + : public ObfuscatedFileSystemFileUtil::AbstractOriginEnumerator { |
| + public: |
| + typedef FileSystemOriginDatabase::OriginRecord OriginRecord; |
| + ObfuscatedFileSystemOriginEnumerator( |
| + const std::vector<OriginRecord>& origins, |
| + const FilePath& base_path) |
| + : origins_(origins), base_path_(base_path) { |
|
michaeln
2011/05/23 16:15:18
maybe avoid copying the 'origins' vector
ericu
2011/05/23 18:05:01
I could do this by making it swap() with the input
michaeln
2011/05/23 18:20:21
That would be a funky interface. You could pass a
ericu
2011/05/23 18:31:43
Oh, of course. That's a much better idea. Done.
|
| + } |
| + |
| + ~ObfuscatedFileSystemOriginEnumerator() {} |
| + |
| + // Returns the next origin. Returns empty if there are no more origins. |
| + virtual GURL Next() OVERRIDE { |
| + OriginRecord record; |
| + if (!origins_.empty()) { |
| + record = origins_.back(); |
| + origins_.pop_back(); |
| + } |
| + current_ = record; |
| + return GetOriginURLFromIdentifier(record.first); |
| + } |
| + |
| + // Returns the current origin's information. |
| + virtual bool HasFileSystemType(FileSystemType type) const OVERRIDE { |
| + if (current_.second.empty()) |
| + return false; |
| + FilePath::StringType type_string = |
| + ObfuscatedFileSystemFileUtil::GetDirectoryNameForType(type); |
| + if (type_string.empty()) { |
| + NOTREACHED(); |
| + return false; |
| + } |
| + FilePath path = base_path_.Append(current_.second).Append(type_string); |
| + return file_util::DirectoryExists(path); |
| + } |
| + |
| + private: |
| + std::vector<OriginRecord> origins_; |
| + OriginRecord current_; |
|
michaeln
2011/05/23 16:15:18
a comment about what .first and .second are would
ericu
2011/05/23 18:05:01
Changed to struct.
|
| + FilePath base_path_; |
| +}; |
| + |
| +ObfuscatedFileSystemFileUtil::AbstractOriginEnumerator* |
| +ObfuscatedFileSystemFileUtil::CreateOriginEnumerator() { |
| + std::vector<FileSystemOriginDatabase::OriginRecord> origins; |
| + |
| + if (InitOriginDatabase(false)) |
| + origin_database_->ListAllOrigins(&origins); |
| + return new ObfuscatedFileSystemOriginEnumerator( |
| + origins, file_system_directory_); |
| +} |
| + |
| FileSystemFileUtil::AbstractFileEnumerator* |
| ObfuscatedFileSystemFileUtil::CreateFileEnumerator( |
| FileSystemOperationContext* context, |
| @@ -633,7 +686,7 @@ PlatformFileError ObfuscatedFileSystemFileUtil::CreateFile( |
| path = path.AppendASCII(StringPrintf("%02" PRIu64, directory_number)); |
| PlatformFileError error; |
| - error = FileSystemFileUtil::GetInstance()->CreateDirectory( |
| + error = QuotaFileUtil::GetInstance()->CreateDirectory( |
| context, path, false /* exclusive */, false /* recursive */); |
| if (base::PLATFORM_FILE_OK != error) |
| return error; |
| @@ -645,17 +698,17 @@ PlatformFileError ObfuscatedFileSystemFileUtil::CreateFile( |
| if (!source_path.empty()) { |
| DCHECK(!file_flags); |
| DCHECK(!handle); |
| - error = FileSystemFileUtil::GetInstance()->CopyOrMoveFile( |
| + error = QuotaFileUtil::GetInstance()->CopyOrMoveFile( |
| context, source_path, path, true /* copy */); |
| created = true; |
| } else { |
| if (handle) { |
| - error = FileSystemFileUtil::GetInstance()->CreateOrOpen( |
| + error = QuotaFileUtil::GetInstance()->CreateOrOpen( |
| context, path, file_flags, handle, &created); |
| // If this succeeds, we must close handle on any subsequent error. |
| } else { |
| DCHECK(!file_flags); // file_flags is only used by CreateOrOpen. |
| - error = FileSystemFileUtil::GetInstance()->EnsureFileExists( |
| + error = QuotaFileUtil::GetInstance()->EnsureFileExists( |
| context, path, &created); |
| } |
| } |
| @@ -666,7 +719,7 @@ PlatformFileError ObfuscatedFileSystemFileUtil::CreateFile( |
| NOTREACHED(); |
| if (handle) { |
| base::ClosePlatformFile(*handle); |
| - FileSystemFileUtil::GetInstance()->DeleteFile(context, path); |
| + QuotaFileUtil::GetInstance()->DeleteFile(context, path); |
| } |
| return base::PLATFORM_FILE_ERROR_FAILED; |
| } |
| @@ -675,7 +728,7 @@ PlatformFileError ObfuscatedFileSystemFileUtil::CreateFile( |
| if (!db->AddFileInfo(*file_info, &file_id)) { |
| if (handle) |
| base::ClosePlatformFile(*handle); |
| - FileSystemFileUtil::GetInstance()->DeleteFile(context, path); |
| + QuotaFileUtil::GetInstance()->DeleteFile(context, path); |
| return base::PLATFORM_FILE_ERROR_FAILED; |
| } |
| @@ -710,32 +763,28 @@ FilePath ObfuscatedFileSystemFileUtil::GetDirectoryForOriginAndType( |
| LOG(WARNING) << "Unknown filesystem type requested:" << type; |
| return FilePath(); |
| } |
| - return origin_dir.Append(type_string); |
| + FilePath path = origin_dir.Append(type_string); |
| + if (!file_util::DirectoryExists(path) && |
| + (!create || !file_util::CreateDirectory(path))) |
| + return FilePath(); |
| + return path; |
| } |
| FilePath ObfuscatedFileSystemFileUtil::GetDirectoryForOrigin( |
| const GURL& origin, bool create) { |
| - if (!origin_database_.get()) { |
| - if (!create && !file_util::DirectoryExists(file_system_directory_)) { |
| - return FilePath(); |
| - } |
| - if (!file_util::CreateDirectory(file_system_directory_)) { |
| - LOG(WARNING) << "Failed to create FileSystem directory: " << |
| - file_system_directory_.value(); |
| - return FilePath(); |
| - } |
| - origin_database_.reset( |
| - new FileSystemOriginDatabase( |
| - file_system_directory_.AppendASCII(kOriginDatabaseName))); |
| - } |
| + if (!InitOriginDatabase(create)) |
| + return FilePath(); |
| FilePath directory_name; |
| - // TODO(ericu): This should probably be using GetOriginIdentifierFromURL from |
| - // sandbox_mount_point_provider.cc, instead of just using origin.spec(). |
| - if (!create && !origin_database_->HasOriginPath(origin.spec())) |
| + std::string id = GetOriginIdentifierFromURL(origin); |
| + if (!create && !origin_database_->HasOriginPath(id)) |
| return FilePath(); |
| - if (!origin_database_->GetPathForOrigin(origin.spec(), &directory_name)) |
| + if (!origin_database_->GetPathForOrigin(id, &directory_name)) |
| return FilePath(); |
| - return file_system_directory_.Append(directory_name); |
| + FilePath path = file_system_directory_.Append(directory_name); |
| + if (!file_util::DirectoryExists(path) && |
| + (!create || !file_util::CreateDirectory(path))) |
| + return FilePath(); |
| + return path; |
| } |
| bool ObfuscatedFileSystemFileUtil::MigrateFromOldSandbox( |
| @@ -800,8 +849,9 @@ bool ObfuscatedFileSystemFileUtil::MigrateFromOldSandbox( |
| return file_util::Move(src_root, legacy_dest_dir); |
| } |
| +// static |
| FilePath::StringType ObfuscatedFileSystemFileUtil::GetDirectoryNameForType( |
| - FileSystemType type) const { |
| + FileSystemType type) { |
| switch (type) { |
| case kFileSystemTypeTemporary: |
| return kTemporaryDirectoryName; |
| @@ -844,9 +894,7 @@ FileSystemDirectoryDatabase* ObfuscatedFileSystemFileUtil::GetDirectoryDatabase( |
| LOG(WARNING) << "Unknown filesystem type requested:" << type; |
| return NULL; |
| } |
| - // TODO(ericu): This should probably be using GetOriginIdentifierFromURL from |
| - // sandbox_mount_point_provider.cc, instead of just using origin.spec(). |
| - std::string key = origin.spec() + type_string; |
| + std::string key = GetOriginIdentifierFromURL(origin) + type_string; |
| DirectoryMap::iterator iter = directories_.find(key); |
| if (iter != directories_.end()) |
| return iter->second; |
| @@ -889,9 +937,7 @@ bool ObfuscatedFileSystemFileUtil::DestroyDirectoryDatabase( |
| LOG(WARNING) << "Unknown filesystem type requested:" << type; |
| return true; |
| } |
| - // TODO(ericu): This should probably be using GetOriginIdentifierFromURL from |
| - // sandbox_mount_point_provider.cc, instead of just using origin.spec(). |
| - std::string key = origin.spec() + type_string; |
| + std::string key = GetOriginIdentifierFromURL(origin) + type_string; |
| DirectoryMap::iterator iter = directories_.find(key); |
| if (iter != directories_.end()) |
| directories_.erase(iter); |
| @@ -905,4 +951,20 @@ bool ObfuscatedFileSystemFileUtil::DestroyDirectoryDatabase( |
| return FileSystemDirectoryDatabase::DestroyDatabase(path); |
| } |
| +bool ObfuscatedFileSystemFileUtil::InitOriginDatabase(bool create) { |
| + if (!origin_database_.get()) { |
| + if (!create && !file_util::DirectoryExists(file_system_directory_)) |
| + return false; |
| + if (!file_util::CreateDirectory(file_system_directory_)) { |
| + LOG(WARNING) << "Failed to create FileSystem directory: " << |
| + file_system_directory_.value(); |
| + return false; |
| + } |
| + origin_database_.reset( |
| + new FileSystemOriginDatabase( |
| + file_system_directory_.AppendASCII(kOriginDatabaseName))); |
| + } |
| + return true; |
| +} |
| + |
| } // namespace fileapi |