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 WEBKIT_BROWSER_FILEAPI_FILE_SYSTEM_FILE_STREAM_READER_H_ 6 #define WEBKIT_BROWSER_FILEAPI_FILE_SYSTEM_FILE_STREAM_READER_H_ 7 8 #include "base/bind.h" 9 #include "base/memory/ref_counted.h" 10 #include "base/platform_file.h" 11 #include "base/time/time.h" 12 #include "webkit/browser/blob/file_stream_reader.h" 13 #include "webkit/browser/fileapi/file_system_url.h" 14 #include "webkit/browser/webkit_storage_browser_export.h" 15 #include "webkit/common/blob/shareable_file_reference.h" 16 17 namespace base { 18 class FilePath; 19 class SequencedTaskRunner; 20 } 21 22 namespace webkit_blob { 23 class LocalFileStreamReader; 24 } 25 26 namespace fileapi { 27 28 class FileSystemContext; 29 30 // TODO(kinaba,satorux): This generic implementation would work for any 31 // filesystems but remote filesystem should implement its own reader 32 // rather than relying on FileSystemOperation::GetSnapshotFile() which 33 // may force downloading the entire contents for remote files. 34 class WEBKIT_STORAGE_BROWSER_EXPORT_PRIVATE FileSystemFileStreamReader 35 : public webkit_blob::FileStreamReader { 36 public: 37 // Creates a new FileReader for a filesystem URL |url| form |initial_offset|. 38 // |expected_modification_time| specifies the expected last modification if 39 // the value is non-null, the reader will check the underlying file's actual 40 // modification time to see if the file has been modified, and if it does any 41 // succeeding read operations should fail with ERR_UPLOAD_FILE_CHANGED error. 42 FileSystemFileStreamReader(FileSystemContext* file_system_context, 43 const FileSystemURL& url, 44 int64 initial_offset, 45 const base::Time& expected_modification_time); 46 virtual ~FileSystemFileStreamReader(); 47 48 // FileStreamReader overrides. 49 virtual int Read(net::IOBuffer* buf, int buf_len, 50 const net::CompletionCallback& callback) OVERRIDE; 51 virtual int64 GetLength( 52 const net::Int64CompletionCallback& callback) OVERRIDE; 53 54 private: 55 int CreateSnapshot(const base::Closure& callback, 56 const net::CompletionCallback& error_callback); 57 void DidCreateSnapshot( 58 const base::Closure& callback, 59 const net::CompletionCallback& error_callback, 60 base::PlatformFileError file_error, 61 const base::PlatformFileInfo& file_info, 62 const base::FilePath& platform_path, 63 const scoped_refptr<webkit_blob::ShareableFileReference>& file_ref); 64 65 scoped_refptr<FileSystemContext> file_system_context_; 66 FileSystemURL url_; 67 const int64 initial_offset_; 68 const base::Time expected_modification_time_; 69 scoped_ptr<webkit_blob::LocalFileStreamReader> local_file_reader_; 70 scoped_refptr<webkit_blob::ShareableFileReference> snapshot_ref_; 71 bool has_pending_create_snapshot_; 72 base::WeakPtrFactory<FileSystemFileStreamReader> weak_factory_; 73 74 DISALLOW_COPY_AND_ASSIGN(FileSystemFileStreamReader); 75 }; 76 77 } // namespace fileapi 78 79 #endif // WEBKIT_BROWSER_FILEAPI_FILE_SYSTEM_FILE_STREAM_READER_H_ 80