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

Revision 590, 3.8 KB checked in by Eoin, 12 years ago (diff)

Supporting the new libtorrent interface to fast resume data. Not yet working!

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