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 }