2 Copyright (c) 2006 Paolo Capriotti <p.capriotti@sns.it>
3 (c) 2006 Maurizio Monge <maurizio.monge@kdemail.net>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
11 #include "mastersettings.h"
13 #include <QTextStream>
15 QDomElement
MasterSettings::node() const {
16 if (m_node
.isNull()) {
18 if (!f
.open(QFile::ReadOnly
| QFile::Text
) || !m_doc
.setContent(&f
)) {
19 ERROR("Unable to open configuration file for reading.");
21 // // create a stub configuration file
23 // QFile stub(m_filename);
24 // if (!stub.open(QFile::WriteOnly | QFile::Text)) {
25 // std::cout << "Unable to write to configuration file." << std::endl;
28 // QTextStream stream(&stub);
29 // stream << "<?xml version=\"1.0\"?>\n"
30 // "<configuration>\n"
31 // "</configuration>\n";
35 // if (!f.open(QFile::ReadOnly | QFile::Text))
38 m_doc
.appendChild(m_doc
.createElement("configuration"));
39 // std::cout << m_doc.toString() << std::endl;
43 const_cast<QDomElement
&>(m_node
) = m_doc
.documentElement();
44 Q_ASSERT(!m_node
.isNull());
45 Q_ASSERT(!m_node
.ownerDocument().isNull());
51 MasterSettings::MasterSettings(const QString
& filename
)
52 : m_filename(QDir(QDir::homePath()).filePath(filename
)) { }
54 MasterSettings::~MasterSettings() {
58 void MasterSettings::setupObserver(Observer
& observer
) {
59 connect(observer
.object
, SIGNAL(destroyed(QObject
*)), this, SLOT(objectDestroyed(QObject
*)));
62 void MasterSettings::onChange(QObject
* obj
, const char* method
) {
63 m_observers
.push_front(Observer(obj
, method
, 0));
64 setupObserver(m_observers
.front());
67 void MasterSettings::onChange(QObject
* obj
, const char* method
, const char* dependency
) {
69 // go backwards through all existing observers, searching for something
70 // on which we depend.
71 for (ObserverList::reverse_iterator it
= m_observers
.rbegin();
72 it
!= m_observers
.rend(); ++it
) {
73 const char* observer_class
= it
->object
->metaObject()->className();
74 if (observer_class
&& strcmp(observer_class
, dependency
) == 0) {
75 // we hit a dependency wall: we can't be notified
76 // before *it, so add the new Observer just here
77 ObserverList::iterator us
= m_observers
.insert(it
.base(), Observer(obj
, method
, dependency
));
80 // now check for a cyclic dependency
81 const char* this_class
= obj
->metaObject()->className();
82 for (ObserverList::iterator it2
= m_observers
.begin(); it2
!= us
; ++it2
) {
83 if (it2
->dependency
&& strcmp(it2
->dependency
, this_class
) == 0) {
84 // something which is notified before has us a dependency
85 // this means that there is a cyclic dependency it2 -> us -> it.
86 WARNING("Removing a cyclic dependency: " <<
87 it2
->object
->metaObject()->className() << " -> " <<
88 this_class
<< " -> " <<
103 onChange(obj
, method
);
106 void MasterSettings::sync() {
109 if (!f
.open(QFile::WriteOnly
| QFile::Text
))
110 ERROR("Cannot open configuration file for writing");
112 QTextStream
stream(&f
);
113 stream
<< node().ownerDocument().toString();
118 void MasterSettings::objectDestroyed(QObject
* obj
) {
119 for (ObserverList::iterator it
= m_observers
.begin();
120 it
!= m_observers
.end();) {
121 if (it
->object
== obj
) {
122 it
= m_observers
.erase(it
);
130 void MasterSettings::changed() {
131 foreach (Observer
& observer
, m_observers
) {
132 observer
.object
->metaObject()->invokeMethod(observer
.object
, observer
.method
, Qt::DirectConnection
);
137 MasterSettings
& settings() {
138 static MasterSettings
static_settings(".taguarc.xml");
139 return static_settings
;