1 /*
2 This file is part of the KDE libraries
3 SPDX-FileCopyrightText: 2000 Waldo Bastian <bastian@kde.org>
4
5 SPDX-License-Identifier: LGPL-2.0-only
6 */
7
8 #include "kctimefactory_p.h"
9 #include "sycocadebug.h"
10 #include <ksycoca.h>
11 #include <ksycocatype.h>
12 #include <ksycocautils_p.h>
13
14 #include <assert.h>
15
16 // NOTE: the storing of "resource" here is now completely useless (since everything is under GenericDataLocation)
17
key(const QString & path,const QByteArray & resource)18 static inline QString key(const QString &path, const QByteArray &resource)
19 {
20 return QString::fromLatin1(resource) + QLatin1Char('|') + path;
21 }
22
addCTime(const QString & path,const QByteArray & resource,quint32 ctime)23 void KCTimeDict::addCTime(const QString &path, const QByteArray &resource, quint32 ctime)
24 {
25 Q_ASSERT(ctime != 0);
26 assert(!path.isEmpty());
27 m_hash.insert(key(path, resource), ctime);
28 }
29
ctime(const QString & path,const QByteArray & resource) const30 quint32 KCTimeDict::ctime(const QString &path, const QByteArray &resource) const
31 {
32 return m_hash.value(key(path, resource), 0);
33 }
34
remove(const QString & path,const QByteArray & resource)35 void KCTimeDict::remove(const QString &path, const QByteArray &resource)
36 {
37 m_hash.remove(key(path, resource));
38 }
39
dump() const40 void KCTimeDict::dump() const
41 {
42 qCDebug(SYCOCA) << m_hash.keys();
43 }
44
load(QDataStream & str)45 void KCTimeDict::load(QDataStream &str)
46 {
47 QString key;
48 quint32 ctime;
49 while (true) {
50 str >> key >> ctime;
51 if (key.isEmpty()) {
52 break;
53 }
54 m_hash.insert(key, ctime);
55 }
56 }
57
save(QDataStream & str) const58 void KCTimeDict::save(QDataStream &str) const
59 {
60 Hash::const_iterator it = m_hash.constBegin();
61 const Hash::const_iterator end = m_hash.constEnd();
62 for (; it != end; ++it) {
63 str << it.key() << it.value();
64 }
65 str << QString() << quint32(0);
66 }
67
68 ///////////
69
KCTimeFactory(KSycoca * db)70 KCTimeFactory::KCTimeFactory(KSycoca *db)
71 : KSycocaFactory(KST_CTimeInfo, db)
72 , m_ctimeDict()
73 {
74 if (!sycoca()->isBuilding()) {
75 QDataStream *str = stream();
76 (*str) >> m_dictOffset;
77 } else {
78 m_dictOffset = 0;
79 }
80 }
81
~KCTimeFactory()82 KCTimeFactory::~KCTimeFactory()
83 {
84 }
85
saveHeader(QDataStream & str)86 void KCTimeFactory::saveHeader(QDataStream &str)
87 {
88 KSycocaFactory::saveHeader(str);
89
90 str << m_dictOffset;
91 }
92
save(QDataStream & str)93 void KCTimeFactory::save(QDataStream &str)
94 {
95 KSycocaFactory::save(str);
96
97 m_dictOffset = str.device()->pos();
98 m_ctimeDict.save(str);
99 const qint64 endOfFactoryData = str.device()->pos();
100 saveHeader(str);
101 str.device()->seek(endOfFactoryData);
102 }
103
loadDict() const104 KCTimeDict KCTimeFactory::loadDict() const
105 {
106 KCTimeDict dict;
107 QDataStream *str = stream();
108 assert(str);
109 str->device()->seek(m_dictOffset);
110 dict.load(*str);
111 return dict;
112 }
113