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