Home | History | Annotate | Download | only in policy
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/chromeos/policy/proxy_policy_provider.h"
      6 
      7 namespace policy {
      8 
      9 ProxyPolicyProvider::ProxyPolicyProvider() : delegate_(NULL) {}
     10 
     11 ProxyPolicyProvider::~ProxyPolicyProvider() {
     12   DCHECK(!delegate_);
     13 }
     14 
     15 void ProxyPolicyProvider::SetDelegate(ConfigurationPolicyProvider* delegate) {
     16   if (delegate_)
     17     delegate_->RemoveObserver(this);
     18   delegate_ = delegate;
     19   if (delegate_) {
     20     delegate_->AddObserver(this);
     21     OnUpdatePolicy(delegate_);
     22   } else {
     23     UpdatePolicy(scoped_ptr<PolicyBundle>(new PolicyBundle()));
     24   }
     25 }
     26 
     27 void ProxyPolicyProvider::Shutdown() {
     28   // Note: the delegate is not owned by the proxy provider, so this call is not
     29   // forwarded. The same applies for the Init() call.
     30   // Just drop the delegate without propagating updates here.
     31   if (delegate_) {
     32     delegate_->RemoveObserver(this);
     33     delegate_ = NULL;
     34   }
     35   ConfigurationPolicyProvider::Shutdown();
     36 }
     37 
     38 void ProxyPolicyProvider::RefreshPolicies() {
     39   if (delegate_) {
     40     delegate_->RefreshPolicies();
     41   } else {
     42     // Subtle: if a RefreshPolicies() call comes after Shutdown() then the
     43     // current bundle should be served instead. This also does the right thing
     44     // if SetDelegate() was never called before.
     45     scoped_ptr<PolicyBundle> bundle(new PolicyBundle());
     46     bundle->CopyFrom(policies());
     47     UpdatePolicy(bundle.Pass());
     48   }
     49 }
     50 
     51 void ProxyPolicyProvider::OnUpdatePolicy(
     52     ConfigurationPolicyProvider* provider) {
     53   DCHECK_EQ(delegate_, provider);
     54   scoped_ptr<PolicyBundle> bundle(new PolicyBundle());
     55   bundle->CopyFrom(delegate_->policies());
     56   UpdatePolicy(bundle.Pass());
     57 }
     58 
     59 }  // namespace policy
     60