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