kio Library API Documentation

kurifilter.cpp

00001 /* This file is part of the KDE libraries 00002 * Copyright (C) 2000 Yves Arrouye <yves@realnames.com> 00003 * Copyright (C) 2000 Dawit Alemayehu <adawit at kde.org> 00004 * 00005 * This library is free software; you can redistribute it and/or 00006 * modify it under the terms of the GNU Library General Public 00007 * License as published by the Free Software Foundation; either 00008 * version 2 of the License, or (at your option) any later version. 00009 * 00010 * This library is distributed in the hope that it will be useful, 00011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00013 * Library General Public License for more details. 00014 * 00015 * You should have received a copy of the GNU Library General Public License 00016 * along with this library; see the file COPYING.LIB. If not, write to 00017 * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 00018 * Boston, MA 02111-1307, USA. 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 // Since a malformed URL could possibly be a relative 00127 // URL we tag it as a possible local resource... 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 ); // strip path if given 00163 KService::Ptr service = KService::serviceByDesktopName( exeName ); 00164 if (service && service->icon() != QString::fromLatin1( "unknown" )) 00165 m_strIconName = service->icon(); 00166 // Try to find an icon with the same name as the binary (useful for non-kde apps) 00167 else if ( !KGlobal::iconLoader()->loadIcon( exeName, KIcon::NoGroup, 16, KIcon::DefaultState, 0, true ).isNull() ) 00168 m_strIconName = exeName; 00169 else 00170 // not found, use default 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 //******************************************** KURIFilterPlugin ********************************************** 00200 void KURIFilterPlugin::setArguments( KURIFilterData& data, const QString& args ) const 00201 { 00202 data.d->args = args; 00203 } 00204 00205 //******************************************** KURIFilter ********************************************** 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 // If we have a filter list, only include the once 00233 // explicitly specified by it. Otherwise, use all available filters... 00234 if( filters.isEmpty() ) 00235 use_plugins = m_lstPlugins; // Use everything that is loaded... 00236 else 00237 { 00238 //kdDebug() << "Named plugins requested..." << endl; 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 //kdDebug() << "Will use filter plugin named: " << it.current()->name() << endl; 00247 use_plugins.append( it.current() ); 00248 break; // We already found it ; so lets test the next named filter... 00249 } 00250 } 00251 } 00252 } 00253 00254 QPtrListIterator<KURIFilterPlugin> it( use_plugins ); 00255 //kdDebug() << "Using " << use_plugins.count() << " out of the " 00256 // << m_lstPlugins.count() << " available plugins" << endl; 00257 for (; it.current() && !filtered; ++it) 00258 { 00259 //kdDebug() << "Using a filter plugin named: " << it.current()->name() << endl; 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 // NOTE: Plugin priority is now determined by 00324 // the entry in the .desktop files... 00325 // TODO: Config dialog to differentiate "system" 00326 // plugins from "user-defined" ones... 00327 // m_lstPlugins.sort(); 00328 } 00329 00330 void KURIFilterPlugin::virtual_hook( int, void* ) 00331 { /*BASE::virtual_hook( id, data );*/ } 00332 00333 #include "kurifilter.moc"
KDE Logo
This file is part of the documentation for kio Library Version 3.4.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Tue Apr 12 23:09:29 2005 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003