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 "components/policy/core/common/cloud/cloud_policy_store.h"
6
7#include "base/logging.h"
8#include "components/policy/core/common/cloud/cloud_external_data_manager.h"
9
10namespace policy {
11
12CloudPolicyStore::Observer::~Observer() {}
13
14CloudPolicyStore::CloudPolicyStore()
15    : status_(STATUS_OK),
16      validation_status_(CloudPolicyValidatorBase::VALIDATION_OK),
17      invalidation_version_(0),
18      is_initialized_(false) {}
19
20CloudPolicyStore::~CloudPolicyStore() {
21  DCHECK(!external_data_manager_);
22}
23
24void CloudPolicyStore::Store(
25    const enterprise_management::PolicyFetchResponse& policy,
26    int64 invalidation_version) {
27  invalidation_version_ = invalidation_version;
28  Store(policy);
29}
30
31void CloudPolicyStore::AddObserver(CloudPolicyStore::Observer* observer) {
32  observers_.AddObserver(observer);
33}
34
35void CloudPolicyStore::RemoveObserver(CloudPolicyStore::Observer* observer) {
36  observers_.RemoveObserver(observer);
37}
38
39void CloudPolicyStore::NotifyStoreLoaded() {
40  is_initialized_ = true;
41  // The |external_data_manager_| must be notified first so that when other
42  // observers are informed about the changed policies and try to fetch external
43  // data referenced by these, the |external_data_manager_| has the required
44  // metadata already.
45  if (external_data_manager_)
46    external_data_manager_->OnPolicyStoreLoaded();
47  FOR_EACH_OBSERVER(Observer, observers_, OnStoreLoaded(this));
48}
49
50void CloudPolicyStore::NotifyStoreError() {
51  is_initialized_ = true;
52  FOR_EACH_OBSERVER(Observer, observers_, OnStoreError(this));
53}
54
55void CloudPolicyStore::SetExternalDataManager(
56    base::WeakPtr<CloudExternalDataManager> external_data_manager) {
57  DCHECK(!external_data_manager_);
58  external_data_manager_ = external_data_manager;
59  if (is_initialized_)
60    external_data_manager_->OnPolicyStoreLoaded();
61}
62
63void CloudPolicyStore::SetPolicyMapForTesting(const PolicyMap& policy_map) {
64  policy_map_.CopyFrom(policy_map);
65  NotifyStoreLoaded();
66}
67
68}  // namespace policy
69