1// Copyright 2013 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_QUOTA_QUOTA_BACKEND_IMPL_H_
6#define STORAGE_BROWSER_FILEAPI_QUOTA_QUOTA_BACKEND_IMPL_H_
7
8#include "base/memory/ref_counted.h"
9#include "base/memory/weak_ptr.h"
10#include "storage/browser/fileapi/quota/quota_reservation_manager.h"
11#include "storage/browser/fileapi/sandbox_file_system_backend_delegate.h"
12#include "storage/browser/storage_browser_export.h"
13#include "storage/common/quota/quota_status_code.h"
14
15namespace base {
16class SequencedTaskRunner;
17}
18
19namespace content {
20class QuotaBackendImplTest;
21}
22
23namespace storage {
24class QuotaManagerProxy;
25}
26
27namespace storage {
28
29class FileSystemUsageCache;
30class ObfuscatedFileUtil;
31
32// An instance of this class is owned by QuotaReservationManager.
33class STORAGE_EXPORT QuotaBackendImpl
34    : public QuotaReservationManager::QuotaBackend {
35 public:
36  typedef QuotaReservationManager::ReserveQuotaCallback
37      ReserveQuotaCallback;
38
39  QuotaBackendImpl(base::SequencedTaskRunner* file_task_runner,
40                   ObfuscatedFileUtil* obfuscated_file_util,
41                   FileSystemUsageCache* file_system_usage_cache,
42                   storage::QuotaManagerProxy* quota_manager_proxy);
43  virtual ~QuotaBackendImpl();
44
45  // QuotaReservationManager::QuotaBackend overrides.
46  virtual void ReserveQuota(
47      const GURL& origin,
48      FileSystemType type,
49      int64 delta,
50      const ReserveQuotaCallback& callback) OVERRIDE;
51  virtual void ReleaseReservedQuota(
52      const GURL& origin,
53      FileSystemType type,
54      int64 size) OVERRIDE;
55  virtual void CommitQuotaUsage(
56      const GURL& origin,
57      FileSystemType type,
58      int64 delta) OVERRIDE;
59  virtual void IncrementDirtyCount(
60      const GURL& origin,
61      FileSystemType type) OVERRIDE;
62  virtual void DecrementDirtyCount(
63      const GURL& origin,
64      FileSystemType type) OVERRIDE;
65
66 private:
67  friend class content::QuotaBackendImplTest;
68
69  struct QuotaReservationInfo {
70    QuotaReservationInfo(const GURL& origin, FileSystemType type, int64 delta);
71    ~QuotaReservationInfo();
72
73    GURL origin;
74    FileSystemType type;
75    int64 delta;
76  };
77
78  void DidGetUsageAndQuotaForReserveQuota(const QuotaReservationInfo& info,
79                                          const ReserveQuotaCallback& callback,
80                                          storage::QuotaStatusCode status,
81                                          int64 usage,
82                                          int64 quota);
83
84  void ReserveQuotaInternal(
85      const QuotaReservationInfo& info);
86  base::File::Error GetUsageCachePath(
87      const GURL& origin,
88      FileSystemType type,
89      base::FilePath* usage_file_path);
90
91  scoped_refptr<base::SequencedTaskRunner> file_task_runner_;
92
93  // Owned by SandboxFileSystemBackendDelegate.
94  ObfuscatedFileUtil* obfuscated_file_util_;
95  FileSystemUsageCache* file_system_usage_cache_;
96
97  scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy_;
98
99  base::WeakPtrFactory<QuotaBackendImpl> weak_ptr_factory_;
100
101  DISALLOW_COPY_AND_ASSIGN(QuotaBackendImpl);
102};
103
104}  // namespace storage
105
106#endif  // STORAGE_BROWSER_FILEAPI_QUOTA_QUOTA_BACKEND_IMPL_H_
107