summaryrefslogtreecommitdiffstats
path: root/kutils/kcmoduleloader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kutils/kcmoduleloader.cpp')
-rw-r--r--kutils/kcmoduleloader.cpp302
1 files changed, 0 insertions, 302 deletions
diff --git a/kutils/kcmoduleloader.cpp b/kutils/kcmoduleloader.cpp
deleted file mode 100644
index c8327a25e..000000000
--- a/kutils/kcmoduleloader.cpp
+++ /dev/null
@@ -1,302 +0,0 @@
-/*
- Copyright (c) 1999 Matthias Hoelzer-Kluepfel <hoelzer@kde.org>
- Copyright (c) 2000 Matthias Elter <elter@kde.org>
- Copyright (c) 2003,2004 Matthias Kretz <kretz@kde.org>
- Copyright (c) 2004 Frans Englich <frans.englich@telia.com>
-
- This file is part of the KDE project
-
- 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 <tqfile.h>
-#include <tqlabel.h>
-#include <tqlayout.h>
-
-#include <kapplication.h>
-#include <kdebug.h>
-#include <klocale.h>
-#include <kmessagebox.h>
-#include <kparts/componentfactory.h>
-
-#include "kcmoduleloader.h"
-
-
-/***************************************************************/
-/**
- * When something goes wrong in loading the module, this one
- * jumps in as a "dummy" module.
- */
-class KCMError : public KCModule
-{
- public:
- KCMError( const TQString& msg, const TQString& details, TQWidget* parent )
- : KCModule( parent, "KCMError" )
- {
- TQVBoxLayout* topLayout = new TQVBoxLayout( this );
- topLayout->addWidget( new TQLabel( msg, this ) );
- topLayout->addWidget( new TQLabel( details, this ) );
- }
-};
-/***************************************************************/
-
-
-
-
-KCModule* KCModuleLoader::load(const KCModuleInfo &mod, const TQString &libname,
- KLibLoader *loader, ErrorReporting report, TQWidget * parent,
- const char * name, const TQStringList & args )
-{
- // attempt to load modules with ComponentFactory, only if the symbol init_<lib> exists
- // (this is because some modules, e.g. kcmkio with multiple modules in the library,
- // cannot be ported to KGenericFactory)
- KLibrary *lib = loader->library(TQFile::encodeName(libname.arg(mod.library())));
- if (lib) {
- TQString initSym("init_");
- initSym += libname.arg(mod.library());
-
- if ( lib->hasSymbol(TQFile::encodeName(initSym)) )
- {
- KLibFactory *factory = lib->factory();
- if ( factory )
- {
- KCModule *module = KParts::ComponentFactory::createInstanceFromFactory<KCModule>( factory, TQT_TQOBJECT(parent), name ? name : mod.handle().latin1(), args );
- if (module)
- return module;
- }
- // else do a fallback
- kdDebug(1208) << "Unable to load module using ComponentFactory. Falling back to old loader." << endl;
- }
-
- // get the create_ function
- TQString factory("create_%1");
- void *create = lib->symbol(TQFile::encodeName(factory.arg(mod.handle())));
-
- if (create)
- {
- // create the module
- KCModule* (*func)(TQWidget *, const char *);
- func = (KCModule* (*)(TQWidget *, const char *)) create;
- return func( parent, name ? name : mod.handle().latin1() );
- }
- else
- {
- TQString libFileName = lib->fileName();
- lib->unload();
- return reportError( report, i18n("<qt>There was an error when loading the module '%1'.<br><br>"
- "The desktop file (%2) as well as the library (%3) was found but "
- "yet the module could not be loaded properly. Most likely "
- "the factory declaration was wrong, or the "
- "create_* function was missing.</qt>")
- .arg( mod.moduleName() )
- .arg( mod.fileName() )
- .arg( libFileName ),
- TQString::null, parent );
- }
-
- lib->unload();
- }
- return reportError( report, i18n("The specified library %1 could not be found.")
- .arg( mod.library() ), TQString::null, parent );
- return 0;
-}
-
-KCModule* KCModuleLoader::loadModule(const KCModuleInfo &mod, bool withfallback, TQWidget * parent, const char * name, const TQStringList & args )
-{
- return loadModule( mod, None, withfallback, parent, name, args );
-}
-
-KCModule* KCModuleLoader::loadModule(const KCModuleInfo &mod, ErrorReporting report, bool withfallback, TQWidget * parent, const char * name, const TQStringList & args )
-{
- /*
- * Simple libraries as modules are the easiest case:
- * We just have to load the library and get the module
- * from the factory.
- */
-
- if ( !mod.service() )
- {
- if ( mod.moduleName() == "kcmlisa" || mod.moduleName() == "kcmkiolan" )
- {
- return reportError( report,
- i18n("The module %1 could not be found.")
- .arg( mod.moduleName() ),
- i18n("<qt><p>The Lisa and lan:/ ioslave modules "
- "are not installed by default in Kubuntu, because they are obsolete "
- "and replaced by zeroconf.<br> If you still wish to use them, you "
- "should install the lisa package from the Universe repository.</p></qt>"),
- parent );
- } else {
- return reportError( report,
- i18n("The module %1 could not be found.")
- .arg( mod.moduleName() ),
- i18n("<qt><p>The diagnostics is:<br>The desktop file %1 could not be found.</p></qt>").arg(mod.fileName()),
- parent );
- }
- }
-
- if (!mod.library().isEmpty())
- {
- // get the library loader instance
-
- KLibLoader *loader = KLibLoader::self();
-
- KCModule *module = load(mod, "kcm_%1", loader, report, parent, name, args );
- /*
- * Only try to load libkcm_* if it exists, otherwise KLibLoader::lastErrorMessage would say
- * "libkcm_foo not found" instead of the real problem with loading kcm_foo.
- */
- if (!KLibLoader::findLibrary( TQCString( "libkcm_" ) + TQFile::encodeName( mod.library() ) ).isEmpty() )
- module = load(mod, "libkcm_%1", loader, report, parent, name, args );
- if (module)
- return module;
- return reportError( report,
- i18n("The module %1 could not be loaded.")
- .arg( mod.moduleName() ), TQString::null, parent );
- }
-
- /*
- * Ok, we could not load the library.
- * Try to run it as an executable.
- * This must not be done when calling from kcmshell, or you'll
- * have infinite recursion
- * (startService calls kcmshell which calls modloader which calls startService...)
- *
- */
- if(withfallback)
- {
- KApplication::startServiceByDesktopPath(mod.fileName(), TQString::null);
- }
- else
- {
- return reportError( report,
- i18n("The module %1 is not a valid configuration module.")
- .arg( mod.moduleName() ), i18n("<qt><p>The diagnostics is:<br>The desktop file %1 does not specify a library.</qt>").arg(mod.fileName()), parent );
- }
-
- return 0;
-}
-
-KCModule* KCModuleLoader::loadModule(const TQString &module, TQWidget *parent,
- const char *name, const TQStringList & args)
-{
- return loadModule(KCModuleInfo(module), None, false, parent, name, args);
-}
-
-KCModule* KCModuleLoader::loadModule(const TQString &module, ErrorReporting
- report, TQWidget *parent, const char *name, const TQStringList & args)
-{
- return loadModule(KCModuleInfo(module), report, false, parent, name, args);
-}
-
-void KCModuleLoader::unloadModule(const KCModuleInfo &mod)
-{
- // get the library loader instance
- KLibLoader *loader = KLibLoader::self();
-
- // try to unload the library
- TQString libname("libkcm_%1");
- loader->unloadLibrary(TQFile::encodeName(libname.arg(mod.library())));
-
- libname = "kcm_%1";
- loader->unloadLibrary(TQFile::encodeName(libname.arg(mod.library())));
-}
-
-void KCModuleLoader::showLastLoaderError(TQWidget *parent)
-{
- KMessageBox::detailedError(parent,
- i18n("There was an error loading the module."),i18n("<qt><p>The diagnostics is:<br>%1"
- "<p>Possible reasons:</p><ul><li>An error occurred during your last "
- "TDE upgrade leaving an orphaned control module<li>You have old third party "
- "modules lying around.</ul><p>Check these points carefully and try to remove "
- "the module mentioned in the error message. If this fails, consider contacting "
- "your distributor or packager.</p></qt>")
- .arg(KLibLoader::self()->lastErrorMessage()));
-
-}
-
-bool KCModuleLoader::testModule( const TQString& module )
-{
- return testModule( KCModuleInfo( module ) );
-}
-
-bool KCModuleLoader::testModule( const KCModuleInfo& module )
-{
- if (!module.service())
- {
- kdDebug(1208) << "Module '" << module.fileName() << "' not found." << endl;
- return true;
- }
-
- bool doLoad = module.service()->property( "X-TDE-Test-Module", TQVariant::Bool ).toBool();
- if( !doLoad )
- {
- return true;
- }
- else
- {
- /**
- * If something fails we return true - we can't risk functionality becoming
- * unavailable because of a buggy test. Furthermore, the error needs to
- * show so it is discovered. KCModuleProxy will detect the error and load
- * a corresponding KCMError.
- * */
- KLibLoader* loader = KLibLoader::self();
- KLibrary* library = loader->library( TQFile::encodeName((TQString("kcm_%1").arg(module.library()))) );
- if( library )
- {
- void *test_func = library->symbol( TQString(TQString("test_%1").arg(module.factoryName())).utf8() );
- if( test_func )
- {
- bool (*func)() = (bool(*)())test_func;
- if( func() )
- {
- return true;
- }
- else
- {
- return false;
- }
- }
- else
- {
- kdDebug(1208) << "The test function for module '" << module.fileName() << "' could not be found." << endl;
- return true;
- }
- }
- kdDebug(1208) << "The library '" << module.library() << "' could not be found." << endl;
- return true;
- }
-}
-
-KCModule* KCModuleLoader::reportError( ErrorReporting report, const TQString & text,
- TQString details, TQWidget * parent )
-{
- if( details.isNull() )
- details = i18n("<qt><p>The diagnostics is:<br>%1"
- "<p>Possible reasons:</p><ul><li>An error occurred during your last "
- "TDE upgrade leaving an orphaned control module<li>You have old third party "
- "modules lying around.</ul><p>Check these points carefully and try to remove "
- "the module mentioned in the error message. If this fails, consider contacting "
- "your distributor or packager.</p></qt>").arg(KLibLoader::self()->lastErrorMessage());
- if( report & Dialog )
- KMessageBox::detailedError( parent, text, details );
- if( report & Inline )
- return new KCMError( text, details, parent );
- return 0;
-}
-
-// vim: ts=2 sw=2 et
-