source: src/global/ini.cpp @ 303

Revision 303, 3.1 KB checked in by Eoin, 13 years ago (diff)

Stable sorting fixed.

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