1 /* === S Y N F I G ========================================================= */
3 ** \brief Template File
8 ** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
9 ** Copyright (c) 2007 Chris Moore
11 ** This package is free software; you can redistribute it and/or
12 ** modify it under the terms of the GNU General Public License as
13 ** published by the Free Software Foundation; either version 2 of
14 ** the License, or (at your option) any later version.
16 ** This package is distributed in the hope that it will be useful,
17 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
18 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 ** General Public License for more details.
22 /* ========================================================================= */
24 /* === H E A D E R S ======================================================= */
37 #include <synfig/general.h>
43 /* === U S I N G =========================================================== */
47 using namespace synfig
;
48 using namespace synfigapp
;
50 /* === M A C R O S ========================================================= */
52 /* === G L O B A L S ======================================================= */
54 /* === P R O C E D U R E S ================================================= */
56 /* === M E T H O D S ======================================================= */
67 Settings::get_value(const synfig::String
& key
)const
70 if(!get_value(key
,value
))
71 return synfig::String();
76 Settings::add_domain(Settings
* domain
, const synfig::String
& name
)
78 domain_map
[name
]=domain
;
82 Settings::remove_domain(const synfig::String
& name
)
84 domain_map
.erase(name
);
88 Settings::get_value(const synfig::String
& key
, synfig::String
& value
)const
90 // Search for the value in any children domains
91 DomainMap::const_iterator iter
;
92 for(iter
=domain_map
.begin();iter
!=domain_map
.end();++iter
)
94 // if we have a domain hit
95 if(key
.size()>iter
->first
.size() && String(key
.begin(),key
.begin()+iter
->first
.size())==iter
->first
)
97 synfig::String
key_(key
.begin()+iter
->first
.size()+1,key
.end());
99 // If the domain has it, then we have got a hit
100 if(iter
->second
->get_value(key_
,value
))
105 // Search for the value in our simple map
106 if(simple_value_map
.count(key
))
108 value
=simple_value_map
.find(key
)->second
;
117 Settings::set_value(const synfig::String
& key
,const synfig::String
& value
)
119 // Search for the key in any children domains
120 DomainMap::iterator iter
;
121 for(iter
=domain_map
.begin();iter
!=domain_map
.end();++iter
)
123 // if we have a domain hit
124 if(key
.size()>iter
->first
.size() && String(key
.begin(),key
.begin()+iter
->first
.size())==iter
->first
)
126 synfig::String
key_(key
.begin()+iter
->first
.size()+1,key
.end());
128 return iter
->second
->set_value(key_
,value
);
132 simple_value_map
[key
]=value
;
136 //! Compare two key names, putting pref.* keys first
138 compare_pref_first (synfig::String first
, synfig::String second
)
140 return first
.substr(0, 5) == "pref."
141 ? second
.substr(0, 5) == "pref."
144 : second
.substr(0, 5) == "pref."
150 Settings::get_key_list()const
154 // Get keys from the domains
156 DomainMap::const_iterator iter
;
157 for(iter
=domain_map
.begin();iter
!=domain_map
.end();++iter
)
159 KeyList
sub_key_list(iter
->second
->get_key_list());
160 KeyList::iterator key_iter
;
161 for(key_iter
=sub_key_list
.begin();key_iter
!=sub_key_list
.end();++key_iter
)
162 key_list
.push_back(iter
->first
+'.'+*key_iter
);
166 // Get keys from the simple variables
168 ValueBaseMap::const_iterator iter
;
169 for(iter
=simple_value_map
.begin();iter
!=simple_value_map
.end();++iter
)
170 key_list
.push_back(iter
->first
);
174 // We make sure the 'pref.*' keys come first to fix bug 1694393,
175 // where windows were being created before the parameter
176 // specifying which window manager hint to use had been loaded
177 key_list
.sort(compare_pref_first
);
183 Settings::save_to_file(const synfig::String
& filename
)const
185 synfig::String
tmp_filename(filename
+".TMP");
189 std::ofstream
file(tmp_filename
.c_str());
191 if(!file
)return false;
193 KeyList
key_list(get_key_list());
197 KeyList::const_iterator iter
;
198 for(iter
=key_list
.begin();iter
!=key_list
.end();++iter
)
200 if(!file
)return false;
201 String ret
= get_value(*iter
);
202 if (ret
!= String()) file
<<*iter
<<'='<<(ret
== "none" ? "normal" : ret
)<<endl
;
208 }catch(...) { return false; }
211 char old_file
[80]="sif.XXXXXXXX";
213 rename(filename
.c_str(),old_file
);
214 if(rename(tmp_filename
.c_str(),filename
.c_str())!=0)
216 rename(old_file
,tmp_filename
.c_str());
221 if(rename(tmp_filename
.c_str(),filename
.c_str())!=0)
229 Settings::load_from_file(const synfig::String
& filename
)
231 std::ifstream
file(filename
.c_str());
238 if(!line
.empty() && ((line
[0]>='a' && line
[0]<='z')||(line
[0]>='A' && line
[0]<='Z')))
240 std::string::iterator
equal(find(line
.begin(),line
.end(),'='));
241 if(equal
==line
.end())
243 std::string
key(line
.begin(),equal
);
244 std::string
value(equal
+1,line
.end());
246 //synfig::info("Settings::load_from_file(): Trying Key \"%s\" with a value of \"%s\".",key.c_str(),value.c_str());
248 if(!set_value(key
,value
))
249 synfig::warning("Settings::load_from_file(): Key \"%s\" with a value of \"%s\" was rejected.",key
.c_str(),value
.c_str());
253 synfig::error("Settings::load_from_file(): Attempt to set key \"%s\" with a value of \"%s\" has thrown an exception.",key
.c_str(),value
.c_str());