Second try at submitting 61462.

BUG=none
TEST=in file_system_operation_unittest.cc

Review URL: http://codereview.chromium.org/3526018

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@61468 0039d316-1c4b-4281-b951-d872f2087c98


CrOS-Libchrome-Original-Commit: 7eb68a27b4edcf33b6f8edeb5a133d7397409cd8
diff --git a/base/file_util_proxy.cc b/base/file_util_proxy.cc
index 7f7b03a..d71f374 100644
--- a/base/file_util_proxy.cc
+++ b/base/file_util_proxy.cc
@@ -498,7 +498,7 @@
 class RelayWrite : public MessageLoopRelay {
  public:
   RelayWrite(base::PlatformFile file,
-             long long offset,
+             int64 offset,
              const char* buffer,
              int bytes_to_write,
              base::FileUtilProxy::ReadWriteCallback* callback)
@@ -582,11 +582,11 @@
   base::Time last_modified_time_;
 };
 
-class RelayTruncate : public RelayWithStatusCallback {
+class RelayTruncatePlatformFile : public RelayWithStatusCallback {
  public:
-  RelayTruncate(base::PlatformFile file,
-                int64 length,
-                base::FileUtilProxy::StatusCallback* callback)
+  RelayTruncatePlatformFile(base::PlatformFile file,
+                            int64 length,
+                            base::FileUtilProxy::StatusCallback* callback)
       : RelayWithStatusCallback(callback),
         file_(file),
         length_(length) {
@@ -603,6 +603,39 @@
   int64 length_;
 };
 
+class RelayTruncate : public RelayWithStatusCallback {
+ public:
+  RelayTruncate(const FilePath& path,
+                int64 length,
+                base::FileUtilProxy::StatusCallback* callback)
+      : RelayWithStatusCallback(callback),
+        path_(path),
+        length_(length) {
+  }
+
+ protected:
+  virtual void RunWork() {
+    base::PlatformFileError error_code(base::PLATFORM_FILE_ERROR_FAILED);
+    base::PlatformFile file =
+        base::CreatePlatformFile(
+            path_,
+            base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_WRITE,
+            NULL,
+            &error_code);
+    if (error_code != base::PLATFORM_FILE_OK) {
+      set_error_code(error_code);
+      return;
+    }
+    if (!base::TruncatePlatformFile(file, length_))
+      set_error_code(base::PLATFORM_FILE_ERROR_FAILED);
+    base::ClosePlatformFile(file);
+  }
+
+ private:
+  FilePath path_;
+  int64 length_;
+};
+
 class RelayFlush : public RelayWithStatusCallback {
  public:
   RelayFlush(base::PlatformFile file,
@@ -782,10 +815,20 @@
 bool FileUtilProxy::Truncate(
     scoped_refptr<MessageLoopProxy> message_loop_proxy,
     PlatformFile file,
-    long long length,
+    int64 length,
     StatusCallback* callback) {
   return Start(FROM_HERE, message_loop_proxy,
-               new RelayTruncate(file, length, callback));
+               new RelayTruncatePlatformFile(file, length, callback));
+}
+
+// static
+bool FileUtilProxy::Truncate(
+    scoped_refptr<MessageLoopProxy> message_loop_proxy,
+    const FilePath& path,
+    int64 length,
+    StatusCallback* callback) {
+  return Start(FROM_HERE, message_loop_proxy,
+               new RelayTruncate(path, length, callback));
 }
 
 // static
diff --git a/base/file_util_proxy.h b/base/file_util_proxy.h
index 081c11b..32b7863 100644
--- a/base/file_util_proxy.h
+++ b/base/file_util_proxy.h
@@ -138,7 +138,7 @@
 
   // Writes to a file. If |offset| is greater than the length of the file,
   // |false| is returned. On success, the file pointer is moved to position
-  // |offset + bytes_to_write| in the file. If The callback can be NULL.
+  // |offset + bytes_to_write| in the file. The callback can be NULL.
   static bool Write(
       scoped_refptr<MessageLoopProxy> message_loop_proxy,
       base::PlatformFile file,
@@ -169,7 +169,16 @@
   static bool Truncate(
       scoped_refptr<MessageLoopProxy> message_loop_proxy,
       base::PlatformFile file,
-      long long length,
+      int64 length,
+      StatusCallback* callback);
+
+  // Truncates a file to the given length. If |length| is greater than the
+  // current length of the file, the file will be extended with zeroes.
+  // The callback can be NULL.
+  static bool Truncate(
+      scoped_refptr<MessageLoopProxy> message_loop_proxy,
+      const FilePath& path,
+      int64 length,
       StatusCallback* callback);
 
   // Flushes a file. The callback can be NULL.