1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file.
4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifndef CHROME_BROWSER_CHROMEOS_FILE_SYSTEM_PROVIDER_FILEAPI_FILE_STREAM_READER_H_
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#define CHROME_BROWSER_CHROMEOS_FILE_SYSTEM_PROVIDER_FILEAPI_FILE_STREAM_READER_H_
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/basictypes.h"
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/files/file_path.h"
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/memory/weak_ptr.h"
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "webkit/browser/blob/file_stream_reader.h"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "webkit/browser/fileapi/file_system_url.h"
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace fileapi {
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class AsyncFileUtil;
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace fileapi
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace chromeos {
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace file_system_provider {
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class ProvidedFileSystemInterface;
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Implements a streamed file reader. It is lazily initialized by the first call
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// to Read().
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class FileStreamReader : public webkit_blob::FileStreamReader {
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  typedef base::Callback<
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      void(base::WeakPtr<ProvidedFileSystemInterface> file_system,
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)           const base::FilePath& file_path,
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)           int file_handle,
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)           base::File::Error result)> InitializeCompletedCallback;
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  FileStreamReader(fileapi::FileSystemContext* context,
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   const fileapi::FileSystemURL& url,
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   int64 initial_offset,
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   const base::Time& expected_modification_time);
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual ~FileStreamReader();
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // webkit_blob::FileStreamReader overrides.
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual int Read(net::IOBuffer* buf,
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   int buf_len,
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   const net::CompletionCallback& callback) OVERRIDE;
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual int64 GetLength(
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const net::Int64CompletionCallback& callback) OVERRIDE;
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Initializes the reader by opening the file. When completed with success,
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // runs the |pending_closure|. Otherwise, calls the |error_callback|.
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void Initialize(const base::Closure& pending_closure,
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                  const net::Int64CompletionCallback& error_callback);
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Called when initializing is completed with either a success or an error.
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void OnInitializeCompleted(
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const base::Closure& pending_closure,
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const net::Int64CompletionCallback& error_callback,
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::WeakPtr<ProvidedFileSystemInterface> file_system,
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const base::FilePath& file_path,
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      int file_handle,
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::File::Error result);
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Called when a file system provider returns chunk of read data. Note, that
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // this may be called multiple times per single Read() call, as long as
6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // |has_more| is set to true. |result| is set to success only if reading is
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // successful, and the file has not changed while reading.
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void OnReadChunkReceived(const net::CompletionCallback& callback,
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                           int chunk_length,
6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                           bool has_more,
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                           base::File::Error result);
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Called when fetching length of the file is completed with either a success
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // or an error.
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void OnGetMetadataForGetLengthReceived(
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const net::Int64CompletionCallback& callback,
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::File::Error result,
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const base::File::Info& file_info);
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Same as Read(), but called after initializing is completed.
7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void ReadAfterInitialized(scoped_refptr<net::IOBuffer> buffer,
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                            int buffer_length,
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                            const net::CompletionCallback& callback);
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Same as GetLength(), but called after initializing is completed.
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void GetLengthAfterInitialized(const net::Int64CompletionCallback& callback);
85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  fileapi::FileSystemURL url_;
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int64 current_offset_;
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int64 current_length_;
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::Time expected_modification_time_;
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Set during initialization (in case of a success).
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::WeakPtr<ProvidedFileSystemInterface> file_system_;
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::FilePath file_path_;
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int file_handle_;
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::WeakPtrFactory<FileStreamReader> weak_ptr_factory_;
97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FileStreamReader);
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace file_system_provider
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace chromeos
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif  // CHROME_BROWSER_CHROMEOS_FILE_SYSTEM_PROVIDER_FILEAPI_FILE_STREAM_READER_H_
104