Chromium Code Reviews| Index: webkit/fileapi/obfuscated_file_util.cc |
| diff --git a/webkit/fileapi/obfuscated_file_util.cc b/webkit/fileapi/obfuscated_file_util.cc |
| index 8103e62c432775b4ef697ba74a1a95912cd980ba..ab42b4f60a26cc94334cb7f270ad352325fe63a9 100644 |
| --- a/webkit/fileapi/obfuscated_file_util.cc |
| +++ b/webkit/fileapi/obfuscated_file_util.cc |
| @@ -261,80 +261,14 @@ PlatformFileError ObfuscatedFileUtil::CreateOrOpen( |
| FileSystemOperationContext* context, |
| const FileSystemURL& url, int file_flags, |
| PlatformFile* file_handle, bool* created) { |
| - DCHECK(!(file_flags & (base::PLATFORM_FILE_DELETE_ON_CLOSE | |
| - base::PLATFORM_FILE_HIDDEN | base::PLATFORM_FILE_EXCLUSIVE_READ | |
| - base::PLATFORM_FILE_EXCLUSIVE_WRITE))); |
| - FileSystemDirectoryDatabase* db = GetDirectoryDatabase( |
| - url.origin(), url.type(), true); |
| - if (!db) |
| - return base::PLATFORM_FILE_ERROR_FAILED; |
| - FileId file_id; |
| - if (!db->GetFileWithPath(url.path(), &file_id)) { |
| - // The file doesn't exist. |
| - if (!(file_flags & (base::PLATFORM_FILE_CREATE | |
| - base::PLATFORM_FILE_CREATE_ALWAYS | base::PLATFORM_FILE_OPEN_ALWAYS))) |
| - return base::PLATFORM_FILE_ERROR_NOT_FOUND; |
| - FileId parent_id; |
| - if (!db->GetFileWithPath(VirtualPath::DirName(url.path()), |
| - &parent_id)) |
| - return base::PLATFORM_FILE_ERROR_NOT_FOUND; |
| - FileInfo file_info; |
| - InitFileInfo(&file_info, parent_id, |
| - VirtualPath::BaseName(url.path()).value()); |
| - |
| - int64 growth = UsageForPath(file_info.name.size()); |
| - if (!AllocateQuota(context, growth)) |
| - return base::PLATFORM_FILE_ERROR_NO_SPACE; |
| - PlatformFileError error = CreateFile( |
| - context, base::FilePath(), |
| - url.origin(), url.type(), &file_info, |
| - file_flags, file_handle); |
| - if (created && base::PLATFORM_FILE_OK == error) { |
| - *created = true; |
| - UpdateUsage(context, url, growth); |
| - context->change_observers()->Notify( |
| - &FileChangeObserver::OnCreateFile, MakeTuple(url)); |
| - } |
| - return error; |
| - } |
| - |
| - if (file_flags & base::PLATFORM_FILE_CREATE) |
| - return base::PLATFORM_FILE_ERROR_EXISTS; |
| - |
| - base::PlatformFileInfo platform_file_info; |
| - base::FilePath local_path; |
| - FileInfo file_info; |
| - base::PlatformFileError error = GetFileInfoInternal( |
| - db, context, url.origin(), url.type(), file_id, |
| - &file_info, &platform_file_info, &local_path); |
| - if (error != base::PLATFORM_FILE_OK) |
| - return error; |
| - if (file_info.is_directory()) |
| - return base::PLATFORM_FILE_ERROR_NOT_A_FILE; |
| - |
| - int64 delta = 0; |
| - if (file_flags & (base::PLATFORM_FILE_CREATE_ALWAYS | |
| - base::PLATFORM_FILE_OPEN_TRUNCATED)) { |
| - // The file exists and we're truncating. |
| - delta = -platform_file_info.size; |
| - AllocateQuota(context, delta); |
| - } |
| - |
| - error = NativeFileUtil::CreateOrOpen( |
| - local_path, file_flags, file_handle, created); |
| - if (error == base::PLATFORM_FILE_ERROR_NOT_FOUND) { |
| - // TODO(tzik): Also invalidate on-memory usage cache in UsageTracker. |
| - // TODO(tzik): Delete database entry after ensuring the file lost. |
| - InvalidateUsageCache(context, url.origin(), url.type()); |
| - LOG(WARNING) << "Lost a backing file."; |
| - error = base::PLATFORM_FILE_ERROR_FAILED; |
| - } |
| - |
| - // If truncating we need to update the usage. |
| - if (error == base::PLATFORM_FILE_OK && delta) { |
| - UpdateUsage(context, url, delta); |
| - context->change_observers()->Notify( |
| - &FileChangeObserver::OnModifyFile, MakeTuple(url)); |
| + PlatformFileError error = CreateOrOpenInternal(context, url, file_flags, |
| + file_handle, created); |
| + if (*file_handle != base::kInvalidPlatformFileValue && |
| + file_flags & base::PLATFORM_FILE_WRITE && |
| + url.type() == kFileSystemTypePersistent) { |
|
kinuko
2013/04/30 05:14:23
instead should we check context->quota_limit_type(
tzik
2013/04/30 05:26:22
Done.
|
| + DCHECK_EQ(base::PLATFORM_FILE_OK, error); |
| + context->file_system_context()->GetQuotaUtil(url.type())-> |
| + StickyInvalidateUsageCache(url.origin(), url.type()); |
| } |
| return error; |
| } |
| @@ -1337,4 +1271,86 @@ PlatformFileError ObfuscatedFileUtil::GenerateNewLocalPath( |
| return base::PLATFORM_FILE_OK; |
| } |
| +PlatformFileError ObfuscatedFileUtil::CreateOrOpenInternal( |
| + FileSystemOperationContext* context, |
| + const FileSystemURL& url, int file_flags, |
| + PlatformFile* file_handle, bool* created) { |
| + DCHECK(!(file_flags & (base::PLATFORM_FILE_DELETE_ON_CLOSE | |
| + base::PLATFORM_FILE_HIDDEN | base::PLATFORM_FILE_EXCLUSIVE_READ | |
| + base::PLATFORM_FILE_EXCLUSIVE_WRITE))); |
| + FileSystemDirectoryDatabase* db = GetDirectoryDatabase( |
| + url.origin(), url.type(), true); |
| + if (!db) |
| + return base::PLATFORM_FILE_ERROR_FAILED; |
| + FileId file_id; |
| + if (!db->GetFileWithPath(url.path(), &file_id)) { |
| + // The file doesn't exist. |
| + if (!(file_flags & (base::PLATFORM_FILE_CREATE | |
| + base::PLATFORM_FILE_CREATE_ALWAYS | base::PLATFORM_FILE_OPEN_ALWAYS))) |
| + return base::PLATFORM_FILE_ERROR_NOT_FOUND; |
| + FileId parent_id; |
| + if (!db->GetFileWithPath(VirtualPath::DirName(url.path()), |
| + &parent_id)) |
| + return base::PLATFORM_FILE_ERROR_NOT_FOUND; |
| + FileInfo file_info; |
| + InitFileInfo(&file_info, parent_id, |
| + VirtualPath::BaseName(url.path()).value()); |
| + |
| + int64 growth = UsageForPath(file_info.name.size()); |
| + if (!AllocateQuota(context, growth)) |
| + return base::PLATFORM_FILE_ERROR_NO_SPACE; |
| + PlatformFileError error = CreateFile( |
| + context, base::FilePath(), |
| + url.origin(), url.type(), &file_info, |
| + file_flags, file_handle); |
| + if (created && base::PLATFORM_FILE_OK == error) { |
| + *created = true; |
| + UpdateUsage(context, url, growth); |
| + context->change_observers()->Notify( |
| + &FileChangeObserver::OnCreateFile, MakeTuple(url)); |
| + } |
| + return error; |
| + } |
| + |
| + if (file_flags & base::PLATFORM_FILE_CREATE) |
| + return base::PLATFORM_FILE_ERROR_EXISTS; |
| + |
| + base::PlatformFileInfo platform_file_info; |
| + base::FilePath local_path; |
| + FileInfo file_info; |
| + base::PlatformFileError error = GetFileInfoInternal( |
| + db, context, url.origin(), url.type(), file_id, |
| + &file_info, &platform_file_info, &local_path); |
| + if (error != base::PLATFORM_FILE_OK) |
| + return error; |
| + if (file_info.is_directory()) |
| + return base::PLATFORM_FILE_ERROR_NOT_A_FILE; |
| + |
| + int64 delta = 0; |
| + if (file_flags & (base::PLATFORM_FILE_CREATE_ALWAYS | |
| + base::PLATFORM_FILE_OPEN_TRUNCATED)) { |
| + // The file exists and we're truncating. |
| + delta = -platform_file_info.size; |
| + AllocateQuota(context, delta); |
| + } |
| + |
| + error = NativeFileUtil::CreateOrOpen( |
| + local_path, file_flags, file_handle, created); |
| + if (error == base::PLATFORM_FILE_ERROR_NOT_FOUND) { |
| + // TODO(tzik): Also invalidate on-memory usage cache in UsageTracker. |
| + // TODO(tzik): Delete database entry after ensuring the file lost. |
| + InvalidateUsageCache(context, url.origin(), url.type()); |
| + LOG(WARNING) << "Lost a backing file."; |
| + error = base::PLATFORM_FILE_ERROR_FAILED; |
| + } |
| + |
| + // If truncating we need to update the usage. |
| + if (error == base::PLATFORM_FILE_OK && delta) { |
| + UpdateUsage(context, url, delta); |
| + context->change_observers()->Notify( |
| + &FileChangeObserver::OnModifyFile, MakeTuple(url)); |
| + } |
| + return error; |
| +} |
| + |
| } // namespace fileapi |