summaryrefslogtreecommitdiffstats
path: root/kutils/ksettings/dispatcher.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kutils/ksettings/dispatcher.cpp')
-rw-r--r--kutils/ksettings/dispatcher.cpp157
1 files changed, 157 insertions, 0 deletions
diff --git a/kutils/ksettings/dispatcher.cpp b/kutils/ksettings/dispatcher.cpp
new file mode 100644
index 000000000..4e54538d8
--- /dev/null
+++ b/kutils/ksettings/dispatcher.cpp
@@ -0,0 +1,157 @@
+/* This file is part of the KDE project
+ Copyright (C) 2003 Matthias Kretz <kretz@kde.org>
+
+ 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 "ksettings/dispatcher.h"
+
+#include <qsignal.h>
+
+#include <kstaticdeleter.h>
+#include <kdebug.h>
+#include <kconfig.h>
+#include <assert.h>
+
+namespace KSettings
+{
+
+//class Dispatcher::DispatcherPrivate
+//{
+//};
+
+static KStaticDeleter<Dispatcher> ksd_kpd;
+
+Dispatcher * Dispatcher::m_self = 0;
+
+Dispatcher * Dispatcher::self()
+{
+ kdDebug( 701 ) << k_funcinfo << endl;
+ if( m_self == 0 )
+ ksd_kpd.setObject( m_self, new Dispatcher() );
+ return m_self;
+}
+
+Dispatcher::Dispatcher( QObject * parent, const char * name )
+ : QObject( parent, name )
+ //, d( 0 )
+{
+ kdDebug( 701 ) << k_funcinfo << endl;
+}
+
+Dispatcher::~Dispatcher()
+{
+ kdDebug( 701 ) << k_funcinfo << endl;
+ //delete d;
+}
+
+void Dispatcher::registerInstance( KInstance * instance, QObject * recv, const char * slot )
+{
+ assert( instance != 0 );
+ // keep the KInstance around and call
+ // instance->config()->reparseConfiguration when the app should reparse
+ QCString instanceName = instance->instanceName();
+ kdDebug( 701 ) << k_funcinfo << instanceName << endl;
+ m_instanceName[ recv ] = instanceName;
+ QSignal * sig;
+ if( m_instanceInfo.contains( instanceName ) )
+ {
+ sig = m_instanceInfo[ instanceName ].signal;
+ }
+ else
+ {
+ sig = new QSignal( this, "signal dispatcher" );
+ m_instanceInfo[ instanceName ].signal = sig;
+ m_instanceInfo[ instanceName ].instance = instance;
+ }
+ sig->connect( recv, slot );
+
+ ++m_instanceInfo[ instanceName ].count;
+ connect( recv, SIGNAL( destroyed( QObject * ) ), this, SLOT( unregisterInstance( QObject * ) ) );
+}
+
+KConfig * Dispatcher::configForInstanceName( const QCString & instanceName )
+{
+ kdDebug( 701 ) << k_funcinfo << endl;
+ if( m_instanceInfo.contains( instanceName ) )
+ {
+ KInstance * inst = m_instanceInfo[ instanceName ].instance;
+ if( inst )
+ return inst->config();
+ }
+ //if( fallback )
+ //return new KSimpleConfig( instanceName );
+ return 0;
+}
+
+QStrList Dispatcher::instanceNames() const
+{
+ kdDebug( 701 ) << k_funcinfo << endl;
+ QStrList names;
+ for( QMap<QCString, InstanceInfo>::ConstIterator it = m_instanceInfo.begin(); it != m_instanceInfo.end(); ++it )
+ if( ( *it ).count > 0 )
+ names.append( it.key() );
+ return names;
+}
+
+void Dispatcher::reparseConfiguration( const QCString & instanceName )
+{
+ kdDebug( 701 ) << k_funcinfo << instanceName << endl;
+ // check if the instanceName is valid:
+ if( ! m_instanceInfo.contains( instanceName ) )
+ return;
+ // first we reparse the config of the instance so that the KConfig object
+ // will be up to date
+ m_instanceInfo[ instanceName ].instance->config()->reparseConfiguration();
+ QSignal * sig = m_instanceInfo[ instanceName ].signal;
+ if( sig )
+ {
+ kdDebug( 701 ) << "emit signal to instance" << endl;
+ sig->activate();
+ }
+}
+
+void Dispatcher::syncConfiguration()
+{
+ for( QMap<QCString, InstanceInfo>::ConstIterator it = m_instanceInfo.begin(); it != m_instanceInfo.end(); ++it )
+ {
+ ( *it ).instance->config()->sync();
+ }
+}
+
+void Dispatcher::unregisterInstance( QObject * obj )
+{
+ kdDebug( 701 ) << k_funcinfo << endl;
+ QCString name = m_instanceName[ obj ];
+ m_instanceName.remove( obj ); //obj will be destroyed when we return, so we better remove this entry
+ --m_instanceInfo[ name ].count;
+ if( m_instanceInfo[ name ].count == 0 )
+ {
+ delete m_instanceInfo[ name ].signal;
+ m_instanceInfo.remove( name );
+ }
+}
+
+//X KInstance * Dispatcher::instanceForName( const QCString & instanceName )
+//X {
+//X return m_instanceInfo[ instanceName ].instance;
+//X }
+
+} //namespace
+
+#include "dispatcher.moc"
+
+// vim: sw=4 sts=4 et