You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
150 lines
4.7 KiB
150 lines
4.7 KiB
/*************************************************************************** |
|
* Copyright (C) 2006 by Tobias Koenig <tokoe@kde.org> * |
|
* * |
|
* This program is free software; you can redistribute it and/or modify * |
|
* it under the terms of the GNU General Public License as published by * |
|
* the Free Software Foundation; either version 2 of the License, or * |
|
* (at your option) any later version. * |
|
***************************************************************************/ |
|
|
|
#include "document.h" |
|
|
|
#include <KLocalizedString> |
|
#include <kzip.h> |
|
|
|
using namespace OOO; |
|
|
|
Document::Document(const QString &fileName) |
|
: mFileName(fileName) |
|
, mManifest(nullptr) |
|
, mAnyEncrypted(false) |
|
{ |
|
} |
|
|
|
bool Document::open(const QString &password) |
|
{ |
|
mContent.clear(); |
|
mStyles.clear(); |
|
|
|
KZip zip(mFileName); |
|
if (!zip.open(QIODevice::ReadOnly)) { |
|
setError(i18n("Document is not a valid ZIP archive")); |
|
return false; |
|
} |
|
|
|
const KArchiveDirectory *directory = zip.directory(); |
|
if (!directory) { |
|
setError(i18n("Invalid document structure (main directory is missing)")); |
|
return false; |
|
} |
|
|
|
const QStringList entries = directory->entries(); |
|
if (!entries.contains(QStringLiteral("META-INF"))) { |
|
setError(i18n("Invalid document structure (META-INF directory is missing)")); |
|
return false; |
|
} |
|
const KArchiveDirectory *metaInfDirectory = static_cast<const KArchiveDirectory *>(directory->entry(QStringLiteral("META-INF"))); |
|
if (!(metaInfDirectory->entries().contains(QStringLiteral("manifest.xml")))) { |
|
setError(i18n("Invalid document structure (META-INF/manifest.xml is missing)")); |
|
return false; |
|
} |
|
|
|
const KArchiveFile *file = static_cast<const KArchiveFile *>(metaInfDirectory->entry(QStringLiteral("manifest.xml"))); |
|
mManifest = new Manifest(mFileName, file->data(), password); |
|
|
|
// we should really get the file names from the manifest, but for now, we only care |
|
// if the manifest says the files are encrypted. |
|
|
|
if (!entries.contains(QStringLiteral("content.xml"))) { |
|
setError(i18n("Invalid document structure (content.xml is missing)")); |
|
return false; |
|
} |
|
|
|
file = static_cast<const KArchiveFile *>(directory->entry(QStringLiteral("content.xml"))); |
|
if (mManifest->testIfEncrypted(QStringLiteral("content.xml"))) { |
|
mAnyEncrypted = true; |
|
mContent = mManifest->decryptFile(QStringLiteral("content.xml"), file->data()); |
|
} else { |
|
mContent = file->data(); |
|
} |
|
|
|
if (entries.contains(QStringLiteral("styles.xml"))) { |
|
file = static_cast<const KArchiveFile *>(directory->entry(QStringLiteral("styles.xml"))); |
|
if (mManifest->testIfEncrypted(QStringLiteral("styles.xml"))) { |
|
mAnyEncrypted = true; |
|
mStyles = mManifest->decryptFile(QStringLiteral("styles.xml"), file->data()); |
|
} else { |
|
mStyles = file->data(); |
|
} |
|
} |
|
|
|
if (entries.contains(QStringLiteral("meta.xml"))) { |
|
file = static_cast<const KArchiveFile *>(directory->entry(QStringLiteral("meta.xml"))); |
|
if (mManifest->testIfEncrypted(QStringLiteral("meta.xml"))) { |
|
mAnyEncrypted = true; |
|
mMeta = mManifest->decryptFile(QStringLiteral("meta.xml"), file->data()); |
|
} else { |
|
mMeta = file->data(); |
|
} |
|
} |
|
|
|
if (entries.contains(QStringLiteral("Pictures"))) { |
|
const KArchiveDirectory *imagesDirectory = static_cast<const KArchiveDirectory *>(directory->entry(QStringLiteral("Pictures"))); |
|
|
|
const QStringList imagesEntries = imagesDirectory->entries(); |
|
for (int i = 0; i < imagesEntries.count(); ++i) { |
|
file = static_cast<const KArchiveFile *>(imagesDirectory->entry(imagesEntries[i])); |
|
QString fullPath = QStringLiteral("Pictures/%1").arg(imagesEntries[i]); |
|
if (mManifest->testIfEncrypted(fullPath)) { |
|
mAnyEncrypted = true; |
|
mImages.insert(fullPath, mManifest->decryptFile(fullPath, file->data())); |
|
} else { |
|
mImages.insert(fullPath, file->data()); |
|
} |
|
} |
|
} |
|
|
|
zip.close(); |
|
|
|
return true; |
|
} |
|
|
|
Document::~Document() |
|
{ |
|
delete mManifest; |
|
} |
|
|
|
QString Document::lastErrorString() const |
|
{ |
|
return mErrorString; |
|
} |
|
|
|
QByteArray Document::content() const |
|
{ |
|
return mContent; |
|
} |
|
|
|
QByteArray Document::meta() const |
|
{ |
|
return mMeta; |
|
} |
|
|
|
QByteArray Document::styles() const |
|
{ |
|
return mStyles; |
|
} |
|
|
|
QMap<QString, QByteArray> Document::images() const |
|
{ |
|
return mImages; |
|
} |
|
|
|
bool Document::anyFileEncrypted() const |
|
{ |
|
return mAnyEncrypted; |
|
} |
|
|
|
void Document::setError(const QString &error) |
|
{ |
|
mErrorString = error; |
|
}
|
|
|