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