File indexing completed on 2024-04-28 11:44:31

0001 /*
0002     This file is part of the KDE libraries
0003     SPDX-FileCopyrightText: 1999 Waldo Bastian <bastian@kde.org>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-only
0006 */
0007 
0008 #ifndef KSYCOCAFACTORY_H
0009 #define KSYCOCAFACTORY_H
0010 
0011 #include "ksycocaresourcelist_p.h"
0012 #include <QStandardPaths>
0013 #include <ksycocaentry.h>
0014 
0015 #include <ksycoca.h> // for KSycoca::self()
0016 
0017 #include <memory>
0018 
0019 class QString;
0020 class KSycoca;
0021 class KSycocaDict;
0022 template<typename T>
0023 class QList;
0024 template<typename KT, typename VT>
0025 class QHash;
0026 
0027 typedef QHash<QString, KSycocaEntry::Ptr> KSycocaEntryDict;
0028 class KSycocaFactoryPrivate;
0029 /**
0030  * @internal
0031  * Base class for sycoca factories
0032  * Exported for unit tests
0033  */
0034 class KSERVICE_EXPORT KSycocaFactory
0035 {
0036 public:
0037     virtual KSycocaFactoryId factoryId() const = 0;
0038 
0039 protected: // virtual class
0040     /**
0041      * Create a factory which can be used to lookup from/create a database
0042      * (depending on KSycoca::isBuilding())
0043      */
0044     explicit KSycocaFactory(KSycocaFactoryId factory_id, KSycoca *sycoca);
0045 
0046 public:
0047     virtual ~KSycocaFactory();
0048 
0049     /**
0050      * @return the position of the factory in the sycoca file
0051      */
0052     int offset() const;
0053 
0054     /**
0055      * @return the dict, for special use by KBuildSycoca
0056      */
0057     KSycocaEntryDict *entryDict()
0058     {
0059         return m_entryDict;
0060     }
0061 
0062     /**
0063      * Construct an entry from a config file.
0064      * To be implemented in the real factories.
0065      */
0066     virtual KSycocaEntry *createEntry(const QString &file) const = 0;
0067 
0068     /**
0069      * Add an entry
0070      */
0071     virtual void addEntry(const KSycocaEntry::Ptr &newEntry);
0072 
0073     /**
0074      * Remove all entries with the given name.
0075      * Not very fast (O(N)), use with care.
0076      */
0077     void removeEntry(const QString &entryName);
0078 
0079     /**
0080      * Read an entry from the database
0081      */
0082     virtual KSycocaEntry *createEntry(int offset) const = 0;
0083 
0084     /**
0085      * Get a list of all entries from the database.
0086      */
0087     virtual KSycocaEntry::List allEntries() const;
0088 
0089     /**
0090      * Saves all entries it maintains as well as index files
0091      * for these entries to the stream 'str'.
0092      *
0093      * Also sets mOffset to the starting position.
0094      *
0095      * The stream is positioned at the end of the last index.
0096      *
0097      * Don't forget to call the parent first when you override
0098      * this function.
0099      */
0100     virtual void save(QDataStream &str);
0101 
0102     /**
0103      * Writes out a header to the stream 'str'.
0104      * The baseclass positions the stream correctly.
0105      *
0106      * Don't forget to call the parent first when you override
0107      * this function.
0108      */
0109     virtual void saveHeader(QDataStream &str);
0110 
0111     /**
0112      * @return the resources for which this factory is responsible.
0113      * @internal to kbuildsycoca
0114      */
0115     const KSycocaResourceList &resourceList() const;
0116 
0117     /**
0118      * @return the sycoca dict, for factories to find entries by name.
0119      */
0120     const KSycocaDict *sycocaDict() const;
0121 
0122     /**
0123      * @return true if the factory is completely empty - no entries defined
0124      */
0125     bool isEmpty() const;
0126 
0127     KSycoca *sycoca() const
0128     {
0129         return m_sycoca;
0130     }
0131 
0132 protected:
0133     QDataStream *stream() const;
0134 
0135     KSycocaResourceList m_resourceList;
0136     KSycocaEntryDict *m_entryDict = nullptr;
0137 
0138     /**
0139      * Returns all directories for the given @p subdir of GenericDataLocation.
0140      * Helper function for AnyFactory::resourceDirs().
0141      */
0142     static QStringList allDirectories(const QString &subdir);
0143 
0144 private:
0145     QDataStream *m_str = nullptr;
0146     KSycoca *m_sycoca = nullptr;
0147     std::unique_ptr<KSycocaFactoryPrivate> const d;
0148 
0149 protected:
0150     /** Virtual hook, used to add new "virtual" functions while maintaining
0151         binary compatibility. Unused in this class.
0152     */
0153     virtual void virtual_hook(int id, void *data);
0154 };
0155 
0156 /**
0157  * This, instead of a typedef, allows to declare "class ..." in header files.
0158  * @internal
0159  */
0160 class KSycocaFactoryList : public QList<KSycocaFactory *> // krazy:exclude=dpointer (acts as a typedef)
0161 {
0162 public:
0163     KSycocaFactoryList()
0164     {
0165     }
0166 };
0167 
0168 #endif