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