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 CHROME_BROWSER_UI_WEBUI_QUOTA_INTERNALS_QUOTA_INTERNALS_PROXY_H_
6#define CHROME_BROWSER_UI_WEBUI_QUOTA_INTERNALS_QUOTA_INTERNALS_PROXY_H_
7
8#include <map>
9#include <set>
10#include <string>
11#include <vector>
12
13#include "base/memory/ref_counted.h"
14#include "base/memory/weak_ptr.h"
15#include "base/sequenced_task_runner_helpers.h"
16#include "content/public/browser/browser_thread.h"
17#include "storage/browser/quota/quota_manager.h"
18#include "storage/common/quota/quota_types.h"
19
20namespace quota_internals {
21
22class QuotaInternalsHandler;
23class GlobalStorageInfo;
24class PerHostStorageInfo;
25class PerOriginStorageInfo;
26typedef std::map<std::string, std::string> Statistics;
27
28// This class is the bridge between QuotaInternalsHandler and QuotaManager.
29// Each QuotaInternalsHandler instances creates and owns a instance of this
30// class.
31class QuotaInternalsProxy
32    : public base::RefCountedThreadSafe<
33          QuotaInternalsProxy,
34          content::BrowserThread::DeleteOnIOThread> {
35 public:
36  explicit QuotaInternalsProxy(QuotaInternalsHandler* handler);
37
38  void RequestInfo(scoped_refptr<storage::QuotaManager> quota_manager);
39
40 private:
41  friend class base::DeleteHelper<QuotaInternalsProxy>;
42  friend struct content::BrowserThread::DeleteOnThread<
43      content::BrowserThread::IO>;
44  friend class QuotaInternalsHandler;
45
46  typedef storage::QuotaManager::QuotaTableEntries QuotaTableEntries;
47  typedef storage::QuotaManager::OriginInfoTableEntries OriginInfoTableEntries;
48
49  virtual ~QuotaInternalsProxy();
50
51  void ReportAvailableSpace(int64 available_space);
52  void ReportGlobalInfo(const GlobalStorageInfo& data);
53  void ReportPerHostInfo(const std::vector<PerHostStorageInfo>& hosts);
54  void ReportPerOriginInfo(const std::vector<PerOriginStorageInfo>& origins);
55  void ReportStatistics(const Statistics& stats);
56
57  // Called on IO Thread by QuotaManager as callback.
58  void DidGetAvailableSpace(storage::QuotaStatusCode status, int64 space);
59  void DidGetGlobalQuota(storage::StorageType type,
60                         storage::QuotaStatusCode status,
61                         int64 quota);
62  void DidGetGlobalUsage(storage::StorageType type,
63                         int64 usage,
64                         int64 unlimited_usage);
65  void DidDumpQuotaTable(const QuotaTableEntries& entries);
66  void DidDumpOriginInfoTable(const OriginInfoTableEntries& entries);
67  void DidGetHostUsage(const std::string& host,
68                       storage::StorageType type,
69                       int64 usage);
70
71  // Helper. Called on IO Thread.
72  void RequestPerOriginInfo(storage::StorageType type);
73  void VisitHost(const std::string& host, storage::StorageType type);
74  void GetHostUsage(const std::string& host, storage::StorageType type);
75
76  // Used on UI Thread.
77  QuotaInternalsHandler* handler_;
78
79  // Used on IO Thread.
80  scoped_refptr<storage::QuotaManager> quota_manager_;
81  std::set<std::pair<std::string, storage::StorageType> > hosts_visited_,
82      hosts_pending_;
83  std::vector<PerHostStorageInfo> report_pending_;
84  base::WeakPtrFactory<QuotaInternalsProxy> weak_factory_;
85
86  DISALLOW_COPY_AND_ASSIGN(QuotaInternalsProxy);
87};
88}  // namespace quota_internals
89
90#endif  // CHROME_BROWSER_UI_WEBUI_QUOTA_INTERNALS_QUOTA_INTERNALS_PROXY_H_
91