• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // ----------------------------------------------------------------------------
2 // Copyright (C) 2002-2006 Marcin Kalicinski
3 //
4 // Distributed under the Boost Software License, Version 1.0.
5 // (See accompanying file LICENSE_1_0.txt or copy at
6 // http://www.boost.org/LICENSE_1_0.txt)
7 //
8 // For more information, see www.boost.org
9 // ----------------------------------------------------------------------------
10 
11 //[debug_settings_includes
12 #include <boost/property_tree/ptree.hpp>
13 #include <boost/property_tree/xml_parser.hpp>
14 #include <boost/foreach.hpp>
15 #include <string>
16 #include <set>
17 #include <exception>
18 #include <iostream>
19 namespace pt = boost::property_tree;
20 //]
21 //[debug_settings_data
22 struct debug_settings
23 {
24     std::string m_file;               // log filename
25     int m_level;                      // debug level
26     std::set<std::string> m_modules;  // modules where logging is enabled
27     void load(const std::string &filename);
28     void save(const std::string &filename);
29 };
30 //]
31 //[debug_settings_load
load(const std::string & filename)32 void debug_settings::load(const std::string &filename)
33 {
34     // Create empty property tree object
35     pt::ptree tree;
36 
37     // Parse the XML into the property tree.
38     pt::read_xml(filename, tree);
39 
40     // Use the throwing version of get to find the debug filename.
41     // If the path cannot be resolved, an exception is thrown.
42     m_file = tree.get<std::string>("debug.filename");
43 
44     // Use the default-value version of get to find the debug level.
45     // Note that the default value is used to deduce the target type.
46     m_level = tree.get("debug.level", 0);
47 
48     // Use get_child to find the node containing the modules, and iterate over
49     // its children. If the path cannot be resolved, get_child throws.
50     // A C++11 for-range loop would also work.
51     BOOST_FOREACH(pt::ptree::value_type &v, tree.get_child("debug.modules")) {
52         // The data function is used to access the data stored in a node.
53         m_modules.insert(v.second.data());
54     }
55 
56 }
57 //]
58 //[debug_settings_save
save(const std::string & filename)59 void debug_settings::save(const std::string &filename)
60 {
61     // Create an empty property tree object.
62     pt::ptree tree;
63 
64     // Put the simple values into the tree. The integer is automatically
65     // converted to a string. Note that the "debug" node is automatically
66     // created if it doesn't exist.
67     tree.put("debug.filename", m_file);
68     tree.put("debug.level", m_level);
69 
70     // Add all the modules. Unlike put, which overwrites existing nodes, add
71     // adds a new node at the lowest level, so the "modules" node will have
72     // multiple "module" children.
73     BOOST_FOREACH(const std::string &name, m_modules)
74         tree.add("debug.modules.module", name);
75 
76     // Write property tree to XML file
77     pt::write_xml(filename, tree);
78 }
79 //]
80 
main()81 int main()
82 {
83     try
84     {
85         debug_settings ds;
86         ds.load("debug_settings.xml");
87         ds.save("debug_settings_out.xml");
88         std::cout << "Success\n";
89     }
90     catch (std::exception &e)
91     {
92         std::cout << "Error: " << e.what() << "\n";
93     }
94     return 0;
95 }
96