1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file.
4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#ifndef COMPONENTS_POLICY_CORE_COMMON_SCHEMA_MAP_H_
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define COMPONENTS_POLICY_CORE_COMMON_SCHEMA_MAP_H_
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <map>
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <string>
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/basictypes.h"
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/memory/ref_counted.h"
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/policy_namespace.h"
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/schema.h"
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/policy_export.h"
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace policy {
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class PolicyBundle;
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)typedef std::map<std::string, Schema> ComponentMap;
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)typedef std::map<PolicyDomain, ComponentMap> DomainMap;
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Contains a mapping of policy namespaces (domain + component ID) to its
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// corresponding Schema.
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class POLICY_EXPORT SchemaMap : public base::RefCountedThreadSafe<SchemaMap> {
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public:
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SchemaMap();
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Takes ownership of |map| (its contents will be swapped).
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  explicit SchemaMap(DomainMap& map);
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const DomainMap& GetDomains() const;
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const ComponentMap* GetComponents(PolicyDomain domain) const;
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const Schema* GetSchema(const PolicyNamespace& ns) const;
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Removes all the policies in |bundle| that don't match the known schemas.
39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Unknown components are also dropped.
40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void FilterBundle(PolicyBundle* bundle) const;
41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Returns true if this map contains at least one component of a domain other
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // than POLICY_DOMAIN_CHROME.
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool HasComponents() const;
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void GetChanges(const scoped_refptr<SchemaMap>& older,
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                  PolicyNamespaceList* removed,
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                  PolicyNamespaceList* added) const;
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private:
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  friend class base::RefCountedThreadSafe<SchemaMap>;
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void GetNamespacesNotInOther(const SchemaMap* other,
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                               PolicyNamespaceList* list) const;
55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ~SchemaMap();
57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DomainMap map_;
59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SchemaMap);
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace policy
64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif  // COMPONENTS_POLICY_CORE_COMMON_SCHEMA_MAP_H_
66