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 STORAGE_BROWSER_FILEAPI_SANDBOX_FILE_STREAM_WRITER_H_ 6#define STORAGE_BROWSER_FILEAPI_SANDBOX_FILE_STREAM_WRITER_H_ 7 8#include "base/files/file.h" 9#include "base/files/file_path.h" 10#include "base/memory/scoped_ptr.h" 11#include "storage/browser/fileapi/file_stream_writer.h" 12#include "storage/browser/fileapi/file_system_url.h" 13#include "storage/browser/fileapi/task_runner_bound_observer_list.h" 14#include "storage/browser/storage_browser_export.h" 15#include "storage/common/blob/shareable_file_reference.h" 16#include "storage/common/fileapi/file_system_types.h" 17#include "storage/common/quota/quota_types.h" 18#include "url/gurl.h" 19 20namespace storage { 21 22class FileSystemContext; 23class FileSystemQuotaUtil; 24class FileStreamWriter; 25 26class STORAGE_EXPORT_PRIVATE SandboxFileStreamWriter 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::File::Error file_error, 56 const base::File::Info& file_info, 57 const base::FilePath& platform_path, 58 const scoped_refptr<storage::ShareableFileReference>& file_ref); 59 void DidGetUsageAndQuota(const net::CompletionCallback& callback, 60 storage::QuotaStatusCode status, 61 int64 usage, 62 int64 quota); 63 void DidInitializeForWrite(net::IOBuffer* buf, int buf_len, 64 const net::CompletionCallback& callback, 65 int init_status); 66 67 void DidWrite(const net::CompletionCallback& callback, int write_response); 68 69 // Stops the in-flight operation, calls |cancel_callback_| and returns true 70 // if there's a pending cancel request. 71 bool CancelIfRequested(); 72 73 scoped_refptr<FileSystemContext> file_system_context_; 74 FileSystemURL url_; 75 int64 initial_offset_; 76 scoped_ptr<FileStreamWriter> local_file_writer_; 77 net::CompletionCallback cancel_callback_; 78 79 UpdateObserverList observers_; 80 81 base::FilePath file_path_; 82 int64 file_size_; 83 int64 total_bytes_written_; 84 int64 allowed_bytes_to_write_; 85 bool has_pending_operation_; 86 87 int64 default_quota_; 88 89 base::WeakPtrFactory<SandboxFileStreamWriter> weak_factory_; 90 91 DISALLOW_COPY_AND_ASSIGN(SandboxFileStreamWriter); 92}; 93 94} // namespace storage 95 96#endif // STORAGE_BROWSER_FILEAPI_SANDBOX_FILE_STREAM_WRITER_H_ 97