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