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