summaryrefslogtreecommitdiffstats
path: root/chrome/browser/chromeos/policy/affiliated_invalidation_service_provider.h
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/chromeos/policy/affiliated_invalidation_service_provider.h')
-rw-r--r--chrome/browser/chromeos/policy/affiliated_invalidation_service_provider.h140
1 files changed, 140 insertions, 0 deletions
diff --git a/chrome/browser/chromeos/policy/affiliated_invalidation_service_provider.h b/chrome/browser/chromeos/policy/affiliated_invalidation_service_provider.h
new file mode 100644
index 0000000..5484355
--- /dev/null
+++ b/chrome/browser/chromeos/policy/affiliated_invalidation_service_provider.h
@@ -0,0 +1,140 @@
+// Copyright 2015 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_CHROMEOS_POLICY_AFFILIATED_INVALIDATION_SERVICE_PROVIDER_H_
+#define CHROME_BROWSER_CHROMEOS_POLICY_AFFILIATED_INVALIDATION_SERVICE_PROVIDER_H_
+
+#include "base/macros.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/memory/scoped_vector.h"
+#include "base/observer_list.h"
+#include "content/public/browser/notification_observer.h"
+#include "content/public/browser/notification_registrar.h"
+
+namespace invalidation {
+class InvalidationService;
+class TiclInvalidationService;
+}
+
+namespace policy {
+
+// This class provides access to an |InvalidationService| that can be used to
+// subscribe to invalidations generated by the device's enrollment domain, e.g.
+// policy pushing and remote commands for:
+// * the device itself
+// * device-local accounts
+// * other users affiliated with the enrollment domain
+//
+// If an affiliated user with a connected invalidation service is logged in,
+// that invalidation service will be used to conserve server resources. If there
+// are no logged-in users matching these criteria, a device-global
+// |TiclInvalidationService| is spun up.
+// The class monitors the status of the invalidation services and switches
+// between them whenever the service currently in use disconnects or the
+// device-global invalidation service can be replaced with another service that
+// just connected.
+class AffiliatedInvalidationServiceProvider
+ : public content::NotificationObserver {
+ public:
+ class Consumer {
+ public:
+ // This method is called when the invalidation service that the consumer
+ // should use changes:
+ // * If |invalidation_service| is a nullptr, no invalidation service is
+ // currently available for use.
+ // * Otherwise, |invalidation_service| is the invalidation service that the
+ // consumer should use. It is guaranteed to be connected. Any previously
+ // provided invalidation services must no longer be used.
+ virtual void OnInvalidationServiceSet(
+ invalidation::InvalidationService* invalidation_service) = 0;
+
+ protected:
+ virtual ~Consumer();
+ };
+
+ AffiliatedInvalidationServiceProvider();
+ ~AffiliatedInvalidationServiceProvider() override;
+
+ // content::NotificationObserver:
+ void Observe(int type,
+ const content::NotificationSource& source,
+ const content::NotificationDetails& details) override;
+
+ // Indicates that |consumer| is interested in using the shared
+ // |InvalidationService|. The consumer's OnInvalidationServiceSet() method
+ // will be called back when a connected invalidation service becomes
+ // available. If an invalidation service is available already, the callback
+ // will occur synchronously. The |consumer| must be unregistered before |this|
+ // is destroyed.
+ void RegisterConsumer(Consumer* consumer);
+
+ // Indicates that |consumer| is no longer interested in using the
+ // shared |InvalidationService|.
+ void UnregisterConsumer(Consumer* consumer);
+
+ // Shuts down the provider. Once the provider is shut down, it no longer makes
+ // any invalidation service available to consumers, no longer observes any
+ // per-profile invalidation services and no longer maintains a device-global
+ // invalidation service.
+ void Shutdown();
+
+ invalidation::TiclInvalidationService*
+ GetDeviceInvalidationServiceForTest() const;
+
+ private:
+ // Helper that monitors the status of a single |InvalidationService|.
+ class InvalidationServiceObserver;
+
+ // Status updates received from |InvalidationServiceObserver|s.
+ void OnInvalidationServiceConnected(
+ invalidation::InvalidationService* invalidation_service);
+ void OnInvalidationServiceDisconnected(
+ invalidation::InvalidationService* invalidation_service);
+
+ // Checks whether a connected |InvalidationService| affiliated with the
+ // device's enrollment domain is available. If so, notifies the consumers.
+ // Otherwise, consumers will be notified once such an invalidation service
+ // becomes available.
+ // Further ensures that a device-global invalidation service is running iff
+ // there is no other connected service available for use and there is at least
+ // one registered consumer.
+ void FindConnectedInvalidationService();
+
+ // Choose |invalidation_service| as the shared invalidation service and notify
+ // consumers.
+ void SetInvalidationService(
+ invalidation::InvalidationService* invalidation_service);
+
+ // Destroy the device-global invalidation service, if any.
+ void DestroyDeviceInvalidationService();
+
+ content::NotificationRegistrar registrar_;
+
+ // Device-global invalidation service.
+ scoped_ptr<invalidation::TiclInvalidationService>
+ device_invalidation_service_;
+
+ // State observer for the device-global invalidation service.
+ scoped_ptr<InvalidationServiceObserver> device_invalidation_service_observer_;
+
+ // State observers for logged-in users' invalidation services.
+ ScopedVector<InvalidationServiceObserver>
+ profile_invalidation_service_observers_;
+
+ // The invalidation service currently used by consumers. nullptr if there are
+ // no registered consumers or no connected invalidation service is available
+ // for use.
+ invalidation::InvalidationService* invalidation_service_;
+
+ ObserverList<Consumer, true> consumers_;
+ int consumer_count_;
+
+ bool is_shut_down_;
+
+ DISALLOW_COPY_AND_ASSIGN(AffiliatedInvalidationServiceProvider);
+};
+
+} // namespace policy
+
+#endif // CHROME_BROWSER_CHROMEOS_POLICY_AFFILIATED_INVALIDATION_SERVICE_PROVIDER_H_