15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 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)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/common/proxy_policy_provider.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/logging.h"
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/policy/core/common/policy_bundle.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace policy {
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ProxyPolicyProvider::ProxyPolicyProvider() : delegate_(NULL) {}
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ProxyPolicyProvider::~ProxyPolicyProvider() {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!delegate_);
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProxyPolicyProvider::SetDelegate(ConfigurationPolicyProvider* delegate) {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->RemoveObserver(this);
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = delegate;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_) {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->AddObserver(this);
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OnUpdatePolicy(delegate_);
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UpdatePolicy(scoped_ptr<PolicyBundle>(new PolicyBundle()));
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProxyPolicyProvider::Shutdown() {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: the delegate is not owned by the proxy provider, so this call is not
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // forwarded. The same applies for the Init() call.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Just drop the delegate without propagating updates here.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_) {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->RemoveObserver(this);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_ = NULL;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ConfigurationPolicyProvider::Shutdown();
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProxyPolicyProvider::RefreshPolicies() {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->RefreshPolicies();
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Subtle: if a RefreshPolicies() call comes after Shutdown() then the
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // current bundle should be served instead. This also does the right thing
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // if SetDelegate() was never called before.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<PolicyBundle> bundle(new PolicyBundle());
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bundle->CopyFrom(policies());
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UpdatePolicy(bundle.Pass());
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ProxyPolicyProvider::OnUpdatePolicy(
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ConfigurationPolicyProvider* provider) {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(delegate_, provider);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<PolicyBundle> bundle(new PolicyBundle());
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bundle->CopyFrom(delegate_->policies());
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdatePolicy(bundle.Pass());
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace policy
64