15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/quota/quota_manager_proxy.h" 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/bind.h" 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/bind_helpers.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/callback.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/sequenced_task_runner.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/single_thread_task_runner.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/string_number_conversions.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/task_runner_util.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace storage { 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace { 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DidGetUsageAndQuota( 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::SequencedTaskRunner* original_task_runner, 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const QuotaManagerProxy::GetUsageAndQuotaCallback& callback, 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuotaStatusCode status, int64 usage, int64 quota) { 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!original_task_runner->RunsTasksOnCurrentThread()) { 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) original_task_runner->PostTask( 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FROM_HERE, 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&DidGetUsageAndQuota, 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) make_scoped_refptr(original_task_runner), 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback, status, usage, quota)); 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) callback.Run(status, usage, quota); 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void QuotaManagerProxy::RegisterClient(QuotaClient* client) { 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!io_thread_->BelongsToCurrentThread() && 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) io_thread_->PostTask( 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FROM_HERE, 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&QuotaManagerProxy::RegisterClient, this, client))) { 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (manager_) 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) manager_->RegisterClient(client); 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) client->OnQuotaManagerDestroyed(); 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void QuotaManagerProxy::NotifyStorageAccessed( 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuotaClient::ID client_id, 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& origin, 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StorageType type) { 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!io_thread_->BelongsToCurrentThread()) { 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) io_thread_->PostTask( 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FROM_HERE, 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&QuotaManagerProxy::NotifyStorageAccessed, this, client_id, 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) origin, type)); 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (manager_) 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) manager_->NotifyStorageAccessed(client_id, origin, type); 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void QuotaManagerProxy::NotifyStorageModified( 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuotaClient::ID client_id, 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& origin, 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StorageType type, 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64 delta) { 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!io_thread_->BelongsToCurrentThread()) { 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) io_thread_->PostTask( 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FROM_HERE, 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&QuotaManagerProxy::NotifyStorageModified, this, client_id, 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) origin, type, delta)); 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (manager_) 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) manager_->NotifyStorageModified(client_id, origin, type, delta); 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void QuotaManagerProxy::NotifyOriginInUse( 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& origin) { 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!io_thread_->BelongsToCurrentThread()) { 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) io_thread_->PostTask( 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FROM_HERE, 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&QuotaManagerProxy::NotifyOriginInUse, this, origin)); 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (manager_) 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) manager_->NotifyOriginInUse(origin); 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void QuotaManagerProxy::NotifyOriginNoLongerInUse( 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& origin) { 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!io_thread_->BelongsToCurrentThread()) { 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) io_thread_->PostTask( 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FROM_HERE, 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&QuotaManagerProxy::NotifyOriginNoLongerInUse, this, 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) origin)); 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (manager_) 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) manager_->NotifyOriginNoLongerInUse(origin); 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void QuotaManagerProxy::SetUsageCacheEnabled(QuotaClient::ID client_id, 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& origin, 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StorageType type, 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool enabled) { 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!io_thread_->BelongsToCurrentThread()) { 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) io_thread_->PostTask( 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FROM_HERE, 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&QuotaManagerProxy::SetUsageCacheEnabled, this, 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) client_id, origin, type, enabled)); 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (manager_) 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) manager_->SetUsageCacheEnabled(client_id, origin, type, enabled); 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void QuotaManagerProxy::GetUsageAndQuota( 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::SequencedTaskRunner* original_task_runner, 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& origin, 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StorageType type, 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GetUsageAndQuotaCallback& callback) { 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!io_thread_->BelongsToCurrentThread()) { 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) io_thread_->PostTask( 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FROM_HERE, 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&QuotaManagerProxy::GetUsageAndQuota, this, 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) make_scoped_refptr(original_task_runner), 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) origin, type, callback)); 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!manager_) { 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DidGetUsageAndQuota(original_task_runner, callback, kQuotaErrorAbort, 0, 0); 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) manager_->GetUsageAndQuota( 1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) origin, type, 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&DidGetUsageAndQuota, 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) make_scoped_refptr(original_task_runner), callback)); 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)QuotaManager* QuotaManagerProxy::quota_manager() const { 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!io_thread_.get() || io_thread_->BelongsToCurrentThread()); 1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return manager_; 1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)QuotaManagerProxy::QuotaManagerProxy( 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci QuotaManager* manager, 1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const scoped_refptr<base::SingleThreadTaskRunner>& io_thread) 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : manager_(manager), io_thread_(io_thread) { 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)QuotaManagerProxy::~QuotaManagerProxy() { 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 16103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} // namespace storage 162