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_QUOTA_OBSERVER_H_
6#define WEBKIT_BROWSER_FILEAPI_SANDBOX_QUOTA_OBSERVER_H_
7
8#include <map>
9
10#include "base/basictypes.h"
11#include "base/compiler_specific.h"
12#include "base/files/file_path.h"
13#include "base/memory/ref_counted.h"
14#include "base/memory/scoped_ptr.h"
15#include "base/memory/weak_ptr.h"
16#include "webkit/browser/fileapi/file_observers.h"
17#include "webkit/browser/fileapi/file_system_url.h"
18
19namespace base {
20class SequencedTaskRunner;
21}
22
23namespace quota {
24class QuotaManagerProxy;
25}
26
27namespace fileapi {
28
29class FileSystemUsageCache;
30class FileSystemURL;
31class TimedTaskHelper;
32class ObfuscatedFileUtil;
33
34class SandboxQuotaObserver
35    : public FileUpdateObserver,
36      public FileAccessObserver {
37 public:
38  typedef std::map<base::FilePath, int64> PendingUpdateNotificationMap;
39
40  SandboxQuotaObserver(
41      quota::QuotaManagerProxy* quota_manager_proxy,
42      base::SequencedTaskRunner* update_notify_runner,
43      ObfuscatedFileUtil* sandbox_file_util,
44      FileSystemUsageCache* file_system_usage_cache_);
45  virtual ~SandboxQuotaObserver();
46
47  // FileUpdateObserver overrides.
48  virtual void OnStartUpdate(const FileSystemURL& url) OVERRIDE;
49  virtual void OnUpdate(const FileSystemURL& url, int64 delta) OVERRIDE;
50  virtual void OnEndUpdate(const FileSystemURL& url) OVERRIDE;
51
52  // FileAccessObserver overrides.
53  virtual void OnAccess(const FileSystemURL& url) OVERRIDE;
54
55  void SetUsageCacheEnabled(const GURL& origin,
56                            FileSystemType type,
57                            bool enabled);
58
59 private:
60  void ApplyPendingUsageUpdate();
61  void UpdateUsageCacheFile(const base::FilePath& usage_file_path, int64 delta);
62
63  base::FilePath GetUsageCachePath(const FileSystemURL& url);
64
65  scoped_refptr<quota::QuotaManagerProxy> quota_manager_proxy_;
66  scoped_refptr<base::SequencedTaskRunner> update_notify_runner_;
67
68  // Not owned; sandbox_file_util_ should have identical lifetime with this.
69  ObfuscatedFileUtil* sandbox_file_util_;
70
71  // Not owned; file_system_usage_cache_ should have longer lifetime than this.
72  FileSystemUsageCache* file_system_usage_cache_;
73
74  PendingUpdateNotificationMap pending_update_notification_;
75  scoped_ptr<TimedTaskHelper> delayed_cache_update_helper_;
76
77  DISALLOW_COPY_AND_ASSIGN(SandboxQuotaObserver);
78};
79
80}  // namespace fileapi
81
82#endif  // WEBKIT_BROWSER_FILEAPI_SANDBOX_QUOTA_OBSERVER_H_
83