19 #include "kservicefactory.h"
21 #include "ksycocatype.h"
22 #include "ksycocadict.h"
30 #include <kstandarddirs.h>
31 #include <kstaticdeleter.h>
33 KServiceFactory::KServiceFactory()
34 : KSycocaFactory( KST_KServiceFactory )
36 m_offerListOffset = 0;
38 m_relNameDictOffset = 0;
39 m_menuIdDictOffset = 0;
47 m_relNameDictOffset = i;
49 m_offerListOffset = i;
53 m_menuIdDictOffset = i;
55 int saveOffset = m_str->device()->at();
57 m_nameDict =
new KSycocaDict(m_str, m_nameDictOffset);
59 m_relNameDict =
new KSycocaDict(m_str, m_relNameDictOffset);
61 m_menuIdDict =
new KSycocaDict(m_str, m_menuIdDictOffset);
62 saveOffset = m_str->device()->at(saveOffset);
67 m_nameDict =
new KSycocaDict();
68 m_relNameDict =
new KSycocaDict();
69 m_menuIdDict =
new KSycocaDict();
74 KServiceFactory::~KServiceFactory()
82 KServiceFactory * KServiceFactory::self()
85 _self =
new KServiceFactory();
90 KService * KServiceFactory::findServiceByName(
const TQString &_name)
92 if (!m_sycocaDict)
return 0;
98 int offset = m_sycocaDict->find_string( _name );
99 if (!offset)
return 0;
101 KService * newService = createEntry(offset);
104 if (newService && (newService->
name() != _name))
113 KService * KServiceFactory::findServiceByDesktopName(
const TQString &_name)
115 if (!m_nameDict)
return 0;
121 int offset = m_nameDict->find_string( _name );
122 if (!offset)
return 0;
124 KService * newService = createEntry(offset);
136 KService * KServiceFactory::findServiceByDesktopPath(
const TQString &_name)
138 if (!m_relNameDict)
return 0;
144 int offset = m_relNameDict->find_string( _name );
145 if (!offset)
return 0;
147 KService * newService = createEntry(offset);
159 KService * KServiceFactory::findServiceByMenuId(
const TQString &_menuId)
161 if (!m_menuIdDict)
return 0;
167 int offset = m_menuIdDict->find_string( _menuId );
168 if (!offset)
return 0;
170 KService * newService = createEntry(offset);
173 if (newService && (newService->
menuId() != _menuId))
182 KService* KServiceFactory::createEntry(
int offset)
186 TQDataStream *str = KSycoca::self()->findEntry(offset, type);
190 newEntry =
new KService(*str, offset);
194 kdError(7011) << TQString(TQString(
"KServiceFactory: unexpected object entry in KSycoca database (type = %1)").arg((
int)type)) << endl;
199 kdError(7011) <<
"KServiceFactory: corrupt object in KSycoca database!\n" << endl;
206 KService::List KServiceFactory::allServices()
208 KService::List result;
209 KSycocaEntry::List list = allEntries();
210 for( KSycocaEntry::List::Iterator it = list.begin();
216 result.append( KService::Ptr( newService ) );
221 KService::List KServiceFactory::allInitServices()
224 if (!m_str)
return list;
228 m_str->device()->at(m_initListOffset);
230 (*m_str) >> entryCount;
232 TQ_INT32 *offsetList =
new TQ_INT32[entryCount];
233 for(
int i = 0; i < entryCount; i++)
235 (*m_str) >> offsetList[i];
238 for(
int i = 0; i < entryCount; i++)
240 KService *newEntry = createEntry(offsetList[i]);
243 list.append( KService::Ptr( newEntry ) );
246 delete [] offsetList;
250 KService::List KServiceFactory::offers(
int serviceTypeOffset )
254 TQDataStream *str = m_str;
256 str->device()->at( m_offerListOffset );
258 TQ_INT32 aServiceTypeOffset;
259 TQ_INT32 aServiceOffset;
264 (*str) >> aServiceTypeOffset;
265 if ( aServiceTypeOffset )
267 (*str) >> aServiceOffset;
268 if ( aServiceTypeOffset == serviceTypeOffset )
271 int savedPos = str->device()->at();
273 KService * serv = createEntry( aServiceOffset );
275 list.append( KService::Ptr( serv ) );
277 str->device()->at( savedPos );
278 }
else if ( aServiceTypeOffset > (TQ_INT32)serviceTypeOffset )
287 KServiceFactory *KServiceFactory::_self = 0;
289 void KServiceFactory::virtual_hook(
int id,
void* data )
290 { KSycocaFactory::virtual_hook(
id, data ); }