source: 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                wpath backup = app().working_directory()/(filename + L".pre")
38               
39                if (boost::filesystem::exists(backup))
40                        boost::filesystem::boost::filesystem(backup);
41               
42                boost::filesystem::copy_file(app().working_directory()/filename, backup);
43        }
44       
45        void load_data()
46        {
47                if (!xml_.load_file(working_file_.string()))
48                {
49                        generate_default_file();
50                }
51        }
52       
53        void save_data()
54        {               
55        //      ::MessageBox(0, to_wstr(working_file_.string()).c_str(), L"INI", 0);
56                xml_.save_file(working_file_.string());
57        }
58       
59        bool save(boost::filesystem::path location, std::string data)
60        {
61                tinyxml::node* data_node = get_data_node(location);
62               
63                // Should have correct node             
64               
65                return true;
66        }
67
68        bool save(boost::filesystem::path location, tinyxml::node* data)
69        {
70                tinyxml::node* data_node = get_data_node(location);
71               
72                data_node->clear();
73                data_node->link_end_child(data);
74               
75                return true;
76        }
77       
78        tinyxml::node* load(boost::filesystem::path location)
79        {
80                tinyxml::node* data_node = get_data_node(location);
81               
82                tinyxml::node* data = data_node->first_child();
83               
84                if (data)
85                        return data->clone();
86                else
87                        return 0;
88        }
89
90private:
91        void generate_default_file()
92        {
93                xml_.link_end_child(new tinyxml::declaration("1.0", "", ""));
94               
95                xml_.link_end_child(new tinyxml::element("ini"));
96        }
97       
98        tinyxml::node* get_data_node(boost::filesystem::path location)
99        {
100                tinyxml::node* data_node = xml_.first_child("ini");
101               
102                if (!data_node)
103                {
104                        data_node = new tinyxml::element("ini");
105                        xml_.link_end_child(data_node);
106                }
107               
108                foreach(std::string elem, location)
109                {
110                        tinyxml::node* child_node = data_node->first_child(elem);
111                       
112                        if (!child_node)
113                        {
114                                child_node = new tinyxml::element(elem);
115                                data_node->link_end_child(child_node);
116                        }
117                       
118                        data_node = child_node;
119                }
120
121                return data_node;
122        }
123       
124        boost::filesystem::wpath working_file_;
125        tinyxml::document xml_;
126};
127
128ini_file::ini_file(std::wstring filename) :
129        pimpl(new ini_impl(filename))
130{}
131
132ini_file::~ini_file()
133{}
134
135void ini_file::load_data()
136{
137        pimpl->load_data();
138}
139
140void ini_file::save_data()
141{
142        pimpl->save_data();
143}
144
145bool ini_file::save(boost::filesystem::path location, std::string data)
146{
147        return pimpl->save(location, data);
148}
149
150bool ini_file::save(boost::filesystem::path location, tinyxml::node* data)
151{
152        return pimpl->save(location, data);
153}
154
155tinyxml::node* ini_file::load(boost::filesystem::path location)
156{
157        return pimpl->load(location);
158}
159
160ini_file& ini()
161{
162        static ini_file ini(L"Halite.xml");
163        return ini;
164}
165
166} // namespace hal
Note: See TracBrowser for help on using the repository browser.