19 #ifndef SBUILD_KEYFILE_H
20 #define SBUILD_KEYFILE_H
23 #include <sbuild/log.h>
24 #include <sbuild/parse-error.h>
25 #include <sbuild/parse-value.h>
26 #include <sbuild/types.h>
27 #include <sbuild/util.h>
35 #include <boost/format.hpp>
36 #include <boost/any.hpp>
114 typedef std::tuple<key_type,internal_value_type,comment_type,size_type>
121 typedef std::tuple<group_name_type,item_map_type,comment_type,size_type>
group_type;
165 const key_list& keys)
const;
185 const key_type& key)
const;
196 const comment_type& comment);
208 const comment_type& comment,
229 const key_type& key)
const;
249 const key_type& key)
const;
261 template <
typename T>
268 <<
", key=" << key << std::endl;
272 const internal_value_type& strval(std::get<1>(*found_item));
275 parse_value(boost::any_cast<std::string const&>(strval), value);
280 size_type line =
get_line(group, key);
310 template <
typename T>
317 bool status =
get_value(group, key, value);
334 value_type& value)
const;
351 value_type& value)
const;
366 const std::string& locale,
367 value_type& value)
const;
385 const std::string& locale,
387 value_type& value)
const;
401 template <
typename C>
407 value_type item_value;
412 for (
const auto& item : items)
414 typename C::value_type tmp;
422 size_type line =
get_line(group, key);
436 container.push_back(tmp);
457 template <
typename C>
481 template <
typename C>
487 value_type item_value;
492 for (
const auto& item : items)
494 typename C::value_type tmp;
502 size_type line =
get_line(group, key);
516 container.insert(tmp);
537 template <
typename C>
557 template <
typename T>
575 template <
typename T>
580 const comment_type& comment)
582 set_value(group, key, value, comment, 0);
598 const internal_value_type& value,
599 const comment_type& comment,
604 assert (found_group != 0);
606 item_map_type& items = std::get<1>(*found_group);
608 typename item_map_type::iterator pos = items.find(key);
609 if (pos != items.end())
612 (
typename item_map_type::value_type(key,
628 template <
typename T>
633 const comment_type& comment,
636 std::ostringstream os;
637 os.imbue(std::locale::classic());
638 os << std::boolalpha << value;
642 assert (found_group != 0);
644 item_map_type& items = std::get<1>(*found_group);
646 typename item_map_type::iterator pos = items.find(key);
647 if (pos != items.end())
650 (
typename item_map_type::value_type(key,
664 template <
typename I>
684 template <
typename I>
690 const comment_type& comment)
706 template <
typename I>
712 const comment_type& comment,
717 for (I pos = begin; pos != end;)
719 std::ostringstream os;
720 os.imbue(std::locale::classic());
721 os << std::boolalpha << *pos;
730 set_value (group, key, strval, comment, line);
742 template <
typename I>
749 std::vector<typename std::iterator_traits<I>::value_type> l(begin, end);
750 std::sort(l.begin(), l.end());
764 template <
typename I>
770 const comment_type& comment)
772 std::vector<typename std::iterator_traits<I>::value_type> l(begin, end);
773 std::sort(l.begin(), l.end());
788 template <
typename I>
794 const comment_type& comment,
797 std::vector<typename std::iterator_traits<I>::value_type> l(begin, end);
798 std::sort(l.begin(), l.end());
818 const key_type& key);
868 const key_type& key)
const;
879 const key_type& key);
913 template<
class C,
typename T>
916 T (C::* method)()
const,
918 const group_name_type&
group,
924 keyfile.
set_value(group, key, (
object.*method)());
926 catch (
const std::runtime_error& e)
944 template<
class C,
typename T>
947 T
const& (C::* method)()
const,
949 const group_name_type&
group,
955 keyfile.
set_value(group, key, (
object.*method)());
957 catch (
const std::runtime_error& e)
976 template<
class C,
typename T>
979 T (C::* method)()
const,
981 const group_name_type&
group,
988 (
object.*method)().begin(),
989 (
object.*method)().end());
991 catch (
const std::runtime_error& e)
1011 template<
class C,
typename T>
1014 T
const& (C::* method)()
const,
1016 const group_name_type&
group,
1017 const key_type& key)
1023 (
object.*method)().begin(),
1024 (
object.*method)().end());
1026 catch (
const std::runtime_error& e)
1045 template<
class C,
typename T>
1048 T (C::* method)()
const,
1050 const group_name_type&
group,
1051 const key_type& key)
1057 (
object.*method)().begin(),
1058 (
object.*method)().end());
1060 catch (
const std::runtime_error& e)
1080 template<
class C,
typename T>
1083 T
const& (C::* method)()
const,
1085 const group_name_type&
group,
1086 const key_type& key)
1092 (
object.*method)().begin(),
1093 (
object.*method)().end());
1095 catch (
const std::runtime_error& e)
1115 template<
class C,
typename T>
1118 void (C::* method)(T param),
1120 const group_name_type&
group,
1121 const key_type& key,
1127 if (keyfile.
get_value(group, key, priority, value)
1129 (
object.*method)(value);
1131 catch (
const std::runtime_error& e)
1133 size_type line = keyfile.
get_line(group, key);
1155 template<
class C,
typename T>
1158 void (C::* method)(T
const& param),
1160 const group_name_type&
group,
1161 const key_type& key,
1167 if (keyfile.
get_value(group, key, priority, value)
1169 (
object.*method)(value);
1171 catch (
const std::runtime_error& e)
1173 size_type line = keyfile.
get_line(group, key);
1195 template<
class C,
typename T>
1198 void (C::* method)(T param),
1200 const group_name_type&
group,
1201 const key_type& key,
1209 (
object.*method)(value);
1211 catch (
const std::runtime_error& e)
1213 size_type line = keyfile.
get_line(group, key);
1238 template<
class C,
typename T>
1241 void (C::* method)(T
const& param),
1243 const group_name_type&
group,
1244 const key_type& key,
1252 (
object.*method)(value);
1254 catch (
const std::runtime_error& e)
1256 size_type line = keyfile.
get_line(group, key);
1280 template<
class C,
typename T>
1283 void (C::* method)(T param),
1285 const group_name_type&
group,
1286 const key_type& key,
1294 (
object.*method)(value);
1296 catch (
const std::runtime_error& e)
1298 size_type line = keyfile.
get_line(group, key);
1323 template<
class C,
typename T>
1326 void (C::* method)(T
const& param),
1328 const group_name_type&
group,
1329 const key_type& key,
1337 (
object.*method)(value);
1339 catch (
const std::runtime_error& e)
1341 size_type line = keyfile.
get_line(group, key);
void remove_key(const group_name_type &group, const key_type &key)
Remove a key.
Definition: keyfile.cc:349
The group is invalid.
Definition: keyfile.h:69
error_code
Error codes.
Definition: keyfile.h:60
bool get_value(const group_name_type &group, const key_type &key, priority priority, T &value) const
Get a key value.
Definition: keyfile.h:312
static void set_object_list_value(C const &object, T(C::*method)() const, keyfile &keyfile, const group_name_type &group, const key_type &key)
Set a key list value from an object method return value.
Definition: keyfile.h:978
std::tuple< key_type, internal_value_type, comment_type, size_type > item_type
Key-value-comment-line tuple.
Definition: keyfile.h:115
Pass through exception with group.
Definition: keyfile.h:78
static void set_object_list_value(C const &object, T const &(C::*method)() const, keyfile &keyfile, const group_name_type &group, const key_type &key)
Set a key list value from an object method return value.
Definition: keyfile.h:1013
The parameter is not allowed in this context.
Definition: keyfile.h:54
The key is deprecated (no line specified).
Definition: keyfile.h:64
Debian source builder components.
Definition: ctty.cc:31
static void set_object_set_value(C const &object, T const &(C::*method)() const, keyfile &keyfile, const group_name_type &group, const key_type &key)
Set a key set value from an object method return value.
Definition: keyfile.h:1082
The parameter is required.
Definition: keyfile.h:53
keyfile & operator+=(const keyfile &rhs)
Add a keyfile to the keyfile.
Definition: keyfile.cc:363
group_list get_groups() const
Get a list of groups.
Definition: keyfile.cc:144
bool get_set_value(const group_name_type &group, const key_type &key, priority priority, C &container) const
Get a key value as a set.
Definition: keyfile.h:539
std::vector< group_name_type > group_list
Vector of groups.
Definition: keyfile.h:104
static void get_object_list_value(C &object, void(C::*method)(T const ¶m), const keyfile &keyfile, const group_name_type &group, const key_type &key, keyfile::priority priority)
Get a key list value and set it by reference in an object using an object method. ...
Definition: keyfile.h:1240
keyfile()
The constructor.
Definition: keyfile.cc:133
void check_priority(const group_name_type &group, const key_type &key, priority priority, bool valid) const
Check if a key is missing or present when not permitted.
Definition: keyfile.cc:449
Pass through exception with line and group.
Definition: keyfile.h:80
The key is invalid.
Definition: keyfile.h:70
Notification messages.
Definition: log.h:31
void set_list_value(const group_name_type &group, const key_type &key, I begin, I end)
Set a key value from a list.
Definition: keyfile.h:666
static void get_object_list_value(C &object, void(C::*method)(T param), const keyfile &keyfile, const group_name_type &group, const key_type &key, keyfile::priority priority)
Get a key list value and set it in an object using an object method.
Definition: keyfile.h:1197
friend keyfile operator+(const keyfile &lhs, const keyfile &rhs)
Add a keyfile to the keyfile.
Definition: keyfile.cc:388
No group was specified.
Definition: keyfile.h:74
void set_set_value(const group_name_type &group, const key_type &key, I begin, I end, const comment_type &comment, size_type line)
Set a key value from a set.
Definition: keyfile.h:790
std::string key_type
Key name.
Definition: keyfile.h:92
std::ostream & log_debug(debug_level level)
Log a debug message.
Definition: log.cc:110
boost::any internal_value_type
Internal value.
Definition: keyfile.h:111
static void set_object_value(C const &object, T const &(C::*method)() const, keyfile &keyfile, const group_name_type &group, const key_type &key)
Set a key value from an object method return value reference.
Definition: keyfile.h:946
void set_group(const group_name_type &group, const comment_type &comment)
Set a group.
Definition: keyfile.cc:208
void remove_group(const group_name_type &group)
Remove a group.
Definition: keyfile.cc:341
void set_value(const group_name_type &group, const key_type &key, T const &value, const comment_type &comment, size_type line)
Set a key value.
Definition: keyfile.h:630
string_list split_string(const std::string &value, const std::string &separator)
Split a string into a string_list.
Definition: util.cc:256
group_map_type groups
The top-level groups.
Definition: keyfile.h:896
std::vector< key_type > key_list
Vector of keys.
Definition: keyfile.h:127
void set_set_value(const group_name_type &group, const key_type &key, I begin, I end, const comment_type &comment)
Set a key value from a set.
Definition: keyfile.h:766
The key is not allowed.
Definition: keyfile.h:65
size_type get_line(const group_name_type &group) const
Get a group line number.
Definition: keyfile.cc:250
void log_exception_warning(const std::exception &e)
Log an exception as a warning.
Definition: log.cc:143
void set_value(const group_name_type &group, const key_type &key, T const &value, const comment_type &comment)
Set a key value.
Definition: keyfile.h:577
The parameter is optional.
Definition: keyfile.h:52
static void get_object_value(C &object, void(C::*method)(T param), const keyfile &keyfile, const group_name_type &group, const key_type &key, keyfile::priority priority)
Get a key value and set it in an object using an object method.
Definition: keyfile.h:1117
void check_keys(const group_name_type &group, const key_list &keys) const
Check for unused keys in a group.
Definition: keyfile.cc:171
void set_value(const group_name_type &group, const key_type &key, const internal_value_type &value, const comment_type &comment, size_type line)
Set a key value.
Definition: keyfile.h:596
The key is a duplicate.
Definition: keyfile.h:68
The file to parse couldn't be opened.
Definition: keyfile.h:62
bool get_locale_string(const group_name_type &group, const key_type &key, value_type &value) const
Get a localised key string value.
Definition: keyfile.cc:271
virtual ~keyfile()
The destructor.
Definition: keyfile.cc:139
static void set_object_value(C const &object, T(C::*method)() const, keyfile &keyfile, const group_name_type &group, const key_type &key)
Set a key value from an object method return value.
Definition: keyfile.h:915
std::string comment_type
Comment.
Definition: keyfile.h:98
bool has_group(const group_name_type &group) const
Check if a group exists.
Definition: keyfile.cc:195
static void get_object_set_value(C &object, void(C::*method)(T const ¶m), const keyfile &keyfile, const group_name_type &group, const key_type &key, keyfile::priority priority)
Get a key set value and set it by reference in an object using an object method.
Definition: keyfile.h:1325
The key is obsolete.
Definition: keyfile.h:76
The key is not allowed (no line specified).
Definition: keyfile.h:66
Parse error.
Definition: parse-error.h:34
static void get_object_value(C &object, void(C::*method)(T const ¶m), const keyfile &keyfile, const group_name_type &group, const key_type &key, keyfile::priority priority)
Get a key value and set it by reference in an object using an object method.
Definition: keyfile.h:1157
std::map< group_name_type, group_type > group_map_type
Map between group name and group-items-comment tuple.
Definition: keyfile.h:124
parse_error< error_code > error
Exception type.
Definition: keyfile.h:86
bool has_key(const group_name_type &group, const key_type &key) const
Check if a key exists.
Definition: keyfile.cc:201
std::string value_type
Value.
Definition: keyfile.h:95
The key is obsolete (no line specified).
Definition: keyfile.h:77
System group database entry.
Definition: util.h:824
The group is a duplicate.
Definition: keyfile.h:67
std::map< key_type, item_type > item_map_type
Map between key name and key-internal_value-comment tuple.
Definition: keyfile.h:118
std::vector< value_type > value_list
Vector of values.
Definition: keyfile.h:107
std::string group_name_type
Group name.
Definition: keyfile.h:89
The parameter is obsolete, and not functional.
Definition: keyfile.h:56
bool get_value(const group_name_type &group, const key_type &key, T &value) const
Get a key value.
Definition: keyfile.h:263
Pass through exception with line, group and key.
Definition: keyfile.h:81
The key is deprecated.
Definition: keyfile.h:63
void set_value(const group_name_type &group, const key_type &key, T const &value)
Set a key value.
Definition: keyfile.h:559
Informational messages.
Definition: log.h:32
void set_list_value(const group_name_type &group, const key_type &key, I begin, I end, const comment_type &comment, size_type line)
Set a key value from a list.
Definition: keyfile.h:708
The key is missing (no line specified).
Definition: keyfile.h:73
Configuration file parser.
Definition: keyfile.h:46
static void get_object_set_value(C &object, void(C::*method)(T param), const keyfile &keyfile, const group_name_type &group, const key_type &key, keyfile::priority priority)
Get a key set value and set it in an object using an object method.
Definition: keyfile.h:1282
bool get_list_value(const group_name_type &group, const key_type &key, C &container) const
Get a key value as a list.
Definition: keyfile.h:403
std::tuple< group_name_type, item_map_type, comment_type, size_type > group_type
Group-items-comment-line tuple.
Definition: keyfile.h:121
key_list get_keys(const group_name_type &group) const
Get a list of keys in a group.
Definition: keyfile.cc:155
The key is missing.
Definition: keyfile.h:72
void set_set_value(const group_name_type &group, const key_type &key, I begin, I end)
Set a key value from a set.
Definition: keyfile.h:744
value_type separator
The separator used as a list item delimiter.
Definition: keyfile.h:898
bool get_set_value(const group_name_type &group, const key_type &key, C &container) const
Get a key value as a set.
Definition: keyfile.h:483
bool get_list_value(const group_name_type &group, const key_type &key, priority priority, C &container) const
Get a key value as a list.
Definition: keyfile.h:459
priority
Configuration parameter priority.
Definition: keyfile.h:50
void set_list_value(const group_name_type &group, const key_type &key, I begin, I end, const comment_type &comment)
Set a key value from a list.
Definition: keyfile.h:686
Pass through exception with group and key.
Definition: keyfile.h:79
The parameter is deprecated, but functional.
Definition: keyfile.h:55
void parse_value(const std::string &value, bool &parsed_value)
Parse a boolean value.
Definition: parse-value.cc:35
comment_type get_comment(const group_name_type &group) const
Get a group comment.
Definition: keyfile.cc:229
static void set_object_set_value(C const &object, T(C::*method)() const, keyfile &keyfile, const group_name_type &group, const key_type &key)
Set a key set value from an object method return value.
Definition: keyfile.h:1047
The line is invalid.
Definition: keyfile.h:71
Internationalisation functions.
const group_type * find_group(const group_name_type &group) const
Find a group by it's name.
Definition: keyfile.cc:397
The key is unknown.
Definition: keyfile.h:82
unsigned int size_type
Line number.
Definition: keyfile.h:101
const item_type * find_item(const group_name_type &group, const key_type &key) const
Find a key by it's group and name.
Definition: keyfile.cc:417
No key was specified.
Definition: keyfile.h:75