00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
#include "kinstance.h"
00019
00020
#include <stdlib.h>
00021
#include <unistd.h>
00022
00023
#include "kconfig.h"
00024
#include "klocale.h"
00025
#include "kcharsets.h"
00026
#include "kiconloader.h"
00027
#include "kaboutdata.h"
00028
#include "kstandarddirs.h"
00029
#include "kdebug.h"
00030
#include "kglobal.h"
00031
#include "kmimesourcefactory.h"
00032
00033
#include <qfont.h>
00034
00035
#include "config.h"
00036
#ifndef NDEBUG
00037
#include <assert.h>
00038
#include <qptrdict.h>
00039
static QPtrList<KInstance> *allInstances = 0;
00040
static QPtrDict<QCString> *allOldInstances = 0;
00041
#define DEBUG_ADD do { if (!allInstances) { allInstances = new QPtrList<KInstance>(); allOldInstances = new QPtrDict<QCString>(); } allInstances->append(this); allOldInstances->insert( this, new QCString( _name)); } while (false);
00042
#define DEBUG_REMOVE do { allInstances->removeRef(this); } while (false);
00043
#define DEBUG_CHECK_ALIVE do { if (!allInstances->contains((KInstance*)this)) { QCString *old = allOldInstances->find((KInstance*)this); qWarning("ACCESSING DELETED KINSTANCE! (%s)", old ? old->data() : "<unknown>"); assert(false); } } while (false);
00044
#else
00045
#define DEBUG_ADD
00046
#define DEBUG_REMOVE
00047
#define DEBUG_CHECK_ALIVE
00048
#endif
00049
00050
class KInstancePrivate
00051 {
00052
public:
00053 KInstancePrivate ()
00054 {
00055 mimeSourceFactory = 0L;
00056 }
00057
00058 ~KInstancePrivate ()
00059 {
00060
delete mimeSourceFactory;
00061 }
00062
00063
KMimeSourceFactory* mimeSourceFactory;
00064
QString configName;
00065
bool ownAboutdata;
00066 KSharedConfig::Ptr sharedConfig;
00067 };
00068
00069 KInstance::KInstance(
const QCString& name)
00070 : _dirs (0L),
00071 _config (0L),
00072 _iconLoader (0L),
00073 _name( name ), _aboutData( new
KAboutData( name,
"", 0 ) )
00074 {
00075 DEBUG_ADD
00076 Q_ASSERT(!name.isEmpty());
00077
if (!KGlobal::_instance)
00078 {
00079 KGlobal::_instance =
this;
00080
KGlobal::setActiveInstance(
this);
00081 }
00082
00083 d =
new KInstancePrivate ();
00084 d->ownAboutdata =
true;
00085 }
00086
00087 KInstance::KInstance(
const KAboutData * aboutData )
00088 : _dirs (0L),
00089 _config (0L),
00090 _iconLoader (0L),
00091 _name( aboutData->appName() ), _aboutData( aboutData )
00092 {
00093 DEBUG_ADD
00094 Q_ASSERT(!_name.
isEmpty());
00095
00096
if (!KGlobal::_instance)
00097 {
00098 KGlobal::_instance =
this;
00099
KGlobal::setActiveInstance(
this);
00100 }
00101
00102 d =
new KInstancePrivate ();
00103 d->ownAboutdata =
false;
00104 }
00105
00106
KInstance::KInstance(
KInstance* src )
00107 : _dirs ( src->_dirs ),
00108 _config ( src->_config ),
00109 _iconLoader ( src->_iconLoader ),
00110 _name( src->_name ), _aboutData( src->_aboutData )
00111 {
00112 DEBUG_ADD
00113 Q_ASSERT(!_name.
isEmpty());
00114
00115
if (!KGlobal::_instance || KGlobal::_instance == src )
00116 {
00117 KGlobal::_instance =
this;
00118
KGlobal::setActiveInstance(
this);
00119 }
00120
00121 d =
new KInstancePrivate ();
00122 d->ownAboutdata = src->
d->ownAboutdata;
00123 d->sharedConfig = src->
d->sharedConfig;
00124
00125 src->
_dirs = 0L;
00126 src->
_config = 0L;
00127 src->
_iconLoader = 0L;
00128 src->
_aboutData = 0L;
00129
delete src;
00130 }
00131
00132 KInstance::~KInstance()
00133 {
00134 DEBUG_CHECK_ALIVE
00135 DEBUG_REMOVE
00136
00137
if (d->ownAboutdata)
00138
delete _aboutData;
00139 _aboutData = 0;
00140
00141
delete d;
00142 d = 0;
00143
00144
delete _iconLoader;
00145 _iconLoader = 0;
00146
00147
00148 _config = 0;
00149
delete _dirs;
00150 _dirs = 0;
00151
00152
if (KGlobal::_instance ==
this)
00153 KGlobal::_instance = 0;
00154
if (KGlobal::activeInstance() ==
this)
00155
KGlobal::setActiveInstance(0);
00156 }
00157
00158
00159 KStandardDirs *
KInstance::dirs()
const
00160
{
00161 DEBUG_CHECK_ALIVE
00162
if( _dirs == 0 ) {
00163 _dirs =
new KStandardDirs( );
00164
if (_config)
00165
if (_dirs->addCustomized(_config))
00166 _config->
reparseConfiguration();
00167 }
00168
00169
return _dirs;
00170 }
00171
00172
extern bool kde_kiosk_exception;
00173
extern bool kde_kiosk_admin;
00174
00175 KConfig *
KInstance::config()
const
00176
{
00177 DEBUG_CHECK_ALIVE
00178
if( _config == 0 ) {
00179
if ( !d->configName.isEmpty() )
00180 {
00181 d->sharedConfig = KSharedConfig::openConfig( d->configName );
00182
00183
00184 d->sharedConfig->setGroup(
"KDE Action Restrictions" );
00185
QString kioskException = d->sharedConfig->readEntry(
"kiosk_exception");
00186
if (d->sharedConfig->readBoolEntry(
"custom_config",
true))
00187 {
00188 d->sharedConfig->setGroup(QString::null);
00189 }
00190
else
00191 {
00192 d->sharedConfig = 0;
00193 }
00194
00195 }
00196
00197
if ( d->sharedConfig == 0 )
00198 {
00199
if ( !_name.
isEmpty() )
00200 d->sharedConfig = KSharedConfig::openConfig( _name +
"rc");
00201
else
00202 d->sharedConfig = KSharedConfig::openConfig( QString::null );
00203 }
00204
00205
00206
if (kde_kiosk_admin && !kde_kiosk_exception && !
QCString(getenv(
"KDE_KIOSK_NO_RESTRICTIONS")).isEmpty())
00207 {
00208 kde_kiosk_exception =
true;
00209 d->sharedConfig = 0;
00210
return config();
00211 }
00212
00213 _config = d->sharedConfig;
00214
if (_dirs)
00215
if (_dirs->
addCustomized(_config))
00216 _config->reparseConfiguration();
00217 }
00218
00219
return _config;
00220 }
00221
00222 KSharedConfig *
KInstance::sharedConfig()
const
00223
{
00224 DEBUG_CHECK_ALIVE
00225
if (_config == 0)
00226 (
void)
config();
00227
00228
return d->sharedConfig;
00229 }
00230
00231 void KInstance::setConfigName(
const QString &configName)
00232 {
00233 DEBUG_CHECK_ALIVE
00234 d->configName = configName;
00235 }
00236
00237 KIconLoader *
KInstance::iconLoader()
const
00238
{
00239 DEBUG_CHECK_ALIVE
00240
if( _iconLoader == 0 ) {
00241 _iconLoader =
new KIconLoader( _name,
dirs() );
00242 _iconLoader->enableDelayedIconSetLoading(
true );
00243 }
00244
00245
return _iconLoader;
00246 }
00247
00248 void KInstance::newIconLoader()
const
00249
{
00250 DEBUG_CHECK_ALIVE
00251
KIconTheme::reconfigure();
00252 _iconLoader->
reconfigure( _name,
dirs() );
00253 }
00254
00255 const KAboutData *
KInstance::aboutData()
const
00256
{
00257 DEBUG_CHECK_ALIVE
00258
return _aboutData;
00259 }
00260
00261 QCString KInstance::instanceName()
const
00262
{
00263 DEBUG_CHECK_ALIVE
00264
return _name;
00265 }
00266
00267 KMimeSourceFactory*
KInstance::mimeSourceFactory ()
const
00268
{
00269 DEBUG_CHECK_ALIVE
00270
if (!d->mimeSourceFactory)
00271 {
00272 d->mimeSourceFactory =
new KMimeSourceFactory(
iconLoader());
00273 }
00274
00275
return d->mimeSourceFactory;
00276 }
00277
00278
void KInstance::virtual_hook(
int,
void* )
00279 { }
00280