• Skip to content
  • Skip to link menu
  • KDE API Reference
  • kdelibs-4.11.5 API Reference
  • KDE Home
  • Contact Us
 

KIO

  • kio
  • kio
kurifilter.cpp
Go to the documentation of this file.
1 /* This file is part of the KDE libraries
2  * Copyright (C) 2000 Yves Arrouye <yves@realnames.com>
3  * Copyright (C) 2000,2010 Dawit Alemayehu <adawit at kde.org>
4  *
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.
9  *
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.
14  *
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.
19  **/
20 
21 #include "kurifilter.h"
22 
23 #include "hostinfo_p.h"
24 
25 #include <kdebug.h>
26 #include <kiconloader.h>
27 #include <kservicetypetrader.h>
28 #include <kmimetype.h>
29 #include <kstandarddirs.h>
30 
31 #include <QtCore/QHashIterator>
32 #include <QtCore/QStringBuilder>
33 #include <QtNetwork/QHostInfo>
34 #include <QtNetwork/QHostAddress>
35 
36 typedef QList<KUriFilterPlugin *> KUriFilterPluginList;
37 typedef QMap<QString, KUriFilterSearchProvider*> SearchProviderMap;
38 
39 
40 static QString lookupIconNameFor(const KUrl &url, KUriFilterData::UriTypes type)
41 {
42  QString iconName;
43 
44  switch ( type )
45  {
46  case KUriFilterData::NetProtocol:
47  iconName = KMimeType::favIconForUrl(url);
48  if (iconName.isEmpty())
49  iconName = KMimeType::iconNameForUrl( url );
50  else
51  iconName = KStandardDirs::locate("cache", iconName + QLatin1String(".png"));
52  break;
53  case KUriFilterData::LocalFile:
54  case KUriFilterData::LocalDir:
55  {
56  iconName = KMimeType::iconNameForUrl( url );
57  break;
58  }
59  case KUriFilterData::Executable:
60  {
61  QString exeName = url.path();
62  exeName = exeName.mid( exeName.lastIndexOf( '/' ) + 1 ); // strip path if given
63  KService::Ptr service = KService::serviceByDesktopName( exeName );
64  if (service && service->icon() != QLatin1String( "unknown" ))
65  iconName = service->icon();
66  // Try to find an icon with the same name as the binary (useful for non-kde apps)
67  // Use iconPath rather than loadIcon() as the latter uses QPixmap (not threadsafe)
68  else if ( !KIconLoader::global()->iconPath( exeName, KIconLoader::NoGroup, true ).isNull() )
69  iconName = exeName;
70  else
71  // not found, use default
72  iconName = QLatin1String("system-run");
73  break;
74  }
75  case KUriFilterData::Help:
76  {
77  iconName = QLatin1String("khelpcenter");
78  break;
79  }
80  case KUriFilterData::Shell:
81  {
82  iconName = QLatin1String("konsole");
83  break;
84  }
85  case KUriFilterData::Error:
86  case KUriFilterData::Blocked:
87  {
88  iconName = QLatin1String("error");
89  break;
90  }
91  default:
92  break;
93  }
94 
95  return iconName;
96 }
97 
98 
99 class KUriFilterSearchProvider::KUriFilterSearchProviderPrivate
100 {
101 public:
102  KUriFilterSearchProviderPrivate() {}
103  KUriFilterSearchProviderPrivate(const KUriFilterSearchProviderPrivate& other)
104  : desktopEntryName(other.desktopEntryName),
105  iconName(other.iconName),
106  name(other.name),
107  keys(other.keys) {}
108 
109 
110  QString desktopEntryName;
111  QString iconName;
112  QString name;
113  QStringList keys;
114 };
115 
116 KUriFilterSearchProvider::KUriFilterSearchProvider()
117  :d(new KUriFilterSearchProvider::KUriFilterSearchProviderPrivate)
118 {
119 }
120 
121 KUriFilterSearchProvider::KUriFilterSearchProvider(const KUriFilterSearchProvider& other)
122  :d(new KUriFilterSearchProvider::KUriFilterSearchProviderPrivate(*(other.d)))
123 {
124 }
125 
126 KUriFilterSearchProvider::~KUriFilterSearchProvider()
127 {
128  delete d;
129 }
130 
131 QString KUriFilterSearchProvider::desktopEntryName() const
132 {
133  return d->desktopEntryName;
134 }
135 
136 QString KUriFilterSearchProvider::iconName() const
137 {
138  return d->iconName;
139 }
140 
141 QString KUriFilterSearchProvider::name() const
142 {
143  return d->name;
144 }
145 
146 QStringList KUriFilterSearchProvider::keys() const
147 {
148  return d->keys;
149 }
150 
151 QString KUriFilterSearchProvider::defaultKey() const
152 {
153  if (d->keys.isEmpty())
154  return QString();
155 
156  return d->keys.first();
157 }
158 
159 KUriFilterSearchProvider& KUriFilterSearchProvider::operator=(const KUriFilterSearchProvider& other)
160 {
161  d->desktopEntryName = other.d->desktopEntryName;
162  d->iconName = other.d->iconName;
163  d->keys = other.d->keys;
164  d->name = other.d->name;
165  return *this;
166 }
167 
168 void KUriFilterSearchProvider::setDesktopEntryName(const QString& desktopEntryName)
169 {
170  d->desktopEntryName = desktopEntryName;
171 }
172 
173 void KUriFilterSearchProvider::setIconName(const QString& iconName)
174 {
175  d->iconName = iconName;
176 }
177 
178 void KUriFilterSearchProvider::setName(const QString& name)
179 {
180  d->name = name;
181 }
182 
183 void KUriFilterSearchProvider::setKeys(const QStringList& keys)
184 {
185  d->keys = keys;
186 }
187 
188 class KUriFilterDataPrivate
189 {
190 public:
191  explicit KUriFilterDataPrivate( const KUrl& u, const QString& typedUrl )
192  : checkForExecs(true),
193  wasModified(true),
194  uriType(KUriFilterData::Unknown),
195  searchFilterOptions(KUriFilterData::SearchFilterOptionNone),
196  url(u),
197  typedString(typedUrl)
198  {
199  }
200 
201  ~KUriFilterDataPrivate()
202  {
203  qDeleteAll(searchProviderMap.begin(), searchProviderMap.end());
204  }
205 
206  void setData( const KUrl& u, const QString& typedUrl )
207  {
208  checkForExecs = true;
209  wasModified = true;
210  uriType = KUriFilterData::Unknown;
211  searchFilterOptions = KUriFilterData::SearchFilterOptionNone;
212 
213  url = u;
214  typedString = typedUrl;
215 
216  errMsg.clear();
217  iconName.clear();
218  absPath.clear();
219  args.clear();
220  searchTerm.clear();
221  searchProvider.clear();
222  searchTermSeparator = QChar();
223  alternateDefaultSearchProvider.clear();
224  alternateSearchProviders.clear();
225  searchProviderMap.clear();
226  defaultUrlScheme.clear();
227  }
228 
229  KUriFilterDataPrivate( KUriFilterDataPrivate * data )
230  {
231  wasModified = data->wasModified;
232  checkForExecs = data->checkForExecs;
233  uriType = data->uriType;
234  searchFilterOptions = data->searchFilterOptions;
235 
236  url = data->url;
237  typedString = data->typedString;
238 
239  errMsg = data->errMsg;
240  iconName = data->iconName;
241  absPath = data->absPath;
242  args = data->args;
243  searchTerm = data->searchTerm;
244  searchTermSeparator = data->searchTermSeparator;
245  searchProvider = data->searchProvider;
246  alternateDefaultSearchProvider = data->alternateDefaultSearchProvider;
247  alternateSearchProviders = data->alternateSearchProviders;
248  searchProviderMap = data->searchProviderMap;
249  defaultUrlScheme = data->defaultUrlScheme;
250  }
251 
252  bool checkForExecs;
253  bool wasModified;
254  KUriFilterData::UriTypes uriType;
255  KUriFilterData::SearchFilterOptions searchFilterOptions;
256 
257  KUrl url;
258  QString typedString;
259  QString errMsg;
260  QString iconName;
261  QString absPath;
262  QString args;
263  QString searchTerm;
264  QString searchProvider;
265  QString alternateDefaultSearchProvider;
266  QString defaultUrlScheme;
267  QChar searchTermSeparator;
268 
269  QStringList alternateSearchProviders;
270  QStringList searchProviderList;
271  SearchProviderMap searchProviderMap;
272 };
273 
274 KUriFilterData::KUriFilterData()
275  :d( new KUriFilterDataPrivate( KUrl(), QString() ) )
276 {
277 }
278 
279 KUriFilterData::KUriFilterData( const KUrl& url )
280  :d( new KUriFilterDataPrivate( url, url.url() ) )
281 {
282 }
283 
284 KUriFilterData::KUriFilterData( const QString& url )
285  :d( new KUriFilterDataPrivate( KUrl(url), url ) )
286 {
287 }
288 
289 
290 KUriFilterData::KUriFilterData( const KUriFilterData& other )
291  :d( new KUriFilterDataPrivate( other.d ) )
292 {
293 }
294 
295 KUriFilterData::~KUriFilterData()
296 {
297  delete d;
298 }
299 
300 KUrl KUriFilterData::uri() const
301 {
302  return d->url;
303 }
304 
305 QString KUriFilterData::errorMsg() const
306 {
307  return d->errMsg;
308 }
309 
310 KUriFilterData::UriTypes KUriFilterData::uriType() const
311 {
312  return d->uriType;
313 }
314 
315 QString KUriFilterData::absolutePath() const
316 {
317  return d->absPath;
318 }
319 
320 bool KUriFilterData::hasAbsolutePath() const
321 {
322  return !d->absPath.isEmpty();
323 }
324 
325 QString KUriFilterData::argsAndOptions() const
326 {
327  return d->args;
328 }
329 
330 bool KUriFilterData::hasArgsAndOptions() const
331 {
332  return !d->args.isEmpty();
333 }
334 
335 bool KUriFilterData::checkForExecutables() const
336 {
337  return d->checkForExecs;
338 }
339 
340 QString KUriFilterData::typedString() const
341 {
342  return d->typedString;
343 }
344 
345 QString KUriFilterData::searchTerm() const
346 {
347  return d->searchTerm;
348 }
349 
350 QChar KUriFilterData::searchTermSeparator() const
351 {
352  return d->searchTermSeparator;
353 }
354 
355 QString KUriFilterData::searchProvider() const
356 {
357  return d->searchProvider;
358 }
359 
360 QStringList KUriFilterData::preferredSearchProviders() const
361 {
362  return d->searchProviderList;
363 }
364 
365 KUriFilterSearchProvider KUriFilterData::queryForSearchProvider(const QString& provider) const
366 {
367  const KUriFilterSearchProvider* searchProvider = d->searchProviderMap.value(provider);
368 
369  if (searchProvider)
370  return *(searchProvider);
371 
372  return KUriFilterSearchProvider();
373 }
374 
375 QString KUriFilterData::queryForPreferredSearchProvider(const QString& provider) const
376 {
377  const KUriFilterSearchProvider* searchProvider = d->searchProviderMap.value(provider);
378  if (searchProvider)
379  return (searchProvider->defaultKey() % searchTermSeparator() % searchTerm());
380  return QString();
381 }
382 
383 QStringList KUriFilterData::allQueriesForSearchProvider(const QString& provider) const
384 {
385  const KUriFilterSearchProvider* searchProvider = d->searchProviderMap.value(provider);
386  if (searchProvider)
387  return searchProvider->keys();
388  return QStringList();
389 }
390 
391 QString KUriFilterData::iconNameForPreferredSearchProvider(const QString &provider) const
392 {
393  const KUriFilterSearchProvider* searchProvider = d->searchProviderMap.value(provider);
394  if (searchProvider)
395  return searchProvider->iconName();
396  return QString();
397 }
398 
399 QStringList KUriFilterData::alternateSearchProviders() const
400 {
401  return d->alternateSearchProviders;
402 }
403 
404 QString KUriFilterData::alternateDefaultSearchProvider() const
405 {
406  return d->alternateDefaultSearchProvider;
407 }
408 
409 QString KUriFilterData::defaultUrlScheme() const
410 {
411  return d->defaultUrlScheme;
412 }
413 
414 KUriFilterData::SearchFilterOptions KUriFilterData::searchFilteringOptions() const
415 {
416  return d->searchFilterOptions;
417 }
418 
419 QString KUriFilterData::iconName()
420 {
421  if (d->wasModified) {
422  d->iconName = lookupIconNameFor(d->url, d->uriType);
423  d->wasModified = false;
424  }
425 
426  return d->iconName;
427 }
428 
429 void KUriFilterData::setData( const KUrl& url )
430 {
431  d->setData(url, url.url());
432 }
433 
434 void KUriFilterData::setData( const QString& url )
435 {
436  d->setData(KUrl(url), url);
437 }
438 
439 bool KUriFilterData::setAbsolutePath( const QString& absPath )
440 {
441  // Since a malformed URL could possibly be a relative
442  // URL we tag it as a possible local resource...
443  if( (d->url.protocol().isEmpty() || d->url.isLocalFile()) )
444  {
445  d->absPath = absPath;
446  return true;
447  }
448  return false;
449 }
450 
451 void KUriFilterData::setCheckForExecutables( bool check )
452 {
453  d->checkForExecs = check;
454 }
455 
456 void KUriFilterData::setAlternateSearchProviders(const QStringList &providers)
457 {
458  d->alternateSearchProviders = providers;
459 }
460 
461 void KUriFilterData::setAlternateDefaultSearchProvider(const QString &provider)
462 {
463  d->alternateDefaultSearchProvider = provider;
464 }
465 
466 void KUriFilterData::setDefaultUrlScheme(const QString& scheme)
467 {
468  d->defaultUrlScheme = scheme;
469 }
470 
471 void KUriFilterData::setSearchFilteringOptions(SearchFilterOptions options)
472 {
473  d->searchFilterOptions = options;
474 }
475 
476 KUriFilterData& KUriFilterData::operator=( const KUrl& url )
477 {
478  d->setData(url, url.url());
479  return *this;
480 }
481 
482 KUriFilterData& KUriFilterData::operator=( const QString& url )
483 {
484  d->setData(KUrl(url), url);
485  return *this;
486 }
487 
488 /************************* KUriFilterPlugin ******************************/
489 
490 KUriFilterPlugin::KUriFilterPlugin( const QString & name, QObject *parent )
491  :QObject( parent ), d( 0 )
492 {
493  setObjectName( name );
494 }
495 
496 KCModule *KUriFilterPlugin::configModule( QWidget*, const char* ) const
497 {
498  return 0;
499 }
500 
501 QString KUriFilterPlugin::configName() const
502 {
503  return objectName();
504 }
505 
506 void KUriFilterPlugin::setFilteredUri( KUriFilterData& data, const KUrl& uri ) const
507 {
508  data.d->url = uri;
509  data.d->wasModified = true;
510  kDebug(7022) << "Got filtered to:" << uri;
511 }
512 
513 void KUriFilterPlugin::setErrorMsg ( KUriFilterData& data,
514  const QString& errmsg ) const
515 {
516  data.d->errMsg = errmsg;
517 }
518 
519 void KUriFilterPlugin::setUriType ( KUriFilterData& data,
520  KUriFilterData::UriTypes type) const
521 {
522  data.d->uriType = type;
523  data.d->wasModified = true;
524 }
525 
526 void KUriFilterPlugin::setArguments( KUriFilterData& data,
527  const QString& args ) const
528 {
529  data.d->args = args;
530 }
531 
532 void KUriFilterPlugin::setSearchProvider( KUriFilterData &data, const QString& provider,
533  const QString &term, const QChar &separator) const
534 {
535  data.d->searchProvider = provider;
536  data.d->searchTerm = term;
537  data.d->searchTermSeparator = separator;
538 }
539 
540 #ifndef KDE_NO_DEPRECATED
541 void KUriFilterPlugin::setPreferredSearchProviders(KUriFilterData &data, const ProviderInfoList &providers) const
542 {
543  QHashIterator<QString, QPair<QString, QString> > it (providers);
544  while (it.hasNext())
545  {
546  it.next();
547  KUriFilterSearchProvider* searchProvider = data.d->searchProviderMap[it.key()];
548  searchProvider->setName(it.key());
549  searchProvider->setIconName(it.value().second);
550  QStringList keys;
551  const QStringList queries = it.value().first.split(QLatin1Char(','));
552  Q_FOREACH(const QString& query, queries)
553  keys << query.left(query.indexOf(data.d->searchTermSeparator));
554  searchProvider->setKeys(keys);
555  }
556 }
557 #endif
558 
559 void KUriFilterPlugin::setSearchProviders(KUriFilterData &data, const QList<KUriFilterSearchProvider*>& providers) const
560 {
561  Q_FOREACH(KUriFilterSearchProvider* searchProvider, providers) {
562  data.d->searchProviderList << searchProvider->name();
563  data.d->searchProviderMap.insert(searchProvider->name(), searchProvider);
564  }
565 }
566 
567 QString KUriFilterPlugin::iconNameFor(const KUrl& url, KUriFilterData::UriTypes type) const
568 {
569  return lookupIconNameFor(url, type);
570 }
571 
572 QHostInfo KUriFilterPlugin::resolveName(const QString& hostname, unsigned long timeout) const
573 {
574  return KIO::HostInfo::lookupHost(hostname, timeout);
575 }
576 
577 
578 /******************************* KUriFilter ******************************/
579 
580 class KUriFilterPrivate
581 {
582 public:
583  KUriFilterPrivate() {}
584  ~KUriFilterPrivate()
585  {
586  qDeleteAll(plugins);
587  plugins.clear();
588  }
589  QHash<QString, KUriFilterPlugin *> plugins;
590  // NOTE: DO NOT REMOVE this variable! Read the
591  // comments in KUriFilter::loadPlugins to understand why...
592  QStringList pluginNames;
593 };
594 
595 KUriFilter *KUriFilter::self()
596 {
597  K_GLOBAL_STATIC(KUriFilter, m_self)
598  return m_self;
599 }
600 
601 KUriFilter::KUriFilter()
602  : d(new KUriFilterPrivate())
603 {
604  loadPlugins();
605 }
606 
607 KUriFilter::~KUriFilter()
608 {
609  delete d;
610 }
611 
612 bool KUriFilter::filterUri( KUriFilterData& data, const QStringList& filters )
613 {
614  bool filtered = false;
615 
616  // If no specific filters were requested, iterate through all the plugins.
617  // Otherwise, only use available filters.
618  if( filters.isEmpty() ) {
619  QStringListIterator it (d->pluginNames);
620  while (it.hasNext()) {
621  KUriFilterPlugin* plugin = d->plugins.value(it.next());
622  if (plugin && plugin->filterUri( data ))
623  filtered = true;
624  }
625  } else {
626  QStringListIterator it (filters);
627  while (it.hasNext()) {
628  KUriFilterPlugin* plugin = d->plugins.value(it.next());
629  if (plugin && plugin->filterUri( data ))
630  filtered = true;
631  }
632  }
633 
634  return filtered;
635 }
636 
637 bool KUriFilter::filterUri( KUrl& uri, const QStringList& filters )
638 {
639  KUriFilterData data(uri);
640  bool filtered = filterUri( data, filters );
641  if( filtered ) uri = data.uri();
642  return filtered;
643 }
644 
645 bool KUriFilter::filterUri( QString& uri, const QStringList& filters )
646 {
647  KUriFilterData data(uri);
648  bool filtered = filterUri( data, filters );
649  if( filtered ) uri = data.uri().url();
650  return filtered;
651 }
652 
653 KUrl KUriFilter::filteredUri( const KUrl &uri, const QStringList& filters )
654 {
655  KUriFilterData data(uri);
656  filterUri( data, filters );
657  return data.uri();
658 }
659 
660 QString KUriFilter::filteredUri( const QString &uri, const QStringList& filters )
661 {
662  KUriFilterData data(uri);
663  filterUri( data, filters );
664  return data.uri().url();
665 }
666 
667 #ifndef KDE_NO_DEPRECATED
668 bool KUriFilter::filterSearchUri(KUriFilterData &data)
669 {
670  return filterSearchUri(data, (NormalTextFilter | WebShortcutFilter));
671 }
672 #endif
673 
674 bool KUriFilter::filterSearchUri(KUriFilterData &data, SearchFilterTypes types)
675 {
676  QStringList filters;
677 
678  if (types & WebShortcutFilter)
679  filters << "kurisearchfilter";
680 
681  if (types & NormalTextFilter)
682  filters << "kuriikwsfilter";
683 
684  return filterUri(data, filters);
685 }
686 
687 
688 QStringList KUriFilter::pluginNames() const
689 {
690  return d->pluginNames;
691 }
692 
693 void KUriFilter::loadPlugins()
694 {
695  const KService::List offers = KServiceTypeTrader::self()->query( "KUriFilter/Plugin" );
696 
697  // NOTE: Plugin priority is determined by the InitialPreference entry in
698  // the .desktop files, so the trader result is already sorted and should
699  // not be manually sorted.
700  Q_FOREACH (const KService::Ptr &ptr, offers) {
701  KUriFilterPlugin *plugin = ptr->createInstance<KUriFilterPlugin>();
702  if (plugin) {
703  const QString& pluginName = plugin->objectName();
704  Q_ASSERT( !pluginName.isEmpty() );
705  d->plugins.insert(pluginName, plugin );
706  // Needed to ensure the order of filtering is honored since
707  // items are ordered arbitarily in a QHash and QMap always
708  // sorts by keys. Both undesired behavior.
709  d->pluginNames << pluginName;
710  }
711  }
712 }
713 
714 #include "kurifilter.moc"
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Sep 23 2014 09:58:52 by doxygen 1.8.3.1 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

KIO

Skip menu "KIO"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdelibs-4.11.5 API Reference

Skip menu "kdelibs-4.11.5 API Reference"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDEWebKit
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • kio
  • KIOSlave
  • KJS
  •   KJS-API
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver
Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal