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