File indexing completed on 2024-05-12 04:06:26

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 <KTar>
0010 
0011 Palapeli::ArchiveStorageComponent::ArchiveStorageComponent()
0012 {
0013 }
0014 
0015 Palapeli::PuzzleComponent* Palapeli::ArchiveStorageComponent::cast(Palapeli::PuzzleComponent::Type type) const
0016 {
0017     //any casting is done by first casting to DirectoryStorage
0018     if (type == DirectoryStorage)
0019     {
0020         //make archive available locally
0021         //open archive and extract into temporary directory
0022         KTar tar(puzzle()->location(), QStringLiteral("application/x-gzip"));
0023         if (!tar.open(QIODevice::ReadOnly))
0024             return nullptr;
0025         Palapeli::DirectoryStorageComponent* storage = new Palapeli::DirectoryStorageComponent;
0026         tar.directory()->copyTo(storage->directory());
0027         //cleanup
0028         tar.close();
0029         return storage;
0030     }
0031     else
0032     {
0033         const Palapeli::PuzzleComponent* dirStorage = puzzle()->get(DirectoryStorage);
0034         return dirStorage ? dirStorage->cast(type) : nullptr;
0035     }
0036 }
0037 
0038 Palapeli::ArchiveStorageComponent* Palapeli::ArchiveStorageComponent::fromData(Palapeli::Puzzle* puzzle)
0039 {
0040     puzzle->get(DirectoryStorage);
0041     const Palapeli::DirectoryStorageComponent* dirStorage = puzzle->component<Palapeli::DirectoryStorageComponent>();
0042     //compress archive to location
0043     KTar tar(puzzle->location(), QStringLiteral("application/x-gzip"));
0044     if (!tar.open(QIODevice::WriteOnly))
0045         return nullptr;
0046     if (!tar.addLocalDirectory(dirStorage->directory(), QStringLiteral(".")))
0047         return nullptr;
0048     if (!tar.close())
0049         return nullptr;
0050     //done
0051     return new Palapeli::ArchiveStorageComponent;
0052 }