Home | History | Annotate | Download | only in fileapi
      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