file_util_proxy.cc revision 513209b27ff55e2841eac0e4120199c23acce758
13345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Copyright (c) 2010 The Chromium Authors. All rights reserved.
23345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Use of this source code is governed by a BSD-style license that can be
33345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// found in the LICENSE file.
43345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
53345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/file_util_proxy.h"
63345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/message_loop_proxy.h"
83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// TODO(jianli): Move the code from anonymous namespace to base namespace so
103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// that all of the base:: prefixes would be unnecessary.
113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merricknamespace {
123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
13731df977c0511bca2206b5f333555b1205ff1f43Iain Merricknamespace {
14731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
15731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Performs common checks for move and copy.
16731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// This also removes the destination directory if it's non-empty and all other
17731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// checks are passed (so that the copy/move correctly overwrites the
18731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// destination).
19731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstatic base::PlatformFileError PerformCommonCheckAndPreparationForMoveAndCopy(
20731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const FilePath& src_file_path,
21731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const FilePath& dest_file_path) {
22731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Exits earlier if the source path does not exist.
23731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!file_util::PathExists(src_file_path))
24731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return base::PLATFORM_FILE_ERROR_NOT_FOUND;
25731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
26731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // The parent of the |dest_file_path| does not exist.
27731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!file_util::DirectoryExists(dest_file_path.DirName()))
28731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return base::PLATFORM_FILE_ERROR_NOT_FOUND;
29731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
30731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // It is an error to try to copy/move an entry into its child.
31731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (src_file_path.IsParent(dest_file_path))
32731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return base::PLATFORM_FILE_ERROR_INVALID_OPERATION;
33731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
34731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Now it is ok to return if the |dest_file_path| does not exist.
35731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!file_util::PathExists(dest_file_path))
36731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return base::PLATFORM_FILE_OK;
37731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
38731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // |src_file_path| exists and is a directory.
39731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // |dest_file_path| exists and is a file.
40731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  bool src_is_directory = file_util::DirectoryExists(src_file_path);
41731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  bool dest_is_directory = file_util::DirectoryExists(dest_file_path);
42731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (src_is_directory && !dest_is_directory)
43731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return base::PLATFORM_FILE_ERROR_NOT_A_DIRECTORY;
44731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
45731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // |src_file_path| exists and is a file.
46731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // |dest_file_path| exists and is a directory.
47731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!src_is_directory && dest_is_directory)
48731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return base::PLATFORM_FILE_ERROR_NOT_A_FILE;
49731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
50731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // It is an error to copy/move an entry into the same path.
51731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (src_file_path.value() == dest_file_path.value())
52731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return base::PLATFORM_FILE_ERROR_EXISTS;
53731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
54731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (dest_is_directory) {
55731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // It is an error to copy/move an entry to a non-empty directory.
56731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // Otherwise the copy/move attempt must overwrite the destination, but
57731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // the file_util's Copy or Move method doesn't perform overwrite
58731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // on all platforms, so we delete the destination directory here.
59731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // TODO(kinuko): may be better to change the file_util::{Copy,Move}.
60731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (!file_util::Delete(dest_file_path, false /* recursive */)) {
61731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      if (!file_util::IsDirectoryEmpty(dest_file_path))
62731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        return base::PLATFORM_FILE_ERROR_NOT_EMPTY;
63731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return base::PLATFORM_FILE_ERROR_FAILED;
64731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    }
65731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
66731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return base::PLATFORM_FILE_OK;
67731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
68731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
69513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}  // anonymous namespace
70731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass MessageLoopRelay
723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    : public base::RefCountedThreadSafe<MessageLoopRelay> {
733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  MessageLoopRelay()
753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      : origin_message_loop_proxy_(
763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick            base::MessageLoopProxy::CreateForCurrentThread()),
773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        error_code_(base::PLATFORM_FILE_OK) {
783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool Start(scoped_refptr<base::MessageLoopProxy> message_loop_proxy,
813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick             const tracked_objects::Location& from_here) {
823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return message_loop_proxy->PostTask(
833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        from_here,
843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        NewRunnableMethod(this, &MessageLoopRelay::ProcessOnTargetThread));
853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick protected:
883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  friend class base::RefCountedThreadSafe<MessageLoopRelay>;
893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual ~MessageLoopRelay() {}
903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Called to perform work on the FILE thread.
923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void RunWork() = 0;
933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Called to notify the callback on the origin thread.
953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void RunCallback() = 0;
963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void set_error_code(base::PlatformFileError error_code) {
983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    error_code_ = error_code;
993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
1003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  base::PlatformFileError error_code() const {
1023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return error_code_;
1033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
1043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
1063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void ProcessOnTargetThread() {
1073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    RunWork();
1083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    origin_message_loop_proxy_->PostTask(
1093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        FROM_HERE,
1103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        NewRunnableMethod(this, &MessageLoopRelay::RunCallback));
1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
1123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  scoped_refptr<base::MessageLoopProxy> origin_message_loop_proxy_;
1143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  base::PlatformFileError error_code_;
1153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
1163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass RelayCreateOrOpen : public MessageLoopRelay {
1183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
1193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  RelayCreateOrOpen(
1203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      scoped_refptr<base::MessageLoopProxy> message_loop_proxy,
1213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      const FilePath& file_path,
1223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      int file_flags,
1233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      base::FileUtilProxy::CreateOrOpenCallback* callback)
1243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      : message_loop_proxy_(message_loop_proxy),
1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        file_path_(file_path),
1263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        file_flags_(file_flags),
1273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        callback_(callback),
1283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        file_handle_(base::kInvalidPlatformFileValue),
1293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        created_(false) {
1303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    DCHECK(callback);
1313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
1323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick protected:
1343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual ~RelayCreateOrOpen() {
1353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (file_handle_ != base::kInvalidPlatformFileValue)
1363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      base::FileUtilProxy::Close(message_loop_proxy_, file_handle_, NULL);
1373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
1383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void RunWork() {
140731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (!file_util::DirectoryExists(file_path_.DirName())) {
141731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      // If its parent does not exist, should return NOT_FOUND error.
142731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      set_error_code(base::PLATFORM_FILE_ERROR_NOT_FOUND);
143731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return;
144731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    }
1453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    base::PlatformFileError error_code = base::PLATFORM_FILE_OK;
1463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    file_handle_ = base::CreatePlatformFile(file_path_, file_flags_,
1473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                            &created_, &error_code);
1483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    set_error_code(error_code);
1493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
1503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void RunCallback() {
1523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    callback_->Run(error_code(), base::PassPlatformFile(&file_handle_),
1533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                   created_);
1543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    delete callback_;
1553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
1563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
1583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  scoped_refptr<base::MessageLoopProxy> message_loop_proxy_;
1593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath file_path_;
1603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int file_flags_;
1613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  base::FileUtilProxy::CreateOrOpenCallback* callback_;
1623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  base::PlatformFile file_handle_;
1633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool created_;
1643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
1653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass RelayCreateTemporary : public MessageLoopRelay {
1673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
1683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  RelayCreateTemporary(
1693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      scoped_refptr<base::MessageLoopProxy> message_loop_proxy,
1703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      base::FileUtilProxy::CreateTemporaryCallback* callback)
1713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      : message_loop_proxy_(message_loop_proxy),
1723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        callback_(callback),
1733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        file_handle_(base::kInvalidPlatformFileValue) {
1743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    DCHECK(callback);
1753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
1763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick protected:
1783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual ~RelayCreateTemporary() {
1793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (file_handle_ != base::kInvalidPlatformFileValue)
1803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      base::FileUtilProxy::Close(message_loop_proxy_, file_handle_, NULL);
1813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
1823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void RunWork() {
1843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // TODO(darin): file_util should have a variant of CreateTemporaryFile
1853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // that returns a FilePath and a PlatformFile.
1863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    file_util::CreateTemporaryFile(&file_path_);
1873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // Use a fixed set of flags that are appropriate for writing to a temporary
1893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // file from the IO thread using a net::FileStream.
1903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    int file_flags =
1913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        base::PLATFORM_FILE_CREATE_ALWAYS |
1923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        base::PLATFORM_FILE_WRITE |
1933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        base::PLATFORM_FILE_ASYNC |
1943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        base::PLATFORM_FILE_TEMPORARY;
1953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    base::PlatformFileError error_code = base::PLATFORM_FILE_OK;
1963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    file_handle_ = base::CreatePlatformFile(file_path_, file_flags,
1973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                            NULL, &error_code);
1983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    set_error_code(error_code);
1993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void RunCallback() {
2023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    callback_->Run(error_code(), base::PassPlatformFile(&file_handle_),
2033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                   file_path_);
2043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    delete callback_;
2053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
2083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  scoped_refptr<base::MessageLoopProxy> message_loop_proxy_;
2093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  base::FileUtilProxy::CreateTemporaryCallback* callback_;
2103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  base::PlatformFile file_handle_;
2113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath file_path_;
2123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
2133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass RelayWithStatusCallback : public MessageLoopRelay {
2153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
2163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  explicit RelayWithStatusCallback(
2173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      base::FileUtilProxy::StatusCallback* callback)
2183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      : callback_(callback) {
2193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // It is OK for callback to be NULL.
2203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick protected:
2233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void RunCallback() {
2243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // The caller may not have been interested in the result.
2253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (callback_) {
2263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      callback_->Run(error_code());
2273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      delete callback_;
2283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
2293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
2323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  base::FileUtilProxy::StatusCallback* callback_;
2333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
2343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass RelayClose : public RelayWithStatusCallback {
2363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
2373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  RelayClose(base::PlatformFile file_handle,
2383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick             base::FileUtilProxy::StatusCallback* callback)
2393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      : RelayWithStatusCallback(callback),
2403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        file_handle_(file_handle) {
2413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick protected:
2443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void RunWork() {
2453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!base::ClosePlatformFile(file_handle_))
2463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      set_error_code(base::PLATFORM_FILE_ERROR_FAILED);
2473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
2503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  base::PlatformFile file_handle_;
2513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
2523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
253731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass RelayEnsureFileExists : public MessageLoopRelay {
254731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public:
255731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  RelayEnsureFileExists(
256731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      scoped_refptr<base::MessageLoopProxy> message_loop_proxy,
257731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      const FilePath& file_path,
258731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      base::FileUtilProxy::EnsureFileExistsCallback* callback)
259731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      : message_loop_proxy_(message_loop_proxy),
260731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        file_path_(file_path),
261731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        callback_(callback),
262731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        created_(false) {
263731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    DCHECK(callback);
264731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
265731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
266731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick protected:
267731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void RunWork() {
268731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (!file_util::DirectoryExists(file_path_.DirName())) {
269731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      // If its parent does not exist, should return NOT_FOUND error.
270731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      set_error_code(base::PLATFORM_FILE_ERROR_NOT_FOUND);
271731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return;
272731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    }
273731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    base::PlatformFileError error_code = base::PLATFORM_FILE_OK;
274731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // Tries to create the |file_path_| exclusively.  This should fail
275731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // with PLATFORM_FILE_ERROR_EXISTS if the path already exists.
276731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    base::PlatformFile handle = base::CreatePlatformFile(
277731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        file_path_,
278731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        base::PLATFORM_FILE_CREATE | base::PLATFORM_FILE_READ,
279731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        &created_, &error_code);
280731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (error_code == base::PLATFORM_FILE_ERROR_EXISTS) {
281731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      // Make sure created_ is false.
282731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      created_ = false;
283731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      error_code = base::PLATFORM_FILE_OK;
284731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    }
285731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (handle != base::kInvalidPlatformFileValue)
286731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      base::ClosePlatformFile(handle);
287731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    set_error_code(error_code);
288731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
289731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
290731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void RunCallback() {
291731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    callback_->Run(error_code(), created_);
292731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    delete callback_;
293731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
294731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
295731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick private:
296731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  scoped_refptr<base::MessageLoopProxy> message_loop_proxy_;
297731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  FilePath file_path_;
298731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  base::FileUtilProxy::EnsureFileExistsCallback* callback_;
299731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  bool created_;
300731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick};
301731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
3023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass RelayDelete : public RelayWithStatusCallback {
3033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
3043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  RelayDelete(const FilePath& file_path,
3053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick              bool recursive,
3063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick              base::FileUtilProxy::StatusCallback* callback)
3073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      : RelayWithStatusCallback(callback),
3083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        file_path_(file_path),
3093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        recursive_(recursive) {
3103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
3113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick protected:
3133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void RunWork() {
3143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!file_util::PathExists(file_path_)) {
3153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      set_error_code(base::PLATFORM_FILE_ERROR_NOT_FOUND);
3163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      return;
3173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
3183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!file_util::Delete(file_path_, recursive_)) {
3193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      if (!recursive_ && !file_util::IsDirectoryEmpty(file_path_)) {
320731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        set_error_code(base::PLATFORM_FILE_ERROR_NOT_EMPTY);
3213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        return;
3223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      }
3233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      set_error_code(base::PLATFORM_FILE_ERROR_FAILED);
3243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
3253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
3263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
3283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath file_path_;
3293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool recursive_;
3303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
3313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass RelayCopy : public RelayWithStatusCallback {
3333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
3343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  RelayCopy(const FilePath& src_file_path,
3353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick            const FilePath& dest_file_path,
3363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick            base::FileUtilProxy::StatusCallback* callback)
3373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      : RelayWithStatusCallback(callback),
3383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        src_file_path_(src_file_path),
3393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        dest_file_path_(dest_file_path) {
3403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
3413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick protected:
3433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void RunWork() {
344731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    set_error_code(PerformCommonCheckAndPreparationForMoveAndCopy(
345731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        src_file_path_, dest_file_path_));
346731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (error_code() != base::PLATFORM_FILE_OK)
3473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      return;
3483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!file_util::CopyDirectory(src_file_path_, dest_file_path_,
349731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        true /* recursive */))
3503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      set_error_code(base::PLATFORM_FILE_ERROR_FAILED);
3513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
3523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
3543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath src_file_path_;
3553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath dest_file_path_;
3563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
3573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass RelayMove : public RelayWithStatusCallback {
3593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
3603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  RelayMove(const FilePath& src_file_path,
3613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick            const FilePath& dest_file_path,
3623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick            base::FileUtilProxy::StatusCallback* callback)
3633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      : RelayWithStatusCallback(callback),
3643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        src_file_path_(src_file_path),
3653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        dest_file_path_(dest_file_path) {
3663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
3673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick protected:
3693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void RunWork() {
370731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    set_error_code(PerformCommonCheckAndPreparationForMoveAndCopy(
371731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        src_file_path_, dest_file_path_));
372731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (error_code() != base::PLATFORM_FILE_OK)
3733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      return;
374731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (!file_util::Move(src_file_path_, dest_file_path_))
3753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      set_error_code(base::PLATFORM_FILE_ERROR_FAILED);
3763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
3773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
3793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath src_file_path_;
3803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath dest_file_path_;
3813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
3823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass RelayCreateDirectory : public RelayWithStatusCallback {
3843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
3853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  RelayCreateDirectory(
3863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      const FilePath& file_path,
3873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      bool exclusive,
3883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      bool recursive,
3893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      base::FileUtilProxy::StatusCallback* callback)
3903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      : RelayWithStatusCallback(callback),
3913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        file_path_(file_path),
3923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        exclusive_(exclusive),
3933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        recursive_(recursive) {
3943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
3953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick protected:
3973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void RunWork() {
3983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    bool path_exists = file_util::PathExists(file_path_);
3993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // If parent dir of file doesn't exist.
4003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!recursive_ && !file_util::PathExists(file_path_.DirName())) {
4013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      set_error_code(base::PLATFORM_FILE_ERROR_NOT_FOUND);
4023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      return;
4033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
4043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (exclusive_ && path_exists) {
4053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      set_error_code(base::PLATFORM_FILE_ERROR_EXISTS);
4063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      return;
4073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
4083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // If file exists at the path.
4093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (path_exists && !file_util::DirectoryExists(file_path_)) {
4103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      set_error_code(base::PLATFORM_FILE_ERROR_EXISTS);
4113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      return;
4123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
4133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!file_util::CreateDirectory(file_path_))
4143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      set_error_code(base::PLATFORM_FILE_ERROR_FAILED);
4153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
4163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
4183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath file_path_;
4193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool exclusive_;
4203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool recursive_;
4213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
4223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass RelayReadDirectory : public MessageLoopRelay {
4243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
4253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  RelayReadDirectory(const FilePath& file_path,
4263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      base::FileUtilProxy::ReadDirectoryCallback* callback)
4273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      : callback_(callback), file_path_(file_path) {
4283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    DCHECK(callback);
4293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
4303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick protected:
4323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void RunWork() {
4333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // TODO(kkanetkar): Implement directory read in multiple chunks.
4343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!file_util::DirectoryExists(file_path_)) {
4353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      set_error_code(base::PLATFORM_FILE_ERROR_NOT_FOUND);
4363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      return;
4373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
4383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    file_util::FileEnumerator file_enum(
4403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        file_path_, false, static_cast<file_util::FileEnumerator::FILE_TYPE>(
4413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        file_util::FileEnumerator::FILES |
4423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        file_util::FileEnumerator::DIRECTORIES));
4433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    FilePath current;
4443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    while (!(current = file_enum.Next()).empty()) {
445513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      base::FileUtilProxy::Entry entry;
4463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      file_util::FileEnumerator::FindInfo info;
4473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      file_enum.GetFindInfo(&info);
4483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      entry.is_directory = file_enum.IsDirectory(info);
4493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      // This will just give the entry's name instead of entire path
4503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      // if we use current.value().
4513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      entry.name = file_util::FileEnumerator::GetFilename(info).value();
4523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      entries_.push_back(entry);
4533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
4543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
4553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void RunCallback() {
4573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    callback_->Run(error_code(), entries_);
4583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    delete callback_;
4593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
4603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
4623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  base::FileUtilProxy::ReadDirectoryCallback* callback_;
4633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath file_path_;
464513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  std::vector<base::FileUtilProxy::Entry> entries_;
4653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
4663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass RelayGetFileInfo : public MessageLoopRelay {
4683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
4693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  RelayGetFileInfo(const FilePath& file_path,
4703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                   base::FileUtilProxy::GetFileInfoCallback* callback)
4713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      : callback_(callback),
4723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        file_path_(file_path) {
4733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    DCHECK(callback);
4743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
4753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick protected:
4773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void RunWork() {
4783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!file_util::PathExists(file_path_)) {
4793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      set_error_code(base::PLATFORM_FILE_ERROR_NOT_FOUND);
4803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      return;
4813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
4823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!file_util::GetFileInfo(file_path_, &file_info_))
4833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      set_error_code(base::PLATFORM_FILE_ERROR_FAILED);
4843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
4853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void RunCallback() {
4873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    callback_->Run(error_code(), file_info_);
4883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    delete callback_;
4893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
4903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
4923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  base::FileUtilProxy::GetFileInfoCallback* callback_;
4933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath file_path_;
4943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  base::PlatformFileInfo file_info_;
4953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
4963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass RelayGetFileInfoFromPlatformFile : public MessageLoopRelay {
4983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
4993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  RelayGetFileInfoFromPlatformFile(
5003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      base::PlatformFile file,
5013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      base::FileUtilProxy::GetFileInfoCallback* callback)
5023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      : callback_(callback),
5033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        file_(file) {
5043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    DCHECK(callback);
5053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
5063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
5073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick protected:
5083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void RunWork() {
5093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!base::GetPlatformFileInfo(file_, &file_info_))
5103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      set_error_code(base::PLATFORM_FILE_ERROR_FAILED);
5113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
5123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
5133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void RunCallback() {
5143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    callback_->Run(error_code(), file_info_);
5153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    delete callback_;
5163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
5173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
5183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
5193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  base::FileUtilProxy::GetFileInfoCallback* callback_;
5203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  base::PlatformFile file_;
5213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  base::PlatformFileInfo file_info_;
5223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
5233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
5243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass RelayRead : public MessageLoopRelay {
5253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
5263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  RelayRead(base::PlatformFile file,
5273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick            int64 offset,
5283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick            char* buffer,
5293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick            int bytes_to_read,
5303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick            base::FileUtilProxy::ReadWriteCallback* callback)
5313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      : file_(file),
5323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        offset_(offset),
5333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        buffer_(buffer),
5343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        bytes_to_read_(bytes_to_read),
5353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        callback_(callback),
5363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        bytes_read_(0) {
5373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
5383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
5393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick protected:
5403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void RunWork() {
5413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    bytes_read_ = base::ReadPlatformFile(file_, offset_, buffer_,
5423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                         bytes_to_read_);
5433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (bytes_read_ < 0)
5443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      set_error_code(base::PLATFORM_FILE_ERROR_FAILED);
5453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
5463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
5473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void RunCallback() {
5483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (callback_) {
5493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      callback_->Run(error_code(), bytes_read_);
5503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      delete callback_;
5513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
5523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
5533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
5543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
5553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  base::PlatformFile file_;
5563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int64 offset_;
5573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  char* buffer_;
5583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int bytes_to_read_;
5593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  base::FileUtilProxy::ReadWriteCallback* callback_;
5603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int bytes_read_;
5613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
5623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
5633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass RelayWrite : public MessageLoopRelay {
5643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
5653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  RelayWrite(base::PlatformFile file,
566731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick             int64 offset,
5673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick             const char* buffer,
5683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick             int bytes_to_write,
5693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick             base::FileUtilProxy::ReadWriteCallback* callback)
5703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      : file_(file),
5713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        offset_(offset),
5723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        buffer_(buffer),
5733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        bytes_to_write_(bytes_to_write),
5743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        callback_(callback) {
5753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
5763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
5773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick protected:
5783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void RunWork() {
5793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    bytes_written_ = base::WritePlatformFile(file_, offset_, buffer_,
5803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                             bytes_to_write_);
5813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (bytes_written_ < 0)
5823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      set_error_code(base::PLATFORM_FILE_ERROR_FAILED);
5833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
5843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
5853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void RunCallback() {
5863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (callback_) {
5873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      callback_->Run(error_code(), bytes_written_);
5883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      delete callback_;
5893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
5903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
5913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
5923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
5933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  base::PlatformFile file_;
5943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int64 offset_;
5953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const char* buffer_;
5963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int bytes_to_write_;
5973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  base::FileUtilProxy::ReadWriteCallback* callback_;
5983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int bytes_written_;
5993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
6003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass RelayTouch : public RelayWithStatusCallback {
6023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
6033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  RelayTouch(base::PlatformFile file,
6043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick             const base::Time& last_access_time,
6053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick             const base::Time& last_modified_time,
6063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick             base::FileUtilProxy::StatusCallback* callback)
6073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      : RelayWithStatusCallback(callback),
6083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        file_(file),
6093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        last_access_time_(last_access_time),
6103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        last_modified_time_(last_modified_time) {
6113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
6123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick protected:
6143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void RunWork() {
6153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!base::TouchPlatformFile(file_, last_access_time_, last_modified_time_))
6163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      set_error_code(base::PLATFORM_FILE_ERROR_FAILED);
6173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
6183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
6203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  base::PlatformFile file_;
6213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  base::Time last_access_time_;
6223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  base::Time last_modified_time_;
6233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
6243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass RelayTouchFilePath : public RelayWithStatusCallback {
6263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
6273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  RelayTouchFilePath(const FilePath& file_path,
6283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                     const base::Time& last_access_time,
6293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                     const base::Time& last_modified_time,
6303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                     base::FileUtilProxy::StatusCallback* callback)
6313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      : RelayWithStatusCallback(callback),
6323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        file_path_(file_path),
6333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        last_access_time_(last_access_time),
6343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        last_modified_time_(last_modified_time) {
6353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
6363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick protected:
6383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void RunWork() {
6393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!file_util::TouchFile(
6403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick            file_path_, last_access_time_, last_modified_time_))
6413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      set_error_code(base::PLATFORM_FILE_ERROR_FAILED);
6423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
6433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
6453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath file_path_;
6463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  base::Time last_access_time_;
6473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  base::Time last_modified_time_;
6483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
6493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
650731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass RelayTruncatePlatformFile : public RelayWithStatusCallback {
6513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
652731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  RelayTruncatePlatformFile(base::PlatformFile file,
653731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                            int64 length,
654731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                            base::FileUtilProxy::StatusCallback* callback)
6553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      : RelayWithStatusCallback(callback),
6563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        file_(file),
6573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        length_(length) {
6583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
6593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick protected:
6613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void RunWork() {
6623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!base::TruncatePlatformFile(file_, length_))
6633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      set_error_code(base::PLATFORM_FILE_ERROR_FAILED);
6643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
6653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
6673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  base::PlatformFile file_;
6683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int64 length_;
6693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
6703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
671731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass RelayTruncate : public RelayWithStatusCallback {
672731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public:
673731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  RelayTruncate(const FilePath& path,
674731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                int64 length,
675731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                base::FileUtilProxy::StatusCallback* callback)
676731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      : RelayWithStatusCallback(callback),
677731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        path_(path),
678731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        length_(length) {
679731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
680731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
681731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick protected:
682731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void RunWork() {
683731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    base::PlatformFileError error_code(base::PLATFORM_FILE_ERROR_FAILED);
684731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    base::PlatformFile file =
685731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        base::CreatePlatformFile(
686731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick            path_,
687731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick            base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_WRITE,
688731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick            NULL,
689731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick            &error_code);
690731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (error_code != base::PLATFORM_FILE_OK) {
691731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      set_error_code(error_code);
692731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return;
693731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    }
694731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (!base::TruncatePlatformFile(file, length_))
695731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      set_error_code(base::PLATFORM_FILE_ERROR_FAILED);
696731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    base::ClosePlatformFile(file);
697731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
698731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
699731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick private:
700731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  FilePath path_;
701731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  int64 length_;
702731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick};
703731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
7043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass RelayFlush : public RelayWithStatusCallback {
7053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
7063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  RelayFlush(base::PlatformFile file,
7073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick             base::FileUtilProxy::StatusCallback* callback)
7083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      : RelayWithStatusCallback(callback),
7093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        file_(file) {
7103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
7113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick protected:
7133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void RunWork() {
7143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!base::FlushPlatformFile(file_))
7153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      set_error_code(base::PLATFORM_FILE_ERROR_FAILED);
7163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
7173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
7193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  base::PlatformFile file_;
7203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
7213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool Start(const tracked_objects::Location& from_here,
7233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick           scoped_refptr<base::MessageLoopProxy> message_loop_proxy,
7243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick           scoped_refptr<MessageLoopRelay> relay) {
7253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return relay->Start(message_loop_proxy, from_here);
7263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
7273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}  // namespace
7293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merricknamespace base {
7313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
7333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool FileUtilProxy::CreateOrOpen(
7343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    scoped_refptr<MessageLoopProxy> message_loop_proxy,
7353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const FilePath& file_path, int file_flags,
7363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    CreateOrOpenCallback* callback) {
7373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return Start(FROM_HERE, message_loop_proxy, new RelayCreateOrOpen(
7383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      message_loop_proxy, file_path, file_flags, callback));
7393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
7403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
7423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool FileUtilProxy::CreateTemporary(
7433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    scoped_refptr<MessageLoopProxy> message_loop_proxy,
7443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    CreateTemporaryCallback* callback) {
7453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return Start(FROM_HERE, message_loop_proxy,
7463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick               new RelayCreateTemporary(message_loop_proxy, callback));
7473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
7483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
7503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool FileUtilProxy::CreateDirectory(
7513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    scoped_refptr<MessageLoopProxy> message_loop_proxy,
7523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const FilePath& file_path,
7533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    bool exclusive,
7543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    bool recursive,
7553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    StatusCallback* callback) {
7563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return Start(FROM_HERE, message_loop_proxy, new RelayCreateDirectory(
7573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      file_path, exclusive, recursive, callback));
7583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
7593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
7613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool FileUtilProxy::Close(scoped_refptr<MessageLoopProxy> message_loop_proxy,
7623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                          base::PlatformFile file_handle,
7633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                          StatusCallback* callback) {
7643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return Start(FROM_HERE, message_loop_proxy,
7653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick               new RelayClose(file_handle, callback));
7663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
7673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
769731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool FileUtilProxy::EnsureFileExists(
770731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    scoped_refptr<MessageLoopProxy> message_loop_proxy,
771731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const FilePath& file_path,
772731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    EnsureFileExistsCallback* callback) {
773731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return Start(FROM_HERE, message_loop_proxy, new RelayEnsureFileExists(
774731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      message_loop_proxy, file_path, callback));
775731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
776731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
777731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// static
7783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool FileUtilProxy::Delete(scoped_refptr<MessageLoopProxy> message_loop_proxy,
7793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                           const FilePath& file_path,
780731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                           bool recursive,
7813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                           StatusCallback* callback) {
7823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return Start(FROM_HERE, message_loop_proxy,
783731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick               new RelayDelete(file_path, recursive, callback));
7843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
7853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
7873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool FileUtilProxy::Copy(scoped_refptr<MessageLoopProxy> message_loop_proxy,
7883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                         const FilePath& src_file_path,
7893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                         const FilePath& dest_file_path,
7903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                         StatusCallback* callback) {
7913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return Start(FROM_HERE, message_loop_proxy,
7923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick               new RelayCopy(src_file_path, dest_file_path, callback));
7933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
7943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
7963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool FileUtilProxy::Move(scoped_refptr<MessageLoopProxy> message_loop_proxy,
7973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                         const FilePath& src_file_path,
7983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                         const FilePath& dest_file_path,
7993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                         StatusCallback* callback) {
8003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return Start(FROM_HERE, message_loop_proxy,
8013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick               new RelayMove(src_file_path, dest_file_path, callback));
8023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
8033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
8043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
8053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool FileUtilProxy::ReadDirectory(
8063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    scoped_refptr<MessageLoopProxy> message_loop_proxy,
8073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const FilePath& file_path,
8083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ReadDirectoryCallback* callback) {
8093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return Start(FROM_HERE, message_loop_proxy, new RelayReadDirectory(
8103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick               file_path, callback));
8113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
8123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
8133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Retrieves the information about a file. It is invalid to pass NULL for the
8143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// callback.
8153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool FileUtilProxy::GetFileInfo(
8163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    scoped_refptr<MessageLoopProxy> message_loop_proxy,
8173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const FilePath& file_path,
8183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    GetFileInfoCallback* callback) {
8193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return Start(FROM_HERE, message_loop_proxy, new RelayGetFileInfo(
8203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick               file_path, callback));
8213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
8223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
8233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
8243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool FileUtilProxy::RecursiveDelete(
8253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    scoped_refptr<MessageLoopProxy> message_loop_proxy,
8263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const FilePath& file_path,
8273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    StatusCallback* callback) {
8283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return Start(FROM_HERE, message_loop_proxy,
8293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick               new RelayDelete(file_path, true, callback));
8303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
8313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
8323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
8333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool FileUtilProxy::GetFileInfoFromPlatformFile(
8343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    scoped_refptr<MessageLoopProxy> message_loop_proxy,
8353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    PlatformFile file,
8363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    GetFileInfoCallback* callback) {
8373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return Start(FROM_HERE, message_loop_proxy,
8383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick               new RelayGetFileInfoFromPlatformFile(file, callback));
8393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
8403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
8413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
8423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool FileUtilProxy::Read(
8433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    scoped_refptr<MessageLoopProxy> message_loop_proxy,
8443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    PlatformFile file,
8453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    int64 offset,
8463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    char* buffer,
8473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    int bytes_to_read,
8483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ReadWriteCallback* callback) {
8493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return Start(FROM_HERE, message_loop_proxy,
8503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick               new RelayRead(file, offset, buffer, bytes_to_read, callback));
8513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
8523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
8533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
8543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool FileUtilProxy::Write(
8553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    scoped_refptr<MessageLoopProxy> message_loop_proxy,
8563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    PlatformFile file,
8573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    int64 offset,
8583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const char* buffer,
8593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    int bytes_to_write,
8603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ReadWriteCallback* callback) {
8613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return Start(FROM_HERE, message_loop_proxy,
8623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick               new RelayWrite(file, offset, buffer, bytes_to_write, callback));
8633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
8643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
8653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
8663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool FileUtilProxy::Touch(
8673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    scoped_refptr<MessageLoopProxy> message_loop_proxy,
8683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    PlatformFile file,
8693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const base::Time& last_access_time,
8703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const base::Time& last_modified_time,
8713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    StatusCallback* callback) {
8723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return Start(FROM_HERE, message_loop_proxy,
8733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick               new RelayTouch(file, last_access_time, last_modified_time,
8743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                              callback));
8753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
8763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
8773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
8783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool FileUtilProxy::Touch(
8793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    scoped_refptr<MessageLoopProxy> message_loop_proxy,
8803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const FilePath& file_path,
8813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const base::Time& last_access_time,
8823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const base::Time& last_modified_time,
8833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    StatusCallback* callback) {
8843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return Start(FROM_HERE, message_loop_proxy,
8853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick               new RelayTouchFilePath(file_path, last_access_time,
8863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                      last_modified_time, callback));
8873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
8883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
8893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
8903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool FileUtilProxy::Truncate(
8913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    scoped_refptr<MessageLoopProxy> message_loop_proxy,
8923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    PlatformFile file,
893731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    int64 length,
894731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    StatusCallback* callback) {
895731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return Start(FROM_HERE, message_loop_proxy,
896731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick               new RelayTruncatePlatformFile(file, length, callback));
897731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
898731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
899731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// static
900731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool FileUtilProxy::Truncate(
901731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    scoped_refptr<MessageLoopProxy> message_loop_proxy,
902731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const FilePath& path,
903731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    int64 length,
9043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    StatusCallback* callback) {
9053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return Start(FROM_HERE, message_loop_proxy,
906731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick               new RelayTruncate(path, length, callback));
9073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
9083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
9093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
9103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool FileUtilProxy::Flush(
9113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    scoped_refptr<MessageLoopProxy> message_loop_proxy,
9123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    PlatformFile file,
9133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    StatusCallback* callback) {
9143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return Start(FROM_HERE, message_loop_proxy, new RelayFlush(file, callback));
9153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
9163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
9173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}  // namespace base
918