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

Revision 558, 4.1 KB checked in by Eoin, 12 years ago (diff)

Settings stored in Application Folder if reg entry present.

Line 
1
2//         Copyright Eóin O'Callaghan 2006 - 2008.
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 "stdAfx.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 <boost/foreach.hpp>
16#include <boost/date_time/posix_time/posix_time.hpp>
17
18#include <atlbase.h>
19#include <atlapp.h>
20
21extern WTL::CAppModule _Module;
22
23#include "txml.hpp"
24#include "wtl_app.hpp"
25#include "logger.hpp"
26#include "string_conv.hpp"
27#include "ini.hpp"
28
29#define foreach BOOST_FOREACH
30
31namespace hal
32{
33
34class ini_impl
35{
36public:
37        ini_impl(std::wstring filename) :
38                main_file_(app().get_working_directory()/filename),
39                working_file_(app().get_working_directory()/(filename + L".working"))
40        {               
41                if (boost::filesystem::exists(working_file_))
42                {                       
43                        std::wstringstream sstr;
44                        boost::posix_time::wtime_facet* facet = new boost::posix_time::wtime_facet(L"%Y-%m-%d.%H-%M-%S");
45                        sstr.imbue(std::locale(std::cout.getloc(), facet));
46                        sstr << boost::posix_time::second_clock::universal_time();
47
48                        boost::filesystem::rename(working_file_, app().get_working_directory()/(filename + L"." + sstr.str()));                 
49                }
50
51                if (boost::filesystem::exists(main_file_))
52                        boost::filesystem::copy_file(main_file_, working_file_);
53        }
54
55        ~ini_impl()
56        {
57                if (boost::filesystem::exists(working_file_))
58                {
59                        if (boost::filesystem::last_write_time(main_file_) ==
60                                        boost::filesystem::last_write_time(working_file_))
61                        {
62                                boost::filesystem::remove(working_file_);
63                        }
64                }
65        }
66       
67        void load_data()
68        {
69                if (!xml_.load_file(working_file_.string()))
70                {
71                        generate_default_file();
72                }
73        }
74       
75        void save_data()
76        {               
77                xml_.save_file(working_file_.string());
78
79                if (boost::filesystem::exists(working_file_))
80                {
81                        boost::filesystem::remove(main_file_);
82                        boost::filesystem::copy_file(working_file_, main_file_);
83                }
84        }
85       
86        bool save(boost::filesystem::path location, std::string data)
87        {
88                xml::node* data_node = get_data_node(location);
89               
90                // Should have correct node             
91               
92                return true;
93        }
94
95        bool save(boost::filesystem::path location, xml::node* data)
96        {
97                xml::node* data_node = get_data_node(location);
98               
99                data_node->clear();
100                data_node->link_end_child(data);
101               
102                return true;
103        }
104       
105        xml::node* load(boost::filesystem::path location)
106        {
107                xml::node* data_node = get_data_node(location);
108               
109                xml::node* data = data_node->first_child();
110               
111                if (data)
112                        return data->clone();
113                else
114                        return 0;
115        }
116
117private:
118        void generate_default_file()
119        {
120                xml_.link_end_child(new xml::declaration("1.0", "", ""));
121               
122                xml_.link_end_child(new xml::element("ini"));
123        }
124       
125        xml::node* get_data_node(boost::filesystem::path location)
126        {
127                xml::node* data_node = xml_.first_child("ini");
128               
129                if (!data_node)
130                {
131                        data_node = new xml::element("ini");
132                        xml_.link_end_child(data_node);
133                }
134               
135                foreach(std::string elem, location)
136                {
137                        xml::node* child_node = data_node->first_child(elem);
138                       
139                        if (!child_node)
140                        {
141                                child_node = new xml::element(elem);
142                                data_node->link_end_child(child_node);
143                        }
144                       
145                        data_node = child_node;
146                }
147
148                return data_node;
149        }
150       
151        boost::filesystem::wpath main_file_;
152        boost::filesystem::wpath working_file_;
153        xml::document xml_;
154};
155
156ini_file::ini_file(std::wstring filename) :
157        pimpl(new ini_impl(filename))
158{}
159
160ini_file::~ini_file()
161{}
162
163void ini_file::load_data()
164{
165        pimpl->load_data();
166}
167
168void ini_file::save_data()
169{
170        pimpl->save_data();
171}
172
173bool ini_file::save(boost::filesystem::path location, std::string data)
174{
175        return pimpl->save(location, data);
176}
177
178bool ini_file::save(boost::filesystem::path location, xml::node* data)
179{
180        return pimpl->save(location, data);
181}
182
183xml::node* ini_file::load(boost::filesystem::path location)
184{
185        return pimpl->load(location);
186}
187
188ini_file& ini()
189{
190        static ini_file ini(L"Halite.xml");
191        return ini;
192}
193
194} // namespace hal
Note: See TracBrowser for help on using the repository browser.