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