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
20namespace fileapi {
21
22class FileSystemContext;
23class FileSystemQuotaUtil;
24class LocalFileStreamWriter;
25
26class WEBKIT_STORAGE_BROWSER_EXPORT_PRIVATE SandboxFileStreamWriter
27    : public 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<LocalFileStreamWriter> 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