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 }