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_SANDBOX_FILE_STREAM_WRITER_H_ 6 #define WEBKIT_BROWSER_FILEAPI_SANDBOX_FILE_STREAM_WRITER_H_ 7 8 #include "base/files/file_path.h" 9 #include "base/memory/scoped_ptr.h" 10 #include "base/platform_file.h" 11 #include "url/gurl.h" 12 #include "webkit/browser/fileapi/file_stream_writer.h" 13 #include "webkit/browser/fileapi/file_system_url.h" 14 #include "webkit/browser/fileapi/task_runner_bound_observer_list.h" 15 #include "webkit/browser/webkit_storage_browser_export.h" 16 #include "webkit/common/blob/shareable_file_reference.h" 17 #include "webkit/common/fileapi/file_system_types.h" 18 #include "webkit/common/quota/quota_types.h" 19 20 namespace fileapi { 21 22 class FileSystemContext; 23 class FileSystemQuotaUtil; 24 class FileStreamWriter; 25 26 class WEBKIT_STORAGE_BROWSER_EXPORT_PRIVATE SandboxFileStreamWriter NON_EXPORTED_BASE(FileStreamWriter)27 : public NON_EXPORTED_BASE(FileStreamWriter) { 28 public: 29 SandboxFileStreamWriter(FileSystemContext* file_system_context, 30 const FileSystemURL& url, 31 int64 initial_offset, 32 const UpdateObserverList& observers); 33 virtual ~SandboxFileStreamWriter(); 34 35 // FileStreamWriter overrides. 36 virtual int Write(net::IOBuffer* buf, int buf_len, 37 const net::CompletionCallback& callback) OVERRIDE; 38 virtual int Cancel(const net::CompletionCallback& callback) OVERRIDE; 39 virtual int Flush(const net::CompletionCallback& callback) OVERRIDE; 40 41 // Used only by tests. 42 void set_default_quota(int64 quota) { 43 default_quota_ = quota; 44 } 45 46 private: 47 // Performs quota calculation and calls local_file_writer_->Write(). 48 int WriteInternal(net::IOBuffer* buf, int buf_len, 49 const net::CompletionCallback& callback); 50 51 // Callbacks that are chained for the first write. This eventually calls 52 // WriteInternal. 53 void DidCreateSnapshotFile( 54 const net::CompletionCallback& callback, 55 base::PlatformFileError file_error, 56 const base::PlatformFileInfo& file_info, 57 const base::FilePath& platform_path, 58 const scoped_refptr<webkit_blob::ShareableFileReference>& file_ref); 59 void DidGetUsageAndQuota(const net::CompletionCallback& callback, 60 quota::QuotaStatusCode status, 61 int64 usage, int64 quota); 62 void DidInitializeForWrite(net::IOBuffer* buf, int buf_len, 63 const net::CompletionCallback& callback, 64 int init_status); 65 66 void DidWrite(const net::CompletionCallback& callback, int write_response); 67 68 // Stops the in-flight operation, calls |cancel_callback_| and returns true 69 // if there's a pending cancel request. 70 bool CancelIfRequested(); 71 72 scoped_refptr<FileSystemContext> file_system_context_; 73 FileSystemURL url_; 74 int64 initial_offset_; 75 scoped_ptr<FileStreamWriter> local_file_writer_; 76 net::CompletionCallback cancel_callback_; 77 78 UpdateObserverList observers_; 79 80 base::FilePath file_path_; 81 int64 file_size_; 82 int64 total_bytes_written_; 83 int64 allowed_bytes_to_write_; 84 bool has_pending_operation_; 85 86 int64 default_quota_; 87 88 base::WeakPtrFactory<SandboxFileStreamWriter> weak_factory_; 89 90 DISALLOW_COPY_AND_ASSIGN(SandboxFileStreamWriter); 91 }; 92 93 } // namespace fileapi 94 95 #endif // WEBKIT_BROWSER_FILEAPI_SANDBOX_FILE_STREAM_WRITER_H_ 96