1f2477e01787aa58f445919b809d89e252beef54fTorne (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)
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#ifndef COMPONENTS_POLICY_CORE_COMMON_POLICY_BUNDLE_H_
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define COMPONENTS_POLICY_CORE_COMMON_POLICY_BUNDLE_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/policy_map.h"
131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "components/policy/core/common/policy_namespace.h"
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/policy_export.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace policy {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Maps policy namespaces to PolicyMaps.
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class POLICY_EXPORT PolicyBundle {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<PolicyNamespace, PolicyMap*> MapType;
2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  typedef MapType::iterator iterator;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef MapType::const_iterator const_iterator;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PolicyBundle();
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~PolicyBundle();
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns the PolicyMap for namespace |ns|.
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PolicyMap& Get(const PolicyNamespace& ns);
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const PolicyMap& Get(const PolicyNamespace& ns) const;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Swaps the internal representation of |this| with |other|.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Swap(PolicyBundle* other);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |this| becomes a copy of |other|. Any existing PolicyMaps are dropped.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CopyFrom(const PolicyBundle& other);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Merges the PolicyMaps of |this| with those of |other| for each namespace
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in common. Also adds copies of the (namespace, PolicyMap) pairs in |other|
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that don't have an entry in |this|.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Each policy in each PolicyMap is replaced only if the policy from |other|
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // has a higher priority.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See PolicyMap::MergeFrom for details on merging individual PolicyMaps.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MergeFrom(const PolicyBundle& other);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if |other| has the same keys and value as |this|.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Equals(const PolicyBundle& other) const;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns iterators to the beginning and end of the underlying container.
5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  iterator begin() { return policy_bundle_.begin(); }
5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  iterator end() { return policy_bundle_.end(); }
5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These can be used to iterate over and read the PolicyMaps, but not to
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // modify them.
5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const_iterator begin() const { return policy_bundle_.begin(); }
5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const_iterator end() const { return policy_bundle_.end(); }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Erases all the existing pairs.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Clear();
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MapType policy_bundle_;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // An empty PolicyMap that is returned by const Get() for namespaces that
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // do not exist in |policy_bundle_|.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const PolicyMap kEmpty_;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PolicyBundle);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace policy
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif  // COMPONENTS_POLICY_CORE_COMMON_POLICY_BUNDLE_H_
74