diff options
Diffstat (limited to 'kdecore/kprotocolinfo_kdecore.cpp')
-rw-r--r-- | kdecore/kprotocolinfo_kdecore.cpp | 562 |
1 files changed, 562 insertions, 0 deletions
diff --git a/kdecore/kprotocolinfo_kdecore.cpp b/kdecore/kprotocolinfo_kdecore.cpp new file mode 100644 index 000000000..0c40c36d3 --- /dev/null +++ b/kdecore/kprotocolinfo_kdecore.cpp @@ -0,0 +1,562 @@ +/* This file is part of the KDE libraries + Copyright (C) 1999 Torben Weis <weis@kde.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifdef MAKE_KDECORE_LIB //needed for proper linkage (win32) +#undef KIO_EXPORT +#define KIO_EXPORT KDE_EXPORT +#endif + +#define KPROTOCOLINFO_KDECORE +#include "kprotocolinfo.h" +#include "kprotocolinfofactory.h" + +#include <kstandarddirs.h> +#include <kglobal.h> +#include <kapplication.h> +#include <kdebug.h> +#include <ksimpleconfig.h> +#include <kconfig.h> +#include <kstringhandler.h> + +class KProtocolInfo::KProtocolInfoPrivate +{ +public: + QString docPath; + QString protClass; + KProtocolInfo::ExtraFieldList extraFields; + bool showPreviews; + bool canRenameFromFile; + bool canRenameToFile; + bool canDeleteRecursive; + bool fileNameUsedForCopying; // true if using UDS_NAME, false if using KURL::fileName() [default] + KURL::URIMode uriMode; + QStringList capabilities; + QString proxyProtocol; +}; + +// +// Internal functions: +// +KProtocolInfo::KProtocolInfo(const QString &path) + : KSycocaEntry(path) +{ + d = new KProtocolInfoPrivate; + QString fullPath = locate("services", path); + + KSimpleConfig config( fullPath, true ); + config.setGroup( "Protocol" ); + + m_name = config.readEntry( "protocol" ); + m_exec = config.readPathEntry( "exec" ); + m_isSourceProtocol = config.readBoolEntry( "source", true ); + m_isHelperProtocol = config.readBoolEntry( "helper", false ); + m_supportsReading = config.readBoolEntry( "reading", false ); + m_supportsWriting = config.readBoolEntry( "writing", false ); + m_supportsMakeDir = config.readBoolEntry( "makedir", false ); + m_supportsDeleting = config.readBoolEntry( "deleting", false ); + m_supportsLinking = config.readBoolEntry( "linking", false ); + m_supportsMoving = config.readBoolEntry( "moving", false ); + m_canCopyFromFile = config.readBoolEntry( "copyFromFile", false ); + m_canCopyToFile = config.readBoolEntry( "copyToFile", false ); + d->canRenameFromFile = config.readBoolEntry( "renameFromFile", false ); + d->canRenameToFile = config.readBoolEntry( "renameToFile", false ); + d->canDeleteRecursive = config.readBoolEntry( "deleteRecursive", false ); + d->fileNameUsedForCopying = config.readEntry( "fileNameUsedForCopying", "FromURL" ) == "Name"; + + m_listing = config.readListEntry( "listing" ); + // Many .protocol files say "Listing=false" when they really mean "Listing=" (i.e. unsupported) + if ( m_listing.count() == 1 && m_listing.first() == "false" ) + m_listing.clear(); + m_supportsListing = ( m_listing.count() > 0 ); + m_defaultMimetype = config.readEntry( "defaultMimetype" ); + m_determineMimetypeFromExtension = config.readBoolEntry( "determineMimetypeFromExtension", true ); + m_icon = config.readEntry( "Icon", "unknown" ); + m_config = config.readEntry( "config", m_name ); + m_maxSlaves = config.readNumEntry( "maxInstances", 1); + + QString tmp = config.readEntry( "input" ); + if ( tmp == "filesystem" ) + m_inputType = KProtocolInfo::T_FILESYSTEM; + else if ( tmp == "stream" ) + m_inputType = KProtocolInfo::T_STREAM; + else + m_inputType = KProtocolInfo::T_NONE; + + tmp = config.readEntry( "output" ); + if ( tmp == "filesystem" ) + m_outputType = KProtocolInfo::T_FILESYSTEM; + else if ( tmp == "stream" ) + m_outputType = KProtocolInfo::T_STREAM; + else + m_outputType = KProtocolInfo::T_NONE; + + d->docPath = config.readPathEntry( "DocPath" ); + d->protClass = config.readEntry( "Class" ).lower(); + if (d->protClass[0] != ':') + d->protClass.prepend(':'); + + QStringList extraNames = config.readListEntry( "ExtraNames" ); + QStringList extraTypes = config.readListEntry( "ExtraTypes" ); + QStringList::Iterator it = extraNames.begin(); + QStringList::Iterator typeit = extraTypes.begin(); + for( ; it != extraNames.end() && typeit != extraTypes.end(); ++it, ++typeit ) { + d->extraFields.append( ExtraField( *it, *typeit ) ); + } + + d->showPreviews = config.readBoolEntry( "ShowPreviews", d->protClass == ":local" ); + + tmp = config.readEntry( "URIMode", QString::null ).lower(); + if (tmp == "rawuri") + d->uriMode = KURL::RawURI; + else if (tmp == "mailto") + d->uriMode = KURL::Mailto; + else if (tmp == "url") + d->uriMode = KURL::URL; + else + d->uriMode = KURL::Auto; + + d->capabilities = config.readListEntry( "Capabilities" ); + d->proxyProtocol = config.readEntry( "ProxiedBy" ); +} + +KProtocolInfo::KProtocolInfo( QDataStream& _str, int offset) : + KSycocaEntry( _str, offset) +{ + d = new KProtocolInfoPrivate; + load( _str ); +} + +KProtocolInfo::~KProtocolInfo() +{ + delete d; +} + +void +KProtocolInfo::load( QDataStream& _str) +{ + // You may add new fields at the end. Make sure to update the version + // number in ksycoca.h + Q_INT32 i_inputType, i_outputType; + Q_INT8 i_isSourceProtocol, i_isHelperProtocol, + i_supportsListing, i_supportsReading, + i_supportsWriting, i_supportsMakeDir, + i_supportsDeleting, i_supportsLinking, + i_supportsMoving, i_determineMimetypeFromExtension, + i_canCopyFromFile, i_canCopyToFile, i_showPreviews, + i_uriMode, i_canRenameFromFile, i_canRenameToFile, + i_canDeleteRecursive, i_fileNameUsedForCopying; + + _str >> m_name >> m_exec >> m_listing >> m_defaultMimetype + >> i_determineMimetypeFromExtension + >> m_icon + >> i_inputType >> i_outputType + >> i_isSourceProtocol >> i_isHelperProtocol + >> i_supportsListing >> i_supportsReading + >> i_supportsWriting >> i_supportsMakeDir + >> i_supportsDeleting >> i_supportsLinking + >> i_supportsMoving + >> i_canCopyFromFile >> i_canCopyToFile + >> m_config >> m_maxSlaves >> d->docPath >> d->protClass + >> d->extraFields >> i_showPreviews >> i_uriMode + >> d->capabilities >> d->proxyProtocol + >> i_canRenameFromFile >> i_canRenameToFile + >> i_canDeleteRecursive >> i_fileNameUsedForCopying; + + m_inputType = (Type) i_inputType; + m_outputType = (Type) i_outputType; + m_isSourceProtocol = (i_isSourceProtocol != 0); + m_isHelperProtocol = (i_isHelperProtocol != 0); + m_supportsListing = (i_supportsListing != 0); + m_supportsReading = (i_supportsReading != 0); + m_supportsWriting = (i_supportsWriting != 0); + m_supportsMakeDir = (i_supportsMakeDir != 0); + m_supportsDeleting = (i_supportsDeleting != 0); + m_supportsLinking = (i_supportsLinking != 0); + m_supportsMoving = (i_supportsMoving != 0); + m_canCopyFromFile = (i_canCopyFromFile != 0); + m_canCopyToFile = (i_canCopyToFile != 0); + d->canRenameFromFile = (i_canRenameFromFile != 0); + d->canRenameToFile = (i_canRenameToFile != 0); + d->canDeleteRecursive = (i_canDeleteRecursive != 0); + d->fileNameUsedForCopying = (i_fileNameUsedForCopying != 0); + m_determineMimetypeFromExtension = (i_determineMimetypeFromExtension != 0); + d->showPreviews = (i_showPreviews != 0); + d->uriMode = (KURL::URIMode) i_uriMode; +} + +void +KProtocolInfo::save( QDataStream& _str) +{ + KSycocaEntry::save( _str ); + + // You may add new fields at the end. Make sure to update the version + // number in ksycoca.h + Q_INT32 i_inputType, i_outputType; + Q_INT8 i_isSourceProtocol, i_isHelperProtocol, + i_supportsListing, i_supportsReading, + i_supportsWriting, i_supportsMakeDir, + i_supportsDeleting, i_supportsLinking, + i_supportsMoving, i_determineMimetypeFromExtension, + i_canCopyFromFile, i_canCopyToFile, i_showPreviews, + i_uriMode, i_canRenameFromFile, i_canRenameToFile, + i_canDeleteRecursive, i_fileNameUsedForCopying; + + i_inputType = (Q_INT32) m_inputType; + i_outputType = (Q_INT32) m_outputType; + i_isSourceProtocol = m_isSourceProtocol ? 1 : 0; + i_isHelperProtocol = m_isHelperProtocol ? 1 : 0; + i_supportsListing = m_supportsListing ? 1 : 0; + i_supportsReading = m_supportsReading ? 1 : 0; + i_supportsWriting = m_supportsWriting ? 1 : 0; + i_supportsMakeDir = m_supportsMakeDir ? 1 : 0; + i_supportsDeleting = m_supportsDeleting ? 1 : 0; + i_supportsLinking = m_supportsLinking ? 1 : 0; + i_supportsMoving = m_supportsMoving ? 1 : 0; + i_canCopyFromFile = m_canCopyFromFile ? 1 : 0; + i_canCopyToFile = m_canCopyToFile ? 1 : 0; + i_canRenameFromFile = d->canRenameFromFile ? 1 : 0; + i_canRenameToFile = d->canRenameToFile ? 1 : 0; + i_canDeleteRecursive = d->canDeleteRecursive ? 1 : 0; + i_fileNameUsedForCopying = d->fileNameUsedForCopying ? 1 : 0; + i_determineMimetypeFromExtension = m_determineMimetypeFromExtension ? 1 : 0; + i_showPreviews = d->showPreviews ? 1 : 0; + i_uriMode = d->uriMode; + + _str << m_name << m_exec << m_listing << m_defaultMimetype + << i_determineMimetypeFromExtension + << m_icon + << i_inputType << i_outputType + << i_isSourceProtocol << i_isHelperProtocol + << i_supportsListing << i_supportsReading + << i_supportsWriting << i_supportsMakeDir + << i_supportsDeleting << i_supportsLinking + << i_supportsMoving + << i_canCopyFromFile << i_canCopyToFile + << m_config << m_maxSlaves << d->docPath << d->protClass + << d->extraFields << i_showPreviews << i_uriMode + << d->capabilities << d->proxyProtocol + << i_canRenameFromFile << i_canRenameToFile + << i_canDeleteRecursive << i_fileNameUsedForCopying; +} + + +// +// Static functions: +// + +QStringList KProtocolInfo::protocols() +{ + return KProtocolInfoFactory::self()->protocols(); +} + +bool KProtocolInfo::isSourceProtocol( const QString& _protocol ) +{ + KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); + if ( !prot ) + return false; + + return prot->m_isSourceProtocol; +} + +bool KProtocolInfo::isFilterProtocol( const QString& _protocol ) +{ + KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); + if ( !prot ) + return false; + + return !prot->m_isSourceProtocol; +} + +bool KProtocolInfo::isHelperProtocol( const QString& _protocol ) +{ + KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); + if ( !prot ) + return false; + + return prot->m_isHelperProtocol; +} + +bool KProtocolInfo::isKnownProtocol( const QString& _protocol ) +{ + KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); + return ( prot != 0); +} + +bool KProtocolInfo::supportsListing( const QString& _protocol ) +{ + KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); + if ( !prot ) + return false; + + return prot->m_supportsListing; +} + +QStringList KProtocolInfo::listing( const QString& _protocol ) +{ + KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); + if ( !prot ) + return QStringList(); + + return prot->m_listing; +} + +bool KProtocolInfo::supportsReading( const QString& _protocol ) +{ + KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); + if ( !prot ) + return false; + + return prot->m_supportsReading; +} + +bool KProtocolInfo::supportsWriting( const QString& _protocol ) +{ + KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); + if ( !prot ) + return false; + + return prot->m_supportsWriting; +} + +bool KProtocolInfo::supportsMakeDir( const QString& _protocol ) +{ + KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); + if ( !prot ) + return false; + + return prot->m_supportsMakeDir; +} + +bool KProtocolInfo::supportsDeleting( const QString& _protocol ) +{ + KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); + if ( !prot ) + return false; + + return prot->m_supportsDeleting; +} + +bool KProtocolInfo::supportsLinking( const QString& _protocol ) +{ + KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); + if ( !prot ) + return false; + + return prot->m_supportsLinking; +} + +bool KProtocolInfo::supportsMoving( const QString& _protocol ) +{ + KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); + if ( !prot ) + return false; + + return prot->m_supportsMoving; +} + +bool KProtocolInfo::canCopyFromFile( const QString& _protocol ) +{ + KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); + if ( !prot ) + return false; + + return prot->m_canCopyFromFile; +} + + +bool KProtocolInfo::canCopyToFile( const QString& _protocol ) +{ + KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); + if ( !prot ) + return false; + + return prot->m_canCopyToFile; +} + +QString KProtocolInfo::icon( const QString& _protocol ) +{ + KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); + if ( !prot ) + return QString::fromLatin1("unknown"); + + return prot->m_icon; +} + +QString KProtocolInfo::config( const QString& _protocol ) +{ + KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); + if ( !prot ) + return QString::null; + + return QString("kio_%1rc").arg(prot->m_config); +} + +int KProtocolInfo::maxSlaves( const QString& _protocol ) +{ + KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); + if ( !prot ) + return 1; + + return prot->m_maxSlaves; +} + +QString KProtocolInfo::defaultMimetype( const QString& _protocol ) +{ + KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); + if ( !prot ) + return QString::null; + + return prot->m_defaultMimetype; +} + +bool KProtocolInfo::determineMimetypeFromExtension( const QString &_protocol ) +{ + KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol( _protocol ); + if ( !prot ) + return true; + + return prot->m_determineMimetypeFromExtension; +} + +QString KProtocolInfo::exec( const QString& _protocol ) +{ + KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); + if ( !prot ) + return QString::null; + + return prot->m_exec; +} + +KProtocolInfo::Type KProtocolInfo::inputType( const QString& _protocol ) +{ + KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); + if ( !prot ) + return T_NONE; + + return prot->m_inputType; +} + +KProtocolInfo::Type KProtocolInfo::outputType( const QString& _protocol ) +{ + KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); + if ( !prot ) + return T_NONE; + + return prot->m_outputType; +} + +KProtocolInfo::ExtraFieldList KProtocolInfo::extraFields( const KURL &url ) +{ + KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(url.protocol()); + if ( !prot ) + return ExtraFieldList(); + + return prot->d->extraFields; +} + +QString KProtocolInfo::docPath( const QString& _protocol ) +{ + KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); + if ( !prot ) + return QString::null; + + return prot->d->docPath; +} + +QString KProtocolInfo::protocolClass( const QString& _protocol ) +{ + KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); + if ( !prot ) + return QString::null; + + return prot->d->protClass; +} + +bool KProtocolInfo::showFilePreview( const QString& _protocol ) +{ + KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); + if ( !prot ) + return false; + + return prot->d->showPreviews; +} + +KURL::URIMode KProtocolInfo::uriParseMode( const QString& _protocol ) +{ + KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); + if ( !prot ) + return KURL::Auto; + + return prot->d->uriMode; +} + +QStringList KProtocolInfo::capabilities( const QString& _protocol ) +{ + KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); + if ( !prot ) + return QStringList(); + + return prot->d->capabilities; +} + +QString KProtocolInfo::proxiedBy( const QString& _protocol ) +{ + KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol); + if ( !prot ) + return QString::null; + + return prot->d->proxyProtocol; +} + +bool KProtocolInfo::canRenameFromFile() const +{ + return d->canRenameFromFile; +} + +bool KProtocolInfo::canRenameToFile() const +{ + return d->canRenameToFile; +} + +bool KProtocolInfo::canDeleteRecursive() const +{ + return d->canDeleteRecursive; +} + +KProtocolInfo::FileNameUsedForCopying KProtocolInfo::fileNameUsedForCopying() const +{ + return d->fileNameUsedForCopying ? Name : FromURL; +} + +QDataStream& operator>>( QDataStream& s, KProtocolInfo::ExtraField& field ) { + s >> field.name; + s >> field.type; + return s; +} + +QDataStream& operator<<( QDataStream& s, const KProtocolInfo::ExtraField& field ) { + s << field.name; + s << field.type; + return s; +} + +// KURL based static functions are implemented in ../kio/kio/kprotocolinfo.cpp + +void KProtocolInfo::virtual_hook( int id, void* data ) +{ KSycocaEntry::virtual_hook( id, data ); } + |