00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
#include "kprotocolinfo.h"
00020
#include "kprotocolinfofactory.h"
00021
00022
#include <kstandarddirs.h>
00023
#include <kglobal.h>
00024
#include <kapplication.h>
00025
#include <kdebug.h>
00026
#include <ksimpleconfig.h>
00027
#include <kconfig.h>
00028
#include <kstringhandler.h>
00029
00030
class KProtocolInfo::KProtocolInfoPrivate
00031 {
00032
public:
00033
QString docPath;
00034
QString protClass;
00035
KProtocolInfo::ExtraFieldList extraFields;
00036
bool showPreviews;
00037
KURL::URIMode uriMode;
00038
QStringList capabilities;
00039
QString proxyProtocol;
00040 };
00041
00042
00043
00044
00045
KProtocolInfo::KProtocolInfo(
const QString &path)
00046 :
KSycocaEntry(path)
00047 {
00048 d =
new KProtocolInfoPrivate;
00049
QString fullPath = locate(
"services", path);
00050
00051
KSimpleConfig config( fullPath,
true );
00052 config.setGroup(
"Protocol" );
00053
00054 m_name = config.readEntry(
"protocol" );
00055 m_exec = config.readPathEntry(
"exec" );
00056 m_isSourceProtocol = config.readBoolEntry(
"source",
true );
00057 m_isHelperProtocol = config.readBoolEntry(
"helper",
false );
00058 m_supportsReading = config.readBoolEntry(
"reading",
false );
00059 m_supportsWriting = config.readBoolEntry(
"writing",
false );
00060 m_supportsMakeDir = config.readBoolEntry(
"makedir",
false );
00061 m_supportsDeleting = config.readBoolEntry(
"deleting",
false );
00062 m_supportsLinking = config.readBoolEntry(
"linking",
false );
00063 m_supportsMoving = config.readBoolEntry(
"moving",
false );
00064 m_canCopyFromFile = config.readBoolEntry(
"copyFromFile",
false );
00065 m_canCopyToFile = config.readBoolEntry(
"copyToFile",
false );
00066 m_listing = config.readListEntry(
"listing" );
00067
00068
if ( m_listing.count() == 1 && m_listing.first() ==
"false" )
00069 m_listing.clear();
00070 m_supportsListing = ( m_listing.count() > 0 );
00071 m_defaultMimetype = config.readEntry(
"defaultMimetype" );
00072 m_determineMimetypeFromExtension = config.readBoolEntry(
"determineMimetypeFromExtension",
true );
00073 m_icon = config.readEntry(
"Icon",
"mime_empty" );
00074 m_config = config.readEntry(
"config", m_name );
00075 m_maxSlaves = config.readNumEntry(
"maxInstances", 1);
00076
00077
QString tmp = config.readEntry(
"input" );
00078
if ( tmp ==
"filesystem" )
00079 m_inputType =
KProtocolInfo::T_FILESYSTEM;
00080
else if ( tmp ==
"stream" )
00081 m_inputType =
KProtocolInfo::T_STREAM;
00082
else
00083 m_inputType =
KProtocolInfo::T_NONE;
00084
00085 tmp = config.readEntry(
"output" );
00086
if ( tmp ==
"filesystem" )
00087 m_outputType =
KProtocolInfo::T_FILESYSTEM;
00088
else if ( tmp ==
"stream" )
00089 m_outputType =
KProtocolInfo::T_STREAM;
00090
else
00091 m_outputType =
KProtocolInfo::T_NONE;
00092
00093 d->docPath = config.readPathEntry(
"DocPath" );
00094 d->protClass = config.readEntry(
"Class" ).lower();
00095
if (d->protClass[0] !=
':')
00096 d->protClass.prepend(
':');
00097
00098
QStringList extraNames = config.readListEntry(
"ExtraNames" );
00099
QStringList extraTypes = config.readListEntry(
"ExtraTypes" );
00100 QStringList::Iterator it = extraNames.begin();
00101 QStringList::Iterator typeit = extraTypes.begin();
00102
for( ; it != extraNames.end() && typeit != extraTypes.end(); ++it, ++typeit ) {
00103 d->extraFields.append( ExtraField( *it, *typeit ) );
00104 }
00105
00106 d->showPreviews = config.readBoolEntry(
"ShowPreviews", d->protClass ==
":local" );
00107
00108 tmp = config.readEntry(
"URIMode", QString::null ).lower();
00109
if (tmp ==
"rawuri")
00110 d->uriMode =
KURL::RawURI;
00111
else if (tmp ==
"mailto")
00112 d->uriMode =
KURL::Mailto;
00113
else if (tmp ==
"url")
00114 d->uriMode =
KURL::URL;
00115
else
00116 d->uriMode =
KURL::Auto;
00117
00118 d->capabilities = config.readListEntry(
"Capabilities" );
00119 d->proxyProtocol = config.readEntry(
"ProxiedBy" );
00120 }
00121
00122
KProtocolInfo::KProtocolInfo(
QDataStream& _str,
int offset) :
00123
KSycocaEntry( _str, offset)
00124 {
00125 d =
new KProtocolInfoPrivate;
00126 load( _str );
00127 }
00128
00129 KProtocolInfo::~KProtocolInfo()
00130 {
00131
delete d;
00132 }
00133
00134
void
00135
KProtocolInfo::load(
QDataStream& _str)
00136 {
00137 Q_INT32 i_inputType, i_outputType;
00138 Q_INT8 i_isSourceProtocol, i_isHelperProtocol,
00139 i_supportsListing, i_supportsReading,
00140 i_supportsWriting, i_supportsMakeDir,
00141 i_supportsDeleting, i_supportsLinking,
00142 i_supportsMoving, i_determineMimetypeFromExtension,
00143 i_canCopyFromFile, i_canCopyToFile, i_showPreviews,
00144 i_uriMode;
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
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
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_canCopyFromFile = (i_canCopyFromFile != 0);
00172
m_canCopyToFile = (i_canCopyToFile != 0);
00173
m_determineMimetypeFromExtension = (i_determineMimetypeFromExtension != 0);
00174 d->showPreviews = (i_showPreviews != 0);
00175 d->uriMode = (
KURL::URIMode) i_uriMode;
00176 }
00177
00178
void
00179
KProtocolInfo::save(
QDataStream& _str)
00180 {
00181 KSycocaEntry::save( _str );
00182
00183 Q_INT32 i_inputType, i_outputType;
00184 Q_INT8 i_isSourceProtocol, i_isHelperProtocol,
00185 i_supportsListing, i_supportsReading,
00186 i_supportsWriting, i_supportsMakeDir,
00187 i_supportsDeleting, i_supportsLinking,
00188 i_supportsMoving, i_determineMimetypeFromExtension,
00189 i_canCopyFromFile, i_canCopyToFile, i_showPreviews,
00190 i_uriMode;
00191
00192 i_inputType = (Q_INT32)
m_inputType;
00193 i_outputType = (Q_INT32)
m_outputType;
00194 i_isSourceProtocol =
m_isSourceProtocol ? 1 : 0;
00195 i_isHelperProtocol =
m_isHelperProtocol ? 1 : 0;
00196 i_supportsListing =
m_supportsListing ? 1 : 0;
00197 i_supportsReading =
m_supportsReading ? 1 : 0;
00198 i_supportsWriting =
m_supportsWriting ? 1 : 0;
00199 i_supportsMakeDir =
m_supportsMakeDir ? 1 : 0;
00200 i_supportsDeleting =
m_supportsDeleting ? 1 : 0;
00201 i_supportsLinking =
m_supportsLinking ? 1 : 0;
00202 i_supportsMoving =
m_supportsMoving ? 1 : 0;
00203 i_canCopyFromFile =
m_canCopyFromFile ? 1 : 0;
00204 i_canCopyToFile =
m_canCopyToFile ? 1 : 0;
00205 i_determineMimetypeFromExtension =
m_determineMimetypeFromExtension ? 1 : 0;
00206 i_showPreviews = d->showPreviews ? 1 : 0;
00207 i_uriMode = d->uriMode;
00208
00209 _str <<
m_name <<
m_exec <<
m_listing <<
m_defaultMimetype
00210 << i_determineMimetypeFromExtension
00211 <<
m_icon
00212 << i_inputType << i_outputType
00213 << i_isSourceProtocol << i_isHelperProtocol
00214 << i_supportsListing << i_supportsReading
00215 << i_supportsWriting << i_supportsMakeDir
00216 << i_supportsDeleting << i_supportsLinking
00217 << i_supportsMoving
00218 << i_canCopyFromFile << i_canCopyToFile
00219 <<
m_config <<
m_maxSlaves << d->docPath << d->protClass
00220 << d->extraFields << i_showPreviews << i_uriMode
00221 << d->capabilities << d->proxyProtocol;
00222 }
00223
00224
00225
00226
00227
00228
00229
QStringList KProtocolInfo::protocols()
00230 {
00231
return KProtocolInfoFactory::self()->
protocols();
00232 }
00233
00234
bool KProtocolInfo::isSourceProtocol(
const QString& _protocol )
00235 {
00236
KProtocolInfo::Ptr prot =
KProtocolInfoFactory::self()->
findProtocol(_protocol);
00237
if ( !prot )
00238
return false;
00239
00240
return prot->m_isSourceProtocol;
00241 }
00242
00243
bool KProtocolInfo::isFilterProtocol(
const QString& _protocol )
00244 {
00245
KProtocolInfo::Ptr prot =
KProtocolInfoFactory::self()->
findProtocol(_protocol);
00246
if ( !prot )
00247
return false;
00248
00249
return !prot->m_isSourceProtocol;
00250 }
00251
00252
bool KProtocolInfo::isHelperProtocol(
const QString& _protocol )
00253 {
00254
KProtocolInfo::Ptr prot =
KProtocolInfoFactory::self()->
findProtocol(_protocol);
00255
if ( !prot )
00256
return false;
00257
00258
return prot->m_isHelperProtocol;
00259 }
00260
00261
bool KProtocolInfo::isKnownProtocol(
const QString& _protocol )
00262 {
00263
KProtocolInfo::Ptr prot =
KProtocolInfoFactory::self()->
findProtocol(_protocol);
00264
return ( prot != 0);
00265 }
00266
00267
bool KProtocolInfo::supportsListing(
const QString& _protocol )
00268 {
00269
KProtocolInfo::Ptr prot =
KProtocolInfoFactory::self()->
findProtocol(_protocol);
00270
if ( !prot )
00271
return false;
00272
00273
return prot->m_supportsListing;
00274 }
00275
00276
QStringList KProtocolInfo::listing(
const QString& _protocol )
00277 {
00278
KProtocolInfo::Ptr prot =
KProtocolInfoFactory::self()->
findProtocol(_protocol);
00279
if ( !prot )
00280
return QStringList();
00281
00282
return prot->m_listing;
00283 }
00284
00285
bool KProtocolInfo::supportsReading(
const QString& _protocol )
00286 {
00287
KProtocolInfo::Ptr prot =
KProtocolInfoFactory::self()->
findProtocol(_protocol);
00288
if ( !prot )
00289
return false;
00290
00291
return prot->m_supportsReading;
00292 }
00293
00294
bool KProtocolInfo::supportsWriting(
const QString& _protocol )
00295 {
00296
KProtocolInfo::Ptr prot =
KProtocolInfoFactory::self()->
findProtocol(_protocol);
00297
if ( !prot )
00298
return false;
00299
00300
return prot->m_supportsWriting;
00301 }
00302
00303
bool KProtocolInfo::supportsMakeDir(
const QString& _protocol )
00304 {
00305
KProtocolInfo::Ptr prot =
KProtocolInfoFactory::self()->
findProtocol(_protocol);
00306
if ( !prot )
00307
return false;
00308
00309
return prot->m_supportsMakeDir;
00310 }
00311
00312
bool KProtocolInfo::supportsDeleting(
const QString& _protocol )
00313 {
00314
KProtocolInfo::Ptr prot =
KProtocolInfoFactory::self()->
findProtocol(_protocol);
00315
if ( !prot )
00316
return false;
00317
00318
return prot->m_supportsDeleting;
00319 }
00320
00321
bool KProtocolInfo::supportsLinking(
const QString& _protocol )
00322 {
00323
KProtocolInfo::Ptr prot =
KProtocolInfoFactory::self()->
findProtocol(_protocol);
00324
if ( !prot )
00325
return false;
00326
00327
return prot->m_supportsLinking;
00328 }
00329
00330
bool KProtocolInfo::supportsMoving(
const QString& _protocol )
00331 {
00332
KProtocolInfo::Ptr prot =
KProtocolInfoFactory::self()->
findProtocol(_protocol);
00333
if ( !prot )
00334
return false;
00335
00336
return prot->m_supportsMoving;
00337 }
00338
00339
bool KProtocolInfo::canCopyFromFile(
const QString& _protocol )
00340 {
00341
KProtocolInfo::Ptr prot =
KProtocolInfoFactory::self()->
findProtocol(_protocol);
00342
if ( !prot )
00343
return false;
00344
00345
return prot->m_canCopyFromFile;
00346 }
00347
00348
00349
bool KProtocolInfo::canCopyToFile(
const QString& _protocol )
00350 {
00351
KProtocolInfo::Ptr prot =
KProtocolInfoFactory::self()->
findProtocol(_protocol);
00352
if ( !prot )
00353
return false;
00354
00355
return prot->m_canCopyToFile;
00356 }
00357
00358
QString KProtocolInfo::icon(
const QString& _protocol )
00359 {
00360
KProtocolInfo::Ptr prot =
KProtocolInfoFactory::self()->
findProtocol(_protocol);
00361
if ( !prot )
00362
return QString::fromLatin1(
"mime_empty");
00363
00364
return prot->m_icon;
00365 }
00366
00367
QString KProtocolInfo::config(
const QString& _protocol )
00368 {
00369
KProtocolInfo::Ptr prot =
KProtocolInfoFactory::self()->
findProtocol(_protocol);
00370
if ( !prot )
00371
return QString::null;
00372
00373
return QString(
"kio_%1rc").arg(prot->m_config);
00374 }
00375
00376
int KProtocolInfo::maxSlaves(
const QString& _protocol )
00377 {
00378
KProtocolInfo::Ptr prot =
KProtocolInfoFactory::self()->
findProtocol(_protocol);
00379
if ( !prot )
00380
return 1;
00381
00382
return prot->m_maxSlaves;
00383 }
00384
00385
QString KProtocolInfo::defaultMimetype(
const QString& _protocol )
00386 {
00387
KProtocolInfo::Ptr prot =
KProtocolInfoFactory::self()->
findProtocol(_protocol);
00388
if ( !prot )
00389
return QString::null;
00390
00391
return prot->m_defaultMimetype;
00392 }
00393
00394
bool KProtocolInfo::determineMimetypeFromExtension(
const QString &_protocol )
00395 {
00396
KProtocolInfo::Ptr prot =
KProtocolInfoFactory::self()->
findProtocol( _protocol );
00397
if ( !prot )
00398
return true;
00399
00400
return prot->m_determineMimetypeFromExtension;
00401 }
00402
00403
QString KProtocolInfo::exec(
const QString& _protocol )
00404 {
00405
KProtocolInfo::Ptr prot =
KProtocolInfoFactory::self()->
findProtocol(_protocol);
00406
if ( !prot )
00407
return QString::null;
00408
00409
return prot->m_exec;
00410 }
00411
00412
KProtocolInfo::Type KProtocolInfo::inputType(
const QString& _protocol )
00413 {
00414
KProtocolInfo::Ptr prot =
KProtocolInfoFactory::self()->
findProtocol(_protocol);
00415
if ( !prot )
00416
return T_NONE;
00417
00418
return prot->m_inputType;
00419 }
00420
00421
KProtocolInfo::Type KProtocolInfo::outputType(
const QString& _protocol )
00422 {
00423
KProtocolInfo::Ptr prot =
KProtocolInfoFactory::self()->
findProtocol(_protocol);
00424
if ( !prot )
00425
return T_NONE;
00426
00427
return prot->m_outputType;
00428 }
00429
00430
KProtocolInfo::ExtraFieldList KProtocolInfo::extraFields(
const KURL &url )
00431 {
00432
KProtocolInfo::Ptr prot =
KProtocolInfoFactory::self()->
findProtocol(url.
protocol());
00433
if ( !prot )
00434
return ExtraFieldList();
00435
00436
return prot->d->extraFields;
00437 }
00438
00439
QString KProtocolInfo::docPath(
const QString& _protocol )
00440 {
00441
KProtocolInfo::Ptr prot =
KProtocolInfoFactory::self()->
findProtocol(_protocol);
00442
if ( !prot )
00443
return QString::null;
00444
00445
return prot->d->docPath;
00446 }
00447
00448
QString KProtocolInfo::protocolClass(
const QString& _protocol )
00449 {
00450
KProtocolInfo::Ptr prot =
KProtocolInfoFactory::self()->
findProtocol(_protocol);
00451
if ( !prot )
00452
return QString::null;
00453
00454
return prot->d->protClass;
00455 }
00456
00457
bool KProtocolInfo::showFilePreview(
const QString& _protocol )
00458 {
00459
KProtocolInfo::Ptr prot =
KProtocolInfoFactory::self()->
findProtocol(_protocol);
00460
if ( !prot )
00461
return false;
00462
00463
return prot->d->showPreviews;
00464 }
00465
00466
KURL::URIMode KProtocolInfo::uriParseMode(
const QString& _protocol )
00467 {
00468
KProtocolInfo::Ptr prot =
KProtocolInfoFactory::self()->
findProtocol(_protocol);
00469
if ( !prot )
00470
return KURL::Auto;
00471
00472
return prot->d->uriMode;
00473 }
00474
00475
QStringList KProtocolInfo::capabilities(
const QString& _protocol )
00476 {
00477
KProtocolInfo::Ptr prot =
KProtocolInfoFactory::self()->
findProtocol(_protocol);
00478
if ( !prot )
00479
return QStringList();
00480
00481
return prot->d->capabilities;
00482 }
00483
00484
QString KProtocolInfo::proxiedBy(
const QString& _protocol )
00485 {
00486
KProtocolInfo::Ptr prot =
KProtocolInfoFactory::self()->
findProtocol(_protocol);
00487
if ( !prot )
00488
return QString::null;
00489
00490
return prot->d->proxyProtocol;
00491 }
00492
00493
QDataStream&
operator>>(
QDataStream& s,
KProtocolInfo::ExtraField& field ) {
00494 s >> field.
name;
00495 s >> field.
type;
00496
return s;
00497 }
00498
00499
QDataStream&
operator<<(
QDataStream& s,
const KProtocolInfo::ExtraField& field ) {
00500 s << field.
name;
00501 s << field.
type;
00502
return s;
00503 }
00504
00505
00506
00507
void KProtocolInfo::virtual_hook(
int id,
void* data )
00508 { KSycocaEntry::virtual_hook(
id, data ); }
00509