source: trunk/src/global/ini.cpp @ 357

Revision 357, 3.3 KB checked in by Eoin, 12 years ago (diff)

Added small backing up of previous data xml files.

Line 
1
2//         Copyright Eóin O'Callaghan 2006 - 2007.
3// Distributed under the Boost Software License, Version 1.0.
4//    (See accompanying file LICENSE_1_0.txt or copy at
5//          http://www.boost.org/LICENSE_1_0.txt)
6
7#include <boost/foreach.hpp>
8
9#define WINVER 0x0500
10#define _WIN32_WINNT 0x0500
11#define _WIN32_IE 0x0500
12#define _RICHEDIT_VER 0x0200
13#define VC_EXTRALEAN
14
15#include <atlbase.h>
16#include <atlapp.h>
17
18extern CAppModule _Module;
19
20#include "tinyxml.hpp"
21#include "wtl_app.hpp"
22#include "logger.hpp"
23#include "string_conv.hpp"
24#include "ini.hpp"
25
26#define foreach BOOST_FOREACH
27
28namespace hal
29{
30
31class ini_impl
32{
33public:
34        ini_impl(std::wstring filename) :
35                working_file_(app().working_directory()/filename)
36        {
37                boost::filesystem::wpath backup = app().working_directory()/(filename + L".pre");
38               
39                if (boost::filesystem::exists(backup))
40                        boost::filesystem::remove(backup);
41                       
42                if (boost::filesystem::exists(working_file_))
43                        boost::filesystem::copy_file(working_file_, backup);
44        }
45       
46        void load_data()
47        {
48                if (!xml_.load_file(working_file_.string()))
49                {
50                        generate_default_file();
51                }
52        }
53       
54        void save_data()
55        {               
56        //      ::MessageBox(0, to_wstr(working_file_.string()).c_str(), L"INI", 0);
57                xml_.save_file(working_file_.string());
58        }
59       
60        bool save(boost::filesystem::path location, std::string data)
61        {
62                tinyxml::node* data_node = get_data_node(location);
63               
64                // Should have correct node             
65               
66                return true;
67        }
68
69        bool save(boost::filesystem::path location, tinyxml::node* data)
70        {
71                tinyxml::node* data_node = get_data_node(location);
72               
73                data_node->clear();
74                data_node->link_end_child(data);
75               
76                return true;
77        }
78       
79        tinyxml::node* load(boost::filesystem::path location)
80        {
81                tinyxml::node* data_node = get_data_node(location);
82               
83                tinyxml::node* data = data_node->first_child();
84               
85                if (data)
86                        return data->clone();
87                else
88                        return 0;
89        }
90
91private:
92        void generate_default_file()
93        {
94                xml_.link_end_child(new tinyxml::declaration("1.0", "", ""));
95               
96                xml_.link_end_child(new tinyxml::element("ini"));
97        }
98       
99        tinyxml::node* get_data_node(boost::filesystem::path location)
100        {
101                tinyxml::node* data_node = xml_.first_child("ini");
102               
103                if (!data_node)
104                {
105                        data_node = new tinyxml::element("ini");
106                        xml_.link_end_child(data_node);
107                }
108               
109                foreach(std::string elem, location)
110                {
111                        tinyxml::node* child_node = data_node->first_child(elem);
112                       
113                        if (!child_node)
114                        {
115                                child_node = new tinyxml::element(elem);
116                                data_node->link_end_child(child_node);
117                        }
118                       
119                        data_node = child_node;
120                }
121
122                return data_node;
123        }
124       
125        boost::filesystem::wpath working_file_;
126        tinyxml::document xml_;
127};
128
129ini_file::ini_file(std::wstring filename) :
130        pimpl(new ini_impl(filename))
131{}
132
133ini_file::~ini_file()
134{}
135
136void ini_file::load_data()
137{
138        pimpl->load_data();
139}
140
141void ini_file::save_data()
142{
143        pimpl->save_data();
144}
145
146bool ini_file::save(boost::filesystem::path location, std::string data)
147{
148        return pimpl->save(location, data);
149}
150
151bool ini_file::save(boost::filesystem::path location, tinyxml::node* data)
152{
153        return pimpl->save(location, data);
154}
155
156tinyxml::node* ini_file::load(boost::filesystem::path location)
157{
158        return pimpl->load(location);
159}
160
161ini_file& ini()
162{
163        static ini_file ini(L"Halite.xml");
164        return ini;
165}
166
167} // namespace hal
Note: See TracBrowser for help on using the repository browser.