summaryrefslogtreecommitdiffstats
path: root/webkit/fileapi/file_system_operation.cc
diff options
context:
space:
mode:
Diffstat (limited to 'webkit/fileapi/file_system_operation.cc')
-rw-r--r--webkit/fileapi/file_system_operation.cc57
1 files changed, 57 insertions, 0 deletions
diff --git a/webkit/fileapi/file_system_operation.cc b/webkit/fileapi/file_system_operation.cc
index 0e258c1..e242e86 100644
--- a/webkit/fileapi/file_system_operation.cc
+++ b/webkit/fileapi/file_system_operation.cc
@@ -375,6 +375,52 @@ void FileSystemOperation::TouchFile(const GURL& path,
callback_factory_.NewCallback(&FileSystemOperation::DidTouchFile));
}
+void FileSystemOperation::OpenFile(const GURL& path,
+ int file_flags,
+ base::ProcessHandle peer_handle) {
+#ifndef NDEBUG
+ DCHECK(kOperationNone == pending_operation_);
+ pending_operation_ = kOperationOpenFile;
+#endif
+
+ peer_handle_ = peer_handle;
+ FilePath virtual_path;
+ GURL origin_url;
+ FileSystemType type;
+ if (file_flags & (
+ (base::PLATFORM_FILE_ENUMERATE | base::PLATFORM_FILE_TEMPORARY |
+ base::PLATFORM_FILE_HIDDEN))) {
+ delete this;
+ return;
+ }
+ if (file_flags &
+ (base::PLATFORM_FILE_CREATE | base::PLATFORM_FILE_OPEN_ALWAYS |
+ base::PLATFORM_FILE_CREATE_ALWAYS |
+ base::PLATFORM_FILE_WRITE | base::PLATFORM_FILE_EXCLUSIVE_WRITE |
+ base::PLATFORM_FILE_DELETE_ON_CLOSE | base::PLATFORM_FILE_TRUNCATE |
+ base::PLATFORM_FILE_WRITE_ATTRIBUTES)) {
+ if (!VerifyFileSystemPathForWrite(path, true /* create */, &origin_url,
+ &type, &virtual_path)) {
+ delete this;
+ return;
+ }
+ } else {
+ if (!VerifyFileSystemPathForRead(path, &origin_url, &type, &virtual_path)) {
+ delete this;
+ return;
+ }
+ }
+ file_system_operation_context_.set_src_origin_url(origin_url);
+ file_system_operation_context_.set_src_type(type);
+ FileSystemFileUtilProxy::CreateOrOpen(
+ file_system_operation_context_,
+ proxy_,
+ virtual_path,
+ file_flags,
+ callback_factory_.NewCallback(
+ &FileSystemOperation::DidOpenFile));
+}
+
// We can only get here on a write or truncate that's not yet completed.
// We don't support cancelling any other operation at this time.
void FileSystemOperation::Cancel(FileSystemOperation* cancel_operation_ptr) {
@@ -527,6 +573,17 @@ void FileSystemOperation::DidTouchFile(base::PlatformFileError rv) {
delete this;
}
+void FileSystemOperation::DidOpenFile(
+ base::PlatformFileError rv,
+ base::PassPlatformFile file,
+ bool unused) {
+ if (rv == base::PLATFORM_FILE_OK)
+ dispatcher_->DidOpenFile(file.ReleaseValue(), peer_handle_);
+ else
+ dispatcher_->DidFail(rv);
+ delete this;
+}
+
void FileSystemOperation::OnFileOpenedForWrite(
base::PlatformFileError rv,
base::PassPlatformFile file,