blob: a0e1062b91cd58bc04d1d34d8bcc91e0dc6d0a9f [file] [log] [blame]
// 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.
#ifndef CHROME_BROWSER_POLICY_POLICY_NOTIFIER_H_
#define CHROME_BROWSER_POLICY_POLICY_NOTIFIER_H_
#pragma once
#include "base/observer_list.h"
#include "chrome/browser/policy/cloud_policy_subsystem.h"
namespace policy {
// Keeps track of the state of the policy subsystem components as far as it's
// relevant to the outside world. Is informed by components about status
// changes (failures and successes), determines the overall state and
// communicates it.
class PolicyNotifier {
public:
typedef CloudPolicySubsystem::PolicySubsystemState PolicySubsystemState;
typedef CloudPolicySubsystem::ErrorDetails ErrorDetails;
enum StatusSource {
TOKEN_FETCHER,
POLICY_CONTROLLER,
POLICY_CACHE,
NUM_SOURCES // This must be the last element in the enum.
};
PolicyNotifier();
~PolicyNotifier();
// Called by components of the policy subsystem. Determines the new overall
// state and triggers observer notifications as necessary.
void Inform(PolicySubsystemState state,
ErrorDetails error_details,
StatusSource source);
CloudPolicySubsystem::PolicySubsystemState state() const {
return state_;
}
CloudPolicySubsystem::ErrorDetails error_details() const {
return error_details_;
}
private:
friend class CloudPolicyController;
friend class CloudPolicySubsystem::ObserverRegistrar;
void AddObserver(CloudPolicySubsystem::Observer* observer);
void RemoveObserver(CloudPolicySubsystem::Observer* observer);
void RecomputeState();
PolicySubsystemState state_;
ErrorDetails error_details_;
PolicySubsystemState component_states_[NUM_SOURCES];
ErrorDetails component_error_details_[NUM_SOURCES];
ObserverList<CloudPolicySubsystem::Observer, true> observer_list_;
DISALLOW_COPY_AND_ASSIGN(PolicyNotifier);
};
} // namespace policy
#endif // CHROME_BROWSER_POLICY_POLICY_NOTIFIER_H_