You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdelibs/tdeio/tdeio/slaveconfig.cpp

226 lines
5.6 KiB

// -*- c++ -*-
/*
* This file is part of the KDE libraries
* Copyright (c) 2001 Waldo Bastian <bastian@kde.org>
*
* $Id$
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License version 2 as published by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
**/
#include <assert.h>
#include <tqdict.h>
#include <tdeconfig.h>
#include <kstaticdeleter.h>
#include <kprotocolinfo.h>
#include <tdeprotocolmanager.h>
#include "slaveconfig.h"
using namespace TDEIO;
namespace TDEIO {
class SlaveConfigProtocol
{
public:
SlaveConfigProtocol() { host.setAutoDelete(true); }
~SlaveConfigProtocol()
{
delete configFile;
}
public:
MetaData global;
TQDict<MetaData> host;
TDEConfig *configFile;
};
static void readConfig(TDEConfig *config, const TQString & group, MetaData *metaData)
{
*metaData += config->entryMap(group);
}
class SlaveConfigPrivate
{
public:
void readGlobalConfig();
SlaveConfigProtocol *readProtocolConfig(const TQString &_protocol);
SlaveConfigProtocol *findProtocolConfig(const TQString &_protocol);
void readConfigProtocolHost(const TQString &_protocol, SlaveConfigProtocol *scp, const TQString &host);
public:
MetaData global;
TQDict<SlaveConfigProtocol> protocol;
};
void SlaveConfigPrivate::readGlobalConfig()
{
global.clear();
// Read stuff...
TDEConfig *config = KProtocolManager::config();
readConfig(TDEGlobal::config(), "Socks", &global); // Socks settings.
if ( config )
readConfig(config, "<default>", &global);
}
SlaveConfigProtocol* SlaveConfigPrivate::readProtocolConfig(const TQString &_protocol)
{
SlaveConfigProtocol *scp = protocol.find(_protocol);
if (!scp)
{
TQString filename = KProtocolInfo::config(_protocol);
scp = new SlaveConfigProtocol;
scp->configFile = new TDEConfig(filename, true, false);
protocol.insert(_protocol, scp);
}
// Read global stuff...
readConfig(scp->configFile, "<default>", &(scp->global));
return scp;
}
SlaveConfigProtocol* SlaveConfigPrivate::findProtocolConfig(const TQString &_protocol)
{
SlaveConfigProtocol *scp = protocol.find(_protocol);
if (!scp)
scp = readProtocolConfig(_protocol);
return scp;
}
void SlaveConfigPrivate::readConfigProtocolHost(const TQString &, SlaveConfigProtocol *scp, const TQString &host)
{
MetaData *metaData = new MetaData;
scp->host.replace(host, metaData);
// Read stuff
// Break host into domains
TQString domain = host;
if (!domain.contains('.'))
{
// Host without domain.
if (scp->configFile->hasGroup("<local>"))
readConfig(scp->configFile, "<local>", metaData);
}
int pos = 0;
do
{
pos = host.findRev('.', pos-1);
if (pos < 0)
domain = host;
else
domain = host.mid(pos+1);
if (scp->configFile->hasGroup(domain))
readConfig(scp->configFile, domain.lower(), metaData);
}
while (pos > 0);
}
SlaveConfig *SlaveConfig::_self = 0;
static KStaticDeleter<SlaveConfig> slaveconfigsd;
SlaveConfig *SlaveConfig::self()
{
if (!_self)
_self = slaveconfigsd.setObject(_self, new SlaveConfig);
return _self;
}
SlaveConfig::SlaveConfig()
{
d = new SlaveConfigPrivate;
d->protocol.setAutoDelete(true);
d->readGlobalConfig();
}
SlaveConfig::~SlaveConfig()
{
delete d; d = 0;
_self = 0;
}
void SlaveConfig::setConfigData(const TQString &protocol,
const TQString &host,
const TQString &key,
const TQString &value )
{
MetaData config;
config.insert(key, value);
setConfigData(protocol, host, config);
}
void SlaveConfig::setConfigData(const TQString &protocol, const TQString &host, const MetaData &config )
{
if (protocol.isEmpty())
d->global += config;
else {
SlaveConfigProtocol *scp = d->findProtocolConfig(protocol);
if (host.isEmpty())
{
scp->global += config;
}
else
{
MetaData *hostConfig = scp->host.find(host);
if (!hostConfig)
{
d->readConfigProtocolHost(protocol, scp, host);
hostConfig = scp->host.find(host);
assert(hostConfig);
}
*hostConfig += config;
}
}
}
MetaData SlaveConfig::configData(const TQString &protocol, const TQString &host)
{
MetaData config = d->global;
SlaveConfigProtocol *scp = d->findProtocolConfig(protocol);
config += scp->global;
if (host.isEmpty())
return config;
MetaData *hostConfig = scp->host.find(host);
if (!hostConfig)
{
d->readConfigProtocolHost(protocol, scp, host);
emit configNeeded(protocol, host);
hostConfig = scp->host.find(host);
assert(hostConfig);
}
config += *hostConfig;
return config;
}
TQString SlaveConfig::configData(const TQString &protocol, const TQString &host, const TQString &key)
{
return configData(protocol, host)[key];
}
void SlaveConfig::reset()
{
d->protocol.clear();
d->readGlobalConfig();
}
}
#include "slaveconfig.moc"