1a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein//
2a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein// Copyright (C) 2015 The Android Open Source Project
3a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein//
4a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein// Licensed under the Apache License, Version 2.0 (the "License");
5a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein// you may not use this file except in compliance with the License.
6a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein// You may obtain a copy of the License at
7a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein//
8a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein//      http://www.apache.org/licenses/LICENSE-2.0
9a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein//
10a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein// Unless required by applicable law or agreed to in writing, software
11a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein// distributed under the License is distributed on an "AS IS" BASIS,
12a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein// See the License for the specific language governing permissions and
14a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein// limitations under the License.
15a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein//
16a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
17a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein#ifndef SHILL_DHCP_PROPERTIES_H_
18a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein#define SHILL_DHCP_PROPERTIES_H_
19a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
20a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein#include <string>
21a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
22a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein#include <gtest/gtest_prod.h>  // for FRIEND_TEST
23a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
24a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein#include "shill/accessor_interface.h"
25a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein#include "shill/key_value_store.h"
26a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
27a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silbersteinnamespace shill {
28a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
29a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silbersteinclass Error;
30a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silbersteinclass PropertyStore;
31a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silbersteinclass StoreInterface;
32a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
33a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silbersteinclass DhcpProperties {
34a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein public:
3515d5431798155cc83a3fcb8abe0d1a2d5128f7b6Rebecca Silberstein  static const char kHostnameProperty[];
3615d5431798155cc83a3fcb8abe0d1a2d5128f7b6Rebecca Silberstein  static const char kVendorClassProperty[];
3715d5431798155cc83a3fcb8abe0d1a2d5128f7b6Rebecca Silberstein
38a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  DhcpProperties();
39a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
40a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  virtual ~DhcpProperties();
41a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
42a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  // Adds property accessors to the DhcpProperty parameters in |this|
43a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  // to |store|.
44a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  void InitPropertyStore(PropertyStore* store);
45a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
46a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  // Loads DHCP properties from |storage| in group |id|.
47a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  virtual void Load(StoreInterface* store, const std::string& id);
48a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
49a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  // Saves DHCP properties to |storage| in group |id|.
50a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  virtual void Save(StoreInterface* store, const std::string& id) const;
51a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
52a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  // Combines two DHCP property objects and returns a
53a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  // std::unique_ptr<DhcpProperties>.  The new DhcpProperties instance is the
54a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  // union of the key-value pairs in |base| and |to_merge|.  For keys which
55a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  // exist in both |base| and |to_merge|, the value is taken from |to_merge|.
56a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  // EX:  |base| stores {"VendorClass": "v1", "Hostname": "host1"}
57a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  //      |to_merge| stores {"Hostname": "differentname"}
58a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  //      returned DhcpProperties will store:
59a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  //          {"VendorClass": "v1", "Hostname": "differentname"}
60a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  // EX:  |base| stores {"Hostname": "host1"}
61a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  //      |to_merge| stores {"Hostname": "differentname", "VendorClass": "vc"}
62a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  //      returned DhcpProperties will store:
63a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  //          {"Hostname": "differentname", "VendorClass": "vc"}
64a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  static std::unique_ptr<DhcpProperties> Combine(
65a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein      const DhcpProperties& base,
66a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein      const DhcpProperties& to_merge);
67a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
68a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  // Retrieves the value for a property with |name| in |value| if it is set.
69a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  // Returns true if the property was found.
7015d5431798155cc83a3fcb8abe0d1a2d5128f7b6Rebecca Silberstein  bool GetValueForProperty(const std::string& name, std::string* value) const;
7115d5431798155cc83a3fcb8abe0d1a2d5128f7b6Rebecca Silberstein
7215d5431798155cc83a3fcb8abe0d1a2d5128f7b6Rebecca Silberstein  const KeyValueStore& properties() const { return properties_; };
73a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
74a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein private:
75a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  FRIEND_TEST(DhcpPropertiesTest, ClearMappedStringPropertyNoExistingValue);
76a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  FRIEND_TEST(DhcpPropertiesTest, ClearMappedStringPropertyWithSetValue);
77a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  FRIEND_TEST(DhcpPropertiesTest, CombineIntoEmpty);
78a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  FRIEND_TEST(DhcpPropertiesTest, CombineEmptyIntoExisting);
79a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  FRIEND_TEST(DhcpPropertiesTest, CombineConflicting);
80a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  FRIEND_TEST(DhcpPropertiesTest, Ctor);
81a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  FRIEND_TEST(DhcpPropertiesTest, GetMappedStringPropertyNoExistingValue);
82a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  FRIEND_TEST(DhcpPropertiesTest, GetMappedStringPropertyWithSetValue);
83a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  FRIEND_TEST(DhcpPropertiesTest, GetValueForProperty);
84a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  FRIEND_TEST(DhcpPropertiesTest, Load);
85a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  FRIEND_TEST(DhcpPropertiesTest, LoadEmpty);
86a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  FRIEND_TEST(DhcpPropertiesTest, LoadWithValuesSetAndClearRequired);
87a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  FRIEND_TEST(DhcpPropertiesTest, SaveWithValuesSet);
88a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  FRIEND_TEST(DhcpPropertiesTest, SavePropertyNotSetShouldBeDeleted);
89a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  FRIEND_TEST(DhcpPropertiesTest, SetMappedStringPropertyNoExistingValue);
90a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  FRIEND_TEST(DhcpPropertiesTest, SetMappedStringPropertyOverrideExisting);
91a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  FRIEND_TEST(DhcpPropertiesTest, SetMappedStringPropertySameAsExistingValue);
92a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
93a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  void ClearMappedStringProperty(const size_t& index, Error* error);
94a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  std::string GetMappedStringProperty(const size_t& index, Error* error);
95a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  bool SetMappedStringProperty(
96a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein      const size_t& index, const std::string& value, Error* error);
97a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
98a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  // KeyValueStore tracking values for DhcpProperties settings.
99a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  KeyValueStore properties_;
100a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
101a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein  DISALLOW_COPY_AND_ASSIGN(DhcpProperties);
102a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein};
103a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
104a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein}  // namespace shill
105a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein
106a77c5e24c871e2b25b2ca4def689388ba6c6892bRebecca Silberstein#endif  // SHILL_DHCP_PROPERTIES_H_
107