KDECore
ksycocafactory.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef KSYCOCAFACTORY_H
00020 #define KSYCOCAFACTORY_H
00021
00022 #include <ksycocaentry.h>
00023
00024 class QString;
00025 class KSycocaDict;
00026 class KSycocaResourceList;
00027 template <typename T> class QList;
00028 template <typename KT, typename VT> class QHash;
00029
00030 typedef QHash<QString, KSycocaEntry::Ptr> KSycocaEntryDict;
00031
00036 class KDECORE_EXPORT KSycocaFactory
00037 {
00038 public:
00039 virtual KSycocaFactoryId factoryId() const = 0;
00040
00041 protected:
00046 explicit KSycocaFactory( KSycocaFactoryId factory_id );
00047
00048 public:
00049 virtual ~KSycocaFactory();
00050
00054 int offset() const;
00055
00059 KSycocaEntryDict * entryDict() { return m_entryDict; }
00060
00065 virtual KSycocaEntry *createEntry(const QString &file, const char *resource) const = 0;
00066
00070 virtual void addEntry(const KSycocaEntry::Ptr& newEntry);
00071
00076 void removeEntry(const QString& entryName);
00077
00081 virtual KSycocaEntry *createEntry(int offset) const = 0;
00082
00086 virtual KSycocaEntry::List allEntries() const;
00087
00099 virtual void save(QDataStream &str);
00100
00108 virtual void saveHeader(QDataStream &str);
00109
00114 const KSycocaResourceList * resourceList() const;
00115
00119 const KSycocaDict *sycocaDict() const;
00120
00124 bool isEmpty() const;
00125
00126 protected:
00127 QDataStream* stream() const;
00128
00129 KSycocaResourceList *m_resourceList;
00130 KSycocaEntryDict *m_entryDict;
00131
00132 private:
00133 QDataStream *m_str;
00134 class Private;
00135 Private* const d;
00136
00137 protected:
00141 virtual void virtual_hook( int id, void* data );
00142 };
00143
00148 class KDECORE_EXPORT KSycocaFactoryList : public QList<KSycocaFactory*>
00149 {
00150 public:
00151 KSycocaFactoryList() { }
00152 };
00153
00154 #include <QThreadStorage>
00159 template <typename F> class KSycocaFactoryContainer
00160 {
00161 public:
00162 KSycocaFactoryContainer(F* factory) : m_factory(factory) {}
00163 F* factory() { return m_factory; }
00164 private:
00165 F* m_factory;
00166 };
00167
00176 template <typename F> class KSycocaFactorySingleton
00177 {
00178 public:
00179 typedef KSycocaFactoryContainer<F> C;
00180 KSycocaFactorySingleton() {
00181 }
00182 ~KSycocaFactorySingleton() {
00183
00184
00185 }
00186 void instanceCreated(F* newFactory) {
00187
00188 Q_ASSERT(!m_factories.hasLocalData());
00189 Q_ASSERT(newFactory);
00190 m_factories.setLocalData(new C(newFactory));
00191 }
00192 void instanceDestroyed(F* factory) {
00193 if (m_factories.hasLocalData()) {
00194 Q_ASSERT(m_factories.localData()->factory() == factory);
00195 m_factories.setLocalData(0);
00196 }
00197 }
00198 F* self() {
00199 if (!m_factories.hasLocalData()) {
00200 new F;
00201 Q_ASSERT(m_factories.hasLocalData());
00202 }
00203 return m_factories.localData()->factory();
00204 }
00205 private:
00206 QThreadStorage<C*> m_factories;
00207 };
00208
00209 #endif