15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/browser/appcache/appcache_backend_impl.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h"
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/browser/appcache/appcache.h"
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/browser/appcache/appcache_group.h"
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/browser/appcache/appcache_service_impl.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace content {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AppCacheBackendImpl::AppCacheBackendImpl()
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : service_(NULL),
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      frontend_(NULL),
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      process_id_(0) {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AppCacheBackendImpl::~AppCacheBackendImpl() {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STLDeleteValues(&hosts_);
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (service_)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    service_->UnregisterBackend(this);
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void AppCacheBackendImpl::Initialize(AppCacheServiceImpl* service,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     AppCacheFrontend* frontend,
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     int process_id) {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!service_ && !frontend_ && frontend && service);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service_ = service;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  frontend_ = frontend;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  process_id_ = process_id;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service_->RegisterBackend(this);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AppCacheBackendImpl::RegisterHost(int id) {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetHost(id))
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  hosts_.insert(
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HostMap::value_type(id, new AppCacheHost(id, frontend_, service_)));
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AppCacheBackendImpl::UnregisterHost(int id) {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostMap::iterator found = hosts_.find(id);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (found == hosts_.end())
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete found->second;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  hosts_.erase(found);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AppCacheBackendImpl::SetSpawningHostId(
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int host_id,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int spawning_host_id) {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppCacheHost* host = GetHost(host_id);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!host)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host->SetSpawningHostId(process_id_, spawning_host_id);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AppCacheBackendImpl::SelectCache(
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int host_id,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& document_url,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const int64 cache_document_was_loaded_from,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& manifest_url) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppCacheHost* host = GetHost(host_id);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!host)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host->SelectCache(document_url, cache_document_was_loaded_from,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    manifest_url);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AppCacheBackendImpl::SelectCacheForWorker(
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int host_id, int parent_process_id, int parent_host_id) {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppCacheHost* host = GetHost(host_id);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!host)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host->SelectCacheForWorker(parent_process_id, parent_host_id);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AppCacheBackendImpl::SelectCacheForSharedWorker(
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int host_id, int64 appcache_id) {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppCacheHost* host = GetHost(host_id);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!host)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host->SelectCacheForSharedWorker(appcache_id);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AppCacheBackendImpl::MarkAsForeignEntry(
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int host_id,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& document_url,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 cache_document_was_loaded_from) {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppCacheHost* host = GetHost(host_id);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!host)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host->MarkAsForeignEntry(document_url, cache_document_was_loaded_from);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AppCacheBackendImpl::GetStatusWithCallback(
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int host_id, const GetStatusCallback& callback, void* callback_param) {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppCacheHost* host = GetHost(host_id);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!host)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host->GetStatusWithCallback(callback, callback_param);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AppCacheBackendImpl::StartUpdateWithCallback(
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int host_id, const StartUpdateCallback& callback, void* callback_param) {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppCacheHost* host = GetHost(host_id);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!host)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host->StartUpdateWithCallback(callback, callback_param);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AppCacheBackendImpl::SwapCacheWithCallback(
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int host_id, const SwapCacheCallback& callback, void* callback_param) {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppCacheHost* host = GetHost(host_id);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!host)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host->SwapCacheWithCallback(callback, callback_param);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppCacheBackendImpl::GetResourceList(
142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    int host_id, std::vector<AppCacheResourceInfo>* resource_infos) {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppCacheHost* host = GetHost(host_id);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!host)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host->GetResourceList(resource_infos);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<AppCacheHost> AppCacheBackendImpl::TransferHostOut(int host_id) {
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  HostMap::iterator found = hosts_.find(host_id);
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (found == hosts_.end()) {
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    NOTREACHED();
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return scoped_ptr<AppCacheHost>();
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AppCacheHost* transferree = found->second;
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Put a new empty host in its place.
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  found->second = new AppCacheHost(host_id, frontend_, service_);
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // We give up ownership.
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  transferree->PrepareForTransfer();
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return scoped_ptr<AppCacheHost>(transferree);
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AppCacheBackendImpl::TransferHostIn(
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int new_host_id, scoped_ptr<AppCacheHost> host) {
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  HostMap::iterator found = hosts_.find(new_host_id);
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (found == hosts_.end()) {
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    NOTREACHED();
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  delete found->second;
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // We take onwership.
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  host->CompleteTransfer(new_host_id, frontend_);
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  found->second = host.release();
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace content
183