1 /* This file is part of the KDE libraries
2 * Copyright (C) 2000 Yves Arrouye <yves@realnames.com>
3 * Copyright (C) 2000 Dawit Alemayehu <adawit at kde.org>
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Library General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Library General Public License for more details.
15 * You should have received a copy of the GNU Library General Public License
16 * along with this library; see the file COPYING.LIB. If not, write to
17 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 * Boston, MA 02110-1301, USA.
21 #include "kurifilter.h"
27 #include <kiconloader.h>
28 #include <kservicetypetrader.h>
29 #include <kmimetype.h>
31 typedef QList
<KUriFilterPlugin
*> KUriFilterPluginList
;
33 class KUriFilterDataPrivate
36 explicit KUriFilterDataPrivate( const KUrl
& url
, const QString
& typedUrl
) :
37 bCheckForExecutables(true),
40 iType(KUriFilterData::Unknown
),
44 void setData( const KUrl
& url
, const QString
& typedUrl
)
46 bCheckForExecutables
= true;
51 iType
= KUriFilterData::Unknown
;
52 typedString
= typedUrl
;
54 KUriFilterDataPrivate( KUriFilterDataPrivate
* data
)
58 strErrMsg
= data
->strErrMsg
;
59 strIconName
= data
->strIconName
;
60 bChanged
= data
->bChanged
;
61 bCheckForExecutables
= data
->bCheckForExecutables
;
62 abs_path
= data
->abs_path
;
63 typedString
= data
->typedString
;
66 bool bCheckForExecutables
;
73 KUriFilterData::UriTypes iType
;
80 KUriFilterData::KUriFilterData()
81 : d( new KUriFilterDataPrivate( KUrl(), QString() ) )
85 KUriFilterData::KUriFilterData( const KUrl
& url
)
86 : d( new KUriFilterDataPrivate( url
, url
.url() ) )
90 KUriFilterData::KUriFilterData( const QString
& url
)
91 : d( new KUriFilterDataPrivate( KUrl(url
), url
) )
97 KUriFilterData::KUriFilterData( const KUriFilterData
& data
)
98 : d( new KUriFilterDataPrivate( data
.d
) )
102 KUriFilterData::~KUriFilterData()
107 KUrl
KUriFilterData::uri() const
112 QString
KUriFilterData::errorMsg() const
117 KUriFilterData::UriTypes
KUriFilterData::uriType() const
122 void KUriFilterData::setData( const KUrl
& url
)
124 d
->setData(url
, url
.url());
127 void KUriFilterData::setData( const QString
& url
)
129 d
->setData(KUrl(url
), url
);
132 bool KUriFilterData::setAbsolutePath( const QString
& absPath
)
134 // Since a malformed URL could possibly be a relative
135 // URL we tag it as a possible local resource...
136 if( (d
->pURI
.protocol().isEmpty() || d
->pURI
.isLocalFile()) )
138 d
->abs_path
= absPath
;
144 QString
KUriFilterData::absolutePath() const
149 bool KUriFilterData::hasAbsolutePath() const
151 return !d
->abs_path
.isEmpty();
154 QString
KUriFilterData::argsAndOptions() const
159 bool KUriFilterData::hasArgsAndOptions() const
161 return !d
->args
.isEmpty();
164 QString
KUriFilterData::iconName()
170 case KUriFilterData::LocalFile
:
171 case KUriFilterData::LocalDir
:
172 case KUriFilterData::NetProtocol
:
174 d
->strIconName
= KMimeType::iconNameForUrl( d
->pURI
);
177 case KUriFilterData::Executable
:
179 QString exeName
= d
->pURI
.url();
180 exeName
= exeName
.mid( exeName
.lastIndexOf( '/' ) + 1 ); // strip path if given
181 KService::Ptr service
= KService::serviceByDesktopName( exeName
);
182 if (service
&& service
->icon() != QLatin1String( "unknown" ))
183 d
->strIconName
= service
->icon();
184 // Try to find an icon with the same name as the binary (useful for non-kde apps)
185 else if ( !KIconLoader::global()->loadIcon( exeName
, KIconLoader::NoGroup
, 16, KIconLoader::DefaultState
, QStringList(), 0, true ).isNull() )
186 d
->strIconName
= exeName
;
188 // not found, use default
189 d
->strIconName
= QLatin1String("system-run");
192 case KUriFilterData::Help
:
194 d
->strIconName
= QLatin1String("khelpcenter");
197 case KUriFilterData::Shell
:
199 d
->strIconName
= QLatin1String("konsole");
202 case KUriFilterData::Error
:
203 case KUriFilterData::Blocked
:
205 d
->strIconName
= QLatin1String("error");
209 d
->strIconName
.clear();
214 return d
->strIconName
;
217 void KUriFilterData::setCheckForExecutables( bool check
)
219 d
->bCheckForExecutables
= check
;
222 bool KUriFilterData::checkForExecutables() const
224 return d
->bCheckForExecutables
;
227 QString
KUriFilterData::typedString() const
229 return d
->typedString
;
232 KUriFilterData
& KUriFilterData::operator=( const KUrl
& url
)
234 d
->setData(url
, url
.url());
238 KUriFilterData
& KUriFilterData::operator=( const QString
& url
)
240 d
->setData(KUrl(url
), url
);
244 /************************* KUriFilterPlugin ******************************/
246 KUriFilterPlugin::KUriFilterPlugin( const QString
& name
, QObject
*parent
)
247 : QObject( parent
), d( 0 )
249 setObjectName( name
);
252 KCModule
*KUriFilterPlugin::configModule( QWidget
*, const char* ) const
257 QString
KUriFilterPlugin::configName() const
262 void KUriFilterPlugin::setFilteredUri( KUriFilterData
& data
, const KUrl
& uri
) const
264 if ( data
.uri() != uri
)
267 data
.d
->bChanged
= true;
271 void KUriFilterPlugin::setErrorMsg ( KUriFilterData
& data
,
272 const QString
& errmsg
) const
274 data
.d
->strErrMsg
= errmsg
;
277 void KUriFilterPlugin::setUriType ( KUriFilterData
& data
,
278 KUriFilterData::UriTypes type
) const
280 data
.d
->iType
= type
;
281 data
.d
->bChanged
= true;
284 void KUriFilterPlugin::setArguments( KUriFilterData
& data
,
285 const QString
& args
) const
290 /******************************* KUriFilter ******************************/
292 class KUriFilterPrivate
295 KUriFilterPrivate() {}
298 qDeleteAll(lstPlugins
);
300 QList
<KUriFilterPlugin
*> lstPlugins
;
303 KUriFilter
*KUriFilter::self()
305 K_GLOBAL_STATIC(KUriFilter
, m_self
)
309 KUriFilter::KUriFilter()
310 : d(new KUriFilterPrivate())
315 KUriFilter::~KUriFilter()
320 static KUriFilterPlugin
* findPluginByName( const KUriFilterPluginList
& lst
, const QString
& name
)
322 for ( KUriFilterPluginList::const_iterator it
= lst
.begin(), end
= lst
.end();
324 if ( (*it
)->objectName() == name
)
330 bool KUriFilter::filterUri( KUriFilterData
& data
, const QStringList
& filters
)
332 KUriFilterPluginList use_plugins
;
334 // If we have a filter list, only include the once
335 // explicitly specified by it. Otherwise, use all available filters...
336 if( filters
.isEmpty() )
337 use_plugins
= d
->lstPlugins
; // Use everything that is loaded...
339 //kDebug() << "Named plugins requested...";
340 for( QStringList::ConstIterator lst
= filters
.begin(); lst
!= filters
.end(); ++lst
) {
341 KUriFilterPlugin
* plugin
= findPluginByName( d
->lstPlugins
, *lst
);
343 //kDebug() << "Will use filter plugin named: " << plugin->objectName();
344 use_plugins
.append(plugin
);
349 //kDebug() << "Using" << use_plugins.count() << "out of the"
350 // << d->lstPlugins.count() << "available plugins";
351 bool filtered
= false;
352 for ( KUriFilterPluginList::const_iterator it
= use_plugins
.constBegin(), end
= use_plugins
.constEnd();
354 //kDebug() << "Using a filter plugin named: " << (*it)->objectName();
355 if( (*it
)->filterUri( data
))
361 bool KUriFilter::filterUri( KUrl
& uri
, const QStringList
& filters
)
363 KUriFilterData
data(uri
);
364 bool filtered
= filterUri( data
, filters
);
365 if( filtered
) uri
= data
.uri();
369 bool KUriFilter::filterUri( QString
& uri
, const QStringList
& filters
)
371 KUriFilterData
data(uri
);
372 bool filtered
= filterUri( data
, filters
);
373 if( filtered
) uri
= data
.uri().url();
377 KUrl
KUriFilter::filteredUri( const KUrl
&uri
, const QStringList
& filters
)
379 KUriFilterData
data(uri
);
380 filterUri( data
, filters
);
384 QString
KUriFilter::filteredUri( const QString
&uri
, const QStringList
& filters
)
386 KUriFilterData
data(uri
);
387 filterUri( data
, filters
);
388 return data
.uri().url();
391 QStringList
KUriFilter::pluginNames() const
394 Q_FOREACH( KUriFilterPlugin
* plugin
, d
->lstPlugins
)
395 list
.append(plugin
->objectName());
399 void KUriFilter::loadPlugins()
401 const KService::List offers
= KServiceTypeTrader::self()->query( "KUriFilter/Plugin" );
403 foreach (const KService::Ptr
&ptr
, offers
) {
404 KUriFilterPlugin
*plugin
= ptr
->createInstance
<KUriFilterPlugin
>();
407 Q_ASSERT( !plugin
->objectName().isEmpty() );
408 d
->lstPlugins
.append( plugin
);
411 // NOTE: Plugin priority is determined by
412 // the InitialPreference entry in the .desktop files,
413 // so the trader result is already sorted.
415 // TODO: Config dialog to differentiate "system"
416 // plugins from "user-defined" ones...
417 // d->lstPlugins.sort();
420 #include "kurifilter.moc"