blob: a1af2c2bbd6d40ac64610f8453ad3ee16ea1614b [file] [log] [blame]
// Copyright 2014 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 "components/policy/core/common/proxy_policy_provider.h"
#include <memory>
#include <utility>
#include "base/logging.h"
#include "components/policy/core/common/policy_bundle.h"
namespace policy {
ProxyPolicyProvider::ProxyPolicyProvider() : delegate_(NULL) {}
ProxyPolicyProvider::~ProxyPolicyProvider() {
DCHECK(!delegate_);
}
void ProxyPolicyProvider::SetDelegate(ConfigurationPolicyProvider* delegate) {
if (delegate_)
delegate_->RemoveObserver(this);
delegate_ = delegate;
if (delegate_) {
delegate_->AddObserver(this);
OnUpdatePolicy(delegate_);
} else {
UpdatePolicy(std::unique_ptr<PolicyBundle>(new PolicyBundle()));
}
}
void ProxyPolicyProvider::Shutdown() {
// Note: the delegate is not owned by the proxy provider, so this call is not
// forwarded. The same applies for the Init() call.
// Just drop the delegate without propagating updates here.
if (delegate_) {
delegate_->RemoveObserver(this);
delegate_ = NULL;
}
ConfigurationPolicyProvider::Shutdown();
}
void ProxyPolicyProvider::RefreshPolicies() {
if (delegate_) {
delegate_->RefreshPolicies();
} else {
// Subtle: if a RefreshPolicies() call comes after Shutdown() then the
// current bundle should be served instead. This also does the right thing
// if SetDelegate() was never called before.
std::unique_ptr<PolicyBundle> bundle(new PolicyBundle());
bundle->CopyFrom(policies());
UpdatePolicy(std::move(bundle));
}
}
void ProxyPolicyProvider::OnUpdatePolicy(
ConfigurationPolicyProvider* provider) {
DCHECK_EQ(delegate_, provider);
std::unique_ptr<PolicyBundle> bundle(new PolicyBundle());
bundle->CopyFrom(delegate_->policies());
UpdatePolicy(std::move(bundle));
}
} // namespace policy