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_BROWSER_BLOB_LOCAL_FILE_STREAM_READER_H_
6#define STORAGE_BROWSER_BLOB_LOCAL_FILE_STREAM_READER_H_
7
8#include "base/basictypes.h"
9#include "base/compiler_specific.h"
10#include "base/files/file.h"
11#include "base/files/file_path.h"
12#include "base/memory/weak_ptr.h"
13#include "base/time/time.h"
14#include "storage/browser/blob/file_stream_reader.h"
15#include "storage/browser/storage_browser_export.h"
16
17namespace base {
18class TaskRunner;
19}
20
21namespace content {
22class LocalFileStreamReaderTest;
23}
24
25namespace net {
26class FileStream;
27}
28
29namespace storage {
30
31// A thin wrapper of net::FileStream with range support for sliced file
32// handling.
33class STORAGE_EXPORT LocalFileStreamReader
34    : public NON_EXPORTED_BASE(FileStreamReader) {
35 public:
36  virtual ~LocalFileStreamReader();
37
38  // FileStreamReader overrides.
39  virtual int Read(net::IOBuffer* buf, int buf_len,
40                   const net::CompletionCallback& callback) OVERRIDE;
41  virtual int64 GetLength(
42      const net::Int64CompletionCallback& callback) OVERRIDE;
43
44 private:
45  friend class FileStreamReader;
46  friend class content::LocalFileStreamReaderTest;
47
48  LocalFileStreamReader(base::TaskRunner* task_runner,
49                        const base::FilePath& file_path,
50                        int64 initial_offset,
51                        const base::Time& expected_modification_time);
52  int Open(const net::CompletionCallback& callback);
53
54  // Callbacks that are chained from Open for Read.
55  void DidVerifyForOpen(const net::CompletionCallback& callback,
56                        int64 get_length_result);
57  void DidOpenFileStream(const net::CompletionCallback& callback,
58                         int result);
59  void DidSeekFileStream(const net::CompletionCallback& callback,
60                         int64 seek_result);
61  void DidOpenForRead(net::IOBuffer* buf,
62                      int buf_len,
63                      const net::CompletionCallback& callback,
64                      int open_result);
65
66  void DidGetFileInfoForGetLength(const net::Int64CompletionCallback& callback,
67                                  base::File::Error error,
68                                  const base::File::Info& file_info);
69
70  scoped_refptr<base::TaskRunner> task_runner_;
71  scoped_ptr<net::FileStream> stream_impl_;
72  const base::FilePath file_path_;
73  const int64 initial_offset_;
74  const base::Time expected_modification_time_;
75  bool has_pending_open_;
76  base::WeakPtrFactory<LocalFileStreamReader> weak_factory_;
77};
78
79}  // namespace storage
80
81#endif  // STORAGE_BROWSER_BLOB_LOCAL_FILE_STREAM_READER_H_
82