41 m_relNameMemoryHash(),
44 m_serviceTypeFactory( serviceTypeFactory ),
45 m_mimeTypeFactory( mimeTypeFactory ),
46 m_serviceGroupFactory( serviceGroupFactory )
51 m_resourceList->add(
"services",
"*.desktop" );
67 delete m_resourceList;
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"))) {
101 if ( serv->isValid() && !serv->isDeleted() ) {
104 if (!serv->isDeleted()) {
105 kWarning(7012) <<
"Invalid Service : " << file;
116 KSycocaFactory::saveHeader(str);
126 KSycocaFactory::save(str);
139 int endOfFactoryData = str.device()->pos();
145 str.device()->seek(endOfFactoryData);
148 void KBuildServiceFactory::collectInheritedServices()
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;
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 ) {
202 KSycocaEntry::Ptr entry = *itserv;
205 if (!service->isDeleted()) {
207 if (!parent.isEmpty())
208 m_serviceGroupFactory->
addNewChild(parent, KSycocaEntry::Ptr::staticCast(service));
213 m_nameMemoryHash.insert(name, service);
215 const QString relName = service->entryPath();
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 ) {
242 for (
int i = 0; i < serviceTypeList.count() ; ++i) {
243 const QString stName = serviceTypeList[i].serviceType;
245 KServiceType::Ptr serviceType = KServiceType::serviceType(stName);
247 const int preference = serviceTypeList[i].preference;
248 const QString parent = serviceType->parentServiceType();
249 if (!parent.isEmpty())
256 KMimeType::Ptr mime = KMimeType::mimeType(stName, KMimeType::ResolveAliases);
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 ) {
294 KServiceType::Ptr entry = KServiceType::Ptr::staticCast( *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 ) {
324 const KServiceType::Ptr entry = KServiceType::Ptr::staticCast( *itstf );
328 qStableSort( offers );
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 ) {
350 qStableSort( offers );
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);
375 KSycocaFactory::addEntry(newEntry);