Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(906)

Unified Diff: chrome/browser/chromeos/policy/affiliated_invalidation_service_provider.h

Issue 828953004: Add AffiliatedInvalidationServiceProvider (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Simplified tests. Made code reentrant. Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/policy/affiliated_invalidation_service_provider.h
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 0000000000000000000000000000000000000000..f1b69a6440ddf8b1b4e7091f0bdc41a15e8ea0f9
--- /dev/null
+++ b/chrome/browser/chromeos/policy/affiliated_invalidation_service_provider.h
@@ -0,0 +1,132 @@
+// 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();
+ virtual ~AffiliatedInvalidationServiceProvider();
+
+ // content::NotificationObserver:
+ virtual 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);
+
+ 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_;
+
+ DISALLOW_COPY_AND_ASSIGN(AffiliatedInvalidationServiceProvider);
+};
+
+} // namespace policy
+
+#endif // CHROME_BROWSER_CHROMEOS_POLICY_AFFILIATED_INVALIDATION_SERVICE_PROVIDER_H_

Powered by Google App Engine
This is Rietveld 408576698