1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file.
4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef BASE_FILES_FILE_PROXY_H_
6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define BASE_FILES_FILE_PROXY_H_
7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/base_export.h"
9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/callback_forward.h"
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/files/file.h"
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/files/file_path.h"
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/memory/ref_counted.h"
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/memory/weak_ptr.h"
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace tracked_objects {
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class Location;
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace base {
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class TaskRunner;
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class Time;
23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// This class provides asynchronous access to a File. All methods follow the
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// same rules of the equivalent File method, as they are implemented by bouncing
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// the operation to File using a TaskRunner.
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)//
28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// This class performs automatic proxying to close the underlying file at
29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// destruction.
30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)//
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// The TaskRunner is in charge of any sequencing of the operations, but a single
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// operation can be proxied at a time, regardless of the use of a callback.
33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// In other words, having a sequence like
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)//
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)//   proxy.Write(...);
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//   proxy.Write(...);
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)//
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// means the second Write will always fail.
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class BASE_EXPORT FileProxy : public SupportsWeakPtr<FileProxy> {
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public:
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // This callback is used by methods that report only an error code. It is
42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // valid to pass a null callback to some functions that takes a
43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // StatusCallback, in which case the operation will complete silently.
44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  typedef Callback<void(File::Error)> StatusCallback;
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  typedef Callback<void(File::Error,
47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        const FilePath&)> CreateTemporaryCallback;
48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  typedef Callback<void(File::Error,
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        const File::Info&)> GetFileInfoCallback;
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  typedef Callback<void(File::Error,
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        const char* data,
52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        int bytes_read)> ReadCallback;
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  typedef Callback<void(File::Error,
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        int bytes_written)> WriteCallback;
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  FileProxy();
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  explicit FileProxy(TaskRunner* task_runner);
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ~FileProxy();
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Creates or opens a file with the given flags. It is invalid to pass a null
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // callback. If File::FLAG_CREATE is set in |file_flags| it always tries to
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // create a new file at the given |file_path| and fails if the file already
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // exists.
64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  //
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // This returns false if task posting to |task_runner| has failed.
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool CreateOrOpen(const FilePath& file_path,
67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    uint32 file_flags,
68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    const StatusCallback& callback);
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Creates a temporary file for writing. The path and an open file are
71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // returned. It is invalid to pass a null callback. The additional file flags
72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // will be added on top of the default file flags which are:
73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  //   File::FLAG_CREATE_ALWAYS
74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  //   File::FLAG_WRITE
75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  //   File::FLAG_TEMPORARY.
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  //
77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // This returns false if task posting to |task_runner| has failed.
78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool CreateTemporary(uint32 additional_file_flags,
79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       const CreateTemporaryCallback& callback);
80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Returns true if the underlying |file_| is valid.
82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool IsValid() const;
83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Returns true if a new file was created (or an old one truncated to zero
85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // length to simulate a new file), and false otherwise.
86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool created() const { return file_.created(); }
87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Claims ownership of |file|. It is an error to call this method when
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // IsValid() returns true.
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void SetFile(File file);
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  File TakeFile();
93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  PlatformFile GetPlatformFile() const;
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Proxies File::Close. The callback can be null.
97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // This returns false if task posting to |task_runner| has failed.
98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool Close(const StatusCallback& callback);
99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Proxies File::GetInfo. The callback can't be null.
101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // This returns false if task posting to |task_runner| has failed.
102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool GetInfo(const GetFileInfoCallback& callback);
103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Proxies File::Read. The callback can't be null.
105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // This returns false if |bytes_to_read| is less than zero, or
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // if task posting to |task_runner| has failed.
107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool Read(int64 offset, int bytes_to_read, const ReadCallback& callback);
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Proxies File::Write. The callback can be null.
110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // This returns false if |bytes_to_write| is less than or equal to zero,
111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // if |buffer| is NULL, or if task posting to |task_runner| has failed.
112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool Write(int64 offset,
113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)             const char* buffer,
114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)             int bytes_to_write,
115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)             const WriteCallback& callback);
116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Proxies File::SetTimes. The callback can be null.
118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // This returns false if task posting to |task_runner| has failed.
119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool SetTimes(Time last_access_time,
120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                Time last_modified_time,
121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                const StatusCallback& callback);
122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Proxies File::SetLength. The callback can be null.
124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // This returns false if task posting to |task_runner| has failed.
125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool SetLength(int64 length, const StatusCallback& callback);
126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Proxies File::Flush. The callback can be null.
128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // This returns false if task posting to |task_runner| has failed.
129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool Flush(const StatusCallback& callback);
130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private:
132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  friend class FileHelper;
133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  TaskRunner* task_runner() { return task_runner_.get(); }
134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_refptr<TaskRunner> task_runner_;
136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  File file_;
137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FileProxy);
138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace base
141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif  // BASE_FILES_FILE_PROXY_H_
143