1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 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            int bytes_to_read,
52972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen            base::FileUtilProxy::ReadCallback* callback)
5303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      : file_(file),
5313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        offset_(offset),
53272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        buffer_(new char[bytes_to_read]),
5333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        bytes_to_read_(bytes_to_read),
5343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        callback_(callback),
5353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        bytes_read_(0) {
5363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
5373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
5383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick protected:
5393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void RunWork() {
54072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    bytes_read_ = base::ReadPlatformFile(file_, offset_, buffer_.get(),
5413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                         bytes_to_read_);
5423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (bytes_read_ < 0)
5433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      set_error_code(base::PLATFORM_FILE_ERROR_FAILED);
5443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
5453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
5463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void RunCallback() {
5473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (callback_) {
54872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      callback_->Run(error_code(), buffer_.get(), bytes_read_);
5493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      delete callback_;
5503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
5513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
5523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
5533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
5543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  base::PlatformFile file_;
5553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int64 offset_;
55672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_array<char> buffer_;
5573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int bytes_to_read_;
55872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::FileUtilProxy::ReadCallback* callback_;
5593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int bytes_read_;
5603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
5613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
5623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass RelayWrite : public MessageLoopRelay {
5633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
5643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  RelayWrite(base::PlatformFile file,
565731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick             int64 offset,
5663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick             const char* buffer,
5673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick             int bytes_to_write,
56872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen             base::FileUtilProxy::WriteCallback* callback)
5693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      : file_(file),
5703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        offset_(offset),
57172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        buffer_(new char[bytes_to_write]),
5723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        bytes_to_write_(bytes_to_write),
573ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        callback_(callback),
574ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        bytes_written_(0) {
57572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    memcpy(buffer_.get(), buffer, bytes_to_write);
5763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
5773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
5783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick protected:
5793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void RunWork() {
58072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    bytes_written_ = base::WritePlatformFile(file_, offset_, buffer_.get(),
5813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                             bytes_to_write_);
5823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (bytes_written_ < 0)
5833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      set_error_code(base::PLATFORM_FILE_ERROR_FAILED);
5843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
5853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
5863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void RunCallback() {
5873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (callback_) {
5883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      callback_->Run(error_code(), bytes_written_);
5893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      delete callback_;
5903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
5913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
5923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
5933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
5943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  base::PlatformFile file_;
5953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int64 offset_;
59672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_array<char> buffer_;
5973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int bytes_to_write_;
59872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::FileUtilProxy::WriteCallback* callback_;
5993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int bytes_written_;
6003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
6013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass RelayTouch : public RelayWithStatusCallback {
6033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
6043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  RelayTouch(base::PlatformFile file,
6053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick             const base::Time& last_access_time,
6063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick             const base::Time& last_modified_time,
6073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick             base::FileUtilProxy::StatusCallback* callback)
6083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      : RelayWithStatusCallback(callback),
6093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        file_(file),
6103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        last_access_time_(last_access_time),
6113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        last_modified_time_(last_modified_time) {
6123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
6133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick protected:
6153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void RunWork() {
6163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!base::TouchPlatformFile(file_, last_access_time_, last_modified_time_))
6173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      set_error_code(base::PLATFORM_FILE_ERROR_FAILED);
6183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
6193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
6213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  base::PlatformFile file_;
6223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  base::Time last_access_time_;
6233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  base::Time last_modified_time_;
6243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
6253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass RelayTouchFilePath : public RelayWithStatusCallback {
6273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
6283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  RelayTouchFilePath(const FilePath& file_path,
6293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                     const base::Time& last_access_time,
6303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                     const base::Time& last_modified_time,
6313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                     base::FileUtilProxy::StatusCallback* callback)
6323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      : RelayWithStatusCallback(callback),
6333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        file_path_(file_path),
6343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        last_access_time_(last_access_time),
6353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        last_modified_time_(last_modified_time) {
6363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
6373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick protected:
6393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void RunWork() {
6403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!file_util::TouchFile(
6413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick            file_path_, last_access_time_, last_modified_time_))
6423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      set_error_code(base::PLATFORM_FILE_ERROR_FAILED);
6433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
6443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
6463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath file_path_;
6473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  base::Time last_access_time_;
6483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  base::Time last_modified_time_;
6493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
6503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
651731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass RelayTruncatePlatformFile : public RelayWithStatusCallback {
6523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
653731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  RelayTruncatePlatformFile(base::PlatformFile file,
654731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                            int64 length,
655731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                            base::FileUtilProxy::StatusCallback* callback)
6563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      : RelayWithStatusCallback(callback),
6573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        file_(file),
6583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        length_(length) {
6593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
6603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick protected:
6623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void RunWork() {
6633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!base::TruncatePlatformFile(file_, length_))
6643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      set_error_code(base::PLATFORM_FILE_ERROR_FAILED);
6653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
6663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
6683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  base::PlatformFile file_;
6693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int64 length_;
6703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
6713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
672731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass RelayTruncate : public RelayWithStatusCallback {
673731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public:
674731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  RelayTruncate(const FilePath& path,
675731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                int64 length,
676731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                base::FileUtilProxy::StatusCallback* callback)
677731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      : RelayWithStatusCallback(callback),
678731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        path_(path),
679731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        length_(length) {
680731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
681731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
682731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick protected:
683731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void RunWork() {
684731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    base::PlatformFileError error_code(base::PLATFORM_FILE_ERROR_FAILED);
685731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    base::PlatformFile file =
686731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        base::CreatePlatformFile(
687731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick            path_,
688731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick            base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_WRITE,
689731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick            NULL,
690731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick            &error_code);
691731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (error_code != base::PLATFORM_FILE_OK) {
692731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      set_error_code(error_code);
693731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      return;
694731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    }
695731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (!base::TruncatePlatformFile(file, length_))
696731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      set_error_code(base::PLATFORM_FILE_ERROR_FAILED);
697731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    base::ClosePlatformFile(file);
698731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
699731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
700731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick private:
701731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  FilePath path_;
702731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  int64 length_;
703731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick};
704731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
7053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass RelayFlush : public RelayWithStatusCallback {
7063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
7073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  RelayFlush(base::PlatformFile file,
7083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick             base::FileUtilProxy::StatusCallback* callback)
7093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      : RelayWithStatusCallback(callback),
7103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        file_(file) {
7113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
7123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick protected:
7143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void RunWork() {
7153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!base::FlushPlatformFile(file_))
7163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      set_error_code(base::PLATFORM_FILE_ERROR_FAILED);
7173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
7183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
7203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  base::PlatformFile file_;
7213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
7223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool Start(const tracked_objects::Location& from_here,
7243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick           scoped_refptr<base::MessageLoopProxy> message_loop_proxy,
7253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick           scoped_refptr<MessageLoopRelay> relay) {
7263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return relay->Start(message_loop_proxy, from_here);
7273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
7283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}  // namespace
7303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merricknamespace base {
7323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
7343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool FileUtilProxy::CreateOrOpen(
7353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    scoped_refptr<MessageLoopProxy> message_loop_proxy,
7363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const FilePath& file_path, int file_flags,
7373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    CreateOrOpenCallback* callback) {
7383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return Start(FROM_HERE, message_loop_proxy, new RelayCreateOrOpen(
7393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      message_loop_proxy, file_path, file_flags, callback));
7403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
7413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
7433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool FileUtilProxy::CreateTemporary(
7443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    scoped_refptr<MessageLoopProxy> message_loop_proxy,
7453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    CreateTemporaryCallback* callback) {
7463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return Start(FROM_HERE, message_loop_proxy,
7473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick               new RelayCreateTemporary(message_loop_proxy, callback));
7483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
7493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
7513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool FileUtilProxy::Close(scoped_refptr<MessageLoopProxy> message_loop_proxy,
7523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                          base::PlatformFile file_handle,
7533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                          StatusCallback* callback) {
7543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return Start(FROM_HERE, message_loop_proxy,
7553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick               new RelayClose(file_handle, callback));
7563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
7573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
759731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool FileUtilProxy::EnsureFileExists(
760731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    scoped_refptr<MessageLoopProxy> message_loop_proxy,
761731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    const FilePath& file_path,
762731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    EnsureFileExistsCallback* callback) {
763731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return Start(FROM_HERE, message_loop_proxy, new RelayEnsureFileExists(
764731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      message_loop_proxy, file_path, callback));
765731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
766731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
76772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Retrieves the information about a file. It is invalid to pass NULL for the
76872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// callback.
76972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool FileUtilProxy::GetFileInfo(
77072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    scoped_refptr<MessageLoopProxy> message_loop_proxy,
77172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const FilePath& file_path,
77272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    GetFileInfoCallback* callback) {
77372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return Start(FROM_HERE, message_loop_proxy, new RelayGetFileInfo(
77472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen               file_path, callback));
77572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
77672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
777731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// static
77872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool FileUtilProxy::GetFileInfoFromPlatformFile(
77972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    scoped_refptr<MessageLoopProxy> message_loop_proxy,
78072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    PlatformFile file,
78172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    GetFileInfoCallback* callback) {
7823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return Start(FROM_HERE, message_loop_proxy,
78372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen               new RelayGetFileInfoFromPlatformFile(file, callback));
78472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
78572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
78672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// static
78772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool FileUtilProxy::ReadDirectory(
78872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    scoped_refptr<MessageLoopProxy> message_loop_proxy,
78972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const FilePath& file_path,
79072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ReadDirectoryCallback* callback) {
79172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return Start(FROM_HERE, message_loop_proxy, new RelayReadDirectory(
79272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen               file_path, callback));
79372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
79472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
79572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// static
79672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool FileUtilProxy::CreateDirectory(
79772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    scoped_refptr<MessageLoopProxy> message_loop_proxy,
79872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const FilePath& file_path,
79972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    bool exclusive,
80072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    bool recursive,
80172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    StatusCallback* callback) {
80272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return Start(FROM_HERE, message_loop_proxy, new RelayCreateDirectory(
80372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      file_path, exclusive, recursive, callback));
8043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
8053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
8063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
8073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool FileUtilProxy::Copy(scoped_refptr<MessageLoopProxy> message_loop_proxy,
8083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                         const FilePath& src_file_path,
8093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                         const FilePath& dest_file_path,
8103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                         StatusCallback* callback) {
8113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return Start(FROM_HERE, message_loop_proxy,
8123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick               new RelayCopy(src_file_path, dest_file_path, callback));
8133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
8143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
8153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
8163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool FileUtilProxy::Move(scoped_refptr<MessageLoopProxy> message_loop_proxy,
8173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                         const FilePath& src_file_path,
8183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                         const FilePath& dest_file_path,
8193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                         StatusCallback* callback) {
8203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return Start(FROM_HERE, message_loop_proxy,
8213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick               new RelayMove(src_file_path, dest_file_path, callback));
8223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
8233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
8243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
82572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool FileUtilProxy::Delete(scoped_refptr<MessageLoopProxy> message_loop_proxy,
82672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                           const FilePath& file_path,
82772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                           bool recursive,
82872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                           StatusCallback* callback) {
82972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return Start(FROM_HERE, message_loop_proxy,
83072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen               new RelayDelete(file_path, recursive, callback));
8313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
8323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
8333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
8343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool FileUtilProxy::RecursiveDelete(
8353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    scoped_refptr<MessageLoopProxy> message_loop_proxy,
8363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const FilePath& file_path,
8373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    StatusCallback* callback) {
8383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return Start(FROM_HERE, message_loop_proxy,
8393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick               new RelayDelete(file_path, true, callback));
8403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
8413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
8423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
8433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool FileUtilProxy::Read(
8443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    scoped_refptr<MessageLoopProxy> message_loop_proxy,
8453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    PlatformFile file,
8463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    int64 offset,
8473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    int bytes_to_read,
84872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ReadCallback* callback) {
8493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return Start(FROM_HERE, message_loop_proxy,
85072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen               new RelayRead(file, offset, 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,
86072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    WriteCallback* 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