| // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // This file defines FileStream, a basic interface for reading and writing files |
| // synchronously or asynchronously with support for seeking to an offset. |
| // Note that even when used asynchronously, only one operation is supported at |
| // a time. |
| |
| #ifndef NET_BASE_FILE_STREAM_H_ |
| #define NET_BASE_FILE_STREAM_H_ |
| #pragma once |
| |
| #include "base/memory/scoped_ptr.h" |
| #include "base/platform_file.h" |
| #include "net/base/completion_callback.h" |
| |
| class FilePath; |
| |
| namespace net { |
| |
| // TODO(darin): Move this to a more generic location. |
| // This explicit mapping matches both FILE_ on Windows and SEEK_ on Linux. |
| enum Whence { |
| FROM_BEGIN = 0, |
| FROM_CURRENT = 1, |
| FROM_END = 2 |
| }; |
| |
| class FileStream { |
| public: |
| FileStream(); |
| |
| // Construct a FileStream with an existing file handle and opening flags. |
| // |file| is valid file handle. |
| // |flags| is a bitfield of base::PlatformFileFlags when the file handle was |
| // opened. |
| // The already opened file will not be automatically closed when FileStream |
| // is destructed. |
| FileStream(base::PlatformFile file, int flags); |
| |
| ~FileStream(); |
| |
| // Call this method to close the FileStream. It is OK to call Close |
| // multiple times. Redundant calls are ignored. |
| // Note that if there are any pending async operations, they'll be aborted. |
| void Close(); |
| |
| // Call this method to open the FileStream. The remaining methods |
| // cannot be used unless this method returns OK. If the file cannot be |
| // opened then an error code is returned. |
| // open_flags is a bitfield of base::PlatformFileFlags |
| int Open(const FilePath& path, int open_flags); |
| |
| // Returns true if Open succeeded and Close has not been called. |
| bool IsOpen() const; |
| |
| // Adjust the position from where data is read. Upon success, the stream |
| // position relative to the start of the file is returned. Otherwise, an |
| // error code is returned. It is not valid to call Seek while a Read call |
| // has a pending completion. |
| int64 Seek(Whence whence, int64 offset); |
| |
| // Returns the number of bytes available to read from the current stream |
| // position until the end of the file. Otherwise, an error code is returned. |
| int64 Available(); |
| |
| // Call this method to read data from the current stream position. Up to |
| // buf_len bytes will be copied into buf. (In other words, partial reads are |
| // allowed.) Returns the number of bytes copied, 0 if at end-of-file, or an |
| // error code if the operation could not be performed. |
| // |
| // If opened with PLATFORM_FILE_ASYNC, then a non-null callback |
| // must be passed to this method. In asynchronous mode, if the read could |
| // not complete synchronously, then ERR_IO_PENDING is returned, and the |
| // callback will be notified on the current thread (via the MessageLoop) when |
| // the read has completed. |
| // |
| // In the case of an asychronous read, the memory pointed to by |buf| must |
| // remain valid until the callback is notified. However, it is valid to |
| // destroy or close the file stream while there is an asynchronous read in |
| // progress. That will cancel the read and allow the buffer to be freed. |
| // |
| // This method should not be called if the stream was opened WRITE_ONLY. |
| // |
| // You can pass NULL as the callback for synchronous I/O. |
| int Read(char* buf, int buf_len, CompletionCallback* callback); |
| |
| // Performs the same as Read, but ensures that exactly buf_len bytes |
| // are copied into buf. A partial read may occur, but only as a result of |
| // end-of-file or fatal error. Returns the number of bytes copied into buf, |
| // 0 if at end-of-file and no bytes have been read into buf yet, |
| // or an error code if the operation could not be performed. |
| int ReadUntilComplete(char *buf, int buf_len); |
| |
| // Call this method to write data at the current stream position. Up to |
| // buf_len bytes will be written from buf. (In other words, partial writes are |
| // allowed.) Returns the number of bytes written, or an error code if the |
| // operation could not be performed. |
| // |
| // If opened with PLATFORM_FILE_ASYNC, then a non-null callback |
| // must be passed to this method. In asynchronous mode, if the write could |
| // not complete synchronously, then ERR_IO_PENDING is returned, and the |
| // callback will be notified on the current thread (via the MessageLoop) when |
| // the write has completed. |
| // |
| // In the case of an asychronous write, the memory pointed to by |buf| must |
| // remain valid until the callback is notified. However, it is valid to |
| // destroy or close the file stream while there is an asynchronous write in |
| // progress. That will cancel the write and allow the buffer to be freed. |
| // |
| // This method should not be called if the stream was opened READ_ONLY. |
| // |
| // You can pass NULL as the callback for synchronous I/O. |
| int Write(const char* buf, int buf_len, CompletionCallback* callback); |
| |
| // Truncates the file to be |bytes| length. This is only valid for writable |
| // files. After truncation the file stream is positioned at |bytes|. The new |
| // position is retured, or a value < 0 on error. |
| // WARNING: one may not truncate a file beyond its current length on any |
| // platform with this call. |
| int64 Truncate(int64 bytes); |
| |
| // Forces out a filesystem sync on this file to make sure that the file was |
| // written out to disk and is not currently sitting in the buffer. This does |
| // not have to be called, it just forces one to happen at the time of |
| // calling. |
| // |
| /// Returns an error code if the operation could not be performed. |
| // |
| // This method should not be called if the stream was opened READ_ONLY. |
| int Flush(); |
| |
| private: |
| class AsyncContext; |
| friend class AsyncContext; |
| |
| // This member is used to support asynchronous reads. It is non-null when |
| // the FileStream was opened with PLATFORM_FILE_ASYNC. |
| scoped_ptr<AsyncContext> async_context_; |
| |
| base::PlatformFile file_; |
| int open_flags_; |
| bool auto_closed_; |
| |
| DISALLOW_COPY_AND_ASSIGN(FileStream); |
| }; |
| |
| } // namespace net |
| |
| #endif // NET_BASE_FILE_STREAM_H_ |