File indexing completed on 2024-04-14 15:52:22

0001 /**
0002  * SPDX-FileCopyrightText: 2019 Nicolas Fella <nicolas.fella@gmx.de>
0003  *
0004  * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005  */
0006 
0007 #include "locationcachemodel.h"
0008 
0009 #include <QDateTime>
0010 #include <QDebug>
0011 #include <QJsonDocument>
0012 #include <QJsonObject>
0013 #include <QStandardPaths>
0014 
0015 LocationCacheModel::LocationCacheModel(QObject *parent)
0016     : QAbstractListModel(parent)
0017     , m_locationCacheFile(QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + QStringLiteral("/locations.cache"))
0018     , m_cachedLocationsJson()
0019 {
0020     if (!m_locationCacheFile.open(QIODevice::ReadWrite)) {
0021         qWarning() << "Could not open location cache file" << m_locationCacheFile.fileName();
0022     }
0023 
0024     loadLocationsFromCache();
0025 }
0026 
0027 void LocationCacheModel::addCachedLocation(const KPublicTransport::Location location)
0028 {
0029     if (m_cachedLocations.contains(QVariant::fromValue(location))) {
0030         return;
0031     }
0032 
0033     m_cachedLocations.append(QVariant::fromValue(location));
0034     m_cachedLocationsJson.append(KPublicTransport::Location::toJson(location));
0035 
0036     QJsonObject obj;
0037     obj[QStringLiteral("version")] = 1;
0038     obj[QStringLiteral("locations")] = m_cachedLocationsJson;
0039 
0040     QJsonDocument doc(obj);
0041 
0042     m_locationCacheFile.resize(0);
0043     m_locationCacheFile.write(doc.toJson());
0044     m_locationCacheFile.flush();
0045 }
0046 
0047 void LocationCacheModel::loadLocationsFromCache()
0048 {
0049     m_cachedLocationsJson = QJsonDocument::fromJson(m_locationCacheFile.readAll()).object()[QStringLiteral("locations")].toArray();
0050 
0051     for (const QJsonValue &val : qAsConst(m_cachedLocationsJson)) {
0052         m_cachedLocations.append(QVariant::fromValue(KPublicTransport::Location::fromJson(val.toObject())));
0053     }
0054 }
0055 
0056 QVariant LocationCacheModel::data(const QModelIndex &index, int role) const
0057 {
0058     Q_ASSERT(index.row() >= 0);
0059     Q_ASSERT(index.row() <= m_cachedLocations.count());
0060 
0061     if (role == Qt::UserRole + 1) {
0062         return m_cachedLocations[index.row()];
0063     }
0064 
0065     return QStringLiteral("deadbeef");
0066 }
0067 
0068 int LocationCacheModel::rowCount(const QModelIndex &parent) const
0069 {
0070     Q_UNUSED(parent);
0071     return m_cachedLocations.count();
0072 }
0073 
0074 QHash<int, QByteArray> LocationCacheModel::roleNames() const
0075 {
0076     QHash<int, QByteArray> roles;
0077     roles.insert((Qt::UserRole + 1), "location");
0078     return roles;
0079 }