1 // Copyright (c) 2012 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.
5 // This file defines FileStream, a basic interface for reading and writing files
6 // synchronously or asynchronously with support for seeking to an offset.
7 // Note that even when used asynchronously, only one operation is supported at
10 #ifndef NET_BASE_FILE_STREAM_H_
11 #define NET_BASE_FILE_STREAM_H_
13 #include "base/files/file.h"
14 #include "net/base/completion_callback.h"
15 #include "net/base/file_stream_whence.h"
16 #include "net/base/net_export.h"
27 class NET_EXPORT FileStream
{
29 // Creates a FileStream.
30 // Uses |task_runner| for asynchronous operations.
31 explicit FileStream(const scoped_refptr
<base::TaskRunner
>& task_runner
);
33 // Construct a FileStream with an existing valid |file|.
34 // Uses |task_runner| for asynchronous operations.
35 FileStream(base::File file
,
36 const scoped_refptr
<base::TaskRunner
>& task_runner
);
38 // The underlying file is closed automatically.
39 virtual ~FileStream();
41 // Call this method to open the FileStream asynchronously. The remaining
42 // methods cannot be used unless the file is opened successfully. Returns
43 // ERR_IO_PENDING if the operation is started. If the operation cannot be
44 // started then an error code is returned.
46 // Once the operation is done, |callback| will be run on the thread where
47 // Open() was called, with the result code. open_flags is a bitfield of
50 // If the file stream is not closed manually, the underlying file will be
51 // automatically closed when FileStream is destructed in an asynchronous
52 // manner (i.e. the file stream is closed in the background but you don't
54 virtual int Open(const base::FilePath
& path
, int open_flags
,
55 const CompletionCallback
& callback
);
57 // Returns ERR_IO_PENDING and closes the file asynchronously, calling
58 // |callback| when done.
59 // It is invalid to request any asynchronous operations while there is an
60 // in-flight asynchronous operation.
61 virtual int Close(const CompletionCallback
& callback
);
63 // Returns true if Open succeeded and Close has not been called.
64 virtual bool IsOpen() const;
66 // Adjust the position from where data is read asynchronously.
67 // Upon success, ERR_IO_PENDING is returned and |callback| will be run
68 // on the thread where Seek() was called with the the stream position
69 // relative to the start of the file. Otherwise, an error code is returned.
70 // It is invalid to request any asynchronous operations while there is an
71 // in-flight asynchronous operation.
72 virtual int Seek(Whence whence
, int64 offset
,
73 const Int64CompletionCallback
& callback
);
75 // Call this method to read data from the current stream position
76 // asynchronously. Up to buf_len bytes will be copied into buf. (In
77 // other words, partial reads are allowed.) Returns the number of bytes
78 // copied, 0 if at end-of-file, or an error code if the operation could
81 // The file must be opened with FLAG_ASYNC, and a non-null
82 // callback must be passed to this method. If the read could not
83 // complete synchronously, then ERR_IO_PENDING is returned, and the
84 // callback will be run on the thread where Read() was called, when the
85 // read has completed.
87 // It is valid to destroy or close the file stream while there is an
88 // asynchronous read in progress. That will cancel the read and allow
89 // the buffer to be freed.
91 // It is invalid to request any asynchronous operations while there is an
92 // in-flight asynchronous operation.
94 // This method must not be called if the stream was opened WRITE_ONLY.
95 virtual int Read(IOBuffer
* buf
, int buf_len
,
96 const CompletionCallback
& callback
);
98 // Call this method to write data at the current stream position
99 // asynchronously. Up to buf_len bytes will be written from buf. (In
100 // other words, partial writes are allowed.) Returns the number of
101 // bytes written, or an error code if the operation could not be
104 // The file must be opened with FLAG_ASYNC, and a non-null
105 // callback must be passed to this method. If the write could not
106 // complete synchronously, then ERR_IO_PENDING is returned, and the
107 // callback will be run on the thread where Write() was called when
108 // the write has completed.
110 // It is valid to destroy or close the file stream while there is an
111 // asynchronous write in progress. That will cancel the write and allow
112 // the buffer to be freed.
114 // It is invalid to request any asynchronous operations while there is an
115 // in-flight asynchronous operation.
117 // This method must not be called if the stream was opened READ_ONLY.
119 // Zero byte writes are not allowed.
120 virtual int Write(IOBuffer
* buf
, int buf_len
,
121 const CompletionCallback
& callback
);
123 // Forces out a filesystem sync on this file to make sure that the file was
124 // written out to disk and is not currently sitting in the buffer. This does
125 // not have to be called, it just forces one to happen at the time of
128 // The file must be opened with FLAG_ASYNC, and a non-null
129 // callback must be passed to this method. If the write could not
130 // complete synchronously, then ERR_IO_PENDING is returned, and the
131 // callback will be run on the thread where Flush() was called when
132 // the write has completed.
134 // It is valid to destroy or close the file stream while there is an
135 // asynchronous flush in progress. That will cancel the flush and allow
136 // the buffer to be freed.
138 // It is invalid to request any asynchronous operations while there is an
139 // in-flight asynchronous operation.
141 // This method should not be called if the stream was opened READ_ONLY.
142 virtual int Flush(const CompletionCallback
& callback
);
144 // Returns the underlying file for testing.
145 const base::File
& GetFileForTesting() const;
150 // Context performing I/O operations. It was extracted into a separate class
151 // to perform asynchronous operations because FileStream can be destroyed
152 // before completion of an async operation. Also if a FileStream is destroyed
153 // without explicitly calling Close, the file should be closed asynchronously
154 // without delaying FileStream's destructor.
155 scoped_ptr
<Context
> context_
;
157 DISALLOW_COPY_AND_ASSIGN(FileStream
);
162 #endif // NET_BASE_FILE_STREAM_H_