Home | History | Annotate | Download | only in base
      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.
      4 
      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
      8 // a time.
      9 
     10 #ifndef NET_BASE_FILE_STREAM_H_
     11 #define NET_BASE_FILE_STREAM_H_
     12 
     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"
     17 
     18 namespace base {
     19 class FilePath;
     20 class TaskRunner;
     21 }
     22 
     23 namespace net {
     24 
     25 class IOBuffer;
     26 
     27 class NET_EXPORT FileStream {
     28  public:
     29   // Creates a FileStream.
     30   // Uses |task_runner| for asynchronous operations.
     31   explicit FileStream(const scoped_refptr<base::TaskRunner>& task_runner);
     32 
     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);
     37 
     38   // The underlying file is closed automatically.
     39   virtual ~FileStream();
     40 
     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.
     45   //
     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
     48   // base::File::Flags.
     49   //
     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
     53   // know when).
     54   virtual int Open(const base::FilePath& path, int open_flags,
     55                    const CompletionCallback& callback);
     56 
     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);
     62 
     63   // Returns true if Open succeeded and Close has not been called.
     64   virtual bool IsOpen() const;
     65 
     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);
     74 
     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
     79   // not be performed.
     80   //
     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.
     86   //
     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.
     90   //
     91   // It is invalid to request any asynchronous operations while there is an
     92   // in-flight asynchronous operation.
     93   //
     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);
     97 
     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
    102   // performed.
    103   //
    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.
    109   //
    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.
    113   //
    114   // It is invalid to request any asynchronous operations while there is an
    115   // in-flight asynchronous operation.
    116   //
    117   // This method must not be called if the stream was opened READ_ONLY.
    118   //
    119   // Zero byte writes are not allowed.
    120   virtual int Write(IOBuffer* buf, int buf_len,
    121                     const CompletionCallback& callback);
    122 
    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
    126   // calling.
    127   //
    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.
    133   //
    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.
    137   //
    138   // It is invalid to request any asynchronous operations while there is an
    139   // in-flight asynchronous operation.
    140   //
    141   // This method should not be called if the stream was opened READ_ONLY.
    142   virtual int Flush(const CompletionCallback& callback);
    143 
    144   // Returns the underlying file for testing.
    145   const base::File& GetFileForTesting() const;
    146 
    147  private:
    148   class Context;
    149 
    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_;
    156 
    157   DISALLOW_COPY_AND_ASSIGN(FileStream);
    158 };
    159 
    160 }  // namespace net
    161 
    162 #endif  // NET_BASE_FILE_STREAM_H_
    163