factory.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <kdebug.h>
00025 #include <klocale.h>
00026 #include <ksimpleconfig.h>
00027 #include <kstandarddirs.h>
00028 #include <kstaticdeleter.h>
00029
00030 #include <qfile.h>
00031
00032 #include "resource.h"
00033 #include "factory.h"
00034
00035 using namespace KRES;
00036
00037 QDict<Factory> *Factory::mSelves = 0;
00038 static KStaticDeleter< QDict<Factory> > staticDeleter;
00039
00040 Factory *Factory::self( const QString& resourceFamily )
00041 {
00042 kdDebug(5650) << "Factory::self()" << endl;
00043
00044 Factory *factory = 0;
00045 if ( !mSelves )
00046 staticDeleter.setObject( mSelves, new QDict<Factory> );
00047
00048 factory = mSelves->find( resourceFamily );
00049
00050 if ( !factory ) {
00051 factory = new Factory( resourceFamily );
00052 mSelves->insert( resourceFamily, factory );
00053 }
00054
00055 return factory;
00056 }
00057
00058 Factory::Factory( const QString& resourceFamily ) :
00059 mResourceFamily( resourceFamily )
00060 {
00061 KTrader::OfferList plugins = KTrader::self()->query( "KResources/Plugin", QString( "[X-KDE-ResourceFamily] == '%1'" )
00062 .arg( resourceFamily ) );
00063 KTrader::OfferList::ConstIterator it;
00064 for ( it = plugins.begin(); it != plugins.end(); ++it ) {
00065 QVariant type = (*it)->property( "X-KDE-ResourceType" );
00066 if ( !type.toString().isEmpty() )
00067 mTypeMap.insert( type.toString(), *it );
00068 }
00069 }
00070
00071 Factory::~Factory()
00072 {
00073 }
00074
00075 QStringList Factory::typeNames() const
00076 {
00077 return mTypeMap.keys();
00078 }
00079
00080 ConfigWidget *Factory::configWidget( const QString& type, QWidget *parent )
00081 {
00082 if ( type.isEmpty() || !mTypeMap.contains( type ) )
00083 return 0;
00084
00085 KService::Ptr ptr = mTypeMap[ type ];
00086 KLibFactory *factory = KLibLoader::self()->factory( ptr->library().latin1() );
00087 if ( !factory ) {
00088 kdDebug(5650) << "KRES::Factory::configWidget(): Factory creation failed"
00089 << endl;
00090 return 0;
00091 }
00092
00093 PluginFactoryBase *pluginFactory = static_cast<PluginFactoryBase *>( factory );
00094
00095 if ( !pluginFactory ) {
00096 kdDebug(5650) << "KRES::Factory::configWidget(): no plugin factory."
00097 << endl;
00098 return 0;
00099 }
00100
00101 ConfigWidget *wdg = pluginFactory->configWidget( parent );
00102 if ( !wdg ) {
00103 kdDebug(5650) << "'" << ptr->library() << "' is not a " + mResourceFamily +
00104 " plugin." << endl;
00105 return 0;
00106 }
00107
00108 return wdg;
00109 }
00110
00111 QString Factory::typeName( const QString &type ) const
00112 {
00113 if ( type.isEmpty() || !mTypeMap.contains( type ) )
00114 return QString();
00115
00116 KService::Ptr ptr = mTypeMap[ type ];
00117 return ptr->name();
00118 }
00119
00120 QString Factory::typeDescription( const QString &type ) const
00121 {
00122 if ( type.isEmpty() || !mTypeMap.contains( type ) )
00123 return QString();
00124
00125 KService::Ptr ptr = mTypeMap[ type ];
00126 return ptr->comment();
00127 }
00128
00129 Resource *Factory::resource( const QString& type, const KConfig *config )
00130 {
00131 kdDebug(5650) << "Factory::resource( " << type << ", config )" << endl;
00132
00133 if ( type.isEmpty() || !mTypeMap.contains( type ) )
00134 return 0;
00135
00136 KService::Ptr ptr = mTypeMap[ type ];
00137 KLibFactory *factory = KLibLoader::self()->factory( ptr->library().latin1() );
00138 if ( !factory ) {
00139 kdDebug(5650) << "KRES::Factory::resource(): Factory creation failed"
00140 << endl;
00141 return 0;
00142 }
00143
00144 PluginFactoryBase *pluginFactory = static_cast<PluginFactoryBase *>( factory );
00145
00146 if ( !pluginFactory ) {
00147 kdDebug(5650) << "KRES::Factory::resource(): no plugin factory." << endl;
00148 return 0;
00149 }
00150
00151 Resource *resource = pluginFactory->resource( config );
00152 if ( !resource ) {
00153 kdDebug(5650) << "'" << ptr->library() << "' is not a " + mResourceFamily +
00154 " plugin." << endl;
00155 return 0;
00156 }
00157
00158 resource->setType( type );
00159
00160 return resource;
00161 }
This file is part of the documentation for kresources Library Version 3.2.1.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Thu Mar 4 22:44:50 2004 by
doxygen 1.3.6-20040222 written by
Dimitri van Heesch, © 1997-2003