|  | // 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_POLICY_CLOUD_REMOTE_COMMANDS_INVALIDATOR_H_ | 
|  | #define CHROME_BROWSER_POLICY_CLOUD_REMOTE_COMMANDS_INVALIDATOR_H_ | 
|  |  | 
|  | #include "base/macros.h" | 
|  | #include "base/threading/thread_checker.h" | 
|  | #include "components/invalidation/public/invalidation_handler.h" | 
|  | #include "components/invalidation/public/invalidation_util.h" | 
|  | #include "components/policy/proto/device_management_backend.pb.h" | 
|  |  | 
|  | namespace invalidation { | 
|  | class InvalidationService; | 
|  | }  // namespace invalidation | 
|  |  | 
|  | namespace invalidation { | 
|  | class Invalidation; | 
|  | }  // namespace invalidation | 
|  |  | 
|  | namespace policy { | 
|  |  | 
|  | // This class provides basic intefaces for an invalidator for remote commands | 
|  | // services. It's not interacting with CloudPolicyClient/CloudPolicyCore | 
|  | // directly, instead, it handles the interacting with invalidation service | 
|  | // only and leaves interfaces to integrate with subclasses. | 
|  | class RemoteCommandsInvalidator : public invalidation::InvalidationHandler { | 
|  | public: | 
|  | explicit RemoteCommandsInvalidator(std::string owner_name); | 
|  | ~RemoteCommandsInvalidator() override; | 
|  |  | 
|  | // Initialize this invalidator to pair with |invalidation_service|. Must be | 
|  | // called before Start(). | 
|  | void Initialize(invalidation::InvalidationService* invalidation_service); | 
|  |  | 
|  | // Shutdown this invalidator. Will stop the invalidator first, and after | 
|  | // shutting down, the invalidator can't be started anymore unless it's | 
|  | // initialized again. | 
|  | void Shutdown(); | 
|  |  | 
|  | // Starts to process invalidations. | 
|  | void Start(); | 
|  |  | 
|  | // Stops to process invalidation. May only be called after Start() has been | 
|  | // called. | 
|  | void Stop(); | 
|  |  | 
|  | // Helpful accessors. | 
|  | invalidation::InvalidationService* invalidation_service() { | 
|  | return invalidation_service_; | 
|  | } | 
|  |  | 
|  | // Whether the invalidator currently has the ability to receive invalidations. | 
|  | bool invalidations_enabled() { return invalidations_enabled_; } | 
|  |  | 
|  | // invalidation::InvalidationHandler: | 
|  | void OnInvalidatorStateChange(invalidation::InvalidatorState state) override; | 
|  | void OnIncomingInvalidation( | 
|  | const invalidation::TopicInvalidationMap& invalidation_map) override; | 
|  | std::string GetOwnerName() const override; | 
|  | bool IsPublicTopic(const invalidation::Topic& topic) const override; | 
|  |  | 
|  | protected: | 
|  | virtual void OnInitialize() = 0; | 
|  | virtual void OnShutdown() = 0; | 
|  | virtual void OnStart() = 0; | 
|  | virtual void OnStop() = 0; | 
|  |  | 
|  | // Subclasses must override this method to implement the actual remote | 
|  | // commands fetch. | 
|  | virtual void DoRemoteCommandsFetch( | 
|  | const invalidation::Invalidation& invalidation) = 0; | 
|  |  | 
|  | // Subclasses must call this function to set the topic for remote command | 
|  | // invalidations. | 
|  | void ReloadPolicyData(const enterprise_management::PolicyData* policy); | 
|  |  | 
|  | private: | 
|  | // Registers this handler with |invalidation_service_| if needed and | 
|  | // subscribes to the given |topic| with the invalidation service. | 
|  | void Register(const invalidation::Topic& topic); | 
|  |  | 
|  | // Unregisters this handler and unsubscribes from the current topic with | 
|  | // the invalidation service. | 
|  | // TODO(crbug.com/1056114): Topic subscription remains active after browser | 
|  | // restart, so explicit unsubscription here causes redundant (un)subscription | 
|  | // traffic (and potentially leaking subscriptions). | 
|  | void Unregister(); | 
|  |  | 
|  | // Updates invalidations_enabled_. | 
|  | void UpdateInvalidationsEnabled(); | 
|  |  | 
|  | // The state of the object. | 
|  | enum State { | 
|  | SHUT_DOWN, | 
|  | STOPPED, | 
|  | STARTED, | 
|  | }; | 
|  | State state_ = SHUT_DOWN; | 
|  |  | 
|  | // The unique name to be returned with by GetOwnerName(). | 
|  | const std::string owner_name_; | 
|  |  | 
|  | // The invalidation service. | 
|  | invalidation::InvalidationService* invalidation_service_ = nullptr; | 
|  |  | 
|  | // Whether the invalidator currently has the ability to receive invalidations. | 
|  | // This is true if the invalidation service is enabled and the invalidator | 
|  | // has registered for a remote commands object. | 
|  | bool invalidations_enabled_ = false; | 
|  |  | 
|  | // Whether the invalidation service is currently enabled. | 
|  | bool invalidation_service_enabled_ = false; | 
|  |  | 
|  | // Whether this object has registered for remote commands invalidations. | 
|  | bool is_registered_ = false; | 
|  |  | 
|  | // The Topic representing the remote commands in the invalidation service. | 
|  | invalidation::Topic topic_; | 
|  |  | 
|  | // A thread checker to make sure that callbacks are invoked on the correct | 
|  | // thread. | 
|  | base::ThreadChecker thread_checker_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(RemoteCommandsInvalidator); | 
|  | }; | 
|  |  | 
|  | }  // namespace policy | 
|  |  | 
|  | #endif  // CHROME_BROWSER_POLICY_CLOUD_REMOTE_COMMANDS_INVALIDATOR_H_ |