a2623ea0ccfa2ae3406625a87a9cace975e7e9fa
[archive/platform/core/system/libConfig.git] / src / config / manager.hpp
1 /*
2  *  Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  *  Contact: Piotr Bartosiewicz (p.bartosiewi@partner.samsung.com)
5  *
6  *  Licensed under the Apache License, Version 2.0 (the "License");
7  *  you may not use this file except in compliance with the License.
8  *  You may obtain a copy of the License at
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
12  *  Unless required by applicable law or agreed to in writing, software
13  *  distributed under the License is distributed on an "AS IS" BASIS,
14  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  *  See the License for the specific language governing permissions and
16  *  limitations under the License
17  */
18
19 /**
20  * @file
21  * @author  Piotr Bartosiewicz (p.bartosiewi@partner.samsung.com)
22  * @brief   Configuration management functions
23  */
24
25 #ifndef CONFIG_MANAGER_HPP
26 #define CONFIG_MANAGER_HPP
27
28 #include "config/to-json-visitor.hpp"
29 #include "config/to-kvstore-visitor.hpp"
30 #include "config/to-fdstore-visitor.hpp"
31 #include "config/from-json-visitor.hpp"
32 #include "config/from-kvstore-visitor.hpp"
33 #include "config/from-fdstore-visitor.hpp"
34 #include "config/is-visitable.hpp"
35 #include "config/fs-utils.hpp"
36
37
38 namespace config {
39
40 /**
41  * Fills the configuration with data stored in the json string
42  *
43  * @param jsonString configuration in a json format
44  * @param config     visitable structure to fill
45  */
46 template <class Config>
47 void loadFromString(const std::string& jsonString, Config& config)
48 {
49     static_assert(isVisitable<Config>::value, "Use CONFIG_REGISTER macro");
50
51     FromJsonVisitor visitor(jsonString);
52     config.accept(visitor);
53 }
54
55
56 /**
57  * Creates a string representation of the configuration in json format
58  *
59  * @param config   visitable structure to convert
60  */
61 template <class Config>
62 std::string saveToString(const Config& config)
63 {
64     static_assert(isVisitable<Config>::value, "Use CONFIG_REGISTER macro");
65
66     ToJsonVisitor visitor;
67     config.accept(visitor);
68     return visitor.toString();
69 }
70
71 /**
72  * Loads the config from a json file
73  *
74  * @param filename path to the file
75  * @param config   visitable structure to load
76  */
77 template <class Config>
78 void loadFromFile(const std::string& filename, Config& config)
79 {
80     std::string content;
81     if (!fsutils::readFileContent(filename, content)) {
82         throw ConfigException("Could not load " + filename);
83     }
84     try {
85         loadFromString(content, config);
86     } catch (ConfigException& e) {
87         throw ConfigException("Error in " + filename + ": " + e.what());
88     }
89 }
90
91 /**
92  * Saves the config in a json file
93  *
94  * @param filename path to the file
95  * @param config   visitable structure to save
96  */
97 template <class Config>
98 void saveToFile(const std::string& filename, const Config& config)
99 {
100     const std::string content = saveToString(config);
101     if (!fsutils::saveFileContent(filename, content)) {
102         throw ConfigException("Could not save " + filename);
103     }
104 }
105
106 /**
107  * Loads a visitable configuration from KVStore.
108  *
109  * @param filename   path to the KVStore db
110  * @param config     visitable structure to load
111  * @param configName name of the configuration inside the KVStore db
112  */
113 template <class Config>
114 void loadFromKVStore(const std::string& filename, Config& config, const std::string& configName = "")
115 {
116     static_assert(isVisitable<Config>::value, "Use CONFIG_REGISTER macro");
117
118     FromKVStoreVisitor visitor(filename, configName);
119     config.accept(visitor);
120 }
121
122 /**
123  * Saves the config to a KVStore.
124  *
125  * @param filename   path to the KVStore db
126  * @param config     visitable structure to save
127  * @param configName name of the config inside the KVStore db
128  */
129 template <class Config>
130 void saveToKVStore(const std::string& filename, const Config& config, const std::string& configName = "")
131 {
132     static_assert(isVisitable<Config>::value, "Use CONFIG_REGISTER macro");
133
134     ToKVStoreVisitor visitor(filename, configName);
135     config.accept(visitor);
136 }
137
138 /**
139  * Load binary data from a file/socket/pipe represented by the fd
140  *
141  * @param fd file descriptor
142  * @param config visitable structure to load
143  */
144 template <class Config>
145 void loadFromFD(const int fd, Config& config)
146 {
147     static_assert(isVisitable<Config>::value, "Use CONFIG_REGISTER macro");
148
149     FromFDStoreVisitor visitor(fd);
150     config.accept(visitor);
151 }
152
153 /**
154  * Save binary data to a file/socket/pipe represented by the fd
155  *
156  * @param fd file descriptor
157  * @param config visitable structure to save
158  */
159 template <class Config>
160 void saveToFD(const int fd, const Config& config)
161 {
162     static_assert(isVisitable<Config>::value, "Use CONFIG_REGISTER macro");
163
164     ToFDStoreVisitor visitor(fd);
165     config.accept(visitor);
166 }
167
168 } // namespace config
169
170 #endif // CONFIG_MANAGER_HPP