// 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; }