File indexing completed on 2023-05-30 09:06:33

0001 // SPDX-License-Identifier: LGPL-2.1-or-later
0002 //
0003 // SPDX-FileCopyrightText: 2016 Dennis Nienhüser <nienhueser@kde.org>
0004 //
0005 
0006 #include "TileQueue.h"
0007 
0008 #include <QCryptographicHash>
0009 #include <QBuffer>
0010 #include <QDataStream>
0011 #include <QDebug>
0012 
0013 
0014 namespace Marble {
0015 
0016 QString generateKeyHash(const QString& key, const QString& salt)
0017 {
0018     QByteArray data;
0019     data.append(key.toUtf8());
0020     data.append(salt.toUtf8());
0021     data = QCryptographicHash::hash(data, QCryptographicHash::Sha1).toHex();
0022     return data;
0023 }
0024 
0025 TileQueue::TileQueue()
0026     : m_sharedMemory(generateKeyHash("marble-vectorosm", "tile-queue"))
0027 {
0028     // nothing to do
0029 }
0030 
0031 TileQueue::~TileQueue()
0032 {
0033     release();
0034 }
0035 
0036 bool TileQueue::read(QSet<TileId> &tileQueue)
0037 {
0038     if (!m_sharedMemory.attach()) {
0039         if (m_sharedMemory.error() == QSharedMemory::NotFound) {
0040             if (!m_sharedMemory.create(256 * 1024 * sizeof(TileId))) {
0041                 qDebug() << "Cannot create shared memory";
0042                 return false;
0043             }
0044         }
0045     }
0046 
0047     if (m_sharedMemory.lock()) {
0048         QBuffer buffer;
0049         QDataStream in(&buffer);
0050         buffer.setData((char*)m_sharedMemory.constData(), m_sharedMemory.size());
0051         buffer.open(QBuffer::ReadOnly);
0052         in >> tileQueue;
0053         return true;
0054     }
0055     return false;
0056 }
0057 
0058 bool TileQueue::write(const QSet<TileId> &tileQueue)
0059 {
0060     QBuffer buffer;
0061     buffer.open(QBuffer::ReadWrite);
0062     QDataStream out(&buffer);
0063     out << tileQueue;
0064     if (buffer.size() <= m_sharedMemory.size()) {
0065         memcpy(m_sharedMemory.data(), buffer.data().data(), buffer.size());
0066         m_sharedMemory.unlock();
0067         return true;
0068     }
0069 
0070     m_sharedMemory.unlock();
0071     return false;
0072 }
0073 
0074 void TileQueue::release()
0075 {
0076     if (m_sharedMemory.isAttached()) {
0077         m_sharedMemory.unlock();
0078         m_sharedMemory.detach();
0079     }
0080 }
0081 
0082 QDataStream &operator<<(QDataStream &stream, const TileId &tile)
0083 {
0084     stream << tile.x();
0085     stream << tile.y();
0086     stream << tile.zoomLevel();
0087     return stream;
0088 }
0089 
0090 QDataStream &operator>>(QDataStream &stream, TileId &tile)
0091 {
0092     int x, y, z;
0093     stream >> x;
0094     stream >> y;
0095     stream >> z;
0096     tile = TileId(0, z, x, y);
0097     return stream;
0098 }
0099 
0100 }