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