| // 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. |
| |
| #include "chrome/browser/policy/policy_notifier.h" |
| |
| namespace policy { |
| |
| void PolicyNotifier::AddObserver(CloudPolicySubsystem::Observer* observer) { |
| observer_list_.AddObserver(observer); |
| } |
| |
| void PolicyNotifier::RemoveObserver(CloudPolicySubsystem::Observer* observer) { |
| observer_list_.RemoveObserver(observer); |
| } |
| |
| PolicyNotifier::PolicyNotifier() |
| : state_(CloudPolicySubsystem::UNENROLLED), |
| error_details_(CloudPolicySubsystem::NO_DETAILS) { |
| for (int i = 0; i < NUM_SOURCES; ++i) { |
| component_states_[i] = CloudPolicySubsystem::UNENROLLED; |
| component_error_details_[i] = CloudPolicySubsystem::NO_DETAILS; |
| } |
| } |
| |
| PolicyNotifier::~PolicyNotifier() { |
| } |
| |
| void PolicyNotifier::Inform(PolicySubsystemState state, |
| ErrorDetails error_details, |
| StatusSource source) { |
| component_states_[source] = state; |
| component_error_details_[source] = error_details; |
| RecomputeState(); |
| } |
| |
| void PolicyNotifier::RecomputeState() { |
| // Define shortcuts. |
| PolicySubsystemState* s = component_states_; |
| ErrorDetails* e = component_error_details_; |
| |
| // Compute overall state. General idea: If any component knows we're |
| // unmanaged, set that as global state. Otherwise, ask components in the |
| // order they normally do work in. If anyone reports 'SUCCESS' or 'UNENROLLED' |
| // (which can also be read as 'undefined/unknown', ask the next component. |
| if (s[TOKEN_FETCHER] == CloudPolicySubsystem::UNMANAGED || |
| s[POLICY_CONTROLLER] == CloudPolicySubsystem::UNMANAGED || |
| s[POLICY_CACHE] == CloudPolicySubsystem::UNMANAGED) { |
| state_ = CloudPolicySubsystem::UNMANAGED; |
| error_details_ = CloudPolicySubsystem::NO_DETAILS; |
| } else if (s[TOKEN_FETCHER] == CloudPolicySubsystem::NETWORK_ERROR) { |
| state_ = s[TOKEN_FETCHER]; |
| error_details_ = e[TOKEN_FETCHER]; |
| } else if (s[TOKEN_FETCHER] == CloudPolicySubsystem::BAD_GAIA_TOKEN) { |
| state_ = s[TOKEN_FETCHER]; |
| error_details_ = e[TOKEN_FETCHER]; |
| } else if (s[POLICY_CONTROLLER] == CloudPolicySubsystem::NETWORK_ERROR) { |
| state_ = s[POLICY_CONTROLLER]; |
| error_details_ = e[POLICY_CONTROLLER]; |
| } else if (s[TOKEN_FETCHER] == CloudPolicySubsystem::SUCCESS && |
| s[POLICY_CONTROLLER] != CloudPolicySubsystem::SUCCESS) { |
| // We need to be able to differentiate between token fetch success or |
| // policy fetch success. |
| state_ = CloudPolicySubsystem::TOKEN_FETCHED; |
| error_details_ = CloudPolicySubsystem::NO_DETAILS; |
| } else { |
| state_ = s[POLICY_CACHE]; |
| error_details_ = e[POLICY_CACHE]; |
| } |
| |
| FOR_EACH_OBSERVER(CloudPolicySubsystem::Observer, observer_list_, |
| OnPolicyStateChanged(state_, error_details_)); |
| } |
| |
| } // namespace policy |