41 m_relNameMemoryHash(),
44 m_serviceTypeFactory( serviceTypeFactory ),
45 m_mimeTypeFactory( mimeTypeFactory ),
46 m_serviceGroupFactory( serviceGroupFactory )
72 return m_nameMemoryHash.value(name);
77 return m_relNameMemoryHash.value(name);
82 return m_menuIdMemoryHash.value(menuId);
88 int pos = name.lastIndexOf(
'/');
90 name = name.mid(pos+1);
93 if (name.endsWith(QLatin1String(
".desktop"))) {
105 kWarning(7012) <<
"Invalid Service : " << file;
139 int endOfFactoryData = str.device()->pos();
145 str.device()->seek(endOfFactoryData);
148 void KBuildServiceFactory::collectInheritedServices()
154 QSet<QString> visitedMimes;
156 Q_FOREACH(
const QString& mimeType, allMimeTypes) {
157 collectInheritedServices(mimeType, visitedMimes);
162 void KBuildServiceFactory::collectInheritedServices(
const QString& mimeTypeName, QSet<QString>& visitedMimes)
164 if (visitedMimes.contains(mimeTypeName))
166 visitedMimes.insert(mimeTypeName);
171 int mimeTypeInheritanceLevel = 0;
175 collectInheritedServices(parentMimeType, visitedMimes);
177 ++mimeTypeInheritanceLevel;
178 const QList<KServiceOffer>&
offers = m_offerHash.
offersFor(parentMimeType);
179 QList<KServiceOffer>::const_iterator itserv = offers.begin();
180 const QList<KServiceOffer>::const_iterator endserv = offers.end();
181 for ( ; itserv != endserv; ++itserv ) {
184 offer.setMimeTypeInheritanceLevel(mimeTypeInheritanceLevel);
198 KSycocaEntryDict::Iterator itserv =
m_entryDict->begin();
199 const KSycocaEntryDict::Iterator endserv =
m_entryDict->end();
200 for( ; itserv != endserv ; ++itserv ) {
207 if (!parent.isEmpty())
213 m_nameMemoryHash.insert(name, service);
218 m_relNameMemoryHash.insert(relName, service);
221 if (!menuId.isEmpty()) {
223 m_menuIdMemoryHash.insert(menuId, service);
226 populateServiceTypes();
229 void KBuildServiceFactory::populateServiceTypes()
232 KSycocaEntryDict::Iterator itserv =
m_entryDict->begin();
233 const KSycocaEntryDict::Iterator endserv =
m_entryDict->end();
234 for( ; itserv != endserv ; ++itserv ) {
237 QVector<KService::ServiceTypeAndPreference> serviceTypeList = service->_k_accessServiceTypes();
242 for (
int i = 0; i < serviceTypeList.count() ; ++i) {
243 const QString stName = serviceTypeList[i].serviceType;
247 const int preference = serviceTypeList[i].preference;
248 const QString parent = serviceType->parentServiceType();
249 if (!parent.isEmpty())
255 KServiceOffer offer(service, serviceTypeList[i].preference, 0, service->allowAsDefault());
258 if (stName.startsWith(QLatin1String(
"x-scheme-handler/"))) {
263 kDebug(7021) << service->entryPath() <<
"specifies undefined mimetype/servicetype" << stName;
278 mimeAssociations.parseAllMimeAppsList();
281 collectInheritedServices();
285 int offersOffset = 0;
286 const int offerEntrySize =
sizeof(
qint32 ) * 4;
291 KSycocaEntryDict::const_iterator itstf = m_serviceTypeFactory->
entryDict()->constBegin();
292 const KSycocaEntryDict::const_iterator endstf = m_serviceTypeFactory->
entryDict()->constEnd();
293 for( ; itstf != endstf; ++itstf ) {
295 const int numOffers = m_offerHash.
offersFor(entry->name()).count();
297 entry->setServiceOffersOffset( offersOffset );
298 offersOffset += offerEntrySize * numOffers;
301 KSycocaEntryDict::const_iterator itmtf = m_mimeTypeFactory->
entryDict()->constBegin();
302 const KSycocaEntryDict::const_iterator endmtf = m_mimeTypeFactory->
entryDict()->constEnd();
303 for( ; itmtf != endmtf; ++itmtf )
306 const int numOffers = m_offerHash.
offersFor(entry->name()).count();
309 entry->setServiceOffersOffset( offersOffset );
310 offersOffset += offerEntrySize * numOffers;
315 void KBuildServiceFactory::saveOfferList(QDataStream &str)
320 KSycocaEntryDict::const_iterator itstf = m_serviceTypeFactory->
entryDict()->constBegin();
321 const KSycocaEntryDict::const_iterator endstf = m_serviceTypeFactory->
entryDict()->constEnd();
322 for( ; itstf != endstf; ++itstf ) {
327 QList<KServiceOffer> offers = m_offerHash.
offersFor(entry->name());
328 qStableSort( offers );
330 for(QList<KServiceOffer>::const_iterator it2 = offers.constBegin();
331 it2 != offers.constEnd(); ++it2) {
334 str << (
qint32) entry->offset();
335 str << (
qint32) (*it2).service()->offset();
336 str << (
qint32) (*it2).preference();
343 KSycocaEntryDict::const_iterator itmtf = m_mimeTypeFactory->
entryDict()->constBegin();
344 const KSycocaEntryDict::const_iterator endmtf = m_mimeTypeFactory->
entryDict()->constEnd();
345 for( ; itmtf != endmtf; ++itmtf ) {
349 QList<KServiceOffer> offers = m_offerHash.
offersFor(entry->name());
350 qStableSort( offers );
352 for(QList<KServiceOffer>::const_iterator it2 = offers.constBegin();
353 it2 != offers.constEnd(); ++it2) {
355 Q_ASSERT((*it2).service()->offset() != 0);
356 str << (
qint32) entry->offset();
357 str << (
qint32) (*it2).service()->offset();
358 str << (
qint32) (*it2).preference();
359 str << (
qint32) (*it2).mimeTypeInheritanceLevel();
370 if (m_dupeDict.contains(newEntry))
374 m_dupeDict.insert(newEntry);