/usr/include/klibloader.h is in kdelibs5-dev 4:4.14.38-0ubuntu3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 | /* This file is part of the KDE libraries
Copyright (C) 1999 Torben Weis <weis@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.
*/
#ifndef KLIBLOADER_H
#define KLIBLOADER_H
#include <kglobal.h>
#include <QtCore/QObject>
#include <QtCore/QStringList>
#include <QtCore/QHash>
#include <QtCore/QLibrary>
#include <QtCore/QtPlugin>
#include "kpluginfactory.h"
#include "kpluginloader.h"
#include "klibrary.h"
#ifndef KDE_NO_DEPRECATED
# define K_EXPORT_COMPONENT_FACTORY( libname, factory ) \
extern "C" { KDE_EXPORT KPluginFactory *init_##libname() { return new factory; } }
/**
* \class KLibLoader klibloader.h <KLibLoader>
*
* The KLibLoader allows you to load libraries dynamically at runtime.
* Dependent libraries are loaded automatically.
*
* KLibLoader follows the singleton pattern. You can not create multiple
* instances. Use self() to get a pointer to the loader.
*
* @deprecated You have two other possibilites:
* - KPluginLoader or KService::createInstance for plugins
* - KLibrary for other libraries
*
* @see KLibrary
* @see KPluginLoader
* @author Torben Weis <weis@kde.org>
*/
class KDECORE_EXPORT KLibLoader : public QObject //krazy:exclude=dpointer (private class is kept as a global static)
{
friend class KLibrary;
friend class KLibraryPrivate;
friend class KLibLoaderPrivate;
Q_OBJECT
public:
/**
* Loads and initializes a library. Loading a library multiple times is
* handled gracefully.
*
* This is a convenience function that returns the factory immediately
* @param libname This is the library name without extension. Usually that is something like
* "libkspread". The function will then search for a file named
* "libkspread.la" in the KDE library paths.
* The *.la files are created by libtool and contain
* important information especially about the libraries dependencies
* on other shared libs. Loading a "libfoo.so" could not solve the
* dependencies problem.
*
* You can, however, give a library name ending in ".so"
* (or whatever is used on your platform), and the library
* will be loaded without resolving dependencies. Use with caution.
* @param loadHint provides more control over how the library is loaded
* @return the KPluginFactory, or 0 if the library does not exist or it does
* not have a factory
* @see library
*/
KPluginFactory* factory( const QString &libname, QLibrary::LoadHints loadHint = 0);
/**
* Loads and initializes a library. Loading a library multiple times is
* handled gracefully.
*
* @param libname This is the library name without extension. Usually that is something like
* "libkspread". The function will then search for a file named
* "libkspread.la" in the KDE library paths.
* The *.la files are created by libtool and contain
* important information especially about the libraries dependencies
* on other shared libs. Loading a "libfoo.so" could not solve the
* dependencies problem.
*
* You can, however, give a library name ending in ".so"
* (or whatever is used on your platform), and the library
* will be loaded without resolving dependencies. Use with caution.
* @param loadHint provides more control over how the library is loaded
* @return KLibrary is invalid (0) when the library couldn't be dlopened. in such
* a case you can retrieve the error message by calling KLibLoader::lastErrorMessage()
*
* @see factory
*/
KLibrary* library( const QString &libname, QLibrary::LoadHints loadHint = 0 );
/**
* Returns an error message that can be useful to debug the problem.
* Returns QString() if the last call to library() was successful.
* You can call this function more than once. The error message is only
* reset by a new call to library().
* @return the last error message, or QString() if there was no error
*/
QString lastErrorMessage() const;
/**
* Unloads the library with the given name.
* @param libname This is the library name without extension. Usually that is something like
* "libkspread". The function will then search for a file named
* "libkspread.la" in the KDE library paths.
* The *.la files are created by libtool and contain
* important information especially about the libraries dependencies
* on other shared libs. Loading a "libfoo.so" could not solve the
* dependencies problem.
*
* You can, however, give a library name ending in ".so"
* (or whatever is used on your platform), and the library
* will be loaded without resolving dependencies. Use with caution.
*/
void unloadLibrary( const QString &libname );
/**
* Returns a pointer to the factory.
*
* Use this function to get an instance of KLibLoader.
*
* @return a pointer to the loader. If no loader exists until now
* then one is created.
*
* @deprecated use KPluginLoader instead
*/
static KDE_DEPRECATED KLibLoader* self();
/**
* Helper method which looks for a library in the standard paths
* ("module" and "lib" resources).
* Made public for code that doesn't use KLibLoader itself, but still
* wants to open modules.
* @param libname of the library. If it is not a path, the function searches in
* the "module" and "lib" resources. If there is no extension,
* ".la" will be appended.
* @param cData a KComponentData used to get the standard paths
* @return the name of the library if it was found, an empty string otherwise
*/
static QString findLibrary(const QString &libname, const KComponentData &cData = KGlobal::mainComponent());
/**
* This enum type defines the possible error cases that can happen
* when loading a component.
*
* Use errorString() to convert the error code to a human-readable string
*/
enum ComponentLoadingError {
ErrNoLibrary = 1, /*< the specified library could not be loaded. Use KLibLoader::lastErrorMessage for details*/
ErrNoFactory, /*< the library does not export a factory */
ErrNoComponent, /*< the factory does not support creating components of the specified type */
ErrServiceProvidesNoLibrary, /*< the specified service provides no shared library (when using KService) */
ErrNoServiceFound /*< no service implementing the given servicetype and fullfilling the given constraint expression can be found (when using KServiceTypeTrader) */
};
/**
* Converts a numerical error code into a human-readable error message
*
* @param componentLoadingError the error code, as set using the @p error
* parameter of createInstance()
* @return the translated error message describing the error represented
* by @p componentLoadingError
*
* @see ComponentLoadingError
*/
static QString errorString( int componentLoadingError );
/**
* This template allows to load the specified library and ask the
* factory to create an instance of the given template type.
*
* @param keyword the keyword for the plugin - see KPluginFactory::registerPlugin()
* @param libname the library to open
* @param parent the parent object (see QObject constructor)
* @param args a list of string arguments, passed to the factory and possibly
* to the component (see KPluginFactory)
* @param error if not null, the int will be set to 0 on success or one of the
* error codes defined by ComponentLoadingError if there was an error
* @return a pointer to the newly created object or a null pointer if the
* factory was unable to create an object of the given type
* @deprecated Use KService::createInstance() or KPluginLoader instead
*/
template <typename T>
static KDE_DEPRECATED T *createInstance(const QString &keyword, const QString &libname, QObject *parent = 0,
const QVariantList &args = QVariantList(),
int *error = 0 )
{
KLibrary *library = KLibLoader::self()->library( libname );
if ( !library )
{
if ( error )
*error = ErrNoLibrary;
return 0;
}
KPluginFactory *factory = library->factory();
if ( !factory )
{
library->unload();
if ( error )
*error = ErrNoFactory;
return 0;
}
QObject *object = factory->template create<T>(keyword, parent, args);
T *res = qobject_cast<T *>( object );
if ( !res )
{
delete object;
library->unload();
if ( error )
*error = ErrNoComponent;
}
return res;
}
/**
* This template allows to load the specified library and ask the
* factory to create an instance of the given template type.
*
* @param libname the library to open
* @param parent the parent object (see QObject constructor)
* @param args a list of string arguments, passed to the factory and possibly
* to the component (see KPluginFactory)
* @param error if not null, the int will be set to 0 on success or one of the
* error codes defined by ComponentLoadingError if there was an error
* @return a pointer to the newly created object or a null pointer if the
* factory was unable to create an object of the given type
* @deprecated Use KService::createInstance() or KPluginLoader instead
*/
template <typename T>
static KDE_DEPRECATED T *createInstance( const QString &libname, QObject *parent = 0,
const QVariantList &args = QVariantList(),
int *error = 0 )
{
return createInstance<T>(QString(), libname, parent, args, error);
}
/**
* @deprecated Use one of the other createInstance methods or
* KPluginLoader or KService::createInstance instead
*/
template <typename T>
static KDE_DEPRECATED T *createInstance( const QString &libname, QObject *parent,
const QStringList &args,
int *error = 0 )
{
KLibrary *library = KLibLoader::self()->library( libname );
if ( !library )
{
if ( error )
*error = ErrNoLibrary;
return 0;
}
KPluginFactory *factory = library->factory();
if ( !factory )
{
library->unload();
if ( error )
*error = ErrNoFactory;
return 0;
}
QObject *object = factory->template create<T>(parent, args);
T *res = qobject_cast<T *>( object );
if ( !res )
{
delete object;
library->unload();
if ( error )
*error = ErrNoComponent;
}
return res;
}
private:
~KLibLoader();
KLibLoader();
};
#endif
#endif
|