KDECore
kservicefactory.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "kservicefactory.h"
00020 #include "ksycoca.h"
00021 #include "ksycocatype.h"
00022 #include "ksycocadict.h"
00023 #include "kservice.h"
00024
00025 #include <QtCore/QCharRef>
00026
00027 #include <klocale.h>
00028 #include <kdebug.h>
00029 #include <kglobal.h>
00030 #include <kstandarddirs.h>
00031
00032 KServiceFactory::KServiceFactory()
00033 : KSycocaFactory( KST_KServiceFactory )
00034 {
00035 m_offerListOffset = 0;
00036 m_nameDictOffset = 0;
00037 m_relNameDictOffset = 0;
00038 m_menuIdDictOffset = 0;
00039 if (m_str)
00040 {
00041
00042 qint32 i;
00043 (*m_str) >> i;
00044 m_nameDictOffset = i;
00045 (*m_str) >> i;
00046 m_relNameDictOffset = i;
00047 (*m_str) >> i;
00048 m_offerListOffset = i;
00049 (*m_str) >> i;
00050 m_menuIdDictOffset = i;
00051
00052 const int saveOffset = m_str->device()->pos();
00053
00054 m_nameDict = new KSycocaDict(m_str, m_nameDictOffset);
00055
00056 m_relNameDict = new KSycocaDict(m_str, m_relNameDictOffset);
00057
00058 m_menuIdDict = new KSycocaDict(m_str, m_menuIdDictOffset);
00059 m_str->device()->seek(saveOffset);
00060 }
00061 else
00062 {
00063
00064 m_nameDict = new KSycocaDict();
00065 m_relNameDict = new KSycocaDict();
00066 m_menuIdDict = new KSycocaDict();
00067 }
00068 _self = this;
00069 }
00070
00071 KServiceFactory::~KServiceFactory()
00072 {
00073 _self = 0;
00074 delete m_nameDict;
00075 delete m_relNameDict;
00076 delete m_menuIdDict;
00077 }
00078
00079 KServiceFactory * KServiceFactory::self()
00080 {
00081 if (!_self) {
00082 _self = new KServiceFactory();
00083 }
00084 return _self;
00085 }
00086
00087 KService::Ptr KServiceFactory::findServiceByName(const QString &_name)
00088 {
00089 if (!sycocaDict()) return KService::Ptr();
00090
00091
00092
00093
00094
00095 int offset = sycocaDict()->find_string( _name );
00096 if (!offset) return KService::Ptr();
00097
00098 KService::Ptr newService(createEntry(offset));
00099
00100
00101 if (newService && (newService->name() != _name)) {
00102
00103 return KService::Ptr();
00104 }
00105 return newService;
00106 }
00107
00108 KService::Ptr KServiceFactory::findServiceByDesktopName(const QString &_name)
00109 {
00110 if (!m_nameDict) return KService::Ptr();
00111
00112
00113
00114
00115 int offset = m_nameDict->find_string( _name );
00116 if (!offset) return KService::Ptr();
00117
00118 KService::Ptr newService(createEntry(offset));
00119
00120
00121 if (newService && (newService->desktopEntryName() != _name)) {
00122
00123 return KService::Ptr();
00124 }
00125 return newService;
00126 }
00127
00128 KService::Ptr KServiceFactory::findServiceByDesktopPath(const QString &_name)
00129 {
00130 if (!m_relNameDict) return KService::Ptr();
00131
00132
00133
00134
00135 int offset = m_relNameDict->find_string( _name );
00136 if (!offset) {
00137 kDebug() << QString("findServiceByDesktopPath: %1 not found").arg( _name );
00138 return KService::Ptr();
00139 }
00140
00141 KService::Ptr newService(createEntry(offset));
00142 if ( !newService )
00143 kDebug() << "findServiceByDesktopPath: createEntry failed!";
00144
00145
00146
00147 if (newService && (newService->entryPath() != _name)) {
00148
00149 return KService::Ptr();
00150 }
00151 return newService;
00152 }
00153
00154 KService::Ptr KServiceFactory::findServiceByMenuId(const QString &_menuId)
00155 {
00156 if (!m_menuIdDict) return KService::Ptr();
00157
00158
00159
00160
00161 int offset = m_menuIdDict->find_string( _menuId );
00162 if (!offset) return KService::Ptr();
00163
00164 KService::Ptr newService(createEntry(offset));
00165
00166
00167 if (newService && (newService->menuId() != _menuId)) {
00168
00169 return KService::Ptr();
00170 }
00171 return newService;
00172 }
00173
00174 KService* KServiceFactory::createEntry(int offset) const
00175 {
00176 KService * newEntry = 0L;
00177 KSycocaType type;
00178 QDataStream *str = KSycoca::self()->findEntry(offset, type);
00179 switch(type) {
00180 case KST_KService:
00181 newEntry = new KService(*str, offset);
00182 break;
00183
00184 default:
00185 kError(7011) << QString("KServiceFactory: unexpected object entry in KSycoca database (type = %1)").arg((int)type) << endl;
00186 return 0;
00187 }
00188 if (!newEntry->isValid())
00189 {
00190 kError(7011) << "KServiceFactory: corrupt object in KSycoca database!\n" << endl;
00191 delete newEntry;
00192 newEntry = 0;
00193 }
00194 return newEntry;
00195 }
00196
00197 KService::List KServiceFactory::allServices()
00198 {
00199 KService::List result;
00200 const KSycocaEntry::List list = allEntries();
00201 KSycocaEntry::List::const_iterator it = list.begin();
00202 const KSycocaEntry::List::const_iterator end = list.end();
00203 for( ; it != end; ++it ) {
00204 const KSycocaEntry::Ptr entry = *it;
00205 if ( entry->isType( KST_KService ) )
00206 result.append( KService::Ptr::staticCast( entry ) );
00207 }
00208 return result;
00209 }
00210
00211 QList<KServiceOffer> KServiceFactory::offers( int serviceTypeOffset, int serviceOffersOffset )
00212 {
00213 QList<KServiceOffer> list;
00214
00215
00216 m_str->device()->seek( m_offerListOffset + serviceOffersOffset );
00217
00218 qint32 aServiceTypeOffset, aServiceOffset, initialPreference, mimeTypeInheritanceLevel;
00219 while (true)
00220 {
00221 (*m_str) >> aServiceTypeOffset;
00222 if ( aServiceTypeOffset ) {
00223 (*m_str) >> aServiceOffset;
00224 (*m_str) >> initialPreference;
00225 (*m_str) >> mimeTypeInheritanceLevel;
00226 if ( aServiceTypeOffset == serviceTypeOffset ) {
00227
00228 const int savedPos = m_str->device()->pos();
00229
00230 KService * serv = createEntry( aServiceOffset );
00231 if (serv) {
00232 KService::Ptr servPtr( serv );
00233 list.append( KServiceOffer( servPtr, initialPreference, mimeTypeInheritanceLevel, servPtr->allowAsDefault() ) );
00234 }
00235
00236 m_str->device()->seek( savedPos );
00237 } else
00238 break;
00239 }
00240 else
00241 break;
00242 }
00243 return list;
00244 }
00245
00246 KService::List KServiceFactory::serviceOffers( int serviceTypeOffset, int serviceOffersOffset )
00247 {
00248 KService::List list;
00249
00250
00251 m_str->device()->seek( m_offerListOffset + serviceOffersOffset );
00252
00253 qint32 aServiceTypeOffset, aServiceOffset, initialPreference, mimeTypeInheritanceLevel;
00254 while (true) {
00255 (*m_str) >> aServiceTypeOffset;
00256 if ( aServiceTypeOffset )
00257 {
00258 (*m_str) >> aServiceOffset;
00259 (*m_str) >> initialPreference;
00260 (*m_str) >> mimeTypeInheritanceLevel;
00261 if ( aServiceTypeOffset == serviceTypeOffset )
00262 {
00263
00264 const int savedPos = m_str->device()->pos();
00265
00266 KService * serv = createEntry( aServiceOffset );
00267 if (serv)
00268 list.append( KService::Ptr( serv ) );
00269
00270 m_str->device()->seek( savedPos );
00271 } else
00272 break;
00273 }
00274 else
00275 break;
00276 }
00277 return list;
00278 }
00279
00280 bool KServiceFactory::hasOffer( int serviceTypeOffset, int serviceOffersOffset, int testedServiceOffset )
00281 {
00282
00283 const int savedPos = m_str->device()->pos();
00284
00285
00286 m_str->device()->seek( m_offerListOffset + serviceOffersOffset );
00287 bool found = false;
00288 qint32 aServiceTypeOffset, aServiceOffset, initialPreference, mimeTypeInheritanceLevel;
00289 while (!found)
00290 {
00291 (*m_str) >> aServiceTypeOffset;
00292 if ( aServiceTypeOffset ) {
00293 (*m_str) >> aServiceOffset;
00294 (*m_str) >> initialPreference;
00295 (*m_str) >> mimeTypeInheritanceLevel;
00296 if ( aServiceTypeOffset == serviceTypeOffset )
00297 {
00298 if( aServiceOffset == testedServiceOffset )
00299 found = true;
00300 } else
00301 break;
00302 }
00303 else
00304 break;
00305 }
00306
00307 m_str->device()->seek( savedPos );
00308 return found;
00309 }
00310
00311 KServiceFactory *KServiceFactory::_self = 0;
00312
00313 void KServiceFactory::virtual_hook( int id, void* data )
00314 { KSycocaFactory::virtual_hook( id, data ); }
00315