blob: 9798542d67c86bdbcd643c26224850cf4c1fe57c [file] [log] [blame]
// 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.
#ifndef WEBKIT_FILEAPI_FILE_SYSTEM_FILE_UTIL_PROXY_H_
#define WEBKIT_FILEAPI_FILE_SYSTEM_FILE_UTIL_PROXY_H_
#include <vector>
#include "base/callback.h"
#include "base/file_path.h"
#include "base/file_util_proxy.h"
#include "base/memory/ref_counted.h"
#include "base/platform_file.h"
#include "base/tracked_objects.h"
#include "webkit/fileapi/file_system_file_util.h"
#include "webkit/fileapi/file_system_operation.h"
namespace fileapi {
using base::PlatformFile;
using base::PlatformFileError;
using base::PlatformFileInfo;
class FileSystemFileUtil;
class FileSystemOperationContext;
class FileSystemURL;
// This class provides asynchronous access to FileSystemFileUtil methods for
// FileSystem API operations. This also implements cross-FileUtil copy/move
// operations on top of FileSystemFileUtil methods.
class FileSystemFileUtilProxy {
public:
// Some of the proxy routines are just wrapping around the FileUtilProxy's
// relay methods, so we use the same types as FileUtilProxy for them.
typedef base::FileUtilProxy::Entry Entry;
typedef base::FileUtilProxy::CreateOrOpenCallback CreateOrOpenCallback;
typedef base::Callback<void(PlatformFileError status)> StatusCallback;
typedef base::Callback<void(PlatformFileError status,
bool created)> EnsureFileExistsCallback;
typedef FileSystemOperation::GetMetadataCallback GetFileInfoCallback;
typedef FileSystemOperation::ReadDirectoryCallback ReadDirectoryCallback;
typedef base::Callback<
void(base::PlatformFileError result,
const base::PlatformFileInfo& file_info,
const FilePath& platform_path,
FileSystemFileUtil::SnapshotFilePolicy snapshot_policy)>
SnapshotFileCallback;
// Deletes a file or a directory on the given context's task_runner.
// It is an error to delete a non-empty directory with recursive=false.
static bool Delete(
FileSystemOperationContext* context,
FileSystemFileUtil* file_util,
const FileSystemURL& url,
bool recursive,
const StatusCallback& callback);
// Creates or opens a file with the given flags by calling |file_util|'s
// CreateOrOpen method on the given context's task_runner.
static bool CreateOrOpen(
FileSystemOperationContext* context,
FileSystemFileUtil* file_util,
const FileSystemURL& url,
int file_flags,
const CreateOrOpenCallback& callback);
// Copies a file or a directory from |src_url| to |dest_url| by calling
// FileSystemFileUtil's following methods on the given context's
// task_runner.
// - CopyOrMoveFile() for same-filesystem operations
// - CopyInForeignFile() for (limited) cross-filesystem operations
//
// Error cases:
// If destination's parent doesn't exist.
// If source dir exists but destination url is an existing file.
// If source file exists but destination url is an existing directory.
// If source is a parent of destination.
// If source doesn't exist.
// If source and dest are the same url in the same filesystem.
static bool Copy(
FileSystemOperationContext* context,
FileSystemFileUtil* src_util,
FileSystemFileUtil* dest_util,
const FileSystemURL& src_url,
const FileSystemURL& dest_url,
const StatusCallback& callback);
// Copies a file from local disk to the given filesystem destination.
// Primarily used for the Syncable filesystem type (e.g. GDrive).
static bool CopyInForeignFile(
FileSystemOperationContext* context,
FileSystemFileUtil* dest_util,
const FilePath& src_local_disk_file_path,
const FileSystemURL& dest_url,
const StatusCallback& callback);
// Moves a file or a directory from |src_url| to |dest_url| by calling
// FileSystemFileUtil's following methods on the given context's
// task_runner.
// - CopyOrMoveFile() for same-filesystem operations
// - CopyInForeignFile() for (limited) cross-filesystem operations
//
// This method returns an error on the same error cases with Copy.
static bool Move(
FileSystemOperationContext* context,
FileSystemFileUtil* src_util,
FileSystemFileUtil* dest_util,
const FileSystemURL& src_url,
const FileSystemURL& dest_url,
const StatusCallback& callback);
// Ensures that the given |url| exist by calling |file_util|'s
// EnsureFileExists method on the given context's task_runner.
static bool EnsureFileExists(
FileSystemOperationContext* context,
FileSystemFileUtil* file_util,
const FileSystemURL& url,
const EnsureFileExistsCallback& callback);
// Creates directory at a given url by calling |file_util|'s
// CreateDirectory method on the given context's task_runner.
static bool CreateDirectory(
FileSystemOperationContext* context,
FileSystemFileUtil* file_util,
const FileSystemURL& url,
bool exclusive,
bool recursive,
const StatusCallback& callback);
// Retrieves the information about a file by calling |file_util|'s
// GetFileInfo method on the given context's task_runner.
static bool GetFileInfo(
FileSystemOperationContext* context,
FileSystemFileUtil* file_util,
const FileSystemURL& url,
const GetFileInfoCallback& callback);
// Creates a snapshot file by calling |file_util|'s CreateSnapshotFile
// method on the given context's task_runner.
static bool CreateSnapshotFile(
FileSystemOperationContext* context,
FileSystemFileUtil* file_util,
const FileSystemURL& url,
const SnapshotFileCallback& callback);
// Reads the filenames in |url| by calling |file_util|'s
// ReadDirectory method on the given context's task_runner.
// TODO: this should support returning entries in multiple chunks.
static bool ReadDirectory(
FileSystemOperationContext* context,
FileSystemFileUtil* file_util,
const FileSystemURL& url,
const ReadDirectoryCallback& callback);
// Touches a file by calling |file_util|'s Touch method
// on the given context's task_runner.
static bool Touch(
FileSystemOperationContext* context,
FileSystemFileUtil* file_util,
const FileSystemURL& url,
const base::Time& last_access_time,
const base::Time& last_modified_time,
const StatusCallback& callback);
// Truncates a file to the given length by calling |file_util|'s
// Truncate method on the given context's task_runner.
static bool Truncate(
FileSystemOperationContext* context,
FileSystemFileUtil* file_util,
const FileSystemURL& url,
int64 length,
const StatusCallback& callback);
private:
DISALLOW_IMPLICIT_CONSTRUCTORS(FileSystemFileUtilProxy);
};
} // namespace fileapi
#endif // WEBKIT_FILEAPI_FILE_SYSTEM_FILE_UTIL_PROXY_H_