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