KSycocaEntry::List KBuildMimeTypeFactory::allEntries() const { assert (KSycoca::self()->isBuilding()); KSycocaEntry::List lst; KSycocaEntryDict::Iterator itmime = m_entryDict->begin(); const KSycocaEntryDict::Iterator endmime = m_entryDict->end(); for( ; itmime != endmime ; ++itmime ) lst.append( *itmime ); return lst; }
// returns false if the database is up to date bool KBuildSycoca::build() { typedef TQPtrList<KBSEntryDict> KBSEntryDictList; KBSEntryDictList *entryDictList = 0; KBSEntryDict *serviceEntryDict = 0; entryDictList = new KBSEntryDictList(); // Convert for each factory the entryList to a Dict. int i = 0; // For each factory for (KSycocaFactory *factory = m_lstFactories->first(); factory; factory = m_lstFactories->next() ) { KBSEntryDict *entryDict = new KBSEntryDict(); if (g_allEntries) { KSycocaEntry::List list = (*g_allEntries)[i++]; for( KSycocaEntry::List::Iterator it = list.begin(); it != list.end(); ++it) { entryDict->insert( (*it)->entryPath(), static_cast<KSycocaEntry *>(*it)); } } if (factory == g_bsf) serviceEntryDict = entryDict; else if (factory == g_bsgf) g_serviceGroupEntryDict = entryDict; entryDictList->append(entryDict); } TQStringList allResources; // For each factory for (KSycocaFactory *factory = m_lstFactories->first(); factory; factory = m_lstFactories->next() ) { // For each resource the factory deals with const KSycocaResourceList *list = factory->resourceList(); if (!list) continue; for( KSycocaResourceList::ConstIterator it1 = list->begin(); it1 != list->end(); ++it1 ) { KSycocaResource res = (*it1); if (!allResources.contains(res.resource)) allResources.append(res.resource); } } g_ctimeInfo = new KCTimeInfo(); // This is a build factory too, don't delete!! bool uptodate = true; // For all resources for( TQStringList::ConstIterator it1 = allResources.begin(); it1 != allResources.end(); ++it1 ) { g_changed = false; g_resource = (*it1).ascii(); TQStringList relFiles; (void) TDEGlobal::dirs()->findAllResources( g_resource, TQString::null, true, // Recursive! true, // uniq relFiles); // Now find all factories that use this resource.... // For each factory g_entryDict = entryDictList->first(); for (g_factory = m_lstFactories->first(); g_factory; g_factory = m_lstFactories->next(), g_entryDict = entryDictList->next() ) { // For each resource the factory deals with const KSycocaResourceList *list = g_factory->resourceList(); if (!list) continue; for( KSycocaResourceList::ConstIterator it2 = list->begin(); it2 != list->end(); ++it2 ) { KSycocaResource res = (*it2); if (res.resource != (*it1)) continue; // For each file in the resource for( TQStringList::ConstIterator it3 = relFiles.begin(); it3 != relFiles.end(); ++it3 ) { // Check if file matches filter if ((*it3).endsWith(res.extension)) createEntry(*it3, true); } } if ((g_factory == g_bsf) && (strcmp(g_resource, "services") == 0)) processGnomeVfs(); } if (g_changed || !g_allEntries) { uptodate = false; g_changeList->append(g_resource); } } bool result = !uptodate || !g_ctimeDict->isEmpty(); if (result || bMenuTest) { g_resource = "apps"; g_factory = g_bsf; g_entryDict = serviceEntryDict; g_changed = false; g_vfolder = new VFolderMenu; if (!m_trackId.isEmpty()) g_vfolder->setTrackId(m_trackId); connect(g_vfolder, TQT_SIGNAL(newService(const TQString &, KService **)), this, TQT_SLOT(slotCreateEntry(const TQString &, KService **))); VFolderMenu::SubMenu *kdeMenu = g_vfolder->parseMenu("tde-applications.menu", true); KServiceGroup *entry = g_bsgf->addNew("/", kdeMenu->directoryFile, 0, false); entry->setLayoutInfo(kdeMenu->layoutList); createMenu(TQString::null, TQString::null, kdeMenu); KServiceGroup::Ptr g(entry); (void) existingResourceDirs(); *g_allResourceDirs += g_vfolder->allDirectories(); disconnect(g_vfolder, TQT_SIGNAL(newService(const TQString &, KService **)), this, TQT_SLOT(slotCreateEntry(const TQString &, KService **))); if (g_changed || !g_allEntries) { uptodate = false; g_changeList->append(g_resource); } if (bMenuTest) return false; }
KSycocaEntry *KBuildSycoca::createEntry(const TQString &file, bool addToFactory) { TQ_UINT32 timeStamp = g_ctimeInfo->ctime(file); if (!timeStamp) { timeStamp = TDEGlobal::dirs()->calcResourceHash( g_resource, file, true); } KSycocaEntry* entry = 0; if (g_allEntries) { assert(g_ctimeDict); TQ_UINT32 *timeP = (*g_ctimeDict)[file]; TQ_UINT32 oldTimestamp = timeP ? *timeP : 0; if (timeStamp && (timeStamp == oldTimestamp)) { // Re-use old entry if (g_factory == g_bsgf) // Strip .directory from service-group entries { entry = g_entryDict->find(file.left(file.length()-10)); } else if (g_factory == g_bsf) { entry = g_entryDict->find(file); } else { entry = g_entryDict->find(file); } // remove from g_ctimeDict; if g_ctimeDict is not empty // after all files have been processed, it means // some files were removed since last time g_ctimeDict->remove( file ); } else if (oldTimestamp) { g_changed = true; kdDebug(7021) << "modified: " << file << endl; } else { g_changed = true; kdDebug(7021) << "new: " << file << endl; } } g_ctimeInfo->addCTime(file, timeStamp ); if (!entry) { // Create a new entry entry = g_factory->createEntry( file, g_resource ); } if ( entry && entry->isValid() ) { if (addToFactory) g_factory->addEntry( entry, g_resource ); else g_tempStorage.append(entry); return entry; } return 0; }