00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
#include <config.h>
00022
00023
#include <kdebug.h>
00024
#include <kiconloader.h>
00025
#include <ktrader.h>
00026
#include <kmimetype.h>
00027
#include <klibloader.h>
00028
#include <kstaticdeleter.h>
00029
#include <kparts/componentfactory.h>
00030
00031
#include "kurifilter.h"
00032
00033
template class QPtrList<KURIFilterPlugin>;
00034
00035 KURIFilterPlugin::KURIFilterPlugin(
QObject *parent,
const char *name,
double pri )
00036 :
QObject( parent, name )
00037 {
00038 m_strName = QString::fromLatin1( name );
00039 m_dblPriority = pri;
00040 }
00041
00042 void KURIFilterPlugin::setFilteredURI(
KURIFilterData& data,
const KURL& uri )
const
00043
{
00044
if ( data.
uri() != uri )
00045 {
00046 data.
m_pURI = uri;
00047 data.
m_bChanged =
true;
00048 }
00049 }
00050
00051
class KURIFilterDataPrivate
00052 {
00053
public:
00054 KURIFilterDataPrivate() {};
00055
QString abs_path;
00056
QString args;
00057
QString typedString;
00058 };
00059
00060 KURIFilterData::KURIFilterData(
const KURIFilterData& data )
00061 {
00062 m_iType = data.
m_iType;
00063 m_pURI = data.
m_pURI;
00064 m_strErrMsg = data.
m_strErrMsg;
00065 m_strIconName = data.
m_strIconName;
00066 m_bChanged = data.
m_bChanged;
00067 m_bCheckForExecutables = data.
m_bCheckForExecutables;
00068 d =
new KURIFilterDataPrivate;
00069 d->abs_path = data.
absolutePath();
00070 d->typedString = data.
typedString();
00071 d->args = data.
argsAndOptions();
00072 }
00073
00074 KURIFilterData::~KURIFilterData()
00075 {
00076
delete d;
00077 d = 0;
00078 }
00079
00080 void KURIFilterData::init(
const KURL& url )
00081 {
00082 m_iType = KURIFilterData::UNKNOWN;
00083 m_pURI = url;
00084 m_strErrMsg = QString::null;
00085 m_strIconName = QString::null;
00086 m_bCheckForExecutables =
true;
00087 m_bChanged =
true;
00088 d =
new KURIFilterDataPrivate;
00089 d->typedString = url.url();
00090 }
00091
00092 void KURIFilterData::init(
const QString& url )
00093 {
00094 m_iType = KURIFilterData::UNKNOWN;
00095 m_pURI = url;
00096 m_strErrMsg = QString::null;
00097 m_strIconName = QString::null;
00098 m_bCheckForExecutables =
true;
00099 m_bChanged =
true;
00100 d =
new KURIFilterDataPrivate;
00101 d->typedString = url;
00102 }
00103
00104 QString KURIFilterData::typedString()
const
00105
{
00106
return d->typedString;
00107 }
00108
00109 void KURIFilterData::setCheckForExecutables(
bool check )
00110 {
00111 m_bCheckForExecutables = check;
00112 }
00113
00114 bool KURIFilterData::hasArgsAndOptions()
const
00115
{
00116
return !d->args.isEmpty();
00117 }
00118
00119 bool KURIFilterData::hasAbsolutePath()
const
00120
{
00121
return !d->abs_path.isEmpty();
00122 }
00123
00124 bool KURIFilterData::setAbsolutePath(
const QString& absPath )
00125 {
00126
00127
00128
if( (!m_pURI.
isValid() || m_pURI.
isLocalFile()) )
00129 {
00130 d->abs_path = absPath;
00131
return true;
00132 }
00133
return false;
00134 }
00135
00136 QString KURIFilterData::absolutePath()
const
00137
{
00138
return d->abs_path;
00139 }
00140
00141 QString KURIFilterData::argsAndOptions()
const
00142
{
00143
return d->args;
00144 }
00145
00146 QString KURIFilterData::iconName()
00147 {
00148
if( m_bChanged )
00149 {
00150
switch ( m_iType )
00151 {
00152
case KURIFilterData::LOCAL_FILE:
00153
case KURIFilterData::LOCAL_DIR:
00154
case KURIFilterData::NET_PROTOCOL:
00155 {
00156 m_strIconName =
KMimeType::iconForURL( m_pURI );
00157
break;
00158 }
00159
case KURIFilterData::EXECUTABLE:
00160 {
00161
QString exeName = m_pURI.
url();
00162 exeName = exeName.mid( exeName.findRev(
'/' ) + 1 );
00163
KService::Ptr service =
KService::serviceByDesktopName( exeName );
00164
if (service && service->icon() != QString::fromLatin1(
"unknown" ))
00165 m_strIconName = service->icon();
00166
00167
else if ( !
KGlobal::iconLoader()->
loadIcon( exeName, KIcon::NoGroup, 16, KIcon::DefaultState, 0,
true ).isNull() )
00168 m_strIconName = exeName;
00169
else
00170
00171 m_strIconName = QString::fromLatin1(
"exec");
00172
break;
00173 }
00174
case KURIFilterData::HELP:
00175 {
00176 m_strIconName = QString::fromLatin1(
"khelpcenter");
00177
break;
00178 }
00179
case KURIFilterData::SHELL:
00180 {
00181 m_strIconName = QString::fromLatin1(
"konsole");
00182
break;
00183 }
00184
case KURIFilterData::ERROR:
00185
case KURIFilterData::BLOCKED:
00186 {
00187 m_strIconName = QString::fromLatin1(
"error");
00188
break;
00189 }
00190
default:
00191 m_strIconName = QString::null;
00192
break;
00193 }
00194 m_bChanged =
false;
00195 }
00196
return m_strIconName;
00197 }
00198
00199
00200 void KURIFilterPlugin::setArguments(
KURIFilterData& data,
const QString& args )
const
00201
{
00202 data.
d->args = args;
00203 }
00204
00205
00206
KURIFilter *KURIFilter::m_self;
00207
static KStaticDeleter<KURIFilter> kurifiltersd;
00208
00209 KURIFilter *
KURIFilter::self()
00210 {
00211
if (!m_self)
00212 m_self = kurifiltersd.setObject(m_self,
new KURIFilter);
00213
return m_self;
00214 }
00215
00216 KURIFilter::KURIFilter()
00217 {
00218 m_lstPlugins.setAutoDelete(
true);
00219
loadPlugins();
00220 }
00221
00222 KURIFilter::~KURIFilter()
00223 {
00224 m_self = 0;
00225 }
00226
00227 bool KURIFilter::filterURI(
KURIFilterData& data,
const QStringList& filters )
00228 {
00229
bool filtered =
false;
00230
KURIFilterPluginList use_plugins;
00231
00232
00233
00234
if( filters.isEmpty() )
00235 use_plugins = m_lstPlugins;
00236
else
00237 {
00238
00239
for( QStringList::ConstIterator lst = filters.begin(); lst != filters.end(); ++lst )
00240 {
00241
QPtrListIterator<KURIFilterPlugin> it( m_lstPlugins );
00242
for( ; it.current() ; ++it )
00243 {
00244
if( (*lst) == it.current()->name() )
00245 {
00246
00247 use_plugins.append( it.current() );
00248
break;
00249 }
00250 }
00251 }
00252 }
00253
00254
QPtrListIterator<KURIFilterPlugin> it( use_plugins );
00255
00256
00257
for (; it.current() && !filtered; ++it)
00258 {
00259
00260 filtered |= it.current()->filterURI( data );
00261 }
00262
return filtered;
00263 }
00264
00265 bool KURIFilter::filterURI(
KURL& uri,
const QStringList& filters )
00266 {
00267
KURIFilterData data = uri;
00268
bool filtered =
filterURI( data, filters );
00269
if( filtered ) uri = data.
uri();
00270
return filtered;
00271 }
00272
00273 bool KURIFilter::filterURI(
QString& uri,
const QStringList& filters )
00274 {
00275
KURIFilterData data = uri;
00276
bool filtered =
filterURI( data, filters );
00277
if( filtered ) uri = data.
uri().
url();
00278
return filtered;
00279
00280 }
00281
00282 KURL KURIFilter::filteredURI(
const KURL &uri,
const QStringList& filters )
00283 {
00284
KURIFilterData data = uri;
00285
filterURI( data, filters );
00286
return data.
uri();
00287 }
00288
00289 QString KURIFilter::filteredURI(
const QString &uri,
const QStringList& filters )
00290 {
00291
KURIFilterData data = uri;
00292
filterURI( data, filters );
00293
return data.
uri().
url();
00294 }
00295
00296 QPtrListIterator<KURIFilterPlugin> KURIFilter::pluginsIterator()
const
00297
{
00298
return QPtrListIterator<KURIFilterPlugin>(m_lstPlugins);
00299 }
00300
00301 QStringList KURIFilter::pluginNames()
const
00302
{
00303
QStringList list;
00304
for(
QPtrListIterator<KURIFilterPlugin> i =
pluginsIterator(); *i; ++i)
00305 list.append((*i)->name());
00306
return list;
00307 }
00308
00309 void KURIFilter::loadPlugins()
00310 {
00311
KTrader::OfferList offers = KTrader::self()->query(
"KURIFilter/Plugin" );
00312
00313 KTrader::OfferList::ConstIterator it = offers.begin();
00314 KTrader::OfferList::ConstIterator end = offers.end();
00315
00316
for (; it != end; ++it )
00317 {
00318
KURIFilterPlugin *plugin = KParts::ComponentFactory::createInstanceFromService<KURIFilterPlugin>( *it, 0, (*it)->desktopEntryName().latin1() );
00319
if ( plugin )
00320 m_lstPlugins.append( plugin );
00321 }
00322
00323
00324
00325
00326
00327
00328 }
00329
00330
void KURIFilterPlugin::virtual_hook(
int,
void* )
00331 { }
00332
00333
#include "kurifilter.moc"