3 * This file is part of the KDE libraries
4 * Copyright (c) 2001 Waldo Bastian <bastian@kde.org>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public
8 * License version 2 as published by the Free Software Foundation.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Library General Public License for more details.
15 * You should have received a copy of the GNU Library General Public License
16 * along with this library; see the file COPYING.LIB. If not, write to
17 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 * Boston, MA 02110-1301, USA.
21 #include "slaveconfig.h"
25 #include <QtCore/QHash>
28 #include <ksharedconfig.h>
29 #include <kprotocolinfo.h>
30 #include <kprotocolmanager.h>
36 class SlaveConfigProtocol
39 SlaveConfigProtocol() {}
40 ~SlaveConfigProtocol()
47 QHash
<QString
, MetaData
> host
;
51 static void readConfig(KConfig
*config
, const QString
& group
, MetaData
*metaData
)
53 *metaData
+= config
->entryMap(group
);
56 class SlaveConfigPrivate
59 void readGlobalConfig();
60 SlaveConfigProtocol
*readProtocolConfig(const QString
&_protocol
);
61 SlaveConfigProtocol
*findProtocolConfig(const QString
&_protocol
);
62 void readConfigProtocolHost(const QString
&_protocol
, SlaveConfigProtocol
*scp
, const QString
&host
);
65 QHash
<QString
, SlaveConfigProtocol
*> protocol
;
68 void SlaveConfigPrivate::readGlobalConfig()
72 KSharedConfig::Ptr config
= KProtocolManager::config();
73 readConfig(KGlobal::config().data(), "Socks", &global
); // Socks settings.
75 readConfig(config
.data(), "<default>", &global
);
78 SlaveConfigProtocol
* SlaveConfigPrivate::readProtocolConfig(const QString
&_protocol
)
80 SlaveConfigProtocol
*scp
= protocol
.value(_protocol
,0);
83 QString filename
= KProtocolInfo::config(_protocol
);
84 scp
= new SlaveConfigProtocol
;
85 scp
->configFile
= new KConfig(filename
, KConfig::NoGlobals
);
86 protocol
.insert(_protocol
, scp
);
88 // Read global stuff...
89 readConfig(scp
->configFile
, "<default>", &(scp
->global
));
93 SlaveConfigProtocol
* SlaveConfigPrivate::findProtocolConfig(const QString
&_protocol
)
95 SlaveConfigProtocol
*scp
= protocol
.value(_protocol
,0);
97 scp
= readProtocolConfig(_protocol
);
101 void SlaveConfigPrivate::readConfigProtocolHost(const QString
&, SlaveConfigProtocol
*scp
, const QString
&host
)
104 scp
->host
.insert(host
, metaData
);
107 // Break host into domains
108 QString domain
= host
;
110 if (!domain
.contains('.'))
112 // Host without domain.
113 if (scp
->configFile
->hasGroup("<local>")) {
114 readConfig(scp
->configFile
, "<local>", &metaData
);
115 scp
->host
.insert(host
, metaData
);
122 pos
= host
.lastIndexOf('.', pos
-1);
127 domain
= host
.mid(pos
+1);
129 if (scp
->configFile
->hasGroup(domain
)) {
130 readConfig(scp
->configFile
, domain
.toLower(), &metaData
);
131 scp
->host
.insert(host
, metaData
);
137 SlaveConfig
*SlaveConfig::self()
139 K_GLOBAL_STATIC(SlaveConfig
, _self
)
143 SlaveConfig::SlaveConfig()
144 :d(new SlaveConfigPrivate
)
146 d
->readGlobalConfig();
149 SlaveConfig::~SlaveConfig()
151 qDeleteAll(d
->protocol
);
155 void SlaveConfig::setConfigData(const QString
&protocol
,
158 const QString
&value
)
161 config
.insert(key
, value
);
162 setConfigData(protocol
, host
, config
);
165 void SlaveConfig::setConfigData(const QString
&protocol
, const QString
&host
, const MetaData
&config
)
167 if (protocol
.isEmpty())
170 SlaveConfigProtocol
*scp
= d
->findProtocolConfig(protocol
);
173 scp
->global
+= config
;
177 if (!scp
->host
.contains(host
))
178 d
->readConfigProtocolHost(protocol
, scp
, host
);
180 MetaData hostConfig
= scp
->host
.value(host
);
181 hostConfig
+= config
;
182 scp
->host
.insert(host
, hostConfig
);
187 MetaData
SlaveConfig::configData(const QString
&protocol
, const QString
&host
)
189 MetaData config
= d
->global
;
190 SlaveConfigProtocol
*scp
= d
->findProtocolConfig(protocol
);
191 config
+= scp
->global
;
195 if (!scp
->host
.contains(host
))
197 d
->readConfigProtocolHost(protocol
, scp
, host
);
198 emit
configNeeded(protocol
, host
);
200 MetaData hostConfig
= scp
->host
.value(host
);
201 config
+= hostConfig
;
206 QString
SlaveConfig::configData(const QString
&protocol
, const QString
&host
, const QString
&key
)
208 return configData(protocol
, host
)[key
];
211 void SlaveConfig::reset()
213 qDeleteAll(d
->protocol
);
215 d
->readGlobalConfig();
220 #include "slaveconfig.moc"