You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdelibs/kutils/kplugininfo.cpp

360 lines
9.6 KiB

/* This file is part of the KDE project
Copyright (C) 2003 Matthias Kretz <kretz@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.
*/
#include "kplugininfo.h"
#include <ksimpleconfig.h>
#include <ktrader.h>
#include <kdebug.h>
#include <kconfigbase.h>
#include <kglobal.h>
#include <kstandarddirs.h>
#include <kdesktopfile.h>
#include <kservice.h>
class KPluginInfo::KPluginInfoPrivate
{
public:
KPluginInfoPrivate()
: hidden( false )
, enabledbydefault( false )
, pluginenabled( false )
, config( 0 )
, kcmservicesCached( false )
{}
~KPluginInfoPrivate()
{
delete config;
}
QString specfile; // the filename of the file containing all the info
QString name;
QString comment;
QString icon;
QString author;
QString email;
QString pluginName; // the name attribute in the .rc file
QString version;
QString website; // URL to the website of the plugin/author
QString category;
QString license;
QStringList dependencies;
bool hidden;
bool enabledbydefault;
bool pluginenabled;
KConfig * config;
QString configgroup;
KService::Ptr service;
QValueList<KService::Ptr> kcmservices;
bool kcmservicesCached;
};
KPluginInfo::KPluginInfo( const QString & filename, const char* resource )
: d( new KPluginInfoPrivate )
{
KDesktopFile file( filename, true, resource );
d->specfile = filename;
if( filename.endsWith( QString::fromAscii( ".desktop" ) ) )
{
file.setDesktopGroup();
d->hidden = file.readBoolEntry( "Hidden", false );
if( d->hidden )
return;
d->name = file.readName();
d->comment = file.readComment();
d->icon = file.readEntry( "Icon" );
d->author = file.readEntry( "X-KDE-PluginInfo-Author" );
d->email = file.readEntry( "X-KDE-PluginInfo-Email" );
d->pluginName = file.readEntry( "X-KDE-PluginInfo-Name" );
d->version = file.readEntry( "X-KDE-PluginInfo-Version" );
d->website = file.readEntry( "X-KDE-PluginInfo-Website" );
d->category = file.readEntry( "X-KDE-PluginInfo-Category" );
d->license = file.readEntry( "X-KDE-PluginInfo-License" );
d->dependencies = file.readListEntry( "X-KDE-PluginInfo-Depends" );
d->enabledbydefault = file.readBoolEntry(
"X-KDE-PluginInfo-EnabledByDefault", false );
}
else if( filename.endsWith( QString::fromAscii( ".plugin" ) ) )
{ // provided for noatun style .plugin files compatibility
d->name = file.readName();
d->comment = file.readComment();
d->icon = file.readEntry( "Icon" );
d->author = file.readEntry( "Author" );
d->email = file.readEntry( "Email" );
d->pluginName = file.readPathEntry( "Filename" );
// no version
d->website = file.readEntry( "Site" );
d->category = file.readEntry( "Type" );
d->license = file.readEntry( "License" );
d->dependencies = file.readListEntry( "Require" );
}
}
KPluginInfo::KPluginInfo( const KService::Ptr service )
: d( new KPluginInfoPrivate )
{
d->service = service;
d->specfile = service->desktopEntryPath();
if ( service->isDeleted() )
{
d->hidden = true;
return;
}
d->name = service->name();
d->comment = service->comment();
d->icon = service->icon();
d->author = service->property( "X-KDE-PluginInfo-Author" ).toString();
d->email = service->property( "X-KDE-PluginInfo-Email" ).toString();
d->pluginName = service->property( "X-KDE-PluginInfo-Name" ).toString();
d->version = service->property( "X-KDE-PluginInfo-Version" ).toString();
d->website = service->property( "X-KDE-PluginInfo-Website" ).toString();
d->category = service->property( "X-KDE-PluginInfo-Category" ).toString();
d->license = service->property( "X-KDE-PluginInfo-License" ).toString();
d->dependencies =
service->property( "X-KDE-PluginInfo-Depends" ).toStringList();
QVariant tmp = service->property( "X-KDE-PluginInfo-EnabledByDefault" );
d->enabledbydefault = tmp.isValid() ? tmp.toBool() : false;
}
//X KPluginInfo::KPluginInfo()
//X : d( new KPluginInfoPrivate )
//X {
//X d->hidden = true;
//X }
KPluginInfo::~KPluginInfo()
{
delete d;
}
QValueList<KPluginInfo*> KPluginInfo::fromServices( const KService::List & services, KConfig * config, const QString & group )
{
QValueList<KPluginInfo*> infolist;
KPluginInfo * info;
for( KService::List::ConstIterator it = services.begin();
it != services.end(); ++it )
{
info = new KPluginInfo( *it );
info->setConfig( config, group );
infolist += info;
}
return infolist;
}
QValueList<KPluginInfo*> KPluginInfo::fromFiles( const QStringList & files, KConfig * config, const QString & group )
{
QValueList<KPluginInfo*> infolist;
for( QStringList::ConstIterator it = files.begin(); it != files.end(); ++it )
{
KPluginInfo * info = new KPluginInfo( *it );
info->setConfig( config, group );
infolist += info;
}
return infolist;
}
QValueList<KPluginInfo*> KPluginInfo::fromKPartsInstanceName( const QString & name, KConfig * config, const QString & group )
{
QStringList files = KGlobal::dirs()->findAllResources( "data", name +
"/kpartplugins/*.desktop", true, false );
return fromFiles( files, config, group );
}
bool KPluginInfo::isHidden() const
{
return d->hidden;
}
void KPluginInfo::setPluginEnabled( bool enabled )
{
kdDebug( 703 ) << k_funcinfo << endl;
d->pluginenabled = enabled;
}
bool KPluginInfo::isPluginEnabled() const
{
kdDebug( 703 ) << k_funcinfo << endl;
return d->pluginenabled;
}
bool KPluginInfo::isPluginEnabledByDefault() const
{
kdDebug( 703 ) << k_funcinfo << endl;
return d->enabledbydefault;
}
const QString & KPluginInfo::name() const
{
return d->name;
}
const QString & KPluginInfo::comment() const
{
return d->comment;
}
const QString & KPluginInfo::icon() const
{
return d->icon;
}
const QString & KPluginInfo::specfile() const
{
return d->specfile;
}
const QString & KPluginInfo::author() const
{
return d->author;
}
const QString & KPluginInfo::email() const
{
return d->email;
}
const QString & KPluginInfo::category() const
{
return d->category;
}
const QString & KPluginInfo::pluginName() const
{
return d->pluginName;
}
const QString & KPluginInfo::version() const
{
return d->version;
}
const QString & KPluginInfo::website() const
{
return d->website;
}
const QString & KPluginInfo::license() const
{
return d->license;
}
const QStringList & KPluginInfo::dependencies() const
{
return d->dependencies;
}
KService::Ptr KPluginInfo::service() const
{
return d->service;
}
const QValueList<KService::Ptr> & KPluginInfo::kcmServices() const
{
if ( !d->kcmservicesCached )
{
d->kcmservices = KTrader::self()->query( "KCModule", "'" + d->pluginName +
"' in [X-KDE-ParentComponents]" );
kdDebug( 703 ) << "found " << d->kcmservices.count() << " offers for " <<
d->pluginName << endl;
d->kcmservicesCached = true;
}
return d->kcmservices;
}
void KPluginInfo::setConfig( KConfig * config, const QString & group )
{
d->config = config;
d->configgroup = group;
}
KConfig * KPluginInfo::config() const
{
return d->config;
}
const QString & KPluginInfo::configgroup() const
{
return d->configgroup;
}
QVariant KPluginInfo::property( const QString & key ) const
{
if( d->service )
return d->service->property( key );
else
return QVariant();
}
QVariant KPluginInfo::operator[]( const QString & key ) const
{
return property( key );
}
void KPluginInfo::save( KConfigGroup * config )
{
kdDebug( 703 ) << k_funcinfo << endl;
if( 0 == config )
{
if( 0 == d->config )
{
kdWarning( 703 ) << "no KConfigGroup, cannot save" << endl;
return;
}
d->config->setGroup( d->configgroup );
d->config->writeEntry( d->pluginName + "Enabled", isPluginEnabled() );
}
else
config->writeEntry( d->pluginName + "Enabled", isPluginEnabled() );
}
void KPluginInfo::load( KConfigGroup * config )
{
kdDebug( 703 ) << k_funcinfo << endl;
if( 0 == config )
{
if( 0 == d->config )
{
kdWarning( 703 ) << "no KConfigGroup, cannot load" << endl;
return;
}
d->config->setGroup( d->configgroup );
setPluginEnabled( d->config->readBoolEntry( d->pluginName + "Enabled", isPluginEnabledByDefault() ) );
}
else
setPluginEnabled( config->readBoolEntry( d->pluginName + "Enabled", isPluginEnabledByDefault() ) );
}
void KPluginInfo::defaults()
{
kdDebug( 703 ) << k_funcinfo << endl;
setPluginEnabled( isPluginEnabledByDefault() );
}
// vim: sw=4 sts=4 et