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 #ifndef STORAGE_BLOB_FILE_STREAM_READER_H_
6 #define STORAGE_BLOB_FILE_STREAM_READER_H_
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"
25 class FileSystemContext
;
31 // A generic interface for reading a file-like object.
32 class FileStreamReader
{
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
,
47 const base::Time
& expected_modification_time
);
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
,
58 const base::Time
& expected_modification_time
);
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
);
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() {}
69 // Reads from the current cursor position asynchronously.
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.
78 // It is invalid to call Read while there is an in-flight Read operation.
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;
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;
97 } // namespace storage
99 #endif // STORAGE_BLOB_FILE_STREAM_READER_H_