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#ifndef CHROME_BROWSER_POLICY_POLICY_NOTIFIER_H_
6ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#define CHROME_BROWSER_POLICY_POLICY_NOTIFIER_H_
7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#pragma once
8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/observer_list.h"
10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/policy/cloud_policy_subsystem.h"
11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace policy {
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Keeps track of the state of the policy subsystem components as far as it's
15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// relevant to the outside world. Is informed by components about status
16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// changes (failures and successes), determines the overall state and
17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// communicates it.
18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass PolicyNotifier {
19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public:
20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  typedef CloudPolicySubsystem::PolicySubsystemState PolicySubsystemState;
21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  typedef CloudPolicySubsystem::ErrorDetails ErrorDetails;
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  enum StatusSource {
24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    TOKEN_FETCHER,
25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    POLICY_CONTROLLER,
26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    POLICY_CACHE,
27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NUM_SOURCES  // This must be the last element in the enum.
28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  };
29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PolicyNotifier();
31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ~PolicyNotifier();
32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Called by components of the policy subsystem. Determines the new overall
34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // state and triggers observer notifications as necessary.
35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void Inform(PolicySubsystemState state,
36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen              ErrorDetails error_details,
37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen              StatusSource source);
38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  CloudPolicySubsystem::PolicySubsystemState state() const {
40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return state_;
41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  CloudPolicySubsystem::ErrorDetails error_details() const {
44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return error_details_;
45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private:
48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  friend class CloudPolicyController;
49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  friend class CloudPolicySubsystem::ObserverRegistrar;
50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void AddObserver(CloudPolicySubsystem::Observer* observer);
52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void RemoveObserver(CloudPolicySubsystem::Observer* observer);
53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void RecomputeState();
55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PolicySubsystemState state_;
57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ErrorDetails error_details_;
58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  PolicySubsystemState component_states_[NUM_SOURCES];
60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ErrorDetails component_error_details_[NUM_SOURCES];
61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ObserverList<CloudPolicySubsystem::Observer, true> observer_list_;
63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(PolicyNotifier);
65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}  // namespace policy
68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif  // CHROME_BROWSER_POLICY_POLICY_NOTIFIER_H_
70