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#ifndef STORAGE_BLOB_FILE_STREAM_READER_H_
6#define STORAGE_BLOB_FILE_STREAM_READER_H_
7
8#include "base/basictypes.h"
9#include "base/compiler_specific.h"
10#include "base/files/file.h"
11#include "net/base/completion_callback.h"
12#include "storage/browser/storage_browser_export.h"
13
14namespace base {
15class FilePath;
16class TaskRunner;
17class Time;
18}
19
20namespace net {
21class IOBuffer;
22}
23
24namespace storage {
25class FileSystemContext;
26class FileSystemURL;
27}
28
29namespace storage {
30
31// A generic interface for reading a file-like object.
32class FileStreamReader {
33 public:
34  // Creates a new FileReader for a local file |file_path|.
35  // |initial_offset| specifies the offset in the file where the first read
36  // should start.  If the given offset is out of the file range any
37  // read operation may error out with net::ERR_REQUEST_RANGE_NOT_SATISFIABLE.
38  // |expected_modification_time| specifies the expected last modification
39  // If the value is non-null, the reader will check the underlying file's
40  // actual modification time to see if the file has been modified, and if
41  // it does any succeeding read operations should fail with
42  // ERR_UPLOAD_FILE_CHANGED error.
43  STORAGE_EXPORT static FileStreamReader*
44      CreateForLocalFile(base::TaskRunner* task_runner,
45                         const base::FilePath& file_path,
46                         int64 initial_offset,
47                         const base::Time& expected_modification_time);
48
49  // Creates a new reader for a filesystem URL |url| form |initial_offset|.
50  // |expected_modification_time| specifies the expected last modification if
51  // the value is non-null, the reader will check the underlying file's actual
52  // modification time to see if the file has been modified, and if it does any
53  // succeeding read operations should fail with ERR_UPLOAD_FILE_CHANGED error.
54  STORAGE_EXPORT static FileStreamReader*
55      CreateForFileSystemFile(storage::FileSystemContext* context,
56                              const storage::FileSystemURL& url,
57                              int64 initial_offset,
58                              const base::Time& expected_modification_time);
59
60  // Verify if the underlying file has not been modified.
61  STORAGE_EXPORT static bool VerifySnapshotTime(
62      const base::Time& expected_modification_time,
63      const base::File::Info& file_info);
64
65  // It is valid to delete the reader at any time.  If the stream is deleted
66  // while it has a pending read, its callback will not be called.
67  virtual ~FileStreamReader() {}
68
69  // Reads from the current cursor position asynchronously.
70  //
71  // Up to buf_len bytes will be copied into buf.  (In other words, partial
72  // reads are allowed.)  Returns the number of bytes copied, 0 if at
73  // end-of-file, or an error code if the operation could not be performed.
74  // If the read could not complete synchronously, then ERR_IO_PENDING is
75  // returned, and the callback will be run on the thread where Read()
76  // was called, when the read has completed.
77  //
78  // It is invalid to call Read while there is an in-flight Read operation.
79  //
80  // If the stream is deleted while it has an in-flight Read operation
81  // |callback| will not be called.
82  virtual int Read(net::IOBuffer* buf, int buf_len,
83                   const net::CompletionCallback& callback) = 0;
84
85  // Returns the length of the file if it could successfully retrieve the
86  // file info *and* its last modification time equals to
87  // expected modification time (rv >= 0 cases).
88  // Otherwise, a negative error code is returned (rv < 0 cases).
89  // If the stream is deleted while it has an in-flight GetLength operation
90  // |callback| will not be called.
91  // Note that the return type is int64 to return a larger file's size (a file
92  // larger than 2G) but an error code should fit in the int range (may be
93  // smaller than int64 range).
94  virtual int64 GetLength(const net::Int64CompletionCallback& callback) = 0;
95};
96
97}  // namespace storage
98
99#endif  // STORAGE_BLOB_FILE_STREAM_READER_H_
100