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.
 
 
 
 
 

91 lines
2.5 KiB

/***************************************************************************
* Copyright (C) 2007 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 <QFile>
#include <KLocalizedString>
#include <kzip.h>
using namespace FictionBook;
Document::Document(const QString &fileName)
: mFileName(fileName)
{
}
bool Document::open()
{
QIODevice *device;
QFile file(mFileName);
KZip zip(mFileName);
if (mFileName.endsWith(QLatin1String(".fb")) || mFileName.endsWith(QLatin1String(".fb2"))) {
if (!file.open(QIODevice::ReadOnly)) {
setError(i18n("Unable to open document: %1", file.errorString()));
return false;
}
device = &file;
} else {
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();
QString documentFile;
for (int i = 0; i < entries.count(); ++i) {
if (entries[i].endsWith(QLatin1String(".fb2"))) {
documentFile = entries[i];
break;
}
}
if (documentFile.isEmpty()) {
setError(i18n("No content found in the document"));
return false;
}
const KArchiveFile *entry = static_cast<const KArchiveFile *>(directory->entry(documentFile));
// FIXME delete 'deviceì somewhen
device = entry->createDevice();
}
QString errorMsg;
if (!mDocument.setContent(device, true, &errorMsg)) {
setError(i18n("Invalid XML document: %1", errorMsg));
return false;
}
return true;
}
QDomDocument Document::content() const
{
return mDocument;
}
QString Document::lastErrorString() const
{
return mErrorString;
}
void Document::setError(const QString &error)
{
mErrorString = error;
}