Thu, 06 Aug 2009 13:21:30 +0200
Remove seemingly declarations unnecessary according to Qt 4.5.2 headers.
1 /***************************************************************************
2 preferences.cc
3 -------------------
4 A class to access persistant preferences for an application. Utilizes XML/DOM.
5 Basic format is:
6 <!DOCTYPE preferences>
7 <preferences version="0.1" application="MyApp" >
8 <group name="Default" >
9 <option key="alpha" value="true" />
10 <option key="beta" value="99" />
11 <option key="gamma" value="test" />
12 </group>
13 </preferences>
14 -------------------
15 begin Tue Sep 12 2000
16 author David Johnson, david@usermode.org
17 -------------------
18 Copyright 2000, David Johnson
19 Please see the header file for copyright and license information
20 ***************************************************************************/
22 // version 2
24 // TODO: fix up to account for worst case scenarios:
25 // keys without values in file, and
26 // checking for a key that doesn't exist puts it into the map
27 // then it gets written out if dirty, possibly corrupting the file
29 // TODO: Fix up error reporting
31 #include <Qt/qdom.h>
32 #include <qfile.h>
33 #include <qtextstream.h>
35 #include "as_pref.h"
37 //////////////////////////////////////////////////////////////////////////////
38 // Construction //
39 //////////////////////////////////////////////////////////////////////////////
41 //////////////////////////////////////////////////////////////////////////////
42 // Preferences()
43 // -------------
44 // Constructor. Takes the preferences file name as an argument.
46 Preferences::Preferences(const QString& filename,
47 const QString& format,
48 const QString& version)
49 : dirty_(false),
50 currentgroup_(),
51 file_(filename),
52 format_(format),
53 version_(version),
54 filestate_(false),
55 formatstate_(false),
56 groups_()
57 {
58 readData();
59 dirty_ = false;
60 currentgroup_ = "Default";
61 }
63 //////////////////////////////////////////////////////////////////////////////
64 // ~Preferences()
65 // ---------------
66 // Destructor
68 Preferences::~Preferences()
69 {
70 if (dirty_) writeData();
71 }
73 //////////////////////////////////////////////////////////////////////////////
74 // Settings
75 //////////////////////////////////////////////////////////////////////////////
77 //////////////////////////////////////////////////////////////////////////////
78 // getBoolean()
79 // ------------
80 // Get a boolean value
82 bool Preferences::getBool(const QString& key, bool def)
83 {
84 buffer_ = getString(key, def ? "true" : "false");
85 if (buffer_.isEmpty()) return def;
86 if (buffer_.contains("true"))
87 return true;
88 else
89 return false;
90 }
92 //////////////////////////////////////////////////////////////////////////////
93 // setBoolean()
94 // ------------
95 // Set a boolean value
97 void Preferences::setBool(const QString& key, bool value)
98 {
99 groups_[currentgroup_][key] = value ? "true" : "false";
100 dirty_ = true;
101 }
103 //////////////////////////////////////////////////////////////////////////////
104 // getNumber()
105 // -----------
106 // Get a number value
108 // TODO: this might be a place for templates
110 long Preferences::getNumber(const QString& key, long def)
111 {
112 buffer_ = getString(key, QString::number(def));
113 if (buffer_.isEmpty()) return def;
115 bool ok;
116 long num = buffer_.toLong(&ok);
117 if (ok) return num;
118 else return def;
119 }
121 //////////////////////////////////////////////////////////////////////////////
122 // setNumber()
123 // -----------
124 // Set a number value
126 void Preferences::setNumber(const QString& key, long value)
127 {
128 buffer_.setNum(value);
130 groups_[currentgroup_][key] = buffer_;
131 dirty_ = true;
132 }
134 //////////////////////////////////////////////////////////////////////////////
135 // getDouble()
136 // -----------
137 // Get a double value
139 double Preferences::getDouble(const QString& key, double def)
140 {
141 buffer_ = getString(key, QString::number(def));
142 if (buffer_.isEmpty()) return def;
144 bool ok;
145 double num = buffer_.toDouble(&ok);
146 if (ok) return num;
147 else return def;
148 }
150 //////////////////////////////////////////////////////////////////////////////
151 // setDouble()
152 // -----------
153 // Set a double value
155 void Preferences::setDouble(const QString& key, double value)
156 {
157 buffer_.setNum(value);
159 groups_[currentgroup_][key] = buffer_;
160 dirty_ = true;
161 }
164 //////////////////////////////////////////////////////////////////////////////
165 // getString()
166 // -----------
167 // Get a string value
169 QString Preferences::getString(const QString& key, const QString& def)
170 {
171 buffer_ = "";
172 if (groups_.contains(currentgroup_)) {
173 if (groups_[currentgroup_].contains(key)) {
174 buffer_ = groups_[currentgroup_][key];
175 }
176 }
177 if (buffer_.isEmpty()) return def;
178 return buffer_;
179 }
181 //////////////////////////////////////////////////////////////////////////////
182 // setString()
183 // -----------
184 // Set a string value
186 void Preferences::setString(const QString& key, const QString& value)
187 {
188 groups_[currentgroup_][key] = value;
189 dirty_ = true;
190 }
192 //////////////////////////////////////////////////////////////////////////////
193 // removeValue()
194 // -------------
195 // Remove a value from the preferences
197 void Preferences::removeKey(const QString& key)
198 {
199 groups_[currentgroup_].remove(key);
200 }
202 //////////////////////////////////////////////////////////////////////////////
203 // removeGroup()
204 // -------------
205 // Remove a group from the preferences, and all its options
207 void Preferences::removeGroup()
208 {
209 groups_.remove(currentgroup_);
210 }
212 //////////////////////////////////////////////////////////////////////////////
213 // flush()
214 // -------
215 // Flush the preferences to file
217 void Preferences::flush()
218 {
219 if (dirty_) {
220 writeData();
221 dirty_ = false;
222 }
223 }
225 //////////////////////////////////////////////////////////////////////////////
226 // Serialization //
227 //////////////////////////////////////////////////////////////////////////////
229 //////////////////////////////////////////////////////////////////////////////
230 // readData()
231 // ----------
232 // Read data from the file
234 void Preferences::readData()
235 {
236 // open file
237 QFile* datafile = new QFile(file_);
238 if (!datafile->open(QIODevice::ReadOnly)) {
239 // error opening file
240 qWarning("Error: cannot open preferences file " + file_);
241 datafile->close();
242 delete (datafile);
243 filestate_ = false;
244 return;
245 }
246 filestate_ = true;
248 // open dom document
249 QDomDocument doc("preferences");
250 if (!doc.setContent(datafile)) {
251 qWarning("Error: " + file_ + " is not a proper preferences file");
252 datafile->close();
253 delete (datafile);
254 formatstate_ = false;
255 return;
256 }
257 datafile->close();
258 delete (datafile);
260 // check the doc type and stuff
261 if (doc.doctype().name() != "preferences") {
262 // wrong file type
263 qWarning("Error: " +file_ + " is not a valid preferences file");
264 formatstate_ = false;
265 return;
266 }
267 QDomElement root = doc.documentElement();
268 if (root.attribute("application") != format_) {
269 // right file type, wrong application
270 qWarning("Error: " + file_ + " is not a preferences file for " + format_);
271 formatstate_ = false;
272 return;
273 }
274 // We don't care about application version...
276 // get list of groups
277 QDomNodeList nodes = root.elementsByTagName("group");
279 // iterate through the groups
280 QDomNodeList options;
281 for (unsigned n=0; n<nodes.count(); ++n) {
282 if (nodes.item(n).isElement()) {
283 processGroup(nodes.item(n).toElement());
284 }
285 }
286 formatstate_ = true;
287 }
289 void Preferences::processGroup(QDomElement group)
290 {
291 QDomElement elem;
292 QDomNodeList options;
293 currentgroup_ = group.attribute("name", "Default");
294 options = group.elementsByTagName("option");
295 for (unsigned n=0; n<options.count(); ++n) {
296 if (options.item(n).isElement()) {
297 elem = options.item(n).toElement();
298 setString(elem.attribute("key"), elem.attribute("value"));
299 }
300 }
301 }
303 //////////////////////////////////////////////////////////////////////////////
304 // writeData()
305 // -----------
306 // Write data out to the file
308 void Preferences::writeData()
309 {
310 QDomDocument doc("preferences");
312 // create the root element
313 QDomElement root = doc.createElement(doc.doctype().name());
314 root.setAttribute("version", version_);
315 root.setAttribute("application", format_);
317 // now do our options group by group
318 QMap<QString, PrefMap>::Iterator git;
319 PrefMap::Iterator pit;
320 QDomElement group, option;
321 for (git = groups_.begin(); git != groups_.end(); ++git) {
322 // create a group element
323 group = doc.createElement("group");
324 group.setAttribute("name", git.key());
325 // add in options
326 for (pit = (*git).begin(); pit != (*git).end(); ++pit) {
327 option = doc.createElement("option");
328 option.setAttribute("key", pit.key());
329 option.setAttribute("value", pit.data());
330 group.appendChild(option);
331 }
332 root.appendChild(group);
333 }
334 doc.appendChild(root);
336 // open file
337 QFile* datafile = new QFile(file_);
338 if (!datafile->open(QIODevice::WriteOnly)) {
339 // error opening file
340 qWarning("Error: Cannot open preferences file " + file_);
341 datafile->close();
342 delete (datafile);
343 filestate_ = false;
344 return;
345 }
346 filestate_ = true;
348 // write it out
349 QTextStream textstream(datafile);
350 doc.save(textstream, 0);
351 datafile->close();
352 delete (datafile);
353 formatstate_ = true;
354 }