kservicetype.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "kservice.h"
00021 #include "ksycoca.h"
00022 #include "kservicetype.h"
00023 #include "kservicetypefactory.h"
00024 #include "kservicefactory.h"
00025 #include "kuserprofile.h"
00026 #include <assert.h>
00027 #include <kdebug.h>
00028 #include <kdesktopfile.h>
00029
00030 template QDataStream& operator>> <QString, QVariant>(QDataStream&, QMap<QString, QVariant>&);
00031 template QDataStream& operator<< <QString, QVariant>(QDataStream&, const QMap<QString, QVariant>&);
00032
00033 KServiceType::KServiceType( const QString & _fullpath)
00034 : KSycocaEntry(_fullpath)
00035 {
00036 KDesktopFile config( _fullpath );
00037
00038 init(&config);
00039 }
00040
00041 KServiceType::KServiceType( KDesktopFile *config )
00042 : KSycocaEntry(config->filename())
00043 {
00044 init(config);
00045 }
00046
00047 void
00048 KServiceType::init( KDesktopFile *config)
00049 {
00050
00051 m_strName = config->readEntry( "MimeType" );
00052
00053
00054 if ( m_strName.isEmpty() )
00055 {
00056 m_strName = config->readEntry( "X-KDE-ServiceType" );
00057 }
00058
00059 m_strComment = config->readComment();
00060 m_bDeleted = config->readBoolEntry( "Hidden", false );
00061 m_strIcon = config->readIcon();
00062
00063
00064
00065 QString sDerived = config->readEntry( "X-KDE-Derived" );
00066 m_bDerived = !sDerived.isEmpty();
00067 if ( m_bDerived )
00068 m_mapProps.insert( "X-KDE-Derived", sDerived );
00069
00070 QStringList tmpList = config->groupList();
00071 QStringList::Iterator gIt = tmpList.begin();
00072
00073 for( ; gIt != tmpList.end(); ++gIt )
00074 {
00075 if ( (*gIt).find( "Property::" ) == 0 )
00076 {
00077 config->setGroup( *gIt );
00078 QVariant v = config->readPropertyEntry( "Value",
00079 QVariant::nameToType( config->readEntry( "Type" ).ascii() ) );
00080 if ( v.isValid() )
00081 m_mapProps.insert( (*gIt).mid( 10 ), v );
00082 }
00083 }
00084
00085 gIt = tmpList.begin();
00086 for( ; gIt != tmpList.end(); ++gIt )
00087 {
00088 if( (*gIt).find( "PropertyDef::" ) == 0 )
00089 {
00090 config->setGroup( *gIt );
00091 m_mapPropDefs.insert( (*gIt).mid( 13 ),
00092 QVariant::nameToType( config->readEntry( "Type" ).ascii() ) );
00093 }
00094 }
00095
00096 m_bValid = !m_strName.isEmpty();
00097 }
00098
00099 KServiceType::KServiceType( const QString & _fullpath, const QString& _type,
00100 const QString& _icon, const QString& _comment )
00101 : KSycocaEntry(_fullpath)
00102 {
00103 m_strName = _type;
00104 m_strIcon = _icon;
00105 m_strComment = _comment;
00106 m_bValid = !m_strName.isEmpty();
00107 }
00108
00109 KServiceType::KServiceType( QDataStream& _str, int offset )
00110 : KSycocaEntry( _str, offset )
00111 {
00112 load( _str);
00113 }
00114
00115 void
00116 KServiceType::load( QDataStream& _str )
00117 {
00118 Q_INT8 b;
00119 _str >> m_strName >> m_strIcon >> m_strComment >> m_mapProps >> m_mapPropDefs
00120 >> b;
00121 m_bValid = b;
00122 m_bDerived = m_mapProps.contains("X-KDE-Derived");
00123 }
00124
00125 void
00126 KServiceType::save( QDataStream& _str )
00127 {
00128 KSycocaEntry::save( _str );
00129
00130
00131
00132 _str << m_strName << m_strIcon << m_strComment << m_mapProps << m_mapPropDefs
00133 << (Q_INT8)m_bValid;
00134 }
00135
00136 KServiceType::~KServiceType()
00137 {
00138 }
00139
00140 QString KServiceType::parentServiceType() const
00141 {
00142 QVariant v = property("X-KDE-Derived");
00143 return v.toString();
00144 }
00145
00146 bool KServiceType::inherits( const QString& servTypeName ) const
00147 {
00148 if ( name() == servTypeName )
00149 return true;
00150 QString st = parentServiceType();
00151 while ( !st.isEmpty() )
00152 {
00153 KServiceType::Ptr ptr = KServiceType::serviceType( st );
00154 if (!ptr) return false;
00155 if ( ptr->name() == servTypeName )
00156 return true;
00157 st = ptr->parentServiceType();
00158 }
00159 return false;
00160 }
00161
00162 QVariant
00163 KServiceType::property( const QString& _name ) const
00164 {
00165 QVariant v;
00166
00167 if ( _name == "Name" )
00168 v = QVariant( m_strName );
00169 else if ( _name == "Icon" )
00170 v = QVariant( m_strIcon );
00171 else if ( _name == "Comment" )
00172 v = QVariant( m_strComment );
00173 else {
00174 QMap<QString,QVariant>::ConstIterator it = m_mapProps.find( _name );
00175 if ( it != m_mapProps.end() )
00176 v = it.data();
00177 }
00178
00179 return v;
00180 }
00181
00182 QStringList
00183 KServiceType::propertyNames() const
00184 {
00185 QStringList res;
00186
00187 QMap<QString,QVariant>::ConstIterator it = m_mapProps.begin();
00188 for( ; it != m_mapProps.end(); ++it )
00189 res.append( it.key() );
00190
00191 res.append( "Name" );
00192 res.append( "Comment" );
00193 res.append( "Icon" );
00194
00195 return res;
00196 }
00197
00198 QVariant::Type
00199 KServiceType::propertyDef( const QString& _name ) const
00200 {
00201 QMap<QString,QVariant::Type>::ConstIterator it = m_mapPropDefs.find( _name );
00202 if ( it == m_mapPropDefs.end() )
00203 return QVariant::Invalid;
00204 return it.data();
00205 }
00206
00207 QStringList
00208 KServiceType::propertyDefNames() const
00209 {
00210 QStringList l;
00211
00212 QMap<QString,QVariant::Type>::ConstIterator it = m_mapPropDefs.begin();
00213 for( ; it != m_mapPropDefs.end(); ++it )
00214 l.append( it.key() );
00215
00216 return l;
00217 }
00218
00219 KServiceType::Ptr KServiceType::serviceType( const QString& _name )
00220 {
00221 KServiceType * p = KServiceTypeFactory::self()->findServiceTypeByName( _name );
00222 return KServiceType::Ptr( p );
00223 }
00224
00225 KService::List KServiceType::offers( const QString& _servicetype )
00226 {
00227 KService::List lst;
00228
00229
00230 KServiceType * serv = KServiceTypeFactory::self()->findServiceTypeByName( _servicetype );
00231 if ( serv )
00232 lst += KServiceFactory::self()->offers( serv->offset() );
00233 else
00234 kdWarning(7009) << "KServiceType::offers : servicetype " << _servicetype << " not found" << endl;
00235 bool isAMimeType = serv ? serv->isType( KST_KMimeType ) : false;
00236 delete serv;
00237
00238
00239
00240
00241
00242
00243
00244
00245 if ( !KServiceTypeProfile::configurationMode()
00246 && isAMimeType
00247 && _servicetype.left(4) != "all/" )
00248 {
00249
00250 KServiceType * servAll = KServiceTypeFactory::self()->findServiceTypeByName( "all/all" );
00251 if ( servAll )
00252 {
00253 KService::List newOffers = KServiceFactory::self()->offers( servAll->offset() );
00254
00255 QValueListIterator<KService::Ptr> it = newOffers.begin();
00256 for( ; it != newOffers.end(); ++it )
00257 {
00258 bool found = false;
00259 QValueListIterator<KService::Ptr> it2 = lst.begin();
00260 for( ; it2 != lst.end() && !found; ++it2 )
00261 found = (*it)->desktopEntryPath() == (*it2)->desktopEntryPath();
00262 if ( !found )
00263 {
00264 (*it)->setInitialPreference( 0 );
00265 lst += *it;
00266 }
00267 }
00268
00269 }
00270 else
00271 kdWarning(7009) << "KServiceType::offers : servicetype all/all not found" << endl;
00272 delete servAll;
00273
00274
00275 if ( _servicetype != "inode/directory" && _servicetype != "inode/directory-locked" )
00276 {
00277 KServiceType * servAllFiles = KServiceTypeFactory::self()->findServiceTypeByName( "all/allfiles" );
00278 if ( servAllFiles )
00279 {
00280 KService::List newOffers = KServiceFactory::self()->offers( servAllFiles->offset() );
00281
00282 QValueListIterator<KService::Ptr> it = newOffers.begin();
00283 for( ; it != newOffers.end(); ++it )
00284 {
00285 bool found = false;
00286 QValueListIterator<KService::Ptr> it2 = lst.begin();
00287 for( ; it2 != lst.end() && !found; ++it2 )
00288 found = (*it)->desktopEntryPath() == (*it2)->desktopEntryPath();
00289 if ( !found )
00290 {
00291 (*it)->setInitialPreference( 0 );
00292 lst += *it;
00293 }
00294 }
00295
00296 }
00297 else
00298 kdWarning(7009) << "KServiceType::offers : servicetype all/allfiles not found" << endl;
00299 delete servAllFiles;
00300 }
00301 }
00302
00303 return lst;
00304 }
00305
00306 KServiceType::List KServiceType::allServiceTypes()
00307 {
00308 return KServiceTypeFactory::self()->allServiceTypes();
00309 }
00310
00311 void KServiceType::virtual_hook( int id, void* data )
00312 { KSycocaEntry::virtual_hook( id, data ); }
This file is part of the documentation for kdelibs Version 3.1.5.