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