File indexing completed on 2024-05-05 04:22:02

0001 // SPDX-FileCopyrightText: 2003-2010 Jesper K. Pedersen <blackie@kde.org>
0002 // SPDX-FileCopyrightText: 2021-2023 Johannes Zarl-Zierl <johannes@zarl-zierl.at>
0003 //
0004 // SPDX-License-Identifier: GPL-2.0-or-later
0005 
0006 #include "KimFileReader.h"
0007 
0008 #include <kpabase/FileExtensions.h>
0009 #include <kpabase/FileNameUtil.h>
0010 
0011 #include <KLocalizedString>
0012 #include <QFileInfo>
0013 #include <kmessagebox.h>
0014 #include <kzip.h>
0015 
0016 ImportExport::KimFileReader::KimFileReader()
0017     : m_zip(nullptr)
0018     , m_dir(nullptr)
0019 {
0020 }
0021 
0022 bool ImportExport::KimFileReader::open(const QString &fileName)
0023 {
0024     m_fileName = fileName;
0025     m_zip = new KZip(fileName);
0026     if (!m_zip->open(QIODevice::ReadOnly)) {
0027         KMessageBox::error(nullptr, i18n("Unable to open '%1' for reading.", fileName), i18n("Error Importing Data"));
0028         delete m_zip;
0029         m_zip = nullptr;
0030         return false;
0031     }
0032 
0033     m_dir = m_zip->directory();
0034     if (m_dir == nullptr) {
0035         KMessageBox::error(nullptr, i18n("Error reading folder contents of file %1; it is likely that the file is broken.", fileName));
0036         delete m_zip;
0037         m_zip = nullptr;
0038         return false;
0039     }
0040 
0041     return true;
0042 }
0043 
0044 QByteArray ImportExport::KimFileReader::indexXML()
0045 {
0046     const KArchiveEntry *indexxml = m_dir->entry(QString::fromLatin1("index.xml"));
0047     if (indexxml == nullptr || !indexxml->isFile()) {
0048         KMessageBox::error(nullptr, i18n("Error reading index.xml file from %1; it is likely that the file is broken.", m_fileName));
0049         return QByteArray();
0050     }
0051 
0052     const KArchiveFile *file = static_cast<const KArchiveFile *>(indexxml);
0053     return file->data();
0054 }
0055 
0056 ImportExport::KimFileReader::~KimFileReader()
0057 {
0058     delete m_zip;
0059 }
0060 
0061 QPixmap ImportExport::KimFileReader::loadThumbnail(QString fileName)
0062 {
0063     const KArchiveEntry *thumbnails = m_dir->entry(QString::fromLatin1("Thumbnails"));
0064     if (!thumbnails)
0065         return QPixmap();
0066 
0067     if (!thumbnails->isDirectory()) {
0068         KMessageBox::error(nullptr, i18n("Thumbnail item in export file was not a folder, this indicates that the file is broken."));
0069         return QPixmap();
0070     }
0071 
0072     const KArchiveDirectory *thumbnailDir = static_cast<const KArchiveDirectory *>(thumbnails);
0073 
0074     const auto fileInfo = QFileInfo(fileName);
0075     const QString ext = KPABase::isVideo(DB::FileName::fromRelativePath(fileName)) ? QString::fromLatin1("jpg") : fileInfo.completeSuffix();
0076     fileName = QString::fromLatin1("%1.%2").arg(fileInfo.baseName()).arg(ext);
0077     const KArchiveEntry *fileEntry = thumbnailDir->entry(fileName);
0078     if (fileEntry == nullptr || !fileEntry->isFile()) {
0079         KMessageBox::error(nullptr, i18n("No thumbnail existed in export file for %1", fileName));
0080         return QPixmap();
0081     }
0082 
0083     const KArchiveFile *file = static_cast<const KArchiveFile *>(fileEntry);
0084     const QByteArray data = file->data();
0085     QPixmap pixmap;
0086     pixmap.loadFromData(data);
0087     return pixmap;
0088 }
0089 
0090 QByteArray ImportExport::KimFileReader::loadImage(const QString &fileName)
0091 {
0092     const KArchiveEntry *images = m_dir->entry(QString::fromLatin1("Images"));
0093     if (!images) {
0094         KMessageBox::error(nullptr, i18n("Export file did not contain a Images subfolder, this indicates that the file is broken"));
0095         return QByteArray();
0096     }
0097 
0098     if (!images->isDirectory()) {
0099         KMessageBox::error(nullptr, i18n("Images item in export file was not a folder, this indicates that the file is broken"));
0100         return QByteArray();
0101     }
0102 
0103     const KArchiveDirectory *imagesDir = static_cast<const KArchiveDirectory *>(images);
0104 
0105     const KArchiveEntry *fileEntry = imagesDir->entry(fileName);
0106     if (fileEntry == nullptr || !fileEntry->isFile()) {
0107         KMessageBox::error(nullptr, i18n("No image existed in export file for %1", fileName));
0108         return QByteArray();
0109     }
0110 
0111     const KArchiveFile *file = static_cast<const KArchiveFile *>(fileEntry);
0112     QByteArray data = file->data();
0113     return data;
0114 }
0115 // vi:expandtab:tabstop=4 shiftwidth=4: