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 if ( prot ) { 00311 return prot->m_exec; 00312 } 00313 00314 // Maybe it's "helper protocol", i.e. launches an app? 00315 const KService::Ptr service = KMimeTypeTrader::self()->preferredService(QString::fromLatin1("x-scheme-handler/") + protocol); 00316 if (service) 00317 return service->exec(); 00318 00319 return QString(); 00320 } 00321 00322 KProtocolInfo::ExtraFieldList KProtocolInfo::extraFields( const KUrl &url ) 00323 { 00324 KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(url.protocol()); 00325 if ( !prot ) 00326 return ExtraFieldList(); 00327 00328 return prot->d_func()->extraFields; 00329 } 00330 00331 QString KProtocolInfo::docPath( const QString& _protocol ) 00332 { 00333 KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); 00334 if ( !prot ) 00335 return QString(); 00336 00337 return prot->d_func()->docPath; 00338 } 00339 00340 QString KProtocolInfo::protocolClass( const QString& _protocol ) 00341 { 00342 KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); 00343 if ( !prot ) 00344 return QString(); 00345 00346 return prot->d_func()->protClass; 00347 } 00348 00349 bool KProtocolInfo::showFilePreview( const QString& _protocol ) 00350 { 00351 KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); 00352 if ( !prot ) 00353 return false; 00354 00355 return prot->d_func()->showPreviews; 00356 } 00357 00358 QStringList KProtocolInfo::capabilities( const QString& _protocol ) 00359 { 00360 KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); 00361 if ( !prot ) 00362 return QStringList(); 00363 00364 return prot->d_func()->capabilities; 00365 } 00366 00367 QString KProtocolInfo::proxiedBy( const QString& _protocol ) 00368 { 00369 KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); 00370 if ( !prot ) 00371 return QString(); 00372 00373 return prot->d_func()->proxyProtocol; 00374 } 00375 00376 QString KProtocolInfo::defaultMimeType() const 00377 { 00378 return m_defaultMimetype; 00379 } 00380 00381 00382 QStringList KProtocolInfo::archiveMimeTypes() const 00383 { 00384 Q_D(const KProtocolInfo); 00385 return d->archiveMimetype; 00386 } 00387 00388 bool KProtocolInfo::supportsListing() const 00389 { 00390 return m_supportsListing; 00391 } 00392 00393 bool KProtocolInfo::canRenameFromFile() const 00394 { 00395 Q_D(const KProtocolInfo); 00396 return d->canRenameFromFile; 00397 } 00398 00399 bool KProtocolInfo::canRenameToFile() const 00400 { 00401 Q_D(const KProtocolInfo); 00402 return d->canRenameToFile; 00403 } 00404 00405 bool KProtocolInfo::canDeleteRecursive() const 00406 { 00407 Q_D(const KProtocolInfo); 00408 return d->canDeleteRecursive; 00409 } 00410 00411 KProtocolInfo::FileNameUsedForCopying KProtocolInfo::fileNameUsedForCopying() const 00412 { 00413 Q_D(const KProtocolInfo); 00414 return d->fileNameUsedForCopying; 00415 } 00416 00417 bool KProtocolInfo::isFilterProtocol( const KUrl &url ) 00418 { 00419 return isFilterProtocol (url.protocol()); 00420 } 00421 00422 bool KProtocolInfo::isHelperProtocol( const KUrl &url ) 00423 { 00424 return isHelperProtocol (url.protocol()); 00425 } 00426 00427 bool KProtocolInfo::isHelperProtocol( const QString &protocol ) 00428 { 00429 // We call the findProtocol directly (not via KProtocolManager) to bypass any proxy settings. 00430 KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(protocol); 00431 if ( prot ) 00432 return prot->m_isHelperProtocol; 00433 00434 const KService::Ptr service = KMimeTypeTrader::self()->preferredService(QString::fromLatin1("x-scheme-handler/") + protocol); 00435 return !service.isNull(); 00436 } 00437 00438 bool KProtocolInfo::isKnownProtocol( const KUrl &url ) 00439 { 00440 return isKnownProtocol (url.protocol()); 00441 } 00442 00443 bool KProtocolInfo::isKnownProtocol( const QString &protocol ) 00444 { 00445 // We call the findProtocol (const QString&) to bypass any proxy settings. 00446 KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(protocol); 00447 return prot || isHelperProtocol(protocol); 00448 } 00449 00450 QDataStream& operator>>( QDataStream& s, KProtocolInfo::ExtraField& field ) { 00451 s >> field.name; 00452 int type; 00453 s >> type; 00454 field.type = static_cast<KProtocolInfo::ExtraField::Type>( type ); 00455 return s; 00456 } 00457 00458 QDataStream& operator<<( QDataStream& s, const KProtocolInfo::ExtraField& field ) { 00459 s << field.name; 00460 s << static_cast<int>( field.type ); 00461 return s; 00462 }
KDE 4.7 API Reference