1// Copyright (c) 2009 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#include "content/browser/appcache/appcache_working_set.h"
6
7#include "base/logging.h"
8#include "content/browser/appcache/appcache.h"
9#include "content/browser/appcache/appcache_group.h"
10#include "content/browser/appcache/appcache_response.h"
11
12namespace content {
13
14AppCacheWorkingSet::AppCacheWorkingSet() : is_disabled_(false) {}
15
16AppCacheWorkingSet::~AppCacheWorkingSet() {
17  DCHECK(caches_.empty());
18  DCHECK(groups_.empty());
19  DCHECK(groups_by_origin_.empty());
20}
21
22void AppCacheWorkingSet::Disable() {
23  if (is_disabled_)
24    return;
25  is_disabled_ = true;
26  caches_.clear();
27  groups_.clear();
28  groups_by_origin_.clear();
29  response_infos_.clear();
30}
31
32void AppCacheWorkingSet::AddCache(AppCache* cache) {
33  if (is_disabled_)
34    return;
35  DCHECK(cache->cache_id() != kAppCacheNoCacheId);
36  int64 cache_id = cache->cache_id();
37  DCHECK(caches_.find(cache_id) == caches_.end());
38  caches_.insert(CacheMap::value_type(cache_id, cache));
39}
40
41void AppCacheWorkingSet::RemoveCache(AppCache* cache) {
42  caches_.erase(cache->cache_id());
43}
44
45void AppCacheWorkingSet::AddGroup(AppCacheGroup* group) {
46  if (is_disabled_)
47    return;
48  const GURL& url = group->manifest_url();
49  DCHECK(groups_.find(url) == groups_.end());
50  groups_.insert(GroupMap::value_type(url, group));
51  groups_by_origin_[url.GetOrigin()].insert(GroupMap::value_type(url, group));
52}
53
54void AppCacheWorkingSet::RemoveGroup(AppCacheGroup* group) {
55  const GURL& url = group->manifest_url();
56  groups_.erase(url);
57
58  GURL origin_url = url.GetOrigin();
59  GroupMap* groups_in_origin = GetMutableGroupsInOrigin(origin_url);
60  if (groups_in_origin) {
61    groups_in_origin->erase(url);
62    if (groups_in_origin->empty())
63      groups_by_origin_.erase(origin_url);
64  }
65}
66
67void AppCacheWorkingSet::AddResponseInfo(AppCacheResponseInfo* info) {
68  if (is_disabled_)
69    return;
70  DCHECK(info->response_id() != kAppCacheNoResponseId);
71  int64 response_id = info->response_id();
72  DCHECK(response_infos_.find(response_id) == response_infos_.end());
73  response_infos_.insert(ResponseInfoMap::value_type(response_id, info));
74}
75
76void AppCacheWorkingSet::RemoveResponseInfo(AppCacheResponseInfo* info) {
77  response_infos_.erase(info->response_id());
78}
79
80}  // namespace
81