• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 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 "chrome/browser/policy/policy_notifier.h"
6 
7 namespace policy {
8 
AddObserver(CloudPolicySubsystem::Observer * observer)9 void PolicyNotifier::AddObserver(CloudPolicySubsystem::Observer* observer) {
10   observer_list_.AddObserver(observer);
11 }
12 
RemoveObserver(CloudPolicySubsystem::Observer * observer)13 void PolicyNotifier::RemoveObserver(CloudPolicySubsystem::Observer* observer) {
14   observer_list_.RemoveObserver(observer);
15 }
16 
PolicyNotifier()17 PolicyNotifier::PolicyNotifier()
18     : state_(CloudPolicySubsystem::UNENROLLED),
19       error_details_(CloudPolicySubsystem::NO_DETAILS) {
20   for (int i = 0; i < NUM_SOURCES; ++i) {
21     component_states_[i] = CloudPolicySubsystem::UNENROLLED;
22     component_error_details_[i] = CloudPolicySubsystem::NO_DETAILS;
23   }
24 }
25 
~PolicyNotifier()26 PolicyNotifier::~PolicyNotifier() {
27 }
28 
Inform(PolicySubsystemState state,ErrorDetails error_details,StatusSource source)29 void PolicyNotifier::Inform(PolicySubsystemState state,
30                             ErrorDetails error_details,
31                             StatusSource source) {
32   component_states_[source] = state;
33   component_error_details_[source] = error_details;
34   RecomputeState();
35 }
36 
RecomputeState()37 void PolicyNotifier::RecomputeState() {
38   // Define shortcuts.
39   PolicySubsystemState* s = component_states_;
40   ErrorDetails* e = component_error_details_;
41 
42   // Compute overall state. General idea: If any component knows we're
43   // unmanaged, set that as global state. Otherwise, ask components in the
44   // order they normally do work in. If anyone reports 'SUCCESS' or 'UNENROLLED'
45   // (which can also be read as 'undefined/unknown', ask the next component.
46   if (s[TOKEN_FETCHER] == CloudPolicySubsystem::UNMANAGED ||
47       s[POLICY_CONTROLLER] == CloudPolicySubsystem::UNMANAGED ||
48       s[POLICY_CACHE] == CloudPolicySubsystem::UNMANAGED) {
49     state_ = CloudPolicySubsystem::UNMANAGED;
50     error_details_ = CloudPolicySubsystem::NO_DETAILS;
51   } else if (s[TOKEN_FETCHER] == CloudPolicySubsystem::NETWORK_ERROR) {
52     state_ = s[TOKEN_FETCHER];
53     error_details_ = e[TOKEN_FETCHER];
54   } else if (s[TOKEN_FETCHER] ==  CloudPolicySubsystem::BAD_GAIA_TOKEN) {
55     state_ = s[TOKEN_FETCHER];
56     error_details_ = e[TOKEN_FETCHER];
57   } else if (s[POLICY_CONTROLLER] == CloudPolicySubsystem::NETWORK_ERROR) {
58     state_ = s[POLICY_CONTROLLER];
59     error_details_ = e[POLICY_CONTROLLER];
60   } else if (s[TOKEN_FETCHER] == CloudPolicySubsystem::SUCCESS &&
61              s[POLICY_CONTROLLER] != CloudPolicySubsystem::SUCCESS) {
62     // We need to be able to differentiate between token fetch success or
63     // policy fetch success.
64     state_ = CloudPolicySubsystem::TOKEN_FETCHED;
65     error_details_ = CloudPolicySubsystem::NO_DETAILS;
66   } else {
67     state_ = s[POLICY_CACHE];
68     error_details_ = e[POLICY_CACHE];
69   }
70 
71   FOR_EACH_OBSERVER(CloudPolicySubsystem::Observer, observer_list_,
72                     OnPolicyStateChanged(state_, error_details_));
73 }
74 
75 }  // namespace policy
76