kabc Library API Documentation

resourcefactory.cpp

00001 /*
00002     This file is part of libkabc.
00003     Copyright (c) 2002 Tobias Koenig <tokoe@kde.org>
00004 
00005     This library is free software; you can redistribute it and/or
00006     modify it under the terms of the GNU Library General Public
00007     License as published by the Free Software Foundation; either
00008     version 2 of the License, or (at your option) any later version.
00009 
00010     This library is distributed in the hope that it will be useful,
00011     but WITHOUT ANY WARRANTY; without even the implied warranty of
00012     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013     Library General Public License for more details.
00014 
00015     You should have received a copy of the GNU Library General Public License
00016     along with this library; see the file COPYING.LIB.  If not, write to
00017     the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00018     Boston, MA 02111-1307, USA.
00019 */
00020 
00021 #include <kdebug.h>
00022 #include <klocale.h>
00023 #include <ksimpleconfig.h>
00024 #include <kstandarddirs.h>
00025 
00026 #include <qfile.h>
00027 
00028 #include "resourcefile.h"
00029 #include "resourcefileconfig.h"
00030 
00031 #include "resourcefactory.h"
00032 
00033 using namespace KABC;
00034 
00035 ResourceFactory *ResourceFactory::mSelf = 0;
00036 
00037 ResourceFactory *ResourceFactory::self()
00038 {
00039   kdDebug(5700) << "ResourceFactory::self()" << endl;
00040 
00041   if ( !mSelf ) {
00042     mSelf = new ResourceFactory;
00043   }
00044 
00045   return mSelf;
00046 }
00047 
00048 ResourceFactory::ResourceFactory()
00049 {
00050   mResourceList.setAutoDelete( true );
00051 
00052   // dummy entry for default resource
00053   ResourceInfo *info = new ResourceInfo;
00054   mResourceList.insert( "file", info );
00055 
00056   QStringList list = KGlobal::dirs()->findAllResources( "data" ,"kabc/plugins/*.desktop", true, true );
00057   for ( QStringList::iterator it = list.begin(); it != list.end(); ++it ) {
00058     KSimpleConfig config( *it, true );
00059 
00060     if ( !config.hasGroup( "Misc" ) || !config.hasGroup( "Plugin" ) )
00061       continue;
00062 
00063     info = new ResourceInfo;
00064 
00065     config.setGroup( "Plugin" );
00066     QString type = config.readEntry( "Type" );
00067     info->library = config.readEntry( "X-KDE-Library" );
00068         
00069     config.setGroup( "Misc" );
00070     info->nameLabel = config.readEntry( "Name" );
00071     info->descriptionLabel = config.readEntry( "Comment", i18n( "No description available." ) );
00072 
00073     mResourceList.insert( type, info );
00074   }
00075 }
00076 
00077 ResourceFactory::~ResourceFactory()
00078 {
00079   mResourceList.clear();
00080 }
00081 
00082 QStringList ResourceFactory::resources()
00083 {
00084   QStringList retval;
00085         
00086   // make sure 'file' is the first entry
00087   retval << "file";
00088 
00089   QDictIterator<ResourceInfo> it( mResourceList );
00090   for ( ; it.current(); ++it )
00091     if ( it.currentKey() != "file" )
00092       retval << it.currentKey();
00093 
00094   return retval;
00095 }
00096 
00097 ResourceConfigWidget *ResourceFactory::configWidget( const QString& type, QWidget *parent )
00098 {
00099   ResourceConfigWidget *widget = 0;
00100 
00101   if ( type.isEmpty() )
00102     return 0;
00103 
00104   if ( type == "file" )
00105     return new ResourceFileConfig( parent, "ResourceFileConfig" );
00106 
00107   QString libName = mResourceList[ type ]->library;
00108 
00109   KLibrary *library = openLibrary( libName );
00110   if ( !library )
00111     return 0;
00112 
00113   void *widget_func = library->symbol( "config_widget" );
00114 
00115   if ( widget_func ) {
00116     widget = ((ResourceConfigWidget* (*)(QWidget *wdg))widget_func)( parent );
00117   } else {
00118     kdDebug( 5700 ) << "'" << libName << "' is not a kabc plugin." << endl;
00119     return 0;
00120   }
00121 
00122   return widget;
00123 }
00124 
00125 ResourceInfo *ResourceFactory::info( const QString &type )
00126 {
00127   if ( type.isEmpty() )
00128     return 0;
00129   else
00130     return mResourceList[ type ];
00131 }
00132 
00133 Resource *ResourceFactory::resource( const QString& type, AddressBook *ab, const KConfig *config )
00134 {
00135   Resource *resource = 0;
00136 
00137   if ( type.isEmpty() )
00138     return 0;
00139 
00140   if ( type == "file" ) {
00141     resource = new ResourceFile( ab, config );
00142     resource->setType( type );
00143     resource->setNameLabel( i18n( "File" ) );
00144     resource->setDescriptionLabel( i18n( "File Resource" ) );
00145     return resource;
00146   }
00147 
00148   QString libName = mResourceList[ type ]->library;
00149 
00150   KLibrary *library = openLibrary( libName );
00151   if ( !library )
00152     return 0;
00153 
00154   void *resource_func = library->symbol( "resource" );
00155 
00156   if ( resource_func ) {
00157     resource = ((Resource* (*)(AddressBook *, const KConfig *))resource_func)( ab, config );
00158     resource->setType( type );
00159     resource->setNameLabel( mResourceList[ type ]->nameLabel );
00160     resource->setDescriptionLabel( mResourceList[ type ]->descriptionLabel );
00161   } else {
00162     kdDebug( 5700 ) << "'" << libName << "' is not a kabc plugin." << endl;
00163     return 0;
00164   }
00165 
00166   return resource;
00167 }
00168 
00169 KLibrary *ResourceFactory::openLibrary( const QString& libName )
00170 {
00171   KLibrary *library = 0;
00172 
00173   QString path = KLibLoader::findLibrary( QFile::encodeName( libName ) );
00174 
00175   if ( path.isEmpty() ) {
00176     kdDebug( 5700 ) << "No resource plugin library was found!" << endl;
00177     return 0;
00178   }
00179 
00180   library = KLibLoader::self()->library( QFile::encodeName( path ) );
00181 
00182   if ( !library ) {
00183     kdDebug( 5700 ) << "Could not load library '" << libName << "'" << endl;
00184     return 0;
00185   }
00186 
00187   return library;
00188 }
KDE Logo
This file is part of the documentation for kdelibs Version 3.1.5.
Documentation copyright © 1996-2002 the KDE developers.
Generated on Wed Jan 28 13:29:21 2004 by doxygen 1.3.4 written by Dimitri van Heesch, © 1997-2001