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