Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(623)

Side by Side Diff: webkit/quota/quota_manager.h

Issue 8070001: Use base::Callback in Quota related code. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: choke lint Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef WEBKIT_QUOTA_QUOTA_MANAGER_H_ 5 #ifndef WEBKIT_QUOTA_QUOTA_MANAGER_H_
6 #define WEBKIT_QUOTA_QUOTA_MANAGER_H_ 6 #define WEBKIT_QUOTA_QUOTA_MANAGER_H_
7 #pragma once 7 #pragma once
8 8
9 #include <deque> 9 #include <deque>
10 #include <list> 10 #include <list>
11 #include <map> 11 #include <map>
12 #include <set> 12 #include <set>
13 #include <string> 13 #include <string>
14 #include <utility>
14 #include <vector> 15 #include <vector>
15 16
16 #include "base/basictypes.h" 17 #include "base/basictypes.h"
17 #include "base/callback.h" 18 #include "base/callback.h"
18 #include "base/file_path.h" 19 #include "base/file_path.h"
19 #include "base/memory/ref_counted.h" 20 #include "base/memory/ref_counted.h"
20 #include "base/memory/scoped_callback_factory.h" 21 #include "base/memory/weak_ptr.h"
21 #include "base/memory/scoped_ptr.h" 22 #include "base/memory/scoped_ptr.h"
22 #include "webkit/quota/quota_database.h" 23 #include "webkit/quota/quota_database.h"
23 #include "webkit/quota/quota_client.h" 24 #include "webkit/quota/quota_client.h"
24 #include "webkit/quota/quota_task.h" 25 #include "webkit/quota/quota_task.h"
25 #include "webkit/quota/quota_types.h" 26 #include "webkit/quota/quota_types.h"
26 #include "webkit/quota/special_storage_policy.h" 27 #include "webkit/quota/special_storage_policy.h"
27 28
28 class FilePath; 29 class FilePath;
29 30
30 namespace base { 31 namespace base {
(...skipping 12 matching lines...) Expand all
43 class QuotaManagerProxy; 44 class QuotaManagerProxy;
44 class QuotaTemporaryStorageEvictor; 45 class QuotaTemporaryStorageEvictor;
45 class UsageTracker; 46 class UsageTracker;
46 class MockQuotaManager; 47 class MockQuotaManager;
47 48
48 // An interface called by QuotaTemporaryStorageEvictor. 49 // An interface called by QuotaTemporaryStorageEvictor.
49 class QuotaEvictionHandler { 50 class QuotaEvictionHandler {
50 public: 51 public:
51 virtual ~QuotaEvictionHandler() {} 52 virtual ~QuotaEvictionHandler() {}
52 53
53 typedef Callback1<const GURL&>::Type GetLRUOriginCallback; 54 typedef base::Callback<void (const GURL&)> GetLRUOriginCallback;
awong 2011/09/29 18:05:15 Remove space after void. Here and elsewhere in fi
tzik 2011/10/11 04:53:57 Done.
54 typedef StatusCallback EvictOriginDataCallback; 55 typedef StatusCallback EvictOriginDataCallback;
55 typedef Callback5<QuotaStatusCode, 56 typedef base::Callback<void (QuotaStatusCode,
56 int64 /* usage */, 57 int64 /* usage */,
57 int64 /* unlimited_usage */, 58 int64 /* unlimited_usage */,
58 int64 /* quota */, 59 int64 /* quota */,
59 int64 /* physical_available */ >::Type 60 int64 /* physical_available */)>
60 GetUsageAndQuotaForEvictionCallback; 61 GetUsageAndQuotaForEvictionCallback;
61 62
62 // Returns the least recently used origin. It might return empty 63 // Returns the least recently used origin. It might return empty
63 // GURL when there are no evictable origins. 64 // GURL when there are no evictable origins.
64 virtual void GetLRUOrigin( 65 virtual void GetLRUOrigin(
65 StorageType type, 66 StorageType type,
66 GetLRUOriginCallback* callback) = 0; 67 GetLRUOriginCallback callback) = 0;
67 68
68 virtual void EvictOriginData( 69 virtual void EvictOriginData(
69 const GURL& origin, 70 const GURL& origin,
70 StorageType type, 71 StorageType type,
71 EvictOriginDataCallback* callback) = 0; 72 EvictOriginDataCallback callback) = 0;
72 73
73 virtual void GetUsageAndQuotaForEviction( 74 virtual void GetUsageAndQuotaForEviction(
74 GetUsageAndQuotaForEvictionCallback* callback) = 0; 75 GetUsageAndQuotaForEvictionCallback callback) = 0;
75 }; 76 };
76 77
77 // The quota manager class. This class is instantiated per profile and 78 // The quota manager class. This class is instantiated per profile and
78 // held by the profile. With the exception of the constructor and the 79 // held by the profile. With the exception of the constructor and the
79 // proxy() method, all methods should only be called on the IO thread. 80 // proxy() method, all methods should only be called on the IO thread.
80 class QuotaManager : public QuotaTaskObserver, 81 class QuotaManager : public QuotaTaskObserver,
81 public QuotaEvictionHandler, 82 public QuotaEvictionHandler,
82 public base::RefCountedThreadSafe< 83 public base::RefCountedThreadSafe<
83 QuotaManager, QuotaManagerDeleter> { 84 QuotaManager, QuotaManagerDeleter> {
84 public: 85 public:
85 typedef Callback3<QuotaStatusCode, 86 typedef base::Callback<void (QuotaStatusCode,
86 int64 /* usage */, 87 int64 /* usage */,
87 int64 /* quota */>::Type GetUsageAndQuotaCallback; 88 int64 /* quota */)>
89 GetUsageAndQuotaCallback;
88 90
89 QuotaManager(bool is_incognito, 91 QuotaManager(bool is_incognito,
90 const FilePath& profile_path, 92 const FilePath& profile_path,
91 base::MessageLoopProxy* io_thread, 93 base::MessageLoopProxy* io_thread,
92 base::MessageLoopProxy* db_thread, 94 base::MessageLoopProxy* db_thread,
93 SpecialStoragePolicy* special_storage_policy); 95 SpecialStoragePolicy* special_storage_policy);
94 96
95 virtual ~QuotaManager(); 97 virtual ~QuotaManager();
96 98
97 // Returns a proxy object that can be used on any thread. 99 // Returns a proxy object that can be used on any thread.
98 QuotaManagerProxy* proxy() { return proxy_.get(); } 100 QuotaManagerProxy* proxy() { return proxy_.get(); }
99 101
100 // Called by clients or webapps. 102 // Called by clients or webapps.
101 // This method is declared as virtual to allow test code to override it. 103 // This method is declared as virtual to allow test code to override it.
102 // note: returns host usage and quota 104 // note: returns host usage and quota
103 virtual void GetUsageAndQuota(const GURL& origin, 105 virtual void GetUsageAndQuota(const GURL& origin,
104 StorageType type, 106 StorageType type,
105 GetUsageAndQuotaCallback* callback); 107 GetUsageAndQuotaCallback callback);
awong 2011/09/29 18:05:15 const &.
tzik 2011/10/11 04:53:57 Done.
106 108
107 // Called by clients via proxy. 109 // Called by clients via proxy.
108 // Client storage should call this method when storage is accessed. 110 // Client storage should call this method when storage is accessed.
109 // Used to maintain LRU ordering. 111 // Used to maintain LRU ordering.
110 void NotifyStorageAccessed(QuotaClient::ID client_id, 112 void NotifyStorageAccessed(QuotaClient::ID client_id,
111 const GURL& origin, 113 const GURL& origin,
112 StorageType type); 114 StorageType type);
113 115
114 // Called by clients via proxy. 116 // Called by clients via proxy.
115 // Client storage must call this method whenever they have made any 117 // Client storage must call this method whenever they have made any
116 // modifications that change the amount of data stored in their storage. 118 // modifications that change the amount of data stored in their storage.
117 void NotifyStorageModified(QuotaClient::ID client_id, 119 void NotifyStorageModified(QuotaClient::ID client_id,
118 const GURL& origin, 120 const GURL& origin,
119 StorageType type, 121 StorageType type,
120 int64 delta); 122 int64 delta);
121 123
122 // Used to avoid evicting origins with open pages. 124 // Used to avoid evicting origins with open pages.
123 // A call to NotifyOriginInUse must be balanced by a later call 125 // A call to NotifyOriginInUse must be balanced by a later call
124 // to NotifyOriginNoLongerInUse. 126 // to NotifyOriginNoLongerInUse.
125 void NotifyOriginInUse(const GURL& origin); 127 void NotifyOriginInUse(const GURL& origin);
126 void NotifyOriginNoLongerInUse(const GURL& origin); 128 void NotifyOriginNoLongerInUse(const GURL& origin);
127 bool IsOriginInUse(const GURL& origin) const { 129 bool IsOriginInUse(const GURL& origin) const {
128 return origins_in_use_.find(origin) != origins_in_use_.end(); 130 return origins_in_use_.find(origin) != origins_in_use_.end();
129 } 131 }
130 132
131 // Called by UI. 133 // Called by UI.
132 virtual void DeleteOriginData(const GURL& origin, 134 virtual void DeleteOriginData(const GURL& origin,
133 StorageType type, 135 StorageType type,
134 StatusCallback* callback); 136 StatusCallback callback);
awong 2011/09/29 18:05:15 const &. okay...I give up. Const& whenever you'r
tzik 2011/10/11 04:53:57 Done for all (I hope). It's too boring...
135 137
136 // Called by UI and internal modules. 138 // Called by UI and internal modules.
137 void GetAvailableSpace(AvailableSpaceCallback* callback); 139 void GetAvailableSpace(AvailableSpaceCallback callback);
138 void GetTemporaryGlobalQuota(QuotaCallback* callback); 140 void GetTemporaryGlobalQuota(QuotaCallback callback);
139 void SetTemporaryGlobalQuota(int64 new_quota, QuotaCallback* callback); 141 void SetTemporaryGlobalQuota(int64 new_quota, QuotaCallback callback);
140 void GetPersistentHostQuota(const std::string& host, 142 void GetPersistentHostQuota(const std::string& host,
141 HostQuotaCallback* callback); 143 HostQuotaCallback callback);
142 void SetPersistentHostQuota(const std::string& host, 144 void SetPersistentHostQuota(const std::string& host,
143 int64 new_quota, 145 int64 new_quota,
144 HostQuotaCallback* callback); 146 HostQuotaCallback callback);
145 void GetGlobalUsage(StorageType type, GlobalUsageCallback* callback); 147 void GetGlobalUsage(StorageType type, GlobalUsageCallback callback);
146 void GetHostUsage(const std::string& host, StorageType type, 148 void GetHostUsage(const std::string& host, StorageType type,
147 HostUsageCallback* callback); 149 HostUsageCallback callback);
148 150
149 void GetStatistics(std::map<std::string, std::string>* statistics); 151 void GetStatistics(std::map<std::string, std::string>* statistics);
150 152
151 bool IsStorageUnlimited(const GURL& origin) const { 153 bool IsStorageUnlimited(const GURL& origin) const {
152 return special_storage_policy_.get() && 154 return special_storage_policy_.get() &&
153 special_storage_policy_->IsStorageUnlimited(origin); 155 special_storage_policy_->IsStorageUnlimited(origin);
154 } 156 }
155 157
156 virtual void GetOriginsModifiedSince(StorageType type, 158 virtual void GetOriginsModifiedSince(StorageType type,
157 base::Time modified_since, 159 base::Time modified_since,
158 GetOriginsCallback* callback); 160 GetOriginsCallback callback);
159 161
160 bool ResetUsageTracker(StorageType type); 162 bool ResetUsageTracker(StorageType type);
161 163
162 // Used to determine the total size of the temp pool. 164 // Used to determine the total size of the temp pool.
163 static const int64 kTemporaryStorageQuotaDefaultSize; 165 static const int64 kTemporaryStorageQuotaDefaultSize;
164 static const int64 kTemporaryStorageQuotaMaxSize; 166 static const int64 kTemporaryStorageQuotaMaxSize;
165 static const int64 kIncognitoDefaultTemporaryQuota; 167 static const int64 kIncognitoDefaultTemporaryQuota;
166 168
167 // Determines the portion of the temp pool that can be 169 // Determines the portion of the temp pool that can be
168 // utilized by a single host (ie. 5 for 20%). 170 // utilized by a single host (ie. 5 for 20%).
(...skipping 27 matching lines...) Expand all
196 198
197 class AvailableSpaceQueryTask; 199 class AvailableSpaceQueryTask;
198 class DumpQuotaTableTask; 200 class DumpQuotaTableTask;
199 class DumpOriginInfoTableTask; 201 class DumpOriginInfoTableTask;
200 202
201 typedef QuotaDatabase::QuotaTableEntry QuotaTableEntry; 203 typedef QuotaDatabase::QuotaTableEntry QuotaTableEntry;
202 typedef QuotaDatabase::OriginInfoTableEntry OriginInfoTableEntry; 204 typedef QuotaDatabase::OriginInfoTableEntry OriginInfoTableEntry;
203 typedef std::vector<QuotaTableEntry> QuotaTableEntries; 205 typedef std::vector<QuotaTableEntry> QuotaTableEntries;
204 typedef std::vector<OriginInfoTableEntry> OriginInfoTableEntries; 206 typedef std::vector<OriginInfoTableEntry> OriginInfoTableEntries;
205 207
206 typedef Callback1<const QuotaTableEntries&>::Type DumpQuotaTableCallback; 208 typedef base::Callback<void (const QuotaTableEntries&)>
207 typedef Callback1<const OriginInfoTableEntries&>::Type 209 DumpQuotaTableCallback;
210 typedef base::Callback<void (const OriginInfoTableEntries&)>
208 DumpOriginInfoTableCallback; 211 DumpOriginInfoTableCallback;
209 212
210 struct EvictionContext { 213 struct EvictionContext {
211 EvictionContext() 214 EvictionContext()
212 : evicted_type(kStorageTypeUnknown), 215 : evicted_type(kStorageTypeUnknown),
213 usage(0), 216 usage(0),
214 unlimited_usage(0), 217 unlimited_usage(0),
215 quota(0) {} 218 quota(0) {}
216 virtual ~EvictionContext() {} 219 virtual ~EvictionContext() {}
217 220
218 GURL evicted_origin; 221 GURL evicted_origin;
219 StorageType evicted_type; 222 StorageType evicted_type;
220 223
221 scoped_ptr<EvictOriginDataCallback> evict_origin_data_callback; 224 EvictOriginDataCallback evict_origin_data_callback;
222 225
223 scoped_ptr<GetUsageAndQuotaForEvictionCallback> 226 GetUsageAndQuotaForEvictionCallback get_usage_and_quota_callback;
224 get_usage_and_quota_callback;
225 int64 usage; 227 int64 usage;
226 int64 unlimited_usage; 228 int64 unlimited_usage;
227 int64 quota; 229 int64 quota;
228 }; 230 };
229 231
230 typedef std::pair<std::string, StorageType> HostAndType; 232 typedef std::pair<std::string, StorageType> HostAndType;
231 typedef std::map<HostAndType, UsageAndQuotaDispatcherTask*> 233 typedef std::map<HostAndType, UsageAndQuotaDispatcherTask*>
232 UsageAndQuotaDispatcherTaskMap; 234 UsageAndQuotaDispatcherTaskMap;
233 235
234 friend class quota_internals::QuotaInternalsProxy; 236 friend class quota_internals::QuotaInternalsProxy;
(...skipping 27 matching lines...) Expand all
262 const GURL& origin, 264 const GURL& origin,
263 StorageType type, 265 StorageType type,
264 base::Time accessed_time); 266 base::Time accessed_time);
265 void NotifyStorageModifiedInternal( 267 void NotifyStorageModifiedInternal(
266 QuotaClient::ID client_id, 268 QuotaClient::ID client_id,
267 const GURL& origin, 269 const GURL& origin,
268 StorageType type, 270 StorageType type,
269 int64 delta, 271 int64 delta,
270 base::Time modified_time); 272 base::Time modified_time);
271 273
272 void DumpQuotaTable(DumpQuotaTableCallback* callback); 274 void DumpQuotaTable(DumpQuotaTableCallback callback);
273 void DumpOriginInfoTable(DumpOriginInfoTableCallback* callback); 275 void DumpOriginInfoTable(DumpOriginInfoTableCallback callback);
274 276
275 // Methods for eviction logic. 277 // Methods for eviction logic.
276 void StartEviction(); 278 void StartEviction();
277 void DeleteOriginFromDatabase(const GURL& origin, StorageType type); 279 void DeleteOriginFromDatabase(const GURL& origin, StorageType type);
278 280
279 void DidOriginDataEvicted(QuotaStatusCode status); 281 void DidOriginDataEvicted(QuotaStatusCode status);
280 void DidGetAvailableSpaceForEviction( 282 void DidGetAvailableSpaceForEviction(
281 QuotaStatusCode status, 283 QuotaStatusCode status,
282 int64 available_space); 284 int64 available_space);
283 void DidGetGlobalQuotaForEviction( 285 void DidGetGlobalQuotaForEviction(
284 QuotaStatusCode status, 286 QuotaStatusCode status,
285 StorageType type, 287 StorageType type,
286 int64 quota); 288 int64 quota);
287 void DidGetGlobalUsageForEviction(StorageType type, 289 void DidGetGlobalUsageForEviction(StorageType type,
288 int64 usage, 290 int64 usage,
289 int64 unlimited_usage); 291 int64 unlimited_usage);
290 292
291 void ReportHistogram(); 293 void ReportHistogram();
292 void DidGetTemporaryGlobalUsageForHistogram(StorageType type, 294 void DidGetTemporaryGlobalUsageForHistogram(StorageType type,
293 int64 usage, 295 int64 usage,
294 int64 unlimited_usage); 296 int64 unlimited_usage);
295 void DidGetPersistentGlobalUsageForHistogram(StorageType type, 297 void DidGetPersistentGlobalUsageForHistogram(StorageType type,
296 int64 usage, 298 int64 usage,
297 int64 unlimited_usage); 299 int64 unlimited_usage);
298 300
299 // QuotaEvictionHandler. 301 // QuotaEvictionHandler.
300 virtual void GetLRUOrigin( 302 virtual void GetLRUOrigin(
301 StorageType type, 303 StorageType type,
302 GetLRUOriginCallback* callback) OVERRIDE; 304 GetLRUOriginCallback callback) OVERRIDE;
303 virtual void EvictOriginData( 305 virtual void EvictOriginData(
304 const GURL& origin, 306 const GURL& origin,
305 StorageType type, 307 StorageType type,
306 EvictOriginDataCallback* callback) OVERRIDE; 308 EvictOriginDataCallback callback) OVERRIDE;
307 virtual void GetUsageAndQuotaForEviction( 309 virtual void GetUsageAndQuotaForEviction(
308 GetUsageAndQuotaForEvictionCallback* callback) OVERRIDE; 310 GetUsageAndQuotaForEvictionCallback callback) OVERRIDE;
309 311
310 void DidInitializeTemporaryGlobalQuota(int64 quota); 312 void DidInitializeTemporaryGlobalQuota(int64 quota);
311 void DidRunInitialGetTemporaryGlobalUsage(StorageType type, int64 usage, 313 void DidRunInitialGetTemporaryGlobalUsage(StorageType type, int64 usage,
312 int64 unlimited_usage); 314 int64 unlimited_usage);
313 void DidGetDatabaseLRUOrigin(const GURL& origin); 315 void DidGetDatabaseLRUOrigin(const GURL& origin);
314 316
315 void DeleteOnCorrectThread() const; 317 void DeleteOnCorrectThread() const;
316 318
317 const bool is_incognito_; 319 const bool is_incognito_;
318 const FilePath profile_path_; 320 const FilePath profile_path_;
319 321
320 scoped_refptr<QuotaManagerProxy> proxy_; 322 scoped_refptr<QuotaManagerProxy> proxy_;
321 bool db_disabled_; 323 bool db_disabled_;
322 bool eviction_disabled_; 324 bool eviction_disabled_;
323 scoped_refptr<base::MessageLoopProxy> io_thread_; 325 scoped_refptr<base::MessageLoopProxy> io_thread_;
324 scoped_refptr<base::MessageLoopProxy> db_thread_; 326 scoped_refptr<base::MessageLoopProxy> db_thread_;
325 mutable scoped_ptr<QuotaDatabase> database_; 327 mutable scoped_ptr<QuotaDatabase> database_;
326 328
327 bool need_initialize_origins_; 329 bool need_initialize_origins_;
328 scoped_ptr<GetLRUOriginCallback> lru_origin_callback_; 330 GetLRUOriginCallback lru_origin_callback_;
329 std::set<GURL> access_notified_origins_; 331 std::set<GURL> access_notified_origins_;
330 332
331 QuotaClientList clients_; 333 QuotaClientList clients_;
332 334
333 scoped_ptr<UsageTracker> temporary_usage_tracker_; 335 scoped_ptr<UsageTracker> temporary_usage_tracker_;
334 scoped_ptr<UsageTracker> persistent_usage_tracker_; 336 scoped_ptr<UsageTracker> persistent_usage_tracker_;
335 // TODO(michaeln): Need a way to clear the cache, drop and 337 // TODO(michaeln): Need a way to clear the cache, drop and
336 // reinstantiate the trackers when they're not handling requests. 338 // reinstantiate the trackers when they're not handling requests.
337 339
338 scoped_ptr<QuotaTemporaryStorageEvictor> temporary_storage_evictor_; 340 scoped_ptr<QuotaTemporaryStorageEvictor> temporary_storage_evictor_;
339 EvictionContext eviction_context_; 341 EvictionContext eviction_context_;
340 342
341 UsageAndQuotaDispatcherTaskMap usage_and_quota_dispatchers_; 343 UsageAndQuotaDispatcherTaskMap usage_and_quota_dispatchers_;
342 344
343 int64 temporary_global_quota_; 345 int64 temporary_global_quota_;
344 QuotaCallbackQueue temporary_global_quota_callbacks_; 346 QuotaCallbackQueue temporary_global_quota_callbacks_;
345 347
346 // Map from origin to count. 348 // Map from origin to count.
347 std::map<GURL, int> origins_in_use_; 349 std::map<GURL, int> origins_in_use_;
348 // Map from origin to error count. 350 // Map from origin to error count.
349 std::map<GURL, int> origins_in_error_; 351 std::map<GURL, int> origins_in_error_;
350 352
351 scoped_refptr<SpecialStoragePolicy> special_storage_policy_; 353 scoped_refptr<SpecialStoragePolicy> special_storage_policy_;
352 354
353 base::ScopedCallbackFactory<QuotaManager> callback_factory_; 355 base::WeakPtrFactory<QuotaManager> weak_factory_;
354 base::RepeatingTimer<QuotaManager> histogram_timer_; 356 base::RepeatingTimer<QuotaManager> histogram_timer_;
355 357
356 DISALLOW_COPY_AND_ASSIGN(QuotaManager); 358 DISALLOW_COPY_AND_ASSIGN(QuotaManager);
357 }; 359 };
358 360
359 struct QuotaManagerDeleter { 361 struct QuotaManagerDeleter {
360 static void Destruct(const QuotaManager* manager) { 362 static void Destruct(const QuotaManager* manager) {
361 manager->DeleteOnCorrectThread(); 363 manager->DeleteOnCorrectThread();
362 } 364 }
363 }; 365 };
(...skipping 26 matching lines...) Expand all
390 392
391 QuotaManager* manager_; // only accessed on the io thread 393 QuotaManager* manager_; // only accessed on the io thread
392 scoped_refptr<base::MessageLoopProxy> io_thread_; 394 scoped_refptr<base::MessageLoopProxy> io_thread_;
393 395
394 DISALLOW_COPY_AND_ASSIGN(QuotaManagerProxy); 396 DISALLOW_COPY_AND_ASSIGN(QuotaManagerProxy);
395 }; 397 };
396 398
397 } // namespace quota 399 } // namespace quota
398 400
399 #endif // WEBKIT_QUOTA_QUOTA_MANAGER_H_ 401 #endif // WEBKIT_QUOTA_QUOTA_MANAGER_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698