File indexing completed on 2024-05-19 04:07:53
0001 /* 0002 SPDX-FileCopyrightText: 2009-2011 Stefan Majewsky <majewsky@gmx.net> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "components.h" 0008 0009 #include <QBuffer> 0010 #include <QFileInfo> 0011 #include <KConfigGroup> 0012 0013 Palapeli::CollectionStorageComponent::CollectionStorageComponent(KConfigGroup* group) 0014 : m_group(group) 0015 { 0016 } 0017 0018 Palapeli::CollectionStorageComponent::~CollectionStorageComponent() 0019 { 0020 delete m_group; 0021 } 0022 0023 Palapeli::PuzzleComponent* Palapeli::CollectionStorageComponent::cast(Type type) const 0024 { 0025 const QString file = puzzle()->location(); 0026 //everything except for metadata must always be read from archive 0027 if (type == ArchiveStorage) 0028 return new Palapeli::ArchiveStorageComponent; 0029 else if (type != Metadata) 0030 { 0031 const Palapeli::PuzzleComponent* arStorage = puzzle()->get(ArchiveStorage); 0032 return arStorage ? arStorage->cast(type) : nullptr; 0033 } 0034 //try to serve metadata from cache 0035 const QDateTime mtime = QFileInfo(file).lastModified(); 0036 if (m_group->readEntry("ModifyDateTime", QString()) == mtime.toString()) 0037 { 0038 //cache is up-to-date 0039 Palapeli::PuzzleMetadata metadata; 0040 metadata.name = m_group->readEntry("Name", QString()); 0041 metadata.comment = m_group->readEntry("Comment", QString()); 0042 metadata.author = m_group->readEntry("Author", QString()); 0043 metadata.pieceCount = m_group->readEntry("PieceCount", 0); 0044 metadata.modifyProtection = m_group->readEntry("ModifyProtection", false); 0045 QByteArray ar = m_group->readEntry("Thumbnail", QByteArray()); 0046 metadata.thumbnail.loadFromData(QByteArray::fromBase64 (ar)); 0047 return new Palapeli::MetadataComponent(metadata); 0048 } 0049 else 0050 { 0051 //read metadata from archive... 0052 const Palapeli::PuzzleComponent* arStorage = puzzle()->get(ArchiveStorage); 0053 if (!arStorage) 0054 return nullptr; 0055 Palapeli::PuzzleComponent* cMetadata = arStorage->cast(Metadata); 0056 if (!cMetadata) 0057 return nullptr; 0058 //...and populate cache (image is written via a buffer 0059 //because KConfig does not support QImage directly) 0060 const Palapeli::PuzzleMetadata metadata = dynamic_cast<Palapeli::MetadataComponent*>(cMetadata)->metadata; 0061 QBuffer buffer; 0062 metadata.thumbnail.save(&buffer, "PNG"); 0063 m_group->writeEntry("Name", metadata.name); 0064 m_group->writeEntry("Comment", metadata.comment); 0065 m_group->writeEntry("Author", metadata.author); 0066 m_group->writeEntry("PieceCount", metadata.pieceCount); 0067 m_group->writeEntry("ModifyProtection", metadata.modifyProtection); 0068 m_group->writeEntry("ModifyDateTime", mtime.toString()); 0069 m_group->writeEntry("Thumbnail", buffer.data().toBase64 ()); 0070 return cMetadata; 0071 } 0072 }