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