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 <kglobal.h> 00027 #include <kdebug.h> 00028 #include <kconfig.h> 00029 #include <kstringhandler.h> 00030 #include <kconfiggroup.h> 00031 00032 // 00033 // Internal functions: 00034 // 00035 KProtocolInfo::KProtocolInfo(const QString &path) 00036 : KSycocaEntry(*new KProtocolInfoPrivate(path, this)) 00037 { 00038 Q_D(KProtocolInfo); 00039 QString fullPath = KStandardDirs::locate("services", path); 00040 00041 KConfig sconfig( fullPath ); 00042 KConfigGroup config(&sconfig, "Protocol" ); 00043 00044 m_name = config.readEntry( "protocol" ); 00045 m_exec = config.readPathEntry( "exec", QString() ); 00046 m_isSourceProtocol = config.readEntry( "source", true ); 00047 m_isHelperProtocol = config.readEntry( "helper", false ); 00048 m_supportsReading = config.readEntry( "reading", false ); 00049 m_supportsWriting = config.readEntry( "writing", false ); 00050 m_supportsMakeDir = config.readEntry( "makedir", false ); 00051 m_supportsDeleting = config.readEntry( "deleting", false ); 00052 m_supportsLinking = config.readEntry( "linking", false ); 00053 m_supportsMoving = config.readEntry( "moving", false ); 00054 m_supportsOpening = config.readEntry( "opening", false ); 00055 m_canCopyFromFile = config.readEntry( "copyFromFile", false ); 00056 m_canCopyToFile = config.readEntry( "copyToFile", false ); 00057 d->canRenameFromFile = config.readEntry( "renameFromFile", false ); 00058 d->canRenameToFile = config.readEntry( "renameToFile", false ); 00059 d->canDeleteRecursive = config.readEntry( "deleteRecursive", false ); 00060 const QString fnu = config.readEntry( "fileNameUsedForCopying", "FromURL" ); 00061 d->fileNameUsedForCopying = FromUrl; 00062 if (fnu == QLatin1String("Name")) 00063 d->fileNameUsedForCopying = Name; 00064 else if (fnu == QLatin1String("DisplayName")) 00065 d->fileNameUsedForCopying = DisplayName; 00066 00067 m_listing = config.readEntry( "listing", QStringList() ); 00068 // Many .protocol files say "Listing=false" when they really mean "Listing=" (i.e. unsupported) 00069 if ( m_listing.count() == 1 && m_listing.first() == QLatin1String("false") ) 00070 m_listing.clear(); 00071 m_supportsListing = ( m_listing.count() > 0 ); 00072 m_defaultMimetype = config.readEntry( "defaultMimetype" ); 00073 m_determineMimetypeFromExtension = config.readEntry( "determineMimetypeFromExtension", true ); 00074 d->archiveMimetype = config.readEntry("archiveMimetype", QStringList()); 00075 m_icon = config.readEntry( "Icon" ); 00076 m_config = config.readEntry( "config", m_name ); 00077 m_maxSlaves = config.readEntry( "maxInstances", 1); 00078 d->maxSlavesPerHost = config.readEntry( "maxInstancesPerHost", 0); 00079 00080 QString tmp = config.readEntry( "input" ); 00081 if ( tmp == QLatin1String("filesystem") ) 00082 m_inputType = KProtocolInfo::T_FILESYSTEM; 00083 else if ( tmp == QLatin1String("stream") ) 00084 m_inputType = KProtocolInfo::T_STREAM; 00085 else 00086 m_inputType = KProtocolInfo::T_NONE; 00087 00088 tmp = config.readEntry( "output" ); 00089 if ( tmp == QLatin1String("filesystem") ) 00090 m_outputType = KProtocolInfo::T_FILESYSTEM; 00091 else if ( tmp == QLatin1String("stream") ) 00092 m_outputType = KProtocolInfo::T_STREAM; 00093 else 00094 m_outputType = KProtocolInfo::T_NONE; 00095 00096 d->docPath = config.readPathEntry( "X-DocPath", QString() ); 00097 if (d->docPath.isEmpty()) 00098 d->docPath = config.readPathEntry( "DocPath", QString() ); 00099 d->protClass = config.readEntry( "Class" ).toLower(); 00100 if (d->protClass[0] != QLatin1Char(':')) 00101 d->protClass.prepend(QLatin1Char(':')); 00102 00103 const QStringList extraNames = config.readEntry( "ExtraNames", QStringList() ); 00104 const QStringList extraTypes = config.readEntry( "ExtraTypes", QStringList() ); 00105 QStringList::const_iterator it = extraNames.begin(); 00106 QStringList::const_iterator typeit = extraTypes.begin(); 00107 for( ; it != extraNames.end() && typeit != extraTypes.end(); ++it, ++typeit ) { 00108 QVariant::Type type = QVariant::nameToType( (*typeit).toLatin1() ); 00109 // currently QVariant::Type and ExtraField::Type use the same subset of values, so we can just cast. 00110 d->extraFields.append( ExtraField( *it, static_cast<ExtraField::Type>(type) ) ); 00111 } 00112 00113 d->showPreviews = config.readEntry( "ShowPreviews", d->protClass == QLatin1String(":local") ); 00114 00115 d->capabilities = config.readEntry( "Capabilities", QStringList() ); 00116 d->proxyProtocol = config.readEntry( "ProxiedBy" ); 00117 } 00118 00119 KProtocolInfo::KProtocolInfo( QDataStream& _str, int offset) : 00120 KSycocaEntry(*new KProtocolInfoPrivate( _str, offset, this) ) 00121 { 00122 load( _str ); 00123 } 00124 00125 KProtocolInfo::~KProtocolInfo() 00126 { 00127 } 00128 00129 void 00130 KProtocolInfo::load( QDataStream& _str) 00131 { 00132 Q_D(KProtocolInfo); 00133 // You may add new fields at the end. Make sure to update the version 00134 // number in ksycoca.h 00135 qint32 i_inputType, i_outputType; 00136 qint8 i_isSourceProtocol, i_isHelperProtocol, 00137 i_supportsListing, i_supportsReading, 00138 i_supportsWriting, i_supportsMakeDir, 00139 i_supportsDeleting, i_supportsLinking, 00140 i_supportsMoving, i_supportsOpening, 00141 i_determineMimetypeFromExtension, 00142 i_canCopyFromFile, i_canCopyToFile, i_showPreviews, 00143 i_uriMode, i_canRenameFromFile, i_canRenameToFile, 00144 i_canDeleteRecursive, i_fileNameUsedForCopying; 00145 00146 _str >> m_name >> m_exec >> m_listing >> m_defaultMimetype 00147 >> i_determineMimetypeFromExtension 00148 >> m_icon 00149 >> i_inputType >> i_outputType 00150 >> i_isSourceProtocol >> i_isHelperProtocol 00151 >> i_supportsListing >> i_supportsReading 00152 >> i_supportsWriting >> i_supportsMakeDir 00153 >> i_supportsDeleting >> i_supportsLinking 00154 >> i_supportsMoving >> i_supportsOpening 00155 >> i_canCopyFromFile >> i_canCopyToFile 00156 >> m_config >> m_maxSlaves >> d->docPath >> d->protClass 00157 >> d->extraFields >> i_showPreviews >> i_uriMode 00158 >> d->capabilities >> d->proxyProtocol 00159 >> i_canRenameFromFile >> i_canRenameToFile 00160 >> i_canDeleteRecursive >> i_fileNameUsedForCopying 00161 >> d->archiveMimetype >> d->maxSlavesPerHost; 00162 00163 m_inputType = (Type) i_inputType; 00164 m_outputType = (Type) i_outputType; 00165 m_isSourceProtocol = (i_isSourceProtocol != 0); 00166 m_isHelperProtocol = (i_isHelperProtocol != 0); 00167 m_supportsListing = (i_supportsListing != 0); 00168 m_supportsReading = (i_supportsReading != 0); 00169 m_supportsWriting = (i_supportsWriting != 0); 00170 m_supportsMakeDir = (i_supportsMakeDir != 0); 00171 m_supportsDeleting = (i_supportsDeleting != 0); 00172 m_supportsLinking = (i_supportsLinking != 0); 00173 m_supportsMoving = (i_supportsMoving != 0); 00174 m_supportsOpening = (i_supportsOpening != 0); 00175 m_canCopyFromFile = (i_canCopyFromFile != 0); 00176 m_canCopyToFile = (i_canCopyToFile != 0); 00177 d->canRenameFromFile = (i_canRenameFromFile != 0); 00178 d->canRenameToFile = (i_canRenameToFile != 0); 00179 d->canDeleteRecursive = (i_canDeleteRecursive != 0); 00180 d->fileNameUsedForCopying = FileNameUsedForCopying(i_fileNameUsedForCopying); 00181 m_determineMimetypeFromExtension = (i_determineMimetypeFromExtension != 0); 00182 d->showPreviews = (i_showPreviews != 0); 00183 } 00184 00185 void 00186 KProtocolInfoPrivate::save( QDataStream& _str) 00187 { 00188 KSycocaEntryPrivate::save( _str ); 00189 00190 // You may add new fields at the end. Make sure to update the version 00191 // number in ksycoca.h 00192 qint32 i_inputType, i_outputType; 00193 qint8 i_isSourceProtocol, i_isHelperProtocol, 00194 i_supportsListing, i_supportsReading, 00195 i_supportsWriting, i_supportsMakeDir, 00196 i_supportsDeleting, i_supportsLinking, 00197 i_supportsMoving, i_supportsOpening, 00198 i_determineMimetypeFromExtension, 00199 i_canCopyFromFile, i_canCopyToFile, i_showPreviews, 00200 i_uriMode, i_canRenameFromFile, i_canRenameToFile, 00201 i_canDeleteRecursive, i_fileNameUsedForCopying; 00202 00203 i_inputType = (qint32) q->m_inputType; 00204 i_outputType = (qint32) q->m_outputType; 00205 i_isSourceProtocol = q->m_isSourceProtocol ? 1 : 0; 00206 i_isHelperProtocol = q->m_isHelperProtocol ? 1 : 0; 00207 i_supportsListing = q->m_supportsListing ? 1 : 0; 00208 i_supportsReading = q->m_supportsReading ? 1 : 0; 00209 i_supportsWriting = q->m_supportsWriting ? 1 : 0; 00210 i_supportsMakeDir = q->m_supportsMakeDir ? 1 : 0; 00211 i_supportsDeleting = q->m_supportsDeleting ? 1 : 0; 00212 i_supportsLinking = q->m_supportsLinking ? 1 : 0; 00213 i_supportsMoving = q->m_supportsMoving ? 1 : 0; 00214 i_supportsOpening = q->m_supportsOpening ? 1 : 0; 00215 i_canCopyFromFile = q->m_canCopyFromFile ? 1 : 0; 00216 i_canCopyToFile = q->m_canCopyToFile ? 1 : 0; 00217 i_canRenameFromFile = canRenameFromFile ? 1 : 0; 00218 i_canRenameToFile = canRenameToFile ? 1 : 0; 00219 i_canDeleteRecursive = canDeleteRecursive ? 1 : 0; 00220 i_fileNameUsedForCopying = int(fileNameUsedForCopying); 00221 i_determineMimetypeFromExtension = q->m_determineMimetypeFromExtension ? 1 : 0; 00222 i_showPreviews = showPreviews ? 1 : 0; 00223 i_uriMode = 0; 00224 00225 _str << q->m_name << q->m_exec << q->m_listing << q->m_defaultMimetype 00226 << i_determineMimetypeFromExtension 00227 << q->m_icon 00228 << i_inputType << i_outputType 00229 << i_isSourceProtocol << i_isHelperProtocol 00230 << i_supportsListing << i_supportsReading 00231 << i_supportsWriting << i_supportsMakeDir 00232 << i_supportsDeleting << i_supportsLinking 00233 << i_supportsMoving << i_supportsOpening 00234 << i_canCopyFromFile << i_canCopyToFile 00235 << q->m_config << q->m_maxSlaves << docPath << protClass 00236 << extraFields << i_showPreviews << i_uriMode 00237 << capabilities << proxyProtocol 00238 << i_canRenameFromFile << i_canRenameToFile 00239 << i_canDeleteRecursive << i_fileNameUsedForCopying 00240 << archiveMimetype << maxSlavesPerHost; 00241 } 00242 00243 00244 // 00245 // Static functions: 00246 // 00247 00248 QStringList KProtocolInfo::protocols() 00249 { 00250 return KProtocolInfoFactory::self()->protocols(); 00251 } 00252 00253 bool KProtocolInfo::isFilterProtocol( const QString& _protocol ) 00254 { 00255 // We call the findProtocol directly (not via KProtocolManager) to bypass any proxy settings. 00256 KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); 00257 if ( !prot ) 00258 return false; 00259 00260 return !prot->m_isSourceProtocol; 00261 } 00262 00263 QString KProtocolInfo::icon( const QString& _protocol ) 00264 { 00265 // We call the findProtocol directly (not via KProtocolManager) to bypass any proxy settings. 00266 KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); 00267 if ( !prot ) 00268 return QString(); 00269 00270 return prot->m_icon; 00271 } 00272 00273 QString KProtocolInfo::config( const QString& _protocol ) 00274 { 00275 // We call the findProtocol directly (not via KProtocolManager) to bypass any proxy settings. 00276 KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); 00277 if ( !prot ) 00278 return QString(); 00279 00280 return QString::fromLatin1("kio_%1rc").arg(prot->m_config); 00281 } 00282 00283 int KProtocolInfo::maxSlaves( const QString& _protocol ) 00284 { 00285 KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); 00286 if ( !prot ) 00287 return 1; 00288 00289 return prot->m_maxSlaves; 00290 } 00291 00292 int KProtocolInfo::maxSlavesPerHost( const QString& _protocol ) 00293 { 00294 KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); 00295 if ( !prot ) 00296 return 0; 00297 00298 return prot->d_func()->maxSlavesPerHost; 00299 } 00300 00301 bool KProtocolInfo::determineMimetypeFromExtension( const QString &_protocol ) 00302 { 00303 KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol( _protocol ); 00304 if ( !prot ) 00305 return true; 00306 00307 return prot->m_determineMimetypeFromExtension; 00308 } 00309 00310 QString KProtocolInfo::exec(const QString& protocol) 00311 { 00312 KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(protocol); 00313 if ( prot ) { 00314 return prot->m_exec; 00315 } 00316 00317 // Maybe it's "helper protocol", i.e. launches an app? 00318 const KService::Ptr service = KMimeTypeTrader::self()->preferredService(QString::fromLatin1("x-scheme-handler/") + protocol); 00319 if (service) 00320 return service->exec(); 00321 00322 return QString(); 00323 } 00324 00325 KProtocolInfo::ExtraFieldList KProtocolInfo::extraFields( const KUrl &url ) 00326 { 00327 KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(url.protocol()); 00328 if ( !prot ) 00329 return ExtraFieldList(); 00330 00331 return prot->d_func()->extraFields; 00332 } 00333 00334 QString KProtocolInfo::docPath( const QString& _protocol ) 00335 { 00336 KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); 00337 if ( !prot ) 00338 return QString(); 00339 00340 return prot->d_func()->docPath; 00341 } 00342 00343 QString KProtocolInfo::protocolClass( const QString& _protocol ) 00344 { 00345 KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); 00346 if ( !prot ) 00347 return QString(); 00348 00349 return prot->d_func()->protClass; 00350 } 00351 00352 bool KProtocolInfo::showFilePreview( const QString& _protocol ) 00353 { 00354 KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); 00355 if ( !prot ) 00356 return false; 00357 00358 return prot->d_func()->showPreviews; 00359 } 00360 00361 QStringList KProtocolInfo::capabilities( const QString& _protocol ) 00362 { 00363 KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); 00364 if ( !prot ) 00365 return QStringList(); 00366 00367 return prot->d_func()->capabilities; 00368 } 00369 00370 QString KProtocolInfo::proxiedBy( const QString& _protocol ) 00371 { 00372 KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); 00373 if ( !prot ) 00374 return QString(); 00375 00376 return prot->d_func()->proxyProtocol; 00377 } 00378 00379 QString KProtocolInfo::defaultMimeType() const 00380 { 00381 return m_defaultMimetype; 00382 } 00383 00384 00385 QStringList KProtocolInfo::archiveMimeTypes() const 00386 { 00387 Q_D(const KProtocolInfo); 00388 return d->archiveMimetype; 00389 } 00390 00391 bool KProtocolInfo::supportsListing() const 00392 { 00393 return m_supportsListing; 00394 } 00395 00396 bool KProtocolInfo::canRenameFromFile() const 00397 { 00398 Q_D(const KProtocolInfo); 00399 return d->canRenameFromFile; 00400 } 00401 00402 bool KProtocolInfo::canRenameToFile() const 00403 { 00404 Q_D(const KProtocolInfo); 00405 return d->canRenameToFile; 00406 } 00407 00408 bool KProtocolInfo::canDeleteRecursive() const 00409 { 00410 Q_D(const KProtocolInfo); 00411 return d->canDeleteRecursive; 00412 } 00413 00414 KProtocolInfo::FileNameUsedForCopying KProtocolInfo::fileNameUsedForCopying() const 00415 { 00416 Q_D(const KProtocolInfo); 00417 return d->fileNameUsedForCopying; 00418 } 00419 00420 bool KProtocolInfo::isFilterProtocol( const KUrl &url ) 00421 { 00422 return isFilterProtocol (url.protocol()); 00423 } 00424 00425 bool KProtocolInfo::isHelperProtocol( const KUrl &url ) 00426 { 00427 return isHelperProtocol (url.protocol()); 00428 } 00429 00430 bool KProtocolInfo::isHelperProtocol( const QString &protocol ) 00431 { 00432 // We call the findProtocol directly (not via KProtocolManager) to bypass any proxy settings. 00433 KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(protocol); 00434 if ( prot ) 00435 return prot->m_isHelperProtocol; 00436 00437 const KService::Ptr service = KMimeTypeTrader::self()->preferredService(QString::fromLatin1("x-scheme-handler/") + protocol); 00438 return !service.isNull(); 00439 } 00440 00441 bool KProtocolInfo::isKnownProtocol( const KUrl &url ) 00442 { 00443 return isKnownProtocol (url.protocol()); 00444 } 00445 00446 bool KProtocolInfo::isKnownProtocol( const QString &protocol ) 00447 { 00448 // We call the findProtocol (const QString&) to bypass any proxy settings. 00449 KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(protocol); 00450 return prot || isHelperProtocol(protocol); 00451 } 00452 00453 QDataStream& operator>>( QDataStream& s, KProtocolInfo::ExtraField& field ) { 00454 s >> field.name; 00455 int type; 00456 s >> type; 00457 field.type = static_cast<KProtocolInfo::ExtraField::Type>( type ); 00458 return s; 00459 } 00460 00461 QDataStream& operator<<( QDataStream& s, const KProtocolInfo::ExtraField& field ) { 00462 s << field.name; 00463 s << static_cast<int>( field.type ); 00464 return s; 00465 }
KDE 4.6 API Reference