• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 WEBKIT_BROWSER_QUOTA_QUOTA_CALLBACKS_H_
6 #define WEBKIT_BROWSER_QUOTA_QUOTA_CALLBACKS_H_
7 
8 #include <map>
9 #include <set>
10 #include <string>
11 #include <vector>
12 
13 #include "base/basictypes.h"
14 #include "base/callback.h"
15 #include "base/tuple.h"
16 #include "webkit/common/quota/quota_status_code.h"
17 #include "webkit/common/quota/quota_types.h"
18 
19 class GURL;
20 
21 namespace quota {
22 
23 struct UsageInfo;
24 typedef std::vector<UsageInfo> UsageInfoEntries;
25 
26 // Common callback types that are used throughout in the quota module.
27 typedef base::Callback<void(int64 usage,
28                             int64 unlimited_usage)> GlobalUsageCallback;
29 typedef base::Callback<void(QuotaStatusCode status, int64 quota)> QuotaCallback;
30 typedef base::Callback<void(int64 usage)> UsageCallback;
31 typedef base::Callback<void(QuotaStatusCode, int64)> AvailableSpaceCallback;
32 typedef base::Callback<void(QuotaStatusCode)> StatusCallback;
33 typedef base::Callback<void(const std::set<GURL>& origins,
34                             StorageType type)> GetOriginsCallback;
35 typedef base::Callback<void(const UsageInfoEntries&)> GetUsageInfoCallback;
36 
37 template<typename CallbackType, typename Args>
DispatchToCallback(const CallbackType & callback,const Args & args)38 void DispatchToCallback(const CallbackType& callback,
39                         const Args& args) {
40   DispatchToMethod(&callback, &CallbackType::Run, args);
41 }
42 
43 // Simple template wrapper for a callback queue.
44 template <typename CallbackType, typename Args>
45 class CallbackQueue {
46  public:
47   // Returns true if the given |callback| is the first one added to the queue.
Add(const CallbackType & callback)48   bool Add(const CallbackType& callback) {
49     callbacks_.push_back(callback);
50     return (callbacks_.size() == 1);
51   }
52 
HasCallbacks()53   bool HasCallbacks() const {
54     return !callbacks_.empty();
55   }
56 
57   // Runs the callbacks added to the queue and clears the queue.
Run(const Args & args)58   void Run(const Args& args) {
59     typedef typename std::vector<CallbackType>::iterator iterator;
60     for (iterator iter = callbacks_.begin();
61          iter != callbacks_.end(); ++iter)
62       DispatchToCallback(*iter, args);
63     callbacks_.clear();
64   }
65 
66  private:
67   std::vector<CallbackType> callbacks_;
68 };
69 
70 typedef CallbackQueue<GlobalUsageCallback,
71                       Tuple2<int64, int64> >
72     GlobalUsageCallbackQueue;
73 typedef CallbackQueue<UsageCallback, Tuple1<int64> >
74     UsageCallbackQueue;
75 typedef CallbackQueue<AvailableSpaceCallback,
76                       Tuple2<QuotaStatusCode, int64> >
77     AvailableSpaceCallbackQueue;
78 typedef CallbackQueue<QuotaCallback,
79                       Tuple2<QuotaStatusCode, int64> >
80     GlobalQuotaCallbackQueue;
81 typedef CallbackQueue<base::Closure, Tuple0> ClosureQueue;
82 
83 template <typename CallbackType, typename Key, typename Args>
84 class CallbackQueueMap {
85  public:
86   typedef CallbackQueue<CallbackType, Args> CallbackQueueType;
87   typedef std::map<Key, CallbackQueueType> CallbackMap;
88   typedef typename CallbackMap::iterator iterator;
89 
Add(const Key & key,const CallbackType & callback)90   bool Add(const Key& key, const CallbackType& callback) {
91     return callback_map_[key].Add(callback);
92   }
93 
HasCallbacks(const Key & key)94   bool HasCallbacks(const Key& key) const {
95     return (callback_map_.find(key) != callback_map_.end());
96   }
97 
HasAnyCallbacks()98   bool HasAnyCallbacks() const {
99     return !callback_map_.empty();
100   }
101 
Begin()102   iterator Begin() { return callback_map_.begin(); }
End()103   iterator End() { return callback_map_.end(); }
104 
Clear()105   void Clear() { callback_map_.clear(); }
106 
107   // Runs the callbacks added for the given |key| and clears the key
108   // from the map.
Run(const Key & key,const Args & args)109   void Run(const Key& key, const Args& args) {
110     if (!this->HasCallbacks(key))
111       return;
112     CallbackQueueType& queue = callback_map_[key];
113     queue.Run(args);
114     callback_map_.erase(key);
115   }
116 
117  private:
118   CallbackMap callback_map_;
119 };
120 
121 typedef CallbackQueueMap<UsageCallback, std::string, Tuple1<int64> >
122     HostUsageCallbackMap;
123 typedef CallbackQueueMap<QuotaCallback, std::string,
124                          Tuple2<QuotaStatusCode, int64> >
125     HostQuotaCallbackMap;
126 
127 }  // namespace quota
128 
129 #endif  // WEBKIT_QUOTA_QUOTA_TYPES_H_
130