Index: chrome/browser/policy/cloud_policy_provider.h |
diff --git a/chrome/browser/policy/cloud_policy_provider.h b/chrome/browser/policy/cloud_policy_provider.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1034dd3d97120850bbf61861d4e9a959c2232166 |
--- /dev/null |
+++ b/chrome/browser/policy/cloud_policy_provider.h |
@@ -0,0 +1,150 @@ |
+// Copyright (c) 2011 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. |
+ |
+#ifndef CHROME_BROWSER_POLICY_CLOUD_POLICY_PROVIDER_H_ |
+#define CHROME_BROWSER_POLICY_CLOUD_POLICY_PROVIDER_H_ |
+#pragma once |
+ |
+#include "base/memory/scoped_ptr.h" |
+#include "base/memory/scoped_vector.h" |
+#include "base/observer_list.h" |
+#include "chrome/browser/policy/cloud_policy_cache_base.h" |
+#include "chrome/browser/policy/configuration_policy_provider.h" |
+#include "chrome/browser/policy/policy_map.h" |
+ |
+namespace policy { |
+ |
+// A thin wrapper around CloudPolicyCacheBase. Proxies the notifications and |
+// delegates the actions to the underlying |cache_|. Also exposes the PolicyMap |
+// of |cache_|. |
+// The |cache_| is kept as a weak reference and can be exchanged at any point |
+// destroying the CloudPolicyProvider instance. |
Mattias Nissler (ping if slow)
2011/05/31 14:14:19
destroying is not exactly exchanging the |cache_|
sfeuz
2011/06/03 08:30:35
I meant to write "[...] at any point WITHOUT destr
|
+class CloudPolicyProvider : public ConfigurationPolicyProvider, |
+ public CloudPolicyCacheBase::Observer { |
+ public: |
+ CloudPolicyProvider(const PolicyDefinitionList* policy_list, |
+ CloudPolicyCacheBase::PolicyLevel level); |
+ virtual ~CloudPolicyProvider(); |
+ |
+ // ConfigurationPolicyProvider implementation. |
+ virtual bool Provide(ConfigurationPolicyStoreInterface* store) OVERRIDE; |
+ virtual bool IsInitializationComplete() const OVERRIDE; |
+ virtual void AddObserver(ConfigurationPolicyProvider::Observer* observer) |
+ OVERRIDE; |
+ virtual void RemoveObserver(ConfigurationPolicyProvider::Observer* observer) |
+ OVERRIDE; |
+ |
+ // CloudPolicyCacheBase::Observer implementation. |
+ virtual void OnCacheUpdate() OVERRIDE; |
+ virtual void OnCacheGoingAway() OVERRIDE; |
+ |
+ // Exposes |policy_map| of the underlying |cache_|. |
+ PolicyMap* policy_map(); |
Mattias Nissler (ping if slow)
2011/05/31 14:14:19
It feels wrong that you both expose the policy map
Joao da Silva
2011/05/31 14:50:23
Should this be const?
sfeuz
2011/06/03 08:30:35
Done. As we discussed offline.
|
+ |
+ // Sets another backend. |
+ void set_cache(CloudPolicyCacheBase* cache); |
+ |
+ private: |
+ // The underlying policy cache. Can be NULL if currently none is present. |
+ CloudPolicyCacheBase* cache_; |
+ // Policy level this provider will handle. |
+ CloudPolicyCacheBase::PolicyLevel level_; |
+ |
+ // Provider observers that are registered with this provider. |
+ ObserverList<ConfigurationPolicyProvider::Observer, true> observer_list_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(CloudPolicyProvider); |
+}; |
+ |
+// Combines multiple CloudPolicyProviders and applies them in the given order. |
+class CombiningCloudPolicyProvider : public ConfigurationPolicyProvider { |
+ public: |
+ explicit CombiningCloudPolicyProvider( |
+ const PolicyDefinitionList* policy_list); |
+ virtual ~CombiningCloudPolicyProvider(); |
+ |
+ // ConfigurationPolicyProvider implementation. |
+ // Applies policy by applying the policies of the underlying |
+ // CloudPolicyProviders in |cloud_policy_providers_| in the |
+ // order they appear there. Early elements in |cloud_policy_providers_| take |
+ // precedence. Handles special case for Proxy policy by marking all |
+ // Proxy-related policies as applied as soon as one of them is applied. |
+ // Returns true if we could apply at least one policy. |
Mattias Nissler (ping if slow)
2011/05/31 14:14:19
That seems wrong. It's totally OK for no policy to
sfeuz
2011/06/03 08:30:35
I agree. Just returning true is probably the right
|
+ bool Provide(ConfigurationPolicyStoreInterface* store) OVERRIDE; |
Mattias Nissler (ping if slow)
2011/05/31 14:14:19
virtual
sfeuz
2011/06/03 08:30:35
Done.
|
+ |
+ // Returns true if at least one CloudPolicyProvider in |
+ // |cloud_policy_providers_| is initialized. |
+ bool IsInitializationComplete() const OVERRIDE; |
Mattias Nissler (ping if slow)
2011/05/31 14:14:19
virtual
Joao da Silva
2011/05/31 14:50:23
I'm not sure this is the correct behavior, instead
sfeuz
2011/06/03 08:30:35
Done.
sfeuz
2011/06/03 08:30:35
I now believe the correct behaviour is to always r
|
+ void AddObserver(ConfigurationPolicyProvider::Observer* observer) OVERRIDE; |
Mattias Nissler (ping if slow)
2011/05/31 14:14:19
virtual
sfeuz
2011/06/03 08:30:35
Done.
|
+ void RemoveObserver(ConfigurationPolicyProvider::Observer* observer) OVERRIDE; |
Mattias Nissler (ping if slow)
2011/05/31 14:14:19
virtual
sfeuz
2011/06/03 08:30:35
Done.
|
+ |
+ // Callbacks for CloudPolicyProviderWithObserver. |
+ void OnUpdatePolicy(CloudPolicyProvider* cloud_policy_provider); |
+ void OnProviderGoingAway(CloudPolicyProvider* cloud_policy_provider); |
+ |
+ // Adds a new CloudPolicyProvider to the end of |cloud_policy_providers_|. |
+ // Does not take ownership of |cloud_policy_provider|. |
+ void AddCloudPolicyProvider(CloudPolicyProvider* cloud_policy_provider); |
+ |
+ private: |
+ // Wrapper around a CloudPolicyProvider to include the source in the |
+ // callbacks. We need that to figure out which element in |
+ // |cloud_policy_providers_| to remove if a CloudPolicyProvider calls |
+ // OnProviderGoingAway. |
Mattias Nissler (ping if slow)
2011/05/31 14:14:19
It seems like a adding an appropriate parameter to
sfeuz
2011/06/03 08:30:35
Added the parameter to the cache observer interfac
|
+ class CloudPolicyProviderWithObserver : |
+ public ConfigurationPolicyProvider::Observer { |
+ public: |
+ CloudPolicyProviderWithObserver( |
+ CombiningCloudPolicyProvider* combining_cloud_policy_provider, |
+ CloudPolicyProvider* cloud_policy_provider) : |
+ combining_cloud_policy_provider_(combining_cloud_policy_provider), |
+ cloud_policy_provider_(cloud_policy_provider) { |
+ DCHECK(combining_cloud_policy_provider_ && cloud_policy_provider_); |
+ cloud_policy_provider_->AddObserver(this); |
+ } |
+ ~CloudPolicyProviderWithObserver() { |
+ if (cloud_policy_provider_) { |
+ cloud_policy_provider_->RemoveObserver(this); |
+ cloud_policy_provider_ = NULL; |
+ } |
+ } |
+ virtual void OnUpdatePolicy() { |
+ combining_cloud_policy_provider_->OnUpdatePolicy( |
+ cloud_policy_provider_); |
+ } |
+ virtual void OnProviderGoingAway() { |
+ combining_cloud_policy_provider_->OnProviderGoingAway( |
+ cloud_policy_provider_); |
+ // Normally our dtor is called on removal from |cloud_policy_providers_|, |
+ // but just in case we are still active remove us as Observer. |
+ if (cloud_policy_provider_) { |
+ cloud_policy_provider_->RemoveObserver(this); |
+ cloud_policy_provider_ = NULL; |
+ } |
+ } |
+ CloudPolicyProvider* cloud_policy_provider() const { |
+ return cloud_policy_provider_; |
+ } |
+ |
+ private: |
+ CombiningCloudPolicyProvider* combining_cloud_policy_provider_; |
+ CloudPolicyProvider* cloud_policy_provider_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(CloudPolicyProviderWithObserver); |
+ }; |
+ |
+ // CloudPolicyProviders which are combined by this instance of |
+ // CombiningCoudPolicyProvider. Order dependant. |
Mattias Nissler (ping if slow)
2011/05/31 14:14:19
"Order dependant" conveys to me: There is somethin
sfeuz
2011/06/03 08:30:35
Was explained in Provide.
|
+ typedef ScopedVector<CloudPolicyProviderWithObserver> ListType; |
+ ListType cloud_policy_providers_; |
+ |
+ // Provider observers that are registered with this provider. |
+ ObserverList<ConfigurationPolicyProvider::Observer, true> observer_list_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(CombiningCloudPolicyProvider); |
+}; |
+ |
+} // namespace policy |
+ |
+#endif // CHROME_BROWSER_POLICY_CLOUD_POLICY_PROVIDER_H_ |