File indexing completed on 2024-04-14 03:54:36

0001 /*
0002     This file is part of the KDE libraries
0003     SPDX-FileCopyrightText: 2000 Waldo Bastian <bastian@kde.org>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-only
0006 */
0007 
0008 #include "kctimefactory_p.h"
0009 #include "sycocadebug.h"
0010 #include <ksycoca.h>
0011 #include <ksycocatype.h>
0012 #include <ksycocautils_p.h>
0013 
0014 #include <assert.h>
0015 
0016 // NOTE: the storing of "resource" here is now completely useless (since everything is under GenericDataLocation)
0017 
0018 static inline QString key(const QString &path, const QByteArray &resource)
0019 {
0020     return QString::fromLatin1(resource) + QLatin1Char('|') + path;
0021 }
0022 
0023 void KCTimeDict::addCTime(const QString &path, const QByteArray &resource, quint32 ctime)
0024 {
0025     Q_ASSERT(ctime != 0);
0026     assert(!path.isEmpty());
0027     m_hash.insert(key(path, resource), ctime);
0028 }
0029 
0030 quint32 KCTimeDict::ctime(const QString &path, const QByteArray &resource) const
0031 {
0032     return m_hash.value(key(path, resource), 0);
0033 }
0034 
0035 void KCTimeDict::remove(const QString &path, const QByteArray &resource)
0036 {
0037     m_hash.remove(key(path, resource));
0038 }
0039 
0040 void KCTimeDict::dump() const
0041 {
0042     qCDebug(SYCOCA) << m_hash.keys();
0043 }
0044 
0045 void KCTimeDict::load(QDataStream &str)
0046 {
0047     QString key;
0048     quint32 ctime;
0049     while (true) {
0050         str >> key >> ctime;
0051         if (key.isEmpty()) {
0052             break;
0053         }
0054         m_hash.insert(key, ctime);
0055     }
0056 }
0057 
0058 void KCTimeDict::save(QDataStream &str) const
0059 {
0060     for (auto it = m_hash.cbegin(), endIt = m_hash.cend(); it != endIt; ++it) {
0061         str << it.key() << it.value();
0062     }
0063     str << QString() << quint32(0);
0064 }
0065 
0066 ///////////
0067 
0068 KCTimeFactory::KCTimeFactory(KSycoca *db)
0069     : KSycocaFactory(KST_CTimeInfo, db)
0070     , m_ctimeDict()
0071 {
0072     if (!sycoca()->isBuilding()) {
0073         QDataStream *str = stream();
0074         (*str) >> m_dictOffset;
0075     } else {
0076         m_dictOffset = 0;
0077     }
0078 }
0079 
0080 KCTimeFactory::~KCTimeFactory()
0081 {
0082 }
0083 
0084 void KCTimeFactory::saveHeader(QDataStream &str)
0085 {
0086     KSycocaFactory::saveHeader(str);
0087 
0088     str << m_dictOffset;
0089 }
0090 
0091 void KCTimeFactory::save(QDataStream &str)
0092 {
0093     KSycocaFactory::save(str);
0094 
0095     m_dictOffset = str.device()->pos();
0096     m_ctimeDict.save(str);
0097     const qint64 endOfFactoryData = str.device()->pos();
0098     saveHeader(str);
0099     str.device()->seek(endOfFactoryData);
0100 }
0101 
0102 KCTimeDict KCTimeFactory::loadDict() const
0103 {
0104     KCTimeDict dict;
0105     QDataStream *str = stream();
0106     assert(str);
0107     str->device()->seek(m_dictOffset);
0108     dict.load(*str);
0109     return dict;
0110 }