File indexing completed on 2024-12-08 03:41:41
0001 /* 0002 This file is part of the KDE libraries 0003 SPDX-FileCopyrightText: 1999 David Faure <faure@kde.org> 0004 0005 SPDX-License-Identifier: LGPL-2.0-only 0006 */ 0007 0008 #ifndef KBUILDSYCOCA_H 0009 #define KBUILDSYCOCA_H 0010 0011 #include "kbuildsycocainterface_p.h" 0012 0013 #include <kservice.h> 0014 #include <ksycoca.h> 0015 0016 #include "vfolder_menu_p.h" 0017 0018 class KBuildServiceGroupFactory; 0019 class QDataStream; 0020 class KCTimeFactory; 0021 class KCTimeDict; 0022 0023 /** 0024 * @internal 0025 * Exported for kbuildsycoca, but not installed. 0026 */ 0027 class KSERVICE_EXPORT KBuildSycoca : public KSycoca, public KBuildSycocaInterface 0028 { 0029 Q_OBJECT 0030 public: 0031 explicit KBuildSycoca(); 0032 ~KBuildSycoca() override; 0033 0034 /** 0035 * Recreate the database file. 0036 * @return true if it was indeed recreated (by us or possibly by someone else), false on error 0037 */ 0038 bool recreate(bool incremental = true); 0039 0040 void setTrackId(const QString &id) 0041 { 0042 m_trackId = id; 0043 } 0044 0045 void setMenuTest(bool b) 0046 { 0047 m_menuTest = b; 0048 } 0049 0050 static QStringList factoryResourceDirs(); 0051 static QStringList factoryExtraFiles(); 0052 static QStringList existingResourceDirs(); 0053 0054 /** 0055 * Returns a number that identifies the current version of the file @p filename, 0056 * which is located under GenericDataLocation (including local overrides). 0057 * 0058 * When a change is made to the file this number will change. 0059 */ 0060 static quint32 calcResourceHash(const QString &subdir, const QString &filename); 0061 0062 /** 0063 * Compare our current settings (language, prefixes...) with the ones from the existing ksycoca global header. 0064 * @return true if they match (= we can reuse this ksycoca), false otherwise (full build) 0065 */ 0066 bool checkGlobalHeader(); 0067 0068 /** 0069 * @brief path to the sycoca file, for the crash handler in kbuildsycoca 0070 */ 0071 static const char *sycocaPath(); 0072 0073 private: 0074 /** 0075 * Add single entry to the sycoca database. 0076 * Either from a previous database or regenerated from file. 0077 */ 0078 KSERVICE_NO_EXPORT KSycocaEntry::Ptr createEntry(KSycocaFactory *currentFactory, const QString &file); 0079 0080 /** 0081 * Implementation of KBuildSycocaInterface 0082 * Create service and return it. The caller must add it to the servicefactory. 0083 */ 0084 KService::Ptr createService(const QString &path) override; 0085 0086 /** 0087 * Convert a VFolderMenu::SubMenu to KServiceGroups. 0088 */ 0089 KSERVICE_NO_EXPORT void createMenu(const QString &caption, const QString &name, VFolderMenu::SubMenu *menu); 0090 0091 /** 0092 * Build the whole system cache, from .desktop files 0093 */ 0094 KSERVICE_NO_EXPORT bool build(); 0095 0096 /** 0097 * Save the ksycoca file 0098 */ 0099 KSERVICE_NO_EXPORT void save(QDataStream *str); 0100 0101 /** 0102 * Clear the factories 0103 */ 0104 KSERVICE_NO_EXPORT void clear(); 0105 0106 /** 0107 * @internal 0108 * @return true if building (i.e. if a KBuildSycoca); 0109 */ 0110 bool isBuilding() override 0111 { 0112 return true; 0113 } 0114 0115 QMap<QString, qint64> m_allResourceDirs; // dir, mtime in ms since epoch 0116 QMap<QString, qint64> m_extraFiles; // file, mtime in ms since epoch 0117 QString m_trackId; 0118 0119 QByteArray m_resource; // e.g. "services" (old resource name, now only used for the signal, see kctimefactory.cpp) 0120 QString m_resourceSubdir; // e.g. "mime" (xdgdata subdir) 0121 0122 KSycocaEntry::List m_tempStorage; 0123 typedef QList<KSycocaEntry::List> KSycocaEntryListList; 0124 KSycocaEntryListList *m_allEntries; // entries from existing ksycoca 0125 KBuildServiceGroupFactory *m_buildServiceGroupFactory = nullptr; 0126 KCTimeFactory *m_ctimeFactory = nullptr; 0127 KCTimeDict *m_ctimeDict; // old timestamps 0128 typedef QHash<QString, KSycocaEntry::Ptr> KBSEntryDict; 0129 KBSEntryDict *m_currentEntryDict = nullptr; 0130 KBSEntryDict *m_serviceGroupEntryDict = nullptr; 0131 VFolderMenu *m_vfolder = nullptr; 0132 qint64 m_newTimestamp; 0133 0134 bool m_menuTest; 0135 bool m_changed; 0136 }; 0137 0138 #endif