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