190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// found in the LICENSE file. 490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifndef STORAGE_BROWSER_QUOTA_QUOTA_CALLBACKS_H_ 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define STORAGE_BROWSER_QUOTA_QUOTA_CALLBACKS_H_ 790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include <map> 990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include <set> 1090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include <string> 1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include <vector> 1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/basictypes.h" 1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/callback.h" 1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/tuple.h" 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/common/quota/quota_status_code.h" 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/common/quota/quota_types.h" 1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class GURL; 2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace storage { 2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)struct UsageInfo; 2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)typedef std::vector<UsageInfo> UsageInfoEntries; 2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Common callback types that are used throughout in the quota module. 2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)typedef base::Callback<void(int64 usage, 2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int64 unlimited_usage)> GlobalUsageCallback; 2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)typedef base::Callback<void(QuotaStatusCode status, int64 quota)> QuotaCallback; 3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)typedef base::Callback<void(int64 usage)> UsageCallback; 3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)typedef base::Callback<void(QuotaStatusCode, int64)> AvailableSpaceCallback; 3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)typedef base::Callback<void(QuotaStatusCode)> StatusCallback; 3390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)typedef base::Callback<void(const std::set<GURL>& origins, 3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) StorageType type)> GetOriginsCallback; 3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)typedef base::Callback<void(const UsageInfoEntries&)> GetUsageInfoCallback; 3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)template<typename CallbackType, typename Args> 3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void DispatchToCallback(const CallbackType& callback, 3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const Args& args) { 4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DispatchToMethod(&callback, &CallbackType::Run, args); 4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Simple template wrapper for a callback queue. 4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)template <typename CallbackType, typename Args> 4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class CallbackQueue { 4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Returns true if the given |callback| is the first one added to the queue. 4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool Add(const CallbackType& callback) { 4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) callbacks_.push_back(callback); 5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return (callbacks_.size() == 1); 5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool HasCallbacks() const { 5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return !callbacks_.empty(); 5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Runs the callbacks added to the queue and clears the queue. 5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void Run(const Args& args) { 5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) typedef typename std::vector<CallbackType>::iterator iterator; 6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) for (iterator iter = callbacks_.begin(); 6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) iter != callbacks_.end(); ++iter) 6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DispatchToCallback(*iter, args); 6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) callbacks_.clear(); 6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 6590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 6690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private: 6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<CallbackType> callbacks_; 6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 6990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)typedef CallbackQueue<GlobalUsageCallback, 7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Tuple2<int64, int64> > 7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GlobalUsageCallbackQueue; 73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)typedef CallbackQueue<UsageCallback, Tuple1<int64> > 74868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) UsageCallbackQueue; 7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)typedef CallbackQueue<AvailableSpaceCallback, 7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Tuple2<QuotaStatusCode, int64> > 7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) AvailableSpaceCallbackQueue; 7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)typedef CallbackQueue<QuotaCallback, 7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Tuple2<QuotaStatusCode, int64> > 8090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GlobalQuotaCallbackQueue; 8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)typedef CallbackQueue<base::Closure, Tuple0> ClosureQueue; 8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)template <typename CallbackType, typename Key, typename Args> 8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class CallbackQueueMap { 8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 8690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) typedef CallbackQueue<CallbackType, Args> CallbackQueueType; 8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) typedef std::map<Key, CallbackQueueType> CallbackMap; 8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) typedef typename CallbackMap::iterator iterator; 8990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool Add(const Key& key, const CallbackType& callback) { 9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return callback_map_[key].Add(callback); 9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool HasCallbacks(const Key& key) const { 9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return (callback_map_.find(key) != callback_map_.end()); 9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool HasAnyCallbacks() const { 9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return !callback_map_.empty(); 10090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) iterator Begin() { return callback_map_.begin(); } 10390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) iterator End() { return callback_map_.end(); } 10490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 10590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void Clear() { callback_map_.clear(); } 10690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Runs the callbacks added for the given |key| and clears the key 10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // from the map. 10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void Run(const Key& key, const Args& args) { 11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!this->HasCallbacks(key)) 11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return; 11290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) CallbackQueueType& queue = callback_map_[key]; 11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) queue.Run(args); 11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) callback_map_.erase(key); 11590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 11690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 11790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private: 11890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) CallbackMap callback_map_; 11990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 12090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 12190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)typedef CallbackQueueMap<UsageCallback, std::string, Tuple1<int64> > 12290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) HostUsageCallbackMap; 12390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)typedef CallbackQueueMap<QuotaCallback, std::string, 12490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Tuple2<QuotaStatusCode, int64> > 12590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) HostQuotaCallbackMap; 12690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 12703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} // namespace storage 12890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif // STORAGE_QUOTA_QUOTA_TYPES_H_ 130