blob: cee6e9459f72e4490637359dbac1bbf99a546414 [file] [log] [blame]
// Copyright 2013 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_FORWARDING_POLICY_PROVIDER_H_
#define CHROME_BROWSER_POLICY_FORWARDING_POLICY_PROVIDER_H_
#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "chrome/browser/policy/configuration_policy_provider.h"
#include "components/policy/core/common/policy_namespace.h"
namespace policy {
// A policy provider that forwards calls to another provider.
// This provider also tracks the SchemaRegistry, and becomes ready after making
// sure the delegate provider has refreshed its policies with an updated view
// of the complete schema. It is expected that the delegate's SchemaRegistry
// is a CombinedSchemaRegistry tracking the forwarding provider's registry.
class ForwardingPolicyProvider : public ConfigurationPolicyProvider,
public ConfigurationPolicyProvider::Observer {
public:
// The |delegate| must outlive this provider.
explicit ForwardingPolicyProvider(ConfigurationPolicyProvider* delegate);
virtual ~ForwardingPolicyProvider();
// ConfigurationPolicyProvider:
//
// Note that Init() and Shutdown() are not forwarded to the |delegate_|, since
// this provider does not own it and its up to the |delegate_|'s owner to
// initialize it and shut it down.
//
// Note also that this provider may have a SchemaRegistry passed in Init()
// that doesn't match the |delegate_|'s; therefore OnSchemaRegistryUpdated()
// and OnSchemaRegistryReady() are not forwarded either. It is assumed that
// the |delegate_|'s SchemaRegistry contains a superset of this provider's
// SchemaRegistry though (i.e. it's a CombinedSchemaRegistry that contains
// this provider's SchemaRegistry).
//
// This provider manages its own initialization state for all policy domains
// except POLICY_DOMAIN_CHROME, whose status is always queried from the
// |delegate_|. RefreshPolicies() calls are also forwarded, since this
// provider doesn't have a "real" policy source of its own.
virtual void Init(SchemaRegistry* registry) OVERRIDE;
virtual bool IsInitializationComplete(PolicyDomain domain) const OVERRIDE;
virtual void RefreshPolicies() OVERRIDE;
virtual void OnSchemaRegistryReady() OVERRIDE;
virtual void OnSchemaRegistryUpdated(bool has_new_schemas) OVERRIDE;
// ConfigurationPolicyProvider::Observer:
virtual void OnUpdatePolicy(ConfigurationPolicyProvider* provider) OVERRIDE;
private:
enum InitializationState {
WAITING_FOR_REGISTRY_READY,
WAITING_FOR_REFRESH,
READY,
};
ConfigurationPolicyProvider* delegate_;
InitializationState state_;
DISALLOW_COPY_AND_ASSIGN(ForwardingPolicyProvider);
};
} // namespace policy
#endif // CHROME_BROWSER_POLICY_FORWARDING_POLICY_PROVIDER_H_