Home | History | Annotate | Download | only in policy
      1 // Copyright 2014 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_CHROMEOS_POLICY_DEVICE_CLOUD_POLICY_INVALIDATOR_H_
      6 #define CHROME_BROWSER_CHROMEOS_POLICY_DEVICE_CLOUD_POLICY_INVALIDATOR_H_
      7 
      8 #include "base/basictypes.h"
      9 #include "base/compiler_specific.h"
     10 #include "base/macros.h"
     11 #include "base/memory/scoped_ptr.h"
     12 #include "base/memory/scoped_vector.h"
     13 #include "content/public/browser/notification_observer.h"
     14 #include "content/public/browser/notification_registrar.h"
     15 
     16 namespace invalidation {
     17 class InvalidationService;
     18 class TiclInvalidationService;
     19 }
     20 
     21 namespace policy {
     22 
     23 class CloudPolicyInvalidator;
     24 
     25 // This class provides invalidations for device policy via a
     26 // |CloudPolicyInvalidator| backed by an |InvalidationService|. If an affiliated
     27 // user with a connected invalidation service is logged in, that service is used
     28 // to conserve server resources. If there are no logged-in users matching these
     29 // criteria, a device-global |TiclInvalidationService| is spun up.
     30 // The class monitors the status of the invalidation services and switches
     31 // between them whenever the service currently in use disconnects or the
     32 // device-global invalidation service can be replaced with another service that
     33 // just connected.
     34 class DeviceCloudPolicyInvalidator : public content::NotificationObserver {
     35  public:
     36   DeviceCloudPolicyInvalidator();
     37   virtual ~DeviceCloudPolicyInvalidator();
     38 
     39   // content::NotificationObserver:
     40   virtual void Observe(int type,
     41                        const content::NotificationSource& source,
     42                        const content::NotificationDetails& details) OVERRIDE;
     43 
     44  private:
     45   friend class DeviceCloudPolicyInvalidatorTest;
     46 
     47   // Helper that monitors the status of a single |InvalidationService|.
     48   class InvalidationServiceObserver;
     49 
     50   // Status updates received from |InvalidationServiceObserver|s.
     51   void OnInvalidationServiceConnected(
     52       invalidation::InvalidationService* invalidation_service);
     53   void OnInvalidationServiceDisconnected(
     54       invalidation::InvalidationService* invalidation_service);
     55 
     56   // Attempt to create a |CloudPolicyInvalidator| backed by a connected
     57   // invalidation service. If no connected invalidation service is available for
     58   // use, a |CloudPolicyInvalidator| will be created later when a connected
     59   // service becomes available.
     60   // Further ensures that a device-global invalidation service is running iff
     61   // there is no other connected service available for use.
     62   void TryToCreateInvalidator();
     63 
     64   // Create a |CloudPolicyInvalidator| backed by the |invalidation_service|.
     65   void CreateInvalidator(
     66       invalidation::InvalidationService* invalidation_service);
     67 
     68   // Destroy the current |CloudPolicyInvalidator|, if any.
     69   void DestroyInvalidator();
     70 
     71   // Destroy the device-global invalidation service, if any.
     72   void DestroyDeviceInvalidationService();
     73 
     74   content::NotificationRegistrar registrar_;
     75 
     76   // Device-global invalidation service.
     77   scoped_ptr<invalidation::TiclInvalidationService>
     78       device_invalidation_service_;
     79 
     80   // State observer for the device-global invalidation service.
     81   scoped_ptr<InvalidationServiceObserver> device_invalidation_service_observer_;
     82 
     83   // State observers for logged-in users' invalidation services.
     84   ScopedVector<InvalidationServiceObserver>
     85       profile_invalidation_service_observers_;
     86 
     87   // The invalidation service backing the current |CloudPolicyInvalidator|. NULL
     88   // if no |CloudPolicyInvalidator| exists.
     89   invalidation::InvalidationService* invalidation_service_;
     90 
     91   // The highest invalidation version that was handled already.
     92   int64 highest_handled_invalidation_version_;
     93 
     94   // The current |CloudPolicyInvalidator|. NULL if no connected invalidation
     95   // service is available.
     96   scoped_ptr<CloudPolicyInvalidator> invalidator_;
     97 
     98   DISALLOW_COPY_AND_ASSIGN(DeviceCloudPolicyInvalidator);
     99 };
    100 
    101 }  // namespace policy
    102 
    103 #endif  // CHROME_BROWSER_CHROMEOS_POLICY_DEVICE_CLOUD_POLICY_INVALIDATOR_H_
    104