00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
#include <pluginloaderbase.h>
00023
00024
#include <ksimpleconfig.h>
00025
#include <klocale.h>
00026
#include <kstandarddirs.h>
00027
#include <klibloader.h>
00028
#include <kglobal.h>
00029
#include <kdebug.h>
00030
00031
#include <qfile.h>
00032
#include <qstringlist.h>
00033
00034
static kdbgstream warning() {
00035
return kdWarning( 5300 ) <<
"PluginLoaderBase: ";
00036 }
00037
#ifndef NDEBUG
00038
static kdbgstream debug(
bool cond )
00039 #
else
00040
static kndbgstream debug(
bool cond )
00041 #endif
00042 {
00043
return kdDebug( cond, 5300 ) <<
"PluginLoaderBase: ";
00044 }
00045
00046
namespace KPIM {
00047
00048 PluginLoaderBase::PluginLoaderBase() : d(0) {}
00049 PluginLoaderBase::~PluginLoaderBase() {}
00050
00051
00052
QStringList PluginLoaderBase::types()
const {
00053
QStringList result;
00054
for (
QMap< QString, PluginMetaData >::const_iterator it = mPluginMap.begin();
00055 it != mPluginMap.end() ; ++it )
00056 result.push_back( it.key() );
00057
return result;
00058 }
00059
00060
const PluginMetaData * PluginLoaderBase::infoForName(
const QString & type )
const {
00061
return mPluginMap.contains( type ) ? &(mPluginMap[type]) : 0 ;
00062 }
00063
00064
00065
void PluginLoaderBase::doScan(
const char * path ) {
00066 mPluginMap.clear();
00067
00068
const QStringList list =
00069 KGlobal::dirs()->findAllResources(
"data", path,
true,
true );
00070
for ( QStringList::const_iterator it = list.begin() ;
00071 it != list.end() ; ++it ) {
00072 KSimpleConfig config( *it,
true );
00073
if ( config.hasGroup(
"Misc" ) && config.hasGroup(
"Plugin" ) ) {
00074 config.setGroup(
"Plugin" );
00075
00076
const QString type = config.readEntry(
"Type" ).lower();
00077
if ( type.isEmpty() ) {
00078 warning() <<
"missing or empty [Plugin]Type value in \""
00079 << *it <<
"\" - skipping" << endl;
00080
continue;
00081 }
00082
00083
const QString library = config.readEntry(
"X-KDE-Library" );
00084
if ( library.isEmpty() ) {
00085 warning() <<
"missing or empty [Plugin]X-KDE-Library value in \""
00086 << *it <<
"\" - skipping" << endl;
00087
continue;
00088 }
00089
00090 config.setGroup(
"Misc" );
00091
00092
QString name = config.readEntry(
"Name" );
00093
if ( name.isEmpty() ) {
00094 warning() <<
"missing or empty [Misc]Name value in \""
00095 << *it <<
"\" - inserting default name" << endl;
00096 name = i18n(
"Unnamed plugin");
00097 }
00098
00099
QString comment = config.readEntry(
"Comment" );
00100
if ( comment.isEmpty() ) {
00101 warning() <<
"missing or empty [Misc]Comment value in \""
00102 << *it <<
"\" - inserting default name" << endl;
00103 comment = i18n(
"No description available");
00104 }
00105
00106 mPluginMap.insert( type, PluginMetaData( library, name, comment ) );
00107 }
else {
00108 warning() <<
"Desktop file \"" << *it
00109 <<
"\" doesn't seem to describe a plugin "
00110 <<
"(misses Misc and/or Plugin group)" << endl;
00111 }
00112 }
00113 }
00114
00115
void * PluginLoaderBase::mainFunc(
const QString & type,
00116
const char * mf_name )
const {
00117
if ( type.isEmpty() || !mPluginMap.contains( type ) )
00118
return 0;
00119
00120
const QString libName = mPluginMap[ type ].library;
00121
if ( libName.isEmpty() )
00122
return 0;
00123
00124
const KLibrary * lib = openLibrary( libName );
00125
if ( !lib )
00126
return 0;
00127
00128 mPluginMap[ type ].loaded =
true;
00129
00130
const QString factory_name = libName +
'_' + mf_name;
00131
if ( !lib->hasSymbol( factory_name.latin1() ) ) {
00132 warning() <<
"No symbol named \"" << factory_name.latin1() <<
"\" ("
00133 << factory_name <<
") was found in library \"" << libName
00134 <<
"\"" << endl;
00135
return 0;
00136 }
00137
00138
return lib->symbol( factory_name.latin1() );
00139 }
00140
00141
const KLibrary * PluginLoaderBase::openLibrary(
const QString & libName )
const {
00142
00143
const QString path = KLibLoader::findLibrary( QFile::encodeName( libName ) );
00144
00145
if ( path.isEmpty() ) {
00146 warning() <<
"No plugin library named \"" << libName
00147 <<
"\" was found!" << endl;
00148
return 0;
00149 }
00150
00151
const KLibrary * library = KLibLoader::self()->library( QFile::encodeName( path ) );
00152
00153 debug( !library ) <<
"Could not load library '" << libName <<
"'" << endl;
00154
00155
return library;
00156 }
00157
00158
00159 };