Index: chrome/browser/policy/cloud_policy_cache.cc |
diff --git a/chrome/browser/policy/device_management_policy_cache.cc b/chrome/browser/policy/cloud_policy_cache.cc |
similarity index 68% |
rename from chrome/browser/policy/device_management_policy_cache.cc |
rename to chrome/browser/policy/cloud_policy_cache.cc |
index ef8e6e196d6c9bc666fcd85230582cd6ac8fb76c..4d75cd545c9e016be56a801067da37ae322f3231 100644 |
--- a/chrome/browser/policy/device_management_policy_cache.cc |
+++ b/chrome/browser/policy/cloud_policy_cache.cc |
@@ -2,7 +2,7 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#include "chrome/browser/policy/device_management_policy_cache.h" |
+#include "chrome/browser/policy/cloud_policy_cache.h" |
#include <limits> |
#include <string> |
@@ -12,6 +12,8 @@ |
#include "base/task.h" |
#include "base/values.h" |
#include "chrome/browser/browser_thread.h" |
+#include "chrome/browser/policy/configuration_policy_pref_store.h" |
+#include "chrome/browser/policy/configuration_policy_provider.h" |
#include "chrome/browser/policy/proto/device_management_constants.h" |
#include "chrome/browser/policy/proto/device_management_local.pb.h" |
@@ -20,6 +22,45 @@ using google::protobuf::RepeatedPtrField; |
namespace policy { |
+// A thin ConfigurationPolicyProvider implementation sitting on top of |
+// CloudPolicyCache for hooking up with ConfigurationPolicyPrefStore. |
+class CloudPolicyCache::CloudPolicyProvider |
+ : public ConfigurationPolicyProvider { |
+ public: |
+ CloudPolicyProvider(const PolicyDefinitionList* policy_list, |
+ CloudPolicyCache* cache, |
+ CloudPolicyCache::PolicyLevel level) |
+ : ConfigurationPolicyProvider(policy_list), |
+ cache_(cache), |
+ level_(level) {} |
+ virtual ~CloudPolicyProvider() {} |
+ |
+ virtual bool Provide(ConfigurationPolicyStoreInterface* store) { |
+ // TODO(mnissler) handle level once we have support for that in the cache. |
+ DecodePolicyValueTree(cache_->policy_.get(), store); |
+ return true; |
+ } |
+ |
+ virtual bool IsInitializationComplete() const { |
+ return cache_->initialization_complete_; |
+ } |
+ |
+ virtual void AddObserver(ConfigurationPolicyProvider::Observer* observer) { |
+ cache_->observer_list_.AddObserver(observer); |
+ } |
+ virtual void RemoveObserver(ConfigurationPolicyProvider::Observer* observer) { |
+ cache_->observer_list_.RemoveObserver(observer); |
+ } |
+ |
+ private: |
+ // The underlying policy cache. |
+ CloudPolicyCache* cache_; |
+ // Policy level this provider will handle. |
+ CloudPolicyCache::PolicyLevel level_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(CloudPolicyProvider); |
+}; |
+ |
// Saves policy information to a file. |
class PersistPolicyTask : public Task { |
public: |
@@ -62,18 +103,31 @@ void PersistPolicyTask::Run() { |
} |
} |
-DeviceManagementPolicyCache::DeviceManagementPolicyCache( |
+CloudPolicyCache::CloudPolicyCache( |
const FilePath& backing_file_path) |
: backing_file_path_(backing_file_path), |
policy_(new DictionaryValue), |
- fresh_policy_(false), |
+ initialization_complete_(false), |
is_device_unmanaged_(false) { |
+ managed_policy_provider_.reset( |
+ new CloudPolicyProvider( |
+ ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList(), |
+ this, |
+ POLICY_LEVEL_MANDATORY)); |
+ recommended_policy_provider_.reset( |
+ new CloudPolicyProvider( |
+ ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList(), |
+ this, |
+ POLICY_LEVEL_RECOMMENDED)); |
} |
-DeviceManagementPolicyCache::~DeviceManagementPolicyCache() {} |
+CloudPolicyCache::~CloudPolicyCache() { |
+ FOR_EACH_OBSERVER(ConfigurationPolicyProvider::Observer, |
+ observer_list_, OnProviderGoingAway()); |
+} |
-void DeviceManagementPolicyCache::LoadPolicyFromFile() { |
- if (!file_util::PathExists(backing_file_path_) || fresh_policy_) |
+void CloudPolicyCache::LoadFromFile() { |
+ if (!file_util::PathExists(backing_file_path_) || initialization_complete_) |
return; |
// Read the protobuf from the file. |
@@ -99,30 +153,30 @@ void DeviceManagementPolicyCache::LoadPolicyFromFile() { |
<< ", file is from the future."; |
return; |
} |
- is_device_unmanaged_ = cached_policy.unmanaged(); |
// Decode and swap in the new policy information. |
scoped_ptr<DictionaryValue> value(DecodePolicy(cached_policy.policy())); |
- { |
- base::AutoLock lock(lock_); |
- if (!fresh_policy_) |
- policy_.reset(value.release()); |
- last_policy_refresh_time_ = timestamp; |
- } |
+ initialization_complete_ = true; |
+ is_device_unmanaged_ = cached_policy.unmanaged(); |
+ policy_.reset(value.release()); |
+ last_policy_refresh_time_ = timestamp; |
+ |
+ FOR_EACH_OBSERVER(ConfigurationPolicyProvider::Observer, |
+ observer_list_, OnUpdatePolicy()); |
} |
-bool DeviceManagementPolicyCache::SetPolicy( |
+bool CloudPolicyCache::SetPolicy( |
const em::DevicePolicyResponse& policy) { |
is_device_unmanaged_ = false; |
- DictionaryValue* value = DeviceManagementPolicyCache::DecodePolicy(policy); |
+ DictionaryValue* value = CloudPolicyCache::DecodePolicy(policy); |
const bool new_policy_differs = !(value->Equals(policy_.get())); |
base::Time now(base::Time::NowFromSystemTime()); |
- { |
- base::AutoLock lock(lock_); |
- policy_.reset(value); |
- fresh_policy_ = true; |
- last_policy_refresh_time_ = now; |
- } |
+ policy_.reset(value); |
+ initialization_complete_ = true; |
+ last_policy_refresh_time_ = now; |
+ |
+ FOR_EACH_OBSERVER(ConfigurationPolicyProvider::Observer, |
+ observer_list_, OnUpdatePolicy()); |
em::DevicePolicyResponse* policy_copy = new em::DevicePolicyResponse; |
policy_copy->CopyFrom(policy); |
@@ -133,19 +187,23 @@ bool DeviceManagementPolicyCache::SetPolicy( |
return new_policy_differs; |
} |
-DictionaryValue* DeviceManagementPolicyCache::GetPolicy() { |
- base::AutoLock lock(lock_); |
- return policy_->DeepCopy(); |
+ConfigurationPolicyProvider* CloudPolicyCache::GetManagedPolicyProvider() { |
+ return managed_policy_provider_.get(); |
danno
2011/02/04 16:01:33
Make this class nonthreadsafe?
Jakob Kummerow
2011/02/14 13:50:34
Done.
|
+} |
+ |
+ConfigurationPolicyProvider* CloudPolicyCache::GetRecommendedPolicyProvider() { |
+ return recommended_policy_provider_.get(); |
} |
-void DeviceManagementPolicyCache::SetDeviceUnmanaged() { |
+void CloudPolicyCache::SetDeviceUnmanaged() { |
is_device_unmanaged_ = true; |
base::Time now(base::Time::NowFromSystemTime()); |
- { |
- base::AutoLock lock(lock_); |
- policy_.reset(new DictionaryValue); |
- last_policy_refresh_time_ = now; |
- } |
+ policy_.reset(new DictionaryValue); |
+ last_policy_refresh_time_ = now; |
+ |
+ FOR_EACH_OBSERVER(ConfigurationPolicyProvider::Observer, |
+ observer_list_, OnUpdatePolicy()); |
+ |
BrowserThread::PostTask( |
BrowserThread::FILE, |
FROM_HERE, |
@@ -153,7 +211,7 @@ void DeviceManagementPolicyCache::SetDeviceUnmanaged() { |
} |
// static |
-Value* DeviceManagementPolicyCache::DecodeIntegerValue( |
+Value* CloudPolicyCache::DecodeIntegerValue( |
google::protobuf::int64 value) { |
if (value < std::numeric_limits<int>::min() || |
value > std::numeric_limits<int>::max()) { |
@@ -166,7 +224,7 @@ Value* DeviceManagementPolicyCache::DecodeIntegerValue( |
} |
// static |
-Value* DeviceManagementPolicyCache::DecodeValue(const em::GenericValue& value) { |
+Value* CloudPolicyCache::DecodeValue(const em::GenericValue& value) { |
if (!value.has_value_type()) |
return NULL; |
@@ -235,7 +293,7 @@ Value* DeviceManagementPolicyCache::DecodeValue(const em::GenericValue& value) { |
} |
// static |
-DictionaryValue* DeviceManagementPolicyCache::DecodePolicy( |
+DictionaryValue* CloudPolicyCache::DecodePolicy( |
const em::DevicePolicyResponse& policy) { |
DictionaryValue* result = new DictionaryValue; |
RepeatedPtrField<em::DevicePolicySetting>::const_iterator setting; |
@@ -258,7 +316,7 @@ DictionaryValue* DeviceManagementPolicyCache::DecodePolicy( |
++named_value) { |
if (named_value->has_value()) { |
Value* decoded_value = |
- DeviceManagementPolicyCache::DecodeValue(named_value->value()); |
+ CloudPolicyCache::DecodeValue(named_value->value()); |
if (decoded_value) |
result->Set(named_value->name(), decoded_value); |
} |