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

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

Working on torrent creation.

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