1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#ifndef COMPONENTS_POLICY_CORE_COMMON_CONFIGURATION_POLICY_PROVIDER_H_ 6a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#define COMPONENTS_POLICY_CORE_COMMON_CONFIGURATION_POLICY_PROVIDER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/memory/ref_counted.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/observer_list.h" 12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/policy_bundle.h" 131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "components/policy/core/common/policy_namespace.h" 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/schema_registry.h" 15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/policy_export.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace policy { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A mostly-abstract super class for platform-specific policy providers. 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Platform-specific policy providers (Windows Group Policy, gconf, 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// etc.) should implement a subclass of this class. 22a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class POLICY_EXPORT ConfigurationPolicyProvider 23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) : public SchemaRegistry::Observer { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) class POLICY_EXPORT Observer { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~Observer(); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnUpdatePolicy(ConfigurationPolicyProvider* provider) = 0; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConfigurationPolicyProvider(); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Policy providers can be deleted quite late during shutdown of the browser, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and it's not guaranteed that the message loops will still be running when 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this is invoked. Override Shutdown() instead for cleanup code that needs 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to post to the FILE thread, for example. 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ConfigurationPolicyProvider(); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invoked as soon as the main message loops are spinning. Policy providers 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // are created early during startup to provide the initial policies; the 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Init() call allows them to perform initialization tasks that require 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // running message loops. 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The policy provider will load policy for the components registered in 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // the |schema_registry| whose domain is supported by this provider. 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void Init(SchemaRegistry* registry); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Must be invoked before deleting the provider. Implementations can override 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this method to do appropriate cleanup while threads are still running, and 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // must also invoke ConfigurationPolicyProvider::Shutdown(). 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The provider should keep providing the current policies after Shutdown() 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is invoked, it only has to stop updating. 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Shutdown(); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the current PolicyBundle. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PolicyBundle& policies() const { return policy_bundle_; } 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check whether this provider has completed initialization for the given 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // policy |domain|. This is used to detect whether initialization is done in 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // case implementations need to do asynchronous operations for initialization. 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool IsInitializationComplete(PolicyDomain domain) const; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Asks the provider to refresh its policies. All the updates caused by this 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // call will be visible on the next call of OnUpdatePolicy on the observers, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // which are guaranteed to happen even if the refresh fails. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It is possible that Shutdown() is called first though, and 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OnUpdatePolicy won't be called if that happens. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void RefreshPolicies() = 0; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Observers must detach themselves before the provider is deleted. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void AddObserver(Observer* observer); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void RemoveObserver(Observer* observer); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // SchemaRegistry::Observer: 74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void OnSchemaRegistryUpdated(bool has_new_schemas) OVERRIDE; 75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void OnSchemaRegistryReady() OVERRIDE; 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Subclasses must invoke this to update the policies currently served by 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this provider. UpdatePolicy() takes ownership of |policies|. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The observers are notified after the policies are updated. 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdatePolicy(scoped_ptr<PolicyBundle> bundle); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SchemaRegistry* schema_registry() const; 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const scoped_refptr<SchemaMap>& schema_map() const; 86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The policies currently configured at this provider. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyBundle policy_bundle_; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether Shutdown() has been invoked. 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_shutdown_; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SchemaRegistry* schema_registry_; 95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObserverList<Observer, true> observer_list_; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ConfigurationPolicyProvider); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace policy 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif // COMPONENTS_POLICY_CORE_COMMON_CONFIGURATION_POLICY_PROVIDER_H_ 104