Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1774)

Unified Diff: chrome/browser/chromeos/gdata/gdata_file_system_proxy.cc

Issue 10600013: Wired support for file truncating with RemoteFileSystemOperation::OpenFile() method (case when base… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/gdata/gdata_file_system_proxy.cc
diff --git a/chrome/browser/chromeos/gdata/gdata_file_system_proxy.cc b/chrome/browser/chromeos/gdata/gdata_file_system_proxy.cc
index b8d0880e5a7cc1cea7e8402ed83f53def37757b1..9fbf55c7e693bb0724e8a6f0d5989ba4e03a6db8 100644
--- a/chrome/browser/chromeos/gdata/gdata_file_system_proxy.cc
+++ b/chrome/browser/chromeos/gdata/gdata_file_system_proxy.cc
@@ -34,7 +34,7 @@ const char kGDataRootDirectory[] = "drive";
const char kFeedField[] = "feed";
// Helper function that creates platform file on bocking IO thread pool.
-void CreatePlatformFileOnIOPool(const FilePath& local_path,
+void OpenPlatformFileOnIOPool(const FilePath& local_path,
int file_flags,
base::PlatformFile* platform_file,
base::PlatformFileError* open_error) {
@@ -45,9 +45,9 @@ void CreatePlatformFileOnIOPool(const FilePath& local_path,
open_error);
}
-// Helper function to run reply on results of CreatePlatformFileOnIOPool() on
+// Helper function to run reply on results of OpenPlatformFileOnIOPool() on
// IO thread.
-void OnPlatformFileCreated(
+void OnPlatformFileOpened(
const FileSystemOperationInterface::OpenFileCallback& callback,
base::ProcessHandle peer_handle,
base::PlatformFile* platform_file,
@@ -77,12 +77,12 @@ void OnGetFileByPathForOpen(
base::PlatformFileError* open_error =
new base::PlatformFileError(base::PLATFORM_FILE_ERROR_FAILED);
BrowserThread::GetBlockingPool()->PostTaskAndReply(FROM_HERE,
- base::Bind(&CreatePlatformFileOnIOPool,
+ base::Bind(&OpenPlatformFileOnIOPool,
local_path,
file_flags,
platform_file,
open_error),
- base::Bind(&OnPlatformFileCreated,
+ base::Bind(&OnPlatformFileOpened,
callback,
peer_handle,
base::Owned(platform_file),
@@ -148,7 +148,7 @@ void DoTruncateOnFileThread(
}
void DidCloseFileForTruncate(
- const fileapi::FileSystemOperationInterface::StatusCallback& callback,
+ const FileSystemOperationInterface::StatusCallback& callback,
base::PlatformFileError truncate_result,
gdata::GDataFileError close_result) {
// Reports the first error.
@@ -187,15 +187,13 @@ GDataFileSystemProxy::GDataFileSystemProxy(
void GDataFileSystemProxy::GetFileInfo(const FileSystemURL& file_url,
const FileSystemOperationInterface::GetMetadataCallback& callback) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
-
FilePath file_path;
if (!ValidateUrl(file_url, &file_path)) {
- base::MessageLoopProxy::current()->PostTask(
- FROM_HERE,
- base::Bind(callback,
- base::PLATFORM_FILE_ERROR_NOT_FOUND,
- base::PlatformFileInfo(),
- FilePath()));
+ MessageLoopProxy::current()->PostTask(FROM_HERE,
+ base::Bind(callback,
+ base::PLATFORM_FILE_ERROR_NOT_FOUND,
+ base::PlatformFileInfo(),
+ FilePath()));
return;
}
@@ -326,7 +324,7 @@ void GDataFileSystemProxy::CreateFile(
void GDataFileSystemProxy::Truncate(
const FileSystemURL& file_url, int64 length,
- const fileapi::FileSystemOperationInterface::StatusCallback& callback) {
+ const FileSystemOperationInterface::StatusCallback& callback) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
if (length < 0) {
@@ -354,6 +352,75 @@ void GDataFileSystemProxy::Truncate(
callback));
}
+void GDataFileSystemProxy::OnOpenFileForWriting(
+ int file_flags,
+ base::ProcessHandle peer_handle,
+ const FileSystemOperationInterface::OpenFileCallback& callback,
+ GDataFileError gdata_error,
+ const FilePath& local_cache_path) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+
+ base::PlatformFileError error =
+ gdata::util::GDataFileErrorToPlatformError(gdata_error);
+
+ if (error != base::PLATFORM_FILE_OK) {
+ callback.Run(error, base::kInvalidPlatformFileValue, peer_handle);
+ return;
+ }
+
+ // Cache file prepared for modification is available. Truncate it.
+ // File operation must be done on FILE thread, so relay the operation.
+ base::PlatformFileError* result =
+ new base::PlatformFileError(base::PLATFORM_FILE_ERROR_FAILED);
+ base::PlatformFile* platform_file = new base::PlatformFile(
+ base::kInvalidPlatformFileValue);
+ bool posted = BrowserThread::GetBlockingPool()->PostTaskAndReply(FROM_HERE,
+ base::Bind(&OpenPlatformFileOnIOPool,
+ local_cache_path,
+ file_flags,
+ platform_file,
+ result),
+ base::Bind(&OnPlatformFileOpened,
+ callback,
+ peer_handle,
+ base::Owned(platform_file),
+ base::Owned(result)));
+ DCHECK(posted);
+}
+
+void GDataFileSystemProxy::OnCreateFileForOpen(
+ const FilePath& file_path,
+ int file_flags,
+ base::ProcessHandle peer_handle,
+ const FileSystemOperationInterface::OpenFileCallback& callback,
+ GDataFileError gdata_error) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ base::PlatformFileError create_result =
+ gdata::util::GDataFileErrorToPlatformError(gdata_error);
+
+ if ((create_result == base::PLATFORM_FILE_OK) ||
+ ((create_result == base::PLATFORM_FILE_ERROR_EXISTS) &&
+ (file_flags & base::PLATFORM_FILE_CREATE_ALWAYS))) {
+ // If we are trying to always create an existing file, then
+ // if it really exists open it as truncated.
+ file_flags &= ~base::PLATFORM_FILE_CREATE;
+ file_flags &= ~base::PLATFORM_FILE_CREATE_ALWAYS;
+ file_flags |= base::PLATFORM_FILE_OPEN_TRUNCATED;
+ } else {
+ callback.Run(create_result, base::kInvalidPlatformFileValue, peer_handle);
+ return;
+ }
+
+ // Open created (or existing) file for writing.
+ file_system_->OpenFile(
+ file_path,
+ base::Bind(&GDataFileSystemProxy::OnOpenFileForWriting,
+ this,
+ file_flags,
+ peer_handle,
+ callback));
+}
+
void GDataFileSystemProxy::OnFileOpenedForTruncate(
const FilePath& virtual_path,
int64 length,
@@ -388,7 +455,7 @@ void GDataFileSystemProxy::OnFileOpenedForTruncate(
void GDataFileSystemProxy::DidTruncate(
const FilePath& virtual_path,
- const fileapi::FileSystemOperationInterface::StatusCallback& callback,
+ const FileSystemOperationInterface::StatusCallback& callback,
base::PlatformFileError* truncate_result) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
@@ -418,18 +485,70 @@ void GDataFileSystemProxy::OpenFile(
return;
}
- file_system_->GetFileByPath(file_path,
- base::Bind(&OnGetFileByPathForOpen,
- callback,
- file_flags,
- peer_handle),
- GetDownloadDataCallback());
+ // TODO(zelidrag): Wire all other file open operations.
+ if ((file_flags & base::PLATFORM_FILE_DELETE_ON_CLOSE)) {
+ NOTIMPLEMENTED() << "File create/write operations not yet supported "
+ << file_path.value();
+ MessageLoopProxy::current()->PostTask(FROM_HERE,
+ base::Bind(callback,
+ base::PLATFORM_FILE_ERROR_FAILED,
+ base::kInvalidPlatformFileValue,
+ peer_handle));
+ return;
+ }
+
+ if ((file_flags & base::PLATFORM_FILE_OPEN) ||
+ (file_flags & base::PLATFORM_FILE_OPEN_ALWAYS) ||
+ (file_flags & base::PLATFORM_FILE_OPEN_TRUNCATED)) {
+ if ((file_flags & base::PLATFORM_FILE_OPEN_TRUNCATED) ||
+ (file_flags & base::PLATFORM_FILE_OPEN_ALWAYS) ||
+ (file_flags & base::PLATFORM_FILE_WRITE) ||
+ (file_flags & base::PLATFORM_FILE_EXCLUSIVE_WRITE)) {
+ // Open existing file for writing.
+ file_system_->OpenFile(
+ file_path,
+ base::Bind(&GDataFileSystemProxy::OnOpenFileForWriting,
+ this,
+ file_flags,
+ peer_handle,
+ callback));
+ } else {
+ // Read-only file open.
+ file_system_->GetFileByPath(file_path,
+ base::Bind(&OnGetFileByPathForOpen,
+ callback,
+ file_flags,
+ peer_handle),
+ GetDownloadDataCallback());
+ }
+ } else if ((file_flags & base::PLATFORM_FILE_CREATE) ||
+ (file_flags & base::PLATFORM_FILE_CREATE_ALWAYS)) {
+ // Open existing file for writing.
+ file_system_->CreateFile(
+ file_path,
+ file_flags & base::PLATFORM_FILE_EXCLUSIVE_WRITE,
+ base::Bind(&GDataFileSystemProxy::OnCreateFileForOpen,
+ this,
+ file_path,
+ file_flags,
+ peer_handle,
+ callback));
+ } else {
+ NOTREACHED() << "Unhandled file flags combination " << file_flags;
+ MessageLoopProxy::current()->PostTask(FROM_HERE,
+ base::Bind(callback,
+ base::PLATFORM_FILE_ERROR_FAILED,
+ base::kInvalidPlatformFileValue,
+ peer_handle));
+ }
}
void GDataFileSystemProxy::NotifyCloseFile(const FileSystemURL& url) {
- // TODO(kinaba,zelidrag): crbug.com/132236.
- // Once OpenFile() for writing is implemented, we also need to implement the
- // corresponding NotifyCloseFile for committing dirty cache.
+ FilePath file_path;
+ if (!ValidateUrl(url, &file_path))
+ return;
+
+ file_system_->CloseFile(file_path, FileOperationCallback());
}
void GDataFileSystemProxy::CreateSnapshotFile(

Powered by Google App Engine
This is Rietveld 408576698