file_util_proxy.h revision 3f50c38dc070f4bb515c1b64450dae14f316474e
1// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef BASE_FILE_UTIL_PROXY_H_ 6#define BASE_FILE_UTIL_PROXY_H_ 7 8#include <vector> 9 10#include "base/callback.h" 11#include "base/file_path.h" 12#include "base/file_util.h" 13#include "base/platform_file.h" 14#include "base/ref_counted.h" 15#include "base/tracked_objects.h" 16 17namespace base { 18 19class MessageLoopProxy; 20class Time; 21 22// This class provides asynchronous access to common file routines. 23class FileUtilProxy { 24 public: 25 // Holds metadata for file or directory entry. Used by ReadDirectoryCallback. 26 struct Entry { 27 FilePath::StringType name; 28 bool is_directory; 29 }; 30 31 // This callback is used by methods that report only an error code. It is 32 // valid to pass NULL as the callback parameter to any function that takes a 33 // StatusCallback, in which case the operation will complete silently. 34 typedef Callback1<PlatformFileError /* error code */>::Type StatusCallback; 35 36 typedef Callback3<PlatformFileError /* error code */, 37 PassPlatformFile, 38 bool /* created */>::Type CreateOrOpenCallback; 39 typedef Callback3<PlatformFileError /* error code */, 40 PassPlatformFile, 41 FilePath>::Type CreateTemporaryCallback; 42 typedef Callback2<PlatformFileError /* error code */, 43 bool /* created */>::Type EnsureFileExistsCallback; 44 typedef Callback2<PlatformFileError /* error code */, 45 const PlatformFileInfo& /* file_info */ 46 >::Type GetFileInfoCallback; 47 typedef Callback2<PlatformFileError /* error code */, 48 const std::vector<Entry>&>::Type ReadDirectoryCallback; 49 typedef Callback2<PlatformFileError /* error code */, 50 int /* bytes read/written */>::Type ReadWriteCallback; 51 52 // Creates or opens a file with the given flags. It is invalid to pass NULL 53 // for the callback. 54 // If PLATFORM_FILE_CREATE is set in |file_flags| it always tries to create 55 // a new file at the given |file_path| and calls back with 56 // PLATFORM_FILE_ERROR_FILE_EXISTS if the |file_path| already exists. 57 static bool CreateOrOpen(scoped_refptr<MessageLoopProxy> message_loop_proxy, 58 const FilePath& file_path, 59 int file_flags, 60 CreateOrOpenCallback* callback); 61 62 // Creates a temporary file for writing. The path and an open file handle 63 // are returned. It is invalid to pass NULL for the callback. 64 static bool CreateTemporary( 65 scoped_refptr<MessageLoopProxy> message_loop_proxy, 66 CreateTemporaryCallback* callback); 67 68 // Close the given file handle. 69 static bool Close(scoped_refptr<MessageLoopProxy> message_loop_proxy, 70 PlatformFile, 71 StatusCallback* callback); 72 73 // Ensures that the given |file_path| exist. This creates a empty new file 74 // at |file_path| if the |file_path| does not exist. 75 // If a new file han not existed and is created at the |file_path|, 76 // |created| of the callback argument is set true and |error code| 77 // is set PLATFORM_FILE_OK. 78 // If the file already exists, |created| is set false and |error code| 79 // is set PLATFORM_FILE_OK. 80 // If the file hasn't existed but it couldn't be created for some other 81 // reasons, |created| is set false and |error code| indicates the error. 82 static bool EnsureFileExists( 83 scoped_refptr<MessageLoopProxy> message_loop_proxy, 84 const FilePath& file_path, 85 EnsureFileExistsCallback* callback); 86 87 // Retrieves the information about a file. It is invalid to pass NULL for the 88 // callback. 89 static bool GetFileInfo( 90 scoped_refptr<MessageLoopProxy> message_loop_proxy, 91 const FilePath& file_path, 92 GetFileInfoCallback* callback); 93 94 static bool GetFileInfoFromPlatformFile( 95 scoped_refptr<MessageLoopProxy> message_loop_proxy, 96 PlatformFile file, 97 GetFileInfoCallback* callback); 98 99 static bool ReadDirectory(scoped_refptr<MessageLoopProxy> message_loop_proxy, 100 const FilePath& file_path, 101 ReadDirectoryCallback* callback); 102 103 // Copies a file or a directory from |src_file_path| to |dest_file_path| 104 // Error cases: 105 // If destination file doesn't exist or destination's parent 106 // doesn't exists. 107 // If source dir exists but destination path is an existing file. 108 // If source file exists but destination path is an existing directory. 109 // If source is a parent of destination. 110 // If source doesn't exists. 111 static bool Copy(scoped_refptr<MessageLoopProxy> message_loop_proxy, 112 const FilePath& src_file_path, 113 const FilePath& dest_file_path, 114 StatusCallback* callback); 115 116 // Creates directory at given path. It's an error to create 117 // if |exclusive| is true and dir already exists. 118 static bool CreateDirectory( 119 scoped_refptr<MessageLoopProxy> message_loop_proxy, 120 const FilePath& file_path, 121 bool exclusive, 122 bool recursive, 123 StatusCallback* callback); 124 125 // Deletes a file or a directory. 126 // It is an error to delete a non-empty directory with recursive=false. 127 static bool Delete(scoped_refptr<MessageLoopProxy> message_loop_proxy, 128 const FilePath& file_path, 129 bool recursive, 130 StatusCallback* callback); 131 132 // Moves a file or a directory from src_file_path to dest_file_path. 133 // Error cases are similar to Copy method's error cases. 134 static bool Move( 135 scoped_refptr<MessageLoopProxy> message_loop_proxy, 136 const FilePath& src_file_path, 137 const FilePath& dest_file_path, 138 StatusCallback* callback); 139 140 // Deletes a directory and all of its contents. 141 static bool RecursiveDelete( 142 scoped_refptr<MessageLoopProxy> message_loop_proxy, 143 const FilePath& file_path, 144 StatusCallback* callback); 145 146 // Reads from a file. On success, the file pointer is moved to position 147 // |offset + bytes_to_read| in the file. The callback can be NULL. 148 static bool Read( 149 scoped_refptr<MessageLoopProxy> message_loop_proxy, 150 PlatformFile file, 151 int64 offset, 152 char* buffer, 153 int bytes_to_read, 154 ReadWriteCallback* callback); 155 156 // Writes to a file. If |offset| is greater than the length of the file, 157 // |false| is returned. On success, the file pointer is moved to position 158 // |offset + bytes_to_write| in the file. The callback can be NULL. 159 static bool Write( 160 scoped_refptr<MessageLoopProxy> message_loop_proxy, 161 PlatformFile file, 162 int64 offset, 163 const char* buffer, 164 int bytes_to_write, 165 ReadWriteCallback* callback); 166 167 // Touches a file. The callback can be NULL. 168 static bool Touch( 169 scoped_refptr<MessageLoopProxy> message_loop_proxy, 170 PlatformFile file, 171 const Time& last_access_time, 172 const Time& last_modified_time, 173 StatusCallback* callback); 174 175 // Touches a file. The callback can be NULL. 176 static bool Touch( 177 scoped_refptr<MessageLoopProxy> message_loop_proxy, 178 const FilePath& file_path, 179 const Time& last_access_time, 180 const Time& last_modified_time, 181 StatusCallback* callback); 182 183 // Truncates a file to the given length. If |length| is greater than the 184 // current length of the file, the file will be extended with zeroes. 185 // The callback can be NULL. 186 static bool Truncate( 187 scoped_refptr<MessageLoopProxy> message_loop_proxy, 188 PlatformFile file, 189 int64 length, 190 StatusCallback* callback); 191 192 // Truncates a file to the given length. If |length| is greater than the 193 // current length of the file, the file will be extended with zeroes. 194 // The callback can be NULL. 195 static bool Truncate( 196 scoped_refptr<MessageLoopProxy> message_loop_proxy, 197 const FilePath& path, 198 int64 length, 199 StatusCallback* callback); 200 201 // Flushes a file. The callback can be NULL. 202 static bool Flush( 203 scoped_refptr<MessageLoopProxy> message_loop_proxy, 204 PlatformFile file, 205 StatusCallback* callback); 206 207 private: 208 DISALLOW_IMPLICIT_CONSTRUCTORS(FileUtilProxy); 209}; 210 211} // namespace base 212 213#endif // BASE_FILE_UTIL_PROXY_H_ 214