| 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
|
| deleted file mode 100644
|
| index aa45ad0179cad30b4176b6dea66a54c0f4d225b1..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/chromeos/gdata/gdata_file_system_proxy.cc
|
| +++ /dev/null
|
| @@ -1,742 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "chrome/browser/chromeos/gdata/gdata_file_system_proxy.h"
|
| -
|
| -#include <string>
|
| -#include <vector>
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/platform_file.h"
|
| -#include "base/string_util.h"
|
| -#include "base/values.h"
|
| -#include "chrome/browser/chromeos/gdata/drive.pb.h"
|
| -#include "chrome/browser/chromeos/gdata/drive_files.h"
|
| -#include "chrome/browser/chromeos/gdata/gdata_file_system_interface.h"
|
| -#include "chrome/browser/chromeos/gdata/gdata_system_service.h"
|
| -#include "chrome/browser/chromeos/gdata/gdata_util.h"
|
| -#include "content/public/browser/browser_thread.h"
|
| -#include "webkit/blob/shareable_file_reference.h"
|
| -#include "webkit/fileapi/file_system_file_util_proxy.h"
|
| -#include "webkit/fileapi/file_system_types.h"
|
| -#include "webkit/fileapi/file_system_url.h"
|
| -#include "webkit/fileapi/file_system_util.h"
|
| -
|
| -using base::MessageLoopProxy;
|
| -using content::BrowserThread;
|
| -using fileapi::FileSystemURL;
|
| -using fileapi::FileSystemOperationInterface;
|
| -using webkit_blob::ShareableFileReference;
|
| -
|
| -namespace gdata {
|
| -
|
| -namespace {
|
| -
|
| -const char kDriveRootDirectory[] = "drive";
|
| -const char kFeedField[] = "feed";
|
| -
|
| -// Helper function that creates platform file on blocking IO thread pool.
|
| -void OpenPlatformFileOnIOPool(const FilePath& local_path,
|
| - int file_flags,
|
| - base::PlatformFile* platform_file,
|
| - base::PlatformFileError* open_error) {
|
| - bool created;
|
| - *platform_file = base::CreatePlatformFile(local_path,
|
| - file_flags,
|
| - &created,
|
| - open_error);
|
| -}
|
| -
|
| -// Helper function to run reply on results of OpenPlatformFileOnIOPool() on
|
| -// IO thread.
|
| -void OnPlatformFileOpened(
|
| - const FileSystemOperationInterface::OpenFileCallback& callback,
|
| - base::ProcessHandle peer_handle,
|
| - base::PlatformFile* platform_file,
|
| - base::PlatformFileError* open_error) {
|
| - callback.Run(*open_error, *platform_file, peer_handle);
|
| -}
|
| -
|
| -// Helper function to run OpenFileCallback from
|
| -// GDataFileSystemProxy::OpenFile().
|
| -void OnGetFileByPathForOpen(
|
| - const FileSystemOperationInterface::OpenFileCallback& callback,
|
| - int file_flags,
|
| - base::ProcessHandle peer_handle,
|
| - DriveFileError file_error,
|
| - const FilePath& local_path,
|
| - const std::string& unused_mime_type,
|
| - DriveFileType file_type) {
|
| - base::PlatformFileError error =
|
| - util::DriveFileErrorToPlatformError(file_error);
|
| - if (error != base::PLATFORM_FILE_OK) {
|
| - callback.Run(error, base::kInvalidPlatformFileValue, peer_handle);
|
| - return;
|
| - }
|
| -
|
| - base::PlatformFile* platform_file = new base::PlatformFile(
|
| - base::kInvalidPlatformFileValue);
|
| - base::PlatformFileError* open_error =
|
| - new base::PlatformFileError(base::PLATFORM_FILE_ERROR_FAILED);
|
| - BrowserThread::GetBlockingPool()->PostTaskAndReply(FROM_HERE,
|
| - base::Bind(&OpenPlatformFileOnIOPool,
|
| - local_path,
|
| - file_flags,
|
| - platform_file,
|
| - open_error),
|
| - base::Bind(&OnPlatformFileOpened,
|
| - callback,
|
| - peer_handle,
|
| - base::Owned(platform_file),
|
| - base::Owned(open_error)));
|
| -}
|
| -
|
| -// Helper function to run SnapshotFileCallback from
|
| -// GDataFileSystemProxy::CreateSnapshotFile().
|
| -void CallSnapshotFileCallback(
|
| - const FileSystemOperationInterface::SnapshotFileCallback& callback,
|
| - const base::PlatformFileInfo& file_info,
|
| - DriveFileError file_error,
|
| - const FilePath& local_path,
|
| - const std::string& unused_mime_type,
|
| - DriveFileType file_type) {
|
| - scoped_refptr<ShareableFileReference> file_ref;
|
| - base::PlatformFileError error =
|
| - util::DriveFileErrorToPlatformError(file_error);
|
| -
|
| - // If the file is a hosted document, a temporary JSON file is created to
|
| - // represent the document. The JSON file is not cached and its lifetime
|
| - // is managed by ShareableFileReference.
|
| - if (error == base::PLATFORM_FILE_OK && file_type == HOSTED_DOCUMENT) {
|
| - file_ref = ShareableFileReference::GetOrCreate(
|
| - local_path, ShareableFileReference::DELETE_ON_FINAL_RELEASE,
|
| - BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE));
|
| - }
|
| -
|
| - // When reading file, last modified time specified in file info will be
|
| - // compared to the last modified time of the local version of the drive file.
|
| - // Since those two values don't generally match (last modification time on the
|
| - // drive server vs. last modification time of the local, downloaded file), so
|
| - // we have to opt out from this check. We do this by unsetting last_modified
|
| - // value in the file info passed to the CreateSnapshot caller.
|
| - base::PlatformFileInfo final_file_info(file_info);
|
| - final_file_info.last_modified = base::Time();
|
| -
|
| - callback.Run(error, final_file_info, local_path, file_ref);
|
| -}
|
| -
|
| -// Emits debug log when GDataFileSystem::CloseFile() is complete.
|
| -void EmitDebugLogForCloseFile(const FilePath& local_path,
|
| - DriveFileError error_code) {
|
| - DVLOG(1) << "Closed: " << local_path.AsUTF8Unsafe() << ": " << error_code;
|
| -}
|
| -
|
| -void DoTruncateOnFileThread(
|
| - const FilePath& local_cache_path,
|
| - int64 length,
|
| - base::PlatformFileError* result) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
|
| -
|
| - base::PlatformFile file = base::CreatePlatformFile(
|
| - local_cache_path,
|
| - base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_WRITE,
|
| - NULL,
|
| - result);
|
| - if (*result == base::PLATFORM_FILE_OK) {
|
| - DCHECK_NE(base::kInvalidPlatformFileValue, file);
|
| - if (!base::TruncatePlatformFile(file, length))
|
| - *result = base::PLATFORM_FILE_ERROR_FAILED;
|
| - base::ClosePlatformFile(file);
|
| - }
|
| -}
|
| -
|
| -void DidCloseFileForTruncate(
|
| - const FileSystemOperationInterface::StatusCallback& callback,
|
| - base::PlatformFileError truncate_result,
|
| - DriveFileError close_result) {
|
| - // Reports the first error.
|
| - callback.Run(truncate_result == base::PLATFORM_FILE_OK ?
|
| - util::DriveFileErrorToPlatformError(close_result) :
|
| - truncate_result);
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -base::FileUtilProxy::Entry DriveEntryProtoToFileUtilProxyEntry(
|
| - const DriveEntryProto& proto) {
|
| - base::PlatformFileInfo file_info;
|
| - DriveEntry::ConvertProtoToPlatformFileInfo(proto.file_info(), &file_info);
|
| -
|
| - base::FileUtilProxy::Entry entry;
|
| - entry.name = proto.base_name();
|
| - entry.is_directory = file_info.is_directory;
|
| - entry.size = file_info.size;
|
| - entry.last_modified_time = file_info.last_modified;
|
| - return entry;
|
| -}
|
| -
|
| -// GDataFileSystemProxy class implementation.
|
| -
|
| -GDataFileSystemProxy::GDataFileSystemProxy(
|
| - GDataFileSystemInterface* file_system)
|
| - : file_system_(file_system) {
|
| - // Should be created from the file browser extension API (AddMountFunction)
|
| - // on UI thread.
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| -}
|
| -
|
| -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)) {
|
| - MessageLoopProxy::current()->PostTask(FROM_HERE,
|
| - base::Bind(callback,
|
| - base::PLATFORM_FILE_ERROR_NOT_FOUND,
|
| - base::PlatformFileInfo(),
|
| - FilePath()));
|
| - return;
|
| - }
|
| -
|
| - file_system_->GetEntryInfoByPath(
|
| - file_path,
|
| - base::Bind(&GDataFileSystemProxy::OnGetMetadata,
|
| - this,
|
| - file_path,
|
| - callback));
|
| -}
|
| -
|
| -void GDataFileSystemProxy::Copy(const FileSystemURL& src_file_url,
|
| - const FileSystemURL& dest_file_url,
|
| - const FileSystemOperationInterface::StatusCallback& callback) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| -
|
| - FilePath src_file_path, dest_file_path;
|
| - if (!ValidateUrl(src_file_url, &src_file_path) ||
|
| - !ValidateUrl(dest_file_url, &dest_file_path)) {
|
| - MessageLoopProxy::current()->PostTask(FROM_HERE,
|
| - base::Bind(callback, base::PLATFORM_FILE_ERROR_NOT_FOUND));
|
| - return;
|
| - }
|
| -
|
| - file_system_->Copy(
|
| - src_file_path,
|
| - dest_file_path,
|
| - base::Bind(&GDataFileSystemProxy::OnStatusCallback, this, callback));
|
| -}
|
| -
|
| -void GDataFileSystemProxy::Move(const FileSystemURL& src_file_url,
|
| - const FileSystemURL& dest_file_url,
|
| - const FileSystemOperationInterface::StatusCallback& callback) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| -
|
| - FilePath src_file_path, dest_file_path;
|
| - if (!ValidateUrl(src_file_url, &src_file_path) ||
|
| - !ValidateUrl(dest_file_url, &dest_file_path)) {
|
| - MessageLoopProxy::current()->PostTask(FROM_HERE,
|
| - base::Bind(callback, base::PLATFORM_FILE_ERROR_NOT_FOUND));
|
| - return;
|
| - }
|
| -
|
| - file_system_->Move(
|
| - src_file_path,
|
| - dest_file_path,
|
| - base::Bind(&GDataFileSystemProxy::OnStatusCallback, this, callback));
|
| -}
|
| -
|
| -void GDataFileSystemProxy::ReadDirectory(const FileSystemURL& file_url,
|
| - const FileSystemOperationInterface::ReadDirectoryCallback& 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,
|
| - std::vector<base::FileUtilProxy::Entry>(),
|
| - false));
|
| - return;
|
| - }
|
| -
|
| - file_system_->ReadDirectoryByPath(
|
| - file_path,
|
| - base::Bind(&GDataFileSystemProxy::OnReadDirectory,
|
| - this,
|
| - callback));
|
| -}
|
| -
|
| -void GDataFileSystemProxy::Remove(const FileSystemURL& file_url, bool recursive,
|
| - const FileSystemOperationInterface::StatusCallback& callback) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| -
|
| - FilePath file_path;
|
| - if (!ValidateUrl(file_url, &file_path)) {
|
| - MessageLoopProxy::current()->PostTask(FROM_HERE,
|
| - base::Bind(callback, base::PLATFORM_FILE_ERROR_NOT_FOUND));
|
| - return;
|
| - }
|
| -
|
| - file_system_->Remove(
|
| - file_path,
|
| - recursive,
|
| - base::Bind(&GDataFileSystemProxy::OnStatusCallback, this, callback));
|
| -}
|
| -
|
| -void GDataFileSystemProxy::CreateDirectory(
|
| - const FileSystemURL& file_url,
|
| - bool exclusive,
|
| - bool recursive,
|
| - const FileSystemOperationInterface::StatusCallback& callback) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| -
|
| - FilePath file_path;
|
| - if (!ValidateUrl(file_url, &file_path)) {
|
| - MessageLoopProxy::current()->PostTask(FROM_HERE,
|
| - base::Bind(callback, base::PLATFORM_FILE_ERROR_NOT_FOUND));
|
| - return;
|
| - }
|
| -
|
| - file_system_->CreateDirectory(
|
| - file_path,
|
| - exclusive,
|
| - recursive,
|
| - base::Bind(&GDataFileSystemProxy::OnStatusCallback, this, callback));
|
| -}
|
| -
|
| -void GDataFileSystemProxy::CreateFile(
|
| - const FileSystemURL& file_url,
|
| - bool exclusive,
|
| - const FileSystemOperationInterface::StatusCallback& callback) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| -
|
| - FilePath file_path;
|
| - if (!ValidateUrl(file_url, &file_path)) {
|
| - MessageLoopProxy::current()->PostTask(FROM_HERE,
|
| - base::Bind(callback, base::PLATFORM_FILE_ERROR_NOT_FOUND));
|
| - return;
|
| - }
|
| -
|
| - file_system_->CreateFile(
|
| - file_path,
|
| - exclusive,
|
| - base::Bind(&GDataFileSystemProxy::OnStatusCallback, this, callback));
|
| -}
|
| -
|
| -void GDataFileSystemProxy::Truncate(
|
| - const FileSystemURL& file_url, int64 length,
|
| - const FileSystemOperationInterface::StatusCallback& callback) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| -
|
| - if (length < 0) {
|
| - MessageLoopProxy::current()->PostTask(FROM_HERE,
|
| - base::Bind(callback, base::PLATFORM_FILE_ERROR_INVALID_OPERATION));
|
| - return;
|
| - }
|
| -
|
| - FilePath file_path;
|
| - if (!ValidateUrl(file_url, &file_path)) {
|
| - MessageLoopProxy::current()->PostTask(FROM_HERE,
|
| - base::Bind(callback, base::PLATFORM_FILE_ERROR_NOT_FOUND));
|
| - return;
|
| - }
|
| -
|
| - // TODO(kinaba): http://crbug.com/132780.
|
| - // Optimize the cases for small |length|, at least for |length| == 0.
|
| - // CreateWritableSnapshotFile downloads the whole content unnecessarily.
|
| - file_system_->OpenFile(
|
| - file_path,
|
| - base::Bind(&GDataFileSystemProxy::OnFileOpenedForTruncate,
|
| - this,
|
| - file_path,
|
| - length,
|
| - callback));
|
| -}
|
| -
|
| -void GDataFileSystemProxy::OnOpenFileForWriting(
|
| - int file_flags,
|
| - base::ProcessHandle peer_handle,
|
| - const FileSystemOperationInterface::OpenFileCallback& callback,
|
| - DriveFileError file_error,
|
| - const FilePath& local_cache_path) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| -
|
| - base::PlatformFileError error =
|
| - util::DriveFileErrorToPlatformError(file_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,
|
| - DriveFileError file_error) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| - base::PlatformFileError create_result =
|
| - util::DriveFileErrorToPlatformError(file_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,
|
| - const fileapi::FileSystemOperationInterface::StatusCallback& callback,
|
| - DriveFileError open_result,
|
| - const FilePath& local_cache_path) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| -
|
| - if (open_result != DRIVE_FILE_OK) {
|
| - callback.Run(util::DriveFileErrorToPlatformError(open_result));
|
| - 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);
|
| - bool posted = BrowserThread::GetMessageLoopProxyForThread(
|
| - BrowserThread::FILE)->PostTaskAndReply(
|
| - FROM_HERE,
|
| - base::Bind(&DoTruncateOnFileThread,
|
| - local_cache_path,
|
| - length,
|
| - result),
|
| - base::Bind(&GDataFileSystemProxy::DidTruncate,
|
| - this,
|
| - virtual_path,
|
| - callback,
|
| - base::Owned(result)));
|
| - DCHECK(posted);
|
| -}
|
| -
|
| -void GDataFileSystemProxy::DidTruncate(
|
| - const FilePath& virtual_path,
|
| - const FileSystemOperationInterface::StatusCallback& callback,
|
| - base::PlatformFileError* truncate_result) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| -
|
| - // Truncation finished. We must close the file no matter |truncate_result|
|
| - // indicates an error or not.
|
| - file_system_->CloseFile(
|
| - virtual_path,
|
| - base::Bind(&DidCloseFileForTruncate,
|
| - callback,
|
| - base::PlatformFileError(*truncate_result)));
|
| -}
|
| -
|
| -void GDataFileSystemProxy::OpenFile(
|
| - const FileSystemURL& file_url,
|
| - int file_flags,
|
| - base::ProcessHandle peer_handle,
|
| - const FileSystemOperationInterface::OpenFileCallback& callback) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| -
|
| - FilePath file_path;
|
| - if (!ValidateUrl(file_url, &file_path)) {
|
| - MessageLoopProxy::current()->PostTask(FROM_HERE,
|
| - base::Bind(callback,
|
| - base::PLATFORM_FILE_ERROR_NOT_FOUND,
|
| - base::kInvalidPlatformFileValue,
|
| - peer_handle));
|
| - return;
|
| - }
|
| -
|
| - // 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),
|
| - GetContentCallback());
|
| - }
|
| - } 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) {
|
| - FilePath file_path;
|
| - if (!ValidateUrl(url, &file_path))
|
| - return;
|
| -
|
| - file_system_->CloseFile(file_path,
|
| - base::Bind(&EmitDebugLogForCloseFile, file_path));
|
| -}
|
| -
|
| -void GDataFileSystemProxy::CreateSnapshotFile(
|
| - const FileSystemURL& file_url,
|
| - const FileSystemOperationInterface::SnapshotFileCallback& callback) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| -
|
| - FilePath file_path;
|
| - if (!ValidateUrl(file_url, &file_path)) {
|
| - MessageLoopProxy::current()->PostTask(FROM_HERE,
|
| - base::Bind(callback,
|
| - base::PLATFORM_FILE_ERROR_NOT_FOUND,
|
| - base::PlatformFileInfo(),
|
| - FilePath(),
|
| - scoped_refptr<ShareableFileReference>(NULL)));
|
| - return;
|
| - }
|
| -
|
| - file_system_->GetEntryInfoByPath(
|
| - file_path,
|
| - base::Bind(&GDataFileSystemProxy::OnGetEntryInfoByPath,
|
| - this,
|
| - file_path,
|
| - callback));
|
| -}
|
| -
|
| -void GDataFileSystemProxy::OnGetEntryInfoByPath(
|
| - const FilePath& entry_path,
|
| - const FileSystemOperationInterface::SnapshotFileCallback& callback,
|
| - DriveFileError error,
|
| - scoped_ptr<DriveEntryProto> entry_proto) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| -
|
| - if (error != DRIVE_FILE_OK || !entry_proto.get()) {
|
| - MessageLoopProxy::current()->PostTask(FROM_HERE,
|
| - base::Bind(callback,
|
| - base::PLATFORM_FILE_ERROR_NOT_FOUND,
|
| - base::PlatformFileInfo(),
|
| - FilePath(),
|
| - scoped_refptr<ShareableFileReference>(NULL)));
|
| - return;
|
| - }
|
| -
|
| - base::PlatformFileInfo file_info;
|
| - DriveEntry::ConvertProtoToPlatformFileInfo(
|
| - entry_proto->file_info(),
|
| - &file_info);
|
| -
|
| - file_system_->GetFileByPath(entry_path,
|
| - base::Bind(&CallSnapshotFileCallback,
|
| - callback,
|
| - file_info),
|
| - GetContentCallback());
|
| -}
|
| -
|
| -void GDataFileSystemProxy::CreateWritableSnapshotFile(
|
| - const FileSystemURL& file_url,
|
| - const fileapi::WritableSnapshotFile& callback) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| -
|
| - FilePath file_path;
|
| - if (!ValidateUrl(file_url, &file_path)) {
|
| - MessageLoopProxy::current()->PostTask(FROM_HERE,
|
| - base::Bind(callback,
|
| - base::PLATFORM_FILE_ERROR_NOT_FOUND,
|
| - FilePath(),
|
| - scoped_refptr<ShareableFileReference>(NULL)));
|
| - return;
|
| - }
|
| -
|
| - file_system_->OpenFile(
|
| - file_path,
|
| - base::Bind(&GDataFileSystemProxy::OnCreateWritableSnapshotFile,
|
| - this,
|
| - file_path,
|
| - callback));
|
| -}
|
| -
|
| -GDataFileSystemProxy::~GDataFileSystemProxy() {
|
| - // Should be deleted from the CrosMountPointProvider on UI thread.
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| -}
|
| -
|
| -// static.
|
| -bool GDataFileSystemProxy::ValidateUrl(
|
| - const FileSystemURL& url, FilePath* file_path) {
|
| - // what platform you're on.
|
| - if (!url.is_valid() || url.type() != fileapi::kFileSystemTypeDrive) {
|
| - return false;
|
| - }
|
| - *file_path = url.virtual_path();
|
| - return true;
|
| -}
|
| -
|
| -void GDataFileSystemProxy::OnStatusCallback(
|
| - const fileapi::FileSystemOperationInterface::StatusCallback& callback,
|
| - DriveFileError error) {
|
| - callback.Run(util::DriveFileErrorToPlatformError(error));
|
| -}
|
| -
|
| -void GDataFileSystemProxy::OnGetMetadata(
|
| - const FilePath& file_path,
|
| - const FileSystemOperationInterface::GetMetadataCallback& callback,
|
| - DriveFileError error,
|
| - scoped_ptr<DriveEntryProto> entry_proto) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| -
|
| - if (error != DRIVE_FILE_OK) {
|
| - callback.Run(util::DriveFileErrorToPlatformError(error),
|
| - base::PlatformFileInfo(),
|
| - FilePath());
|
| - return;
|
| - }
|
| - DCHECK(entry_proto.get());
|
| -
|
| - base::PlatformFileInfo file_info;
|
| - DriveEntry::ConvertProtoToPlatformFileInfo(
|
| - entry_proto->file_info(),
|
| - &file_info);
|
| -
|
| - callback.Run(base::PLATFORM_FILE_OK, file_info, file_path);
|
| -}
|
| -
|
| -void GDataFileSystemProxy::OnReadDirectory(
|
| - const FileSystemOperationInterface::ReadDirectoryCallback&
|
| - callback,
|
| - DriveFileError error,
|
| - bool hide_hosted_documents,
|
| - scoped_ptr<DriveEntryProtoVector> proto_entries) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| -
|
| - if (error != DRIVE_FILE_OK) {
|
| - callback.Run(util::DriveFileErrorToPlatformError(error),
|
| - std::vector<base::FileUtilProxy::Entry>(),
|
| - false);
|
| - return;
|
| - }
|
| - DCHECK(proto_entries.get());
|
| -
|
| - std::vector<base::FileUtilProxy::Entry> entries;
|
| - // Convert gdata files to something File API stack can understand.
|
| - for (size_t i = 0; i < proto_entries->size(); ++i) {
|
| - const DriveEntryProto& proto = (*proto_entries)[i];
|
| - if (proto.has_file_specific_info() &&
|
| - proto.file_specific_info().is_hosted_document() &&
|
| - hide_hosted_documents) {
|
| - continue;
|
| - }
|
| - entries.push_back(DriveEntryProtoToFileUtilProxyEntry(proto));
|
| - }
|
| -
|
| - callback.Run(base::PLATFORM_FILE_OK, entries, false);
|
| -}
|
| -
|
| -void GDataFileSystemProxy::OnCreateWritableSnapshotFile(
|
| - const FilePath& virtual_path,
|
| - const fileapi::WritableSnapshotFile& callback,
|
| - DriveFileError result,
|
| - const FilePath& local_path) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| -
|
| - scoped_refptr<ShareableFileReference> file_ref;
|
| -
|
| - if (result == DRIVE_FILE_OK) {
|
| - file_ref = ShareableFileReference::GetOrCreate(
|
| - local_path,
|
| - ShareableFileReference::DONT_DELETE_ON_FINAL_RELEASE,
|
| - BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE));
|
| - file_ref->AddFinalReleaseCallback(
|
| - base::Bind(&GDataFileSystemProxy::CloseWritableSnapshotFile,
|
| - this,
|
| - virtual_path));
|
| - }
|
| -
|
| - callback.Run(
|
| - util::DriveFileErrorToPlatformError(result), local_path, file_ref);
|
| -}
|
| -
|
| -void GDataFileSystemProxy::CloseWritableSnapshotFile(
|
| - const FilePath& virtual_path,
|
| - const FilePath& local_path) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| -
|
| - file_system_->CloseFile(virtual_path,
|
| - base::Bind(&EmitDebugLogForCloseFile, virtual_path));
|
| -}
|
| -
|
| -} // namespace gdata
|
|
|