kurifilter.cpp
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"
This file is part of the documentation for kio Library Version 3.2.2.