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