// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/policy/cloud_policy_manager.h" #include "base/bind.h" #include "base/bind_helpers.h" #include "base/logging.h" #include "chrome/browser/policy/cloud_policy_refresh_scheduler.h" #include "chrome/browser/policy/cloud_policy_service.h" #include "chrome/browser/policy/policy_bundle.h" #include "chrome/browser/policy/policy_map.h" namespace policy { CloudPolicyManager::CloudPolicyManager(scoped_ptr store) : store_(store.Pass()), waiting_for_policy_refresh_(false) { store_->AddObserver(this); store_->Load(); } CloudPolicyManager::~CloudPolicyManager() {} void CloudPolicyManager::Shutdown() { ShutdownService(); store_->RemoveObserver(this); ConfigurationPolicyProvider::Shutdown(); } bool CloudPolicyManager::IsInitializationComplete() const { return store_->is_initialized(); } void CloudPolicyManager::RefreshPolicies() { if (service_.get()) { waiting_for_policy_refresh_ = true; service_->RefreshPolicy( base::Bind(&CloudPolicyManager::OnRefreshComplete, base::Unretained(this))); } else { OnRefreshComplete(); } } void CloudPolicyManager::OnStoreLoaded(CloudPolicyStore* store) { DCHECK_EQ(store_.get(), store); CheckAndPublishPolicy(); } void CloudPolicyManager::OnStoreError(CloudPolicyStore* store) { DCHECK_EQ(store_.get(), store); // No action required, the old policy is still valid. } void CloudPolicyManager::InitializeService( scoped_ptr client) { CHECK(!client_.get()); CHECK(client.get()); client_ = client.Pass(); service_.reset(new CloudPolicyService(client_.get(), store_.get())); } void CloudPolicyManager::ShutdownService() { refresh_scheduler_.reset(); service_.reset(); client_.reset(); } void CloudPolicyManager::StartRefreshScheduler( PrefService* local_state, const std::string& refresh_rate_pref) { if (!refresh_scheduler_.get()) { refresh_scheduler_.reset( new CloudPolicyRefreshScheduler( client_.get(), store_.get(), local_state, refresh_rate_pref, MessageLoop::current()->message_loop_proxy())); } } void CloudPolicyManager::CheckAndPublishPolicy() { if (IsInitializationComplete() && !waiting_for_policy_refresh_) { scoped_ptr bundle(new PolicyBundle()); bundle->Get(POLICY_DOMAIN_CHROME, std::string()).CopyFrom( store_->policy_map()); UpdatePolicy(bundle.Pass()); } } void CloudPolicyManager::OnRefreshComplete() { waiting_for_policy_refresh_ = false; CheckAndPublishPolicy(); } } // namespace policy