15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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)
5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/cloud_policy_store.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#include "base/logging.h"
8a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/cloud_external_data_manager.h"
9a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace policy {
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CloudPolicyStore::Observer::~Observer() {}
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CloudPolicyStore::CloudPolicyStore()
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : status_(STATUS_OK),
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      validation_status_(CloudPolicyValidatorBase::VALIDATION_OK),
17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      invalidation_version_(0),
1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      is_initialized_(false) {}
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)CloudPolicyStore::~CloudPolicyStore() {
21d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DCHECK(!external_data_manager_);
22d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void CloudPolicyStore::Store(
25a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const enterprise_management::PolicyFetchResponse& policy,
26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    int64 invalidation_version) {
27a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  invalidation_version_ = invalidation_version;
28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  Store(policy);
29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CloudPolicyStore::AddObserver(CloudPolicyStore::Observer* observer) {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observers_.AddObserver(observer);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CloudPolicyStore::RemoveObserver(CloudPolicyStore::Observer* observer) {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observers_.RemoveObserver(observer);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CloudPolicyStore::NotifyStoreLoaded() {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_initialized_ = true;
413240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // The |external_data_manager_| must be notified first so that when other
423240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // observers are informed about the changed policies and try to fetch external
433240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // data referenced by these, the |external_data_manager_| has the required
443240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // metadata already.
453240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  if (external_data_manager_)
463240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    external_data_manager_->OnPolicyStoreLoaded();
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(Observer, observers_, OnStoreLoaded(this));
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CloudPolicyStore::NotifyStoreError() {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_initialized_ = true;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(Observer, observers_, OnStoreError(this));
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
553240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochvoid CloudPolicyStore::SetExternalDataManager(
563240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    base::WeakPtr<CloudExternalDataManager> external_data_manager) {
573240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  DCHECK(!external_data_manager_);
583240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  external_data_manager_ = external_data_manager;
593240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  if (is_initialized_)
603240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    external_data_manager_->OnPolicyStoreLoaded();
613240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch}
623240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
63d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void CloudPolicyStore::SetPolicyMapForTesting(const PolicyMap& policy_map) {
64d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  policy_map_.CopyFrom(policy_map);
65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  NotifyStoreLoaded();
66d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
67d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
68a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}  // namespace policy
69