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/tdecore/kglobal.cpp

265 lines
5.9 KiB

/* This file is part of the KDE libraries
Copyright (C) 1999 Sirtaj Singh Kanq <taj@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.
*/
/*
* kglobal.cpp -- Implementation of class KGlobal.
* Author: Sirtaj Singh Kang
* Version: $Id$
* Generated: Sat May 1 02:08:43 EST 1999
*/
#include <tqglobal.h>
#include <tqdict.h>
#include <tqptrlist.h>
#include "kglobal.h"
#include <kapplication.h>
#include <kaboutdata.h>
#include <kdebug.h>
#include <kconfig.h>
#include <klocale.h>
#include <kcharsets.h>
#include <kiconloader.h>
#include <kstandarddirs.h>
#include <kinstance.h>
#include "kstaticdeleter.h"
#include <tqfont.h>
#ifndef NDEBUG
#define MYASSERT(x) if (!x) \
tqFatal("Fatal error: you need to have a KInstance object before\n" \
"you do anything that requires it! Examples of this are config\n" \
"objects, standard directories or translations.");
#else
#define MYASSERT(x) /* nope */
#endif
static void kglobal_init();
KStandardDirs *KGlobal::dirs()
{
MYASSERT(_instance);
return _instance->dirs();
}
KConfig *KGlobal::config()
{
MYASSERT(_instance);
return _instance->config();
}
KSharedConfig *KGlobal::sharedConfig()
{
MYASSERT(_instance);
return _instance->sharedConfig();
}
KIconLoader *KGlobal::iconLoader()
{
MYASSERT(_instance);
return _instance->iconLoader();
}
KInstance *KGlobal::instance()
{
MYASSERT(_instance);
return _instance;
}
KLocale *KGlobal::locale()
{
if( _locale == 0 ) {
if (!_instance)
return 0;
kglobal_init();
// will set _locale if it works - otherwise 0 is returned
KLocale::initInstance();
if( _instance->aboutData())
_instance->aboutData()->translateInternalProgramName();
}
return _locale;
}
KCharsets *KGlobal::charsets()
{
if( _charsets == 0 ) {
_charsets =new KCharsets();
kglobal_init();
}
return _charsets;
}
void KGlobal::setActiveInstance(KInstance *i)
{
_activeInstance = i;
if (i && _locale)
_locale->setActiveCatalogue(TQString::fromUtf8(i->instanceName()));
}
/**
* Create a static QString
*
* To be used inside functions(!) like:
* static const TQString &myString = KGlobal::staticQString("myText");
*/
const TQString &
KGlobal::staticQString(const char *str)
{
return staticQString(TQString::fromLatin1(str));
}
class KStringDict : public TQDict<TQString>
{
public:
KStringDict() : TQDict<TQString>(139) { }
};
/**
* Create a static QString
*
* To be used inside functions(!) like:
* static const TQString &myString = KGlobal::staticQString(i18n("My Text"));
*/
const TQString &
KGlobal::staticQString(const TQString &str)
{
if (!_stringDict) {
_stringDict = new KStringDict;
_stringDict->setAutoDelete( true );
kglobal_init();
}
TQString *result = _stringDict->find(str);
if (!result)
{
result = new TQString(str);
_stringDict->insert(str, result);
}
return *result;
}
class KStaticDeleterList: public TQPtrList<KStaticDeleterBase>
{
public:
KStaticDeleterList() { }
};
void
KGlobal::registerStaticDeleter(KStaticDeleterBase *obj)
{
if (!_staticDeleters)
kglobal_init();
if (_staticDeleters->find(obj) == -1)
_staticDeleters->append(obj);
}
void
KGlobal::unregisterStaticDeleter(KStaticDeleterBase *obj)
{
if (_staticDeleters)
_staticDeleters->removeRef(obj);
}
void
KGlobal::deleteStaticDeleters()
{
if (!KGlobal::_staticDeleters)
return;
for(;_staticDeleters->count();)
{
_staticDeleters->take(0)->destructObject();
}
delete KGlobal::_staticDeleters;
KGlobal::_staticDeleters = 0;
}
// The Variables
KStringDict *KGlobal::_stringDict = 0;
KInstance *KGlobal::_instance = 0;
KInstance *KGlobal::_activeInstance = 0;
KLocale *KGlobal::_locale = 0;
KCharsets *KGlobal::_charsets = 0;
KStaticDeleterList *KGlobal::_staticDeleters = 0;
#ifdef WIN32
#include <windows.h>
static void kglobal_freeAll();
BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, LPVOID impLoad )
{
if (reason == DLL_PROCESS_DETACH)
kglobal_freeAll();
return TRUE;
}
#else
__attribute__((destructor))
#endif
static void kglobal_freeAll()
{
delete KGlobal::_locale;
KGlobal::_locale = 0;
delete KGlobal::_charsets;
KGlobal::_charsets = 0;
delete KGlobal::_stringDict;
KGlobal::_stringDict = 0;
KGlobal::deleteStaticDeleters();
// so that we don't hold a reference and see memory leaks :/
KGlobal::setActiveInstance(0);
}
static void kglobal_init()
{
if (KGlobal::_staticDeleters)
return;
KGlobal::_staticDeleters = new KStaticDeleterList;
}
int kasciistricmp( const char *str1, const char *str2 )
{
const unsigned char *s1 = (const unsigned char *)str1;
const unsigned char *s2 = (const unsigned char *)str2;
int res;
unsigned char c1, c2;
if ( !s1 || !s2 )
return s1 ? 1 : (s2 ? -1 : 0);
if ( !*s1 || !*s2 )
return *s1 ? 1 : (*s2 ? -1 : 0);
for (;*s1; ++s1, ++s2) {
c1 = *s1; c2 = *s2;
if (c1 >= 'A' && c1 <= 'Z')
c1 += 'a' - 'A';
if (c2 >= 'A' && c2 <= 'Z')
c2 += 'a' - 'A';
if ((res = c1 - c2))
break;
}
return *s1 ? res : (*s2 ? -1 : 0);
}