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