Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / chromeos / policy / device_cloud_policy_invalidator.h
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 a user with a
27 // connected invalidation service is logged in, that service is used to conserve
28 // server resources. If there are no logged-in users or none of them have
29 // connected invalidation services, a device-global |TiclInvalidationService| is
30 // spun up.
31 // The class monitors the status of all invalidation services and switches
32 // between them whenever the service currently in use disconnects or the
33 // device-global invalidation service can be replaced with another service that
34 // just connected.
35 class DeviceCloudPolicyInvalidator : public content::NotificationObserver {
36  public:
37   DeviceCloudPolicyInvalidator();
38   virtual ~DeviceCloudPolicyInvalidator();
39
40   // content::NotificationObserver:
41   virtual void Observe(int type,
42                        const content::NotificationSource& source,
43                        const content::NotificationDetails& details) OVERRIDE;
44
45  private:
46   friend class DeviceCloudPolicyInvalidatorTest;
47
48   // Helper that monitors the status of a single |InvalidationService|.
49   class InvalidationServiceObserver;
50
51   // Status updates received from |InvalidationServiceObserver|s.
52   void OnInvalidationServiceConnected(
53       invalidation::InvalidationService* invalidation_service);
54   void OnInvalidationServiceDisconnected(
55       invalidation::InvalidationService* invalidation_service);
56
57   // Attempt to create a |CloudPolicyInvalidator| backed by a connected
58   // invalidation service. If there is no connected invalidation service, a
59   // |CloudPolicyInvalidator| will be created later when a connected service
60   // becomes available.
61   // Further ensures that a device-global invalidation service is running iff
62   // there is no other connected service.
63   void TryToCreateInvalidator();
64
65   // Create a |CloudPolicyInvalidator| backed by the |invalidation_service|.
66   void CreateInvalidator(
67       invalidation::InvalidationService* invalidation_service);
68
69   // Destroy the current |CloudPolicyInvalidator|, if any.
70   void DestroyInvalidator();
71
72   // Destroy the device-global invalidation service, if any.
73   void DestroyDeviceInvalidationService();
74
75   content::NotificationRegistrar registrar_;
76
77   // Device-global invalidation service.
78   scoped_ptr<invalidation::TiclInvalidationService>
79       device_invalidation_service_;
80
81   // State observer for the device-global invalidation service.
82   scoped_ptr<InvalidationServiceObserver> device_invalidation_service_observer_;
83
84   // State observers for logged-in users' invalidation services.
85   ScopedVector<InvalidationServiceObserver>
86       profile_invalidation_service_observers_;
87
88   // The invalidation service backing the current |CloudPolicyInvalidator|. NULL
89   // if no |CloudPolicyInvalidator| exists.
90   invalidation::InvalidationService* invalidation_service_;
91
92   // The highest invalidation version that was handled already.
93   int64 highest_handled_invalidation_version_;
94
95   // The current |CloudPolicyInvalidator|. NULL if no connected invalidation
96   // service is available.
97   scoped_ptr<CloudPolicyInvalidator> invalidator_;
98
99   DISALLOW_COPY_AND_ASSIGN(DeviceCloudPolicyInvalidator);
100 };
101
102 }  // namespace policy
103
104 #endif  // CHROME_BROWSER_CHROMEOS_POLICY_DEVICE_CLOUD_POLICY_INVALIDATOR_H_