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

KDECore

kprotocolinfo.cpp
Go to the documentation of this file.
00001 /* This file is part of the KDE libraries
00002    Copyright (C) 1999 Torben Weis <weis@kde.org>
00003    Copyright (C) 2003 Waldo Bastian <bastian@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 version 2 as published by the Free Software Foundation.
00008 
00009    This library is distributed in the hope that it will be useful,
00010    but WITHOUT ANY WARRANTY; without even the implied warranty of
00011    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012    Library General Public License for more details.
00013 
00014    You should have received a copy of the GNU Library General Public License
00015    along with this library; see the file COPYING.LIB.  If not, write to
00016    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00017    Boston, MA 02110-1301, USA.
00018 */
00019 
00020 #include "kprotocolinfo.h"
00021 #include "kprotocolinfo_p.h"
00022 #include "kprotocolinfofactory.h"
00023 
00024 #include <kmimetypetrader.h>
00025 #include <kstandarddirs.h>
00026 #include <kconfig.h>
00027 #include <kconfiggroup.h>
00028 
00029 //
00030 // Internal functions:
00031 //
00032 KProtocolInfo::KProtocolInfo(const QString &path)
00033  : KSycocaEntry(*new KProtocolInfoPrivate(path, this))
00034 {
00035     Q_D(KProtocolInfo);
00036   QString fullPath = KStandardDirs::locate("services", path);
00037 
00038   KConfig sconfig( fullPath );
00039   KConfigGroup config(&sconfig, "Protocol" );
00040 
00041   m_name = config.readEntry( "protocol" );
00042   m_exec = config.readPathEntry( "exec", QString() );
00043   m_isSourceProtocol = config.readEntry( "source", true );
00044   m_isHelperProtocol = config.readEntry( "helper", false );
00045   m_supportsReading = config.readEntry( "reading", false );
00046   m_supportsWriting = config.readEntry( "writing", false );
00047   m_supportsMakeDir = config.readEntry( "makedir", false );
00048   m_supportsDeleting = config.readEntry( "deleting", false );
00049   m_supportsLinking = config.readEntry( "linking", false );
00050   m_supportsMoving = config.readEntry( "moving", false );
00051   m_supportsOpening = config.readEntry( "opening", false );
00052   m_canCopyFromFile = config.readEntry( "copyFromFile", false );
00053   m_canCopyToFile = config.readEntry( "copyToFile", false );
00054   d->canRenameFromFile = config.readEntry( "renameFromFile", false );
00055   d->canRenameToFile = config.readEntry( "renameToFile", false );
00056   d->canDeleteRecursive = config.readEntry( "deleteRecursive", false );
00057   const QString fnu = config.readEntry( "fileNameUsedForCopying", "FromURL" );
00058   d->fileNameUsedForCopying = FromUrl;
00059   if (fnu == QLatin1String("Name"))
00060     d->fileNameUsedForCopying = Name;
00061   else if (fnu == QLatin1String("DisplayName"))
00062     d->fileNameUsedForCopying = DisplayName;
00063 
00064   m_listing = config.readEntry( "listing", QStringList() );
00065   // Many .protocol files say "Listing=false" when they really mean "Listing=" (i.e. unsupported)
00066   if ( m_listing.count() == 1 && m_listing.first() == QLatin1String("false") )
00067     m_listing.clear();
00068   m_supportsListing = ( m_listing.count() > 0 );
00069   m_defaultMimetype = config.readEntry( "defaultMimetype" );
00070   m_determineMimetypeFromExtension = config.readEntry( "determineMimetypeFromExtension", true );
00071   d->archiveMimetype = config.readEntry("archiveMimetype", QStringList());
00072   m_icon = config.readEntry( "Icon" );
00073   m_config = config.readEntry( "config", m_name );
00074   m_maxSlaves = config.readEntry( "maxInstances", 1);
00075   d->maxSlavesPerHost = config.readEntry( "maxInstancesPerHost", 0);
00076 
00077   QString tmp = config.readEntry( "input" );
00078   if ( tmp == QLatin1String("filesystem") )
00079     m_inputType = KProtocolInfo::T_FILESYSTEM;
00080   else if ( tmp == QLatin1String("stream") )
00081     m_inputType = KProtocolInfo::T_STREAM;
00082   else
00083     m_inputType = KProtocolInfo::T_NONE;
00084 
00085   tmp = config.readEntry( "output" );
00086   if ( tmp == QLatin1String("filesystem") )
00087     m_outputType = KProtocolInfo::T_FILESYSTEM;
00088   else if ( tmp == QLatin1String("stream") )
00089     m_outputType = KProtocolInfo::T_STREAM;
00090   else
00091     m_outputType = KProtocolInfo::T_NONE;
00092 
00093   d->docPath = config.readPathEntry( "X-DocPath", QString() );
00094   if (d->docPath.isEmpty())
00095     d->docPath = config.readPathEntry( "DocPath", QString() );
00096   d->protClass = config.readEntry( "Class" ).toLower();
00097   if (d->protClass[0] != QLatin1Char(':'))
00098      d->protClass.prepend(QLatin1Char(':'));
00099 
00100   const QStringList extraNames = config.readEntry( "ExtraNames", QStringList() );
00101   const QStringList extraTypes = config.readEntry( "ExtraTypes", QStringList() );
00102   QStringList::const_iterator it = extraNames.begin();
00103   QStringList::const_iterator typeit = extraTypes.begin();
00104   for( ; it != extraNames.end() && typeit != extraTypes.end(); ++it, ++typeit ) {
00105       QVariant::Type type = QVariant::nameToType( (*typeit).toLatin1() );
00106       // currently QVariant::Type and ExtraField::Type use the same subset of values, so we can just cast.
00107       d->extraFields.append( ExtraField( *it, static_cast<ExtraField::Type>(type) ) );
00108   }
00109 
00110   d->showPreviews = config.readEntry( "ShowPreviews", d->protClass == QLatin1String(":local") );
00111 
00112   d->capabilities = config.readEntry( "Capabilities", QStringList() );
00113   d->proxyProtocol = config.readEntry( "ProxiedBy" );
00114 }
00115 
00116 KProtocolInfo::KProtocolInfo( QDataStream& _str, int offset) :
00117     KSycocaEntry(*new KProtocolInfoPrivate( _str, offset, this) )
00118 {
00119    load( _str );
00120 }
00121 
00122 KProtocolInfo::~KProtocolInfo()
00123 {
00124 }
00125 
00126 void
00127 KProtocolInfo::load( QDataStream& _str)
00128 {
00129     Q_D(KProtocolInfo);
00130    // You may add new fields at the end. Make sure to update the version
00131    // number in ksycoca.h
00132    qint32 i_inputType, i_outputType;
00133    qint8 i_isSourceProtocol, i_isHelperProtocol,
00134           i_supportsListing, i_supportsReading,
00135           i_supportsWriting, i_supportsMakeDir,
00136           i_supportsDeleting, i_supportsLinking,
00137           i_supportsMoving, i_supportsOpening,
00138           i_determineMimetypeFromExtension,
00139           i_canCopyFromFile, i_canCopyToFile, i_showPreviews,
00140           i_uriMode, i_canRenameFromFile, i_canRenameToFile,
00141           i_canDeleteRecursive, i_fileNameUsedForCopying;
00142 
00143    _str >> m_name >> m_exec >> m_listing >> m_defaultMimetype
00144         >> i_determineMimetypeFromExtension
00145         >> m_icon
00146         >> i_inputType >> i_outputType
00147         >> i_isSourceProtocol >> i_isHelperProtocol
00148         >> i_supportsListing >> i_supportsReading
00149         >> i_supportsWriting >> i_supportsMakeDir
00150         >> i_supportsDeleting >> i_supportsLinking
00151         >> i_supportsMoving >> i_supportsOpening
00152         >> i_canCopyFromFile >> i_canCopyToFile
00153         >> m_config >> m_maxSlaves >> d->docPath >> d->protClass
00154         >> d->extraFields >> i_showPreviews >> i_uriMode
00155         >> d->capabilities >> d->proxyProtocol
00156         >> i_canRenameFromFile >> i_canRenameToFile
00157         >> i_canDeleteRecursive >> i_fileNameUsedForCopying
00158         >> d->archiveMimetype >> d->maxSlavesPerHost;
00159 
00160    m_inputType = (Type) i_inputType;
00161    m_outputType = (Type) i_outputType;
00162    m_isSourceProtocol = (i_isSourceProtocol != 0);
00163    m_isHelperProtocol = (i_isHelperProtocol != 0);
00164    m_supportsListing = (i_supportsListing != 0);
00165    m_supportsReading = (i_supportsReading != 0);
00166    m_supportsWriting = (i_supportsWriting != 0);
00167    m_supportsMakeDir = (i_supportsMakeDir != 0);
00168    m_supportsDeleting = (i_supportsDeleting != 0);
00169    m_supportsLinking = (i_supportsLinking != 0);
00170    m_supportsMoving = (i_supportsMoving != 0);
00171    m_supportsOpening = (i_supportsOpening != 0);
00172    m_canCopyFromFile = (i_canCopyFromFile != 0);
00173    m_canCopyToFile = (i_canCopyToFile != 0);
00174    d->canRenameFromFile = (i_canRenameFromFile != 0);
00175    d->canRenameToFile = (i_canRenameToFile != 0);
00176    d->canDeleteRecursive = (i_canDeleteRecursive != 0);
00177    d->fileNameUsedForCopying = FileNameUsedForCopying(i_fileNameUsedForCopying);
00178    m_determineMimetypeFromExtension = (i_determineMimetypeFromExtension != 0);
00179    d->showPreviews = (i_showPreviews != 0);
00180 }
00181 
00182 void
00183 KProtocolInfoPrivate::save( QDataStream& _str)
00184 {
00185    KSycocaEntryPrivate::save( _str );
00186 
00187    // You may add new fields at the end. Make sure to update the version
00188    // number in ksycoca.h
00189    qint32 i_inputType, i_outputType;
00190    qint8 i_isSourceProtocol, i_isHelperProtocol,
00191           i_supportsListing, i_supportsReading,
00192           i_supportsWriting, i_supportsMakeDir,
00193           i_supportsDeleting, i_supportsLinking,
00194           i_supportsMoving, i_supportsOpening,
00195           i_determineMimetypeFromExtension,
00196           i_canCopyFromFile, i_canCopyToFile, i_showPreviews,
00197           i_uriMode, i_canRenameFromFile, i_canRenameToFile,
00198           i_canDeleteRecursive, i_fileNameUsedForCopying;
00199 
00200    i_inputType = (qint32) q->m_inputType;
00201    i_outputType = (qint32) q->m_outputType;
00202    i_isSourceProtocol = q->m_isSourceProtocol ? 1 : 0;
00203    i_isHelperProtocol = q->m_isHelperProtocol ? 1 : 0;
00204    i_supportsListing = q->m_supportsListing ? 1 : 0;
00205    i_supportsReading = q->m_supportsReading ? 1 : 0;
00206    i_supportsWriting = q->m_supportsWriting ? 1 : 0;
00207    i_supportsMakeDir = q->m_supportsMakeDir ? 1 : 0;
00208    i_supportsDeleting = q->m_supportsDeleting ? 1 : 0;
00209    i_supportsLinking = q->m_supportsLinking ? 1 : 0;
00210    i_supportsMoving = q->m_supportsMoving ? 1 : 0;
00211    i_supportsOpening = q->m_supportsOpening ? 1 : 0;
00212    i_canCopyFromFile = q->m_canCopyFromFile ? 1 : 0;
00213    i_canCopyToFile = q->m_canCopyToFile ? 1 : 0;
00214    i_canRenameFromFile = canRenameFromFile ? 1 : 0;
00215    i_canRenameToFile = canRenameToFile ? 1 : 0;
00216    i_canDeleteRecursive = canDeleteRecursive ? 1 : 0;
00217    i_fileNameUsedForCopying = int(fileNameUsedForCopying);
00218    i_determineMimetypeFromExtension = q->m_determineMimetypeFromExtension ? 1 : 0;
00219    i_showPreviews = showPreviews ? 1 : 0;
00220   i_uriMode = 0;
00221 
00222    _str << q->m_name << q->m_exec << q->m_listing << q->m_defaultMimetype
00223         << i_determineMimetypeFromExtension
00224         << q->m_icon
00225         << i_inputType << i_outputType
00226         << i_isSourceProtocol << i_isHelperProtocol
00227         << i_supportsListing << i_supportsReading
00228         << i_supportsWriting << i_supportsMakeDir
00229         << i_supportsDeleting << i_supportsLinking
00230         << i_supportsMoving << i_supportsOpening
00231         << i_canCopyFromFile << i_canCopyToFile
00232         << q->m_config << q->m_maxSlaves << docPath << protClass
00233         << extraFields << i_showPreviews << i_uriMode
00234         << capabilities << proxyProtocol
00235         << i_canRenameFromFile << i_canRenameToFile
00236         << i_canDeleteRecursive << i_fileNameUsedForCopying
00237         << archiveMimetype << maxSlavesPerHost;
00238 }
00239 
00240 
00241 //
00242 // Static functions:
00243 //
00244 
00245 QStringList KProtocolInfo::protocols()
00246 {
00247   return KProtocolInfoFactory::self()->protocols();
00248 }
00249 
00250 bool KProtocolInfo::isFilterProtocol( const QString& _protocol )
00251 {
00252   // We call the findProtocol directly (not via KProtocolManager) to bypass any proxy settings.
00253   KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol);
00254   if ( !prot )
00255     return false;
00256 
00257   return !prot->m_isSourceProtocol;
00258 }
00259 
00260 QString KProtocolInfo::icon( const QString& _protocol )
00261 {
00262   // We call the findProtocol directly (not via KProtocolManager) to bypass any proxy settings.
00263   KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol);
00264   if ( !prot )
00265     return QString();
00266 
00267   return prot->m_icon;
00268 }
00269 
00270 QString KProtocolInfo::config( const QString& _protocol )
00271 {
00272   // We call the findProtocol directly (not via KProtocolManager) to bypass any proxy settings.
00273   KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol);
00274   if ( !prot )
00275     return QString();
00276 
00277   return QString::fromLatin1("kio_%1rc").arg(prot->m_config);
00278 }
00279 
00280 int KProtocolInfo::maxSlaves( const QString& _protocol )
00281 {
00282   KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol);
00283   if ( !prot )
00284     return 1;
00285 
00286   return prot->m_maxSlaves;
00287 }
00288 
00289 int KProtocolInfo::maxSlavesPerHost( const QString& _protocol )
00290 {
00291   KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol);
00292   if ( !prot )
00293     return 0;
00294 
00295   return prot->d_func()->maxSlavesPerHost;
00296 }
00297 
00298 bool KProtocolInfo::determineMimetypeFromExtension( const QString &_protocol )
00299 {
00300   KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol( _protocol );
00301   if ( !prot )
00302     return true;
00303 
00304   return prot->m_determineMimetypeFromExtension;
00305 }
00306 
00307 QString KProtocolInfo::exec(const QString& protocol)
00308 {
00309   KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(protocol);
00310 
00311   // We have up to two sources of data:
00312   // 1) the exec line of the .protocol file, if there's one (could be a kioslave or a helper app)
00313   // 2) the application associated with x-scheme-handler/<protocol> if there's one
00314 
00315   // If both exist, then:
00316   //  A) if the .protocol file says "launch an application", then the new-style handler-app has priority
00317   //  B) but if the .protocol file is for a kioslave (e.g. kio_http) then this has priority over
00318   //     firefox or chromium saying x-scheme-handler/http. Gnome people want to send all HTTP urls
00319   //     to a webbrowser, but we want mimetype-determination-in-calling-application by default
00320   //     (the user can configure a BrowserApplication though)
00321 
00322   QString helperExe;
00323   const KService::Ptr service = KMimeTypeTrader::self()->preferredService(QString::fromLatin1("x-scheme-handler/") + protocol);
00324   if (service) {
00325       helperExe = service->exec();
00326       if (prot && prot->m_isHelperProtocol)
00327           return helperExe; // for helper protocols, the handler app has priority over the hardcoded one (see A above)
00328   }
00329   if (prot) {
00330       return prot->m_exec;
00331   }
00332 
00333   // If there's no protocol file, then return the handler app if any, otherwise empty string
00334   return helperExe;
00335 }
00336 
00337 KProtocolInfo::ExtraFieldList KProtocolInfo::extraFields( const KUrl &url )
00338 {
00339   KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(url.protocol());
00340   if ( !prot )
00341     return ExtraFieldList();
00342 
00343   return prot->d_func()->extraFields;
00344 }
00345 
00346 QString KProtocolInfo::docPath( const QString& _protocol )
00347 {
00348   KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol);
00349   if ( !prot )
00350     return QString();
00351 
00352   return prot->d_func()->docPath;
00353 }
00354 
00355 QString KProtocolInfo::protocolClass( const QString& _protocol )
00356 {
00357   KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol);
00358   if ( !prot )
00359     return QString();
00360 
00361   return prot->d_func()->protClass;
00362 }
00363 
00364 bool KProtocolInfo::showFilePreview( const QString& _protocol )
00365 {
00366   KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol);
00367   if ( !prot )
00368     return false;
00369 
00370   return prot->d_func()->showPreviews;
00371 }
00372 
00373 QStringList KProtocolInfo::capabilities( const QString& _protocol )
00374 {
00375   KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol);
00376   if ( !prot )
00377     return QStringList();
00378 
00379   return prot->d_func()->capabilities;
00380 }
00381 
00382 QString KProtocolInfo::proxiedBy( const QString& _protocol )
00383 {
00384   KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol);
00385   if ( !prot )
00386     return QString();
00387 
00388   return prot->d_func()->proxyProtocol;
00389 }
00390 
00391 QString KProtocolInfo::defaultMimeType() const
00392 {
00393     return m_defaultMimetype;
00394 }
00395 
00396 
00397 QStringList KProtocolInfo::archiveMimeTypes() const
00398 {
00399     Q_D(const KProtocolInfo);
00400     return d->archiveMimetype;
00401 }
00402 
00403 bool KProtocolInfo::supportsListing() const
00404 {
00405     return m_supportsListing;
00406 }
00407 
00408 bool KProtocolInfo::canRenameFromFile() const
00409 {
00410     Q_D(const KProtocolInfo);
00411   return d->canRenameFromFile;
00412 }
00413 
00414 bool KProtocolInfo::canRenameToFile() const
00415 {
00416     Q_D(const KProtocolInfo);
00417   return d->canRenameToFile;
00418 }
00419 
00420 bool KProtocolInfo::canDeleteRecursive() const
00421 {
00422     Q_D(const KProtocolInfo);
00423   return d->canDeleteRecursive;
00424 }
00425 
00426 KProtocolInfo::FileNameUsedForCopying KProtocolInfo::fileNameUsedForCopying() const
00427 {
00428     Q_D(const KProtocolInfo);
00429     return d->fileNameUsedForCopying;
00430 }
00431 
00432 bool KProtocolInfo::isFilterProtocol( const KUrl &url )
00433 {
00434   return isFilterProtocol (url.protocol());
00435 }
00436 
00437 bool KProtocolInfo::isHelperProtocol( const KUrl &url )
00438 {
00439   return isHelperProtocol (url.protocol());
00440 }
00441 
00442 bool KProtocolInfo::isHelperProtocol( const QString &protocol )
00443 {
00444   // We call the findProtocol directly (not via KProtocolManager) to bypass any proxy settings.
00445   KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(protocol);
00446   if ( prot )
00447       return prot->m_isHelperProtocol;
00448 
00449   const KService::Ptr service = KMimeTypeTrader::self()->preferredService(QString::fromLatin1("x-scheme-handler/") + protocol);
00450   return !service.isNull();
00451 }
00452 
00453 bool KProtocolInfo::isKnownProtocol( const KUrl &url )
00454 {
00455   return isKnownProtocol (url.protocol());
00456 }
00457 
00458 bool KProtocolInfo::isKnownProtocol( const QString &protocol )
00459 {
00460   // We call the findProtocol (const QString&) to bypass any proxy settings.
00461   KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(protocol);
00462   return prot || isHelperProtocol(protocol);
00463 }
00464 
00465 QDataStream& operator>>( QDataStream& s, KProtocolInfo::ExtraField& field )  {
00466   s >> field.name;
00467   int type;
00468   s >> type;
00469   field.type = static_cast<KProtocolInfo::ExtraField::Type>( type );
00470   return s;
00471 }
00472 
00473 QDataStream& operator<<( QDataStream& s, const KProtocolInfo::ExtraField& field )  {
00474   s << field.name;
00475   s << static_cast<int>( field.type );
00476   return s;
00477 }
This file is part of the KDE documentation.
Documentation copyright © 1996-2019 The KDE developers.
Generated on Mon Jan 21 2019 12:28:12 by doxygen 1.7.5.1 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

KDECore

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

kdelibs-4.9.5 API Reference

Skip menu "kdelibs-4.9.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