File indexing completed on 2024-05-12 16:29:10

0001 /*
0002  * This file is part of Office 2007 Filters for Calligra
0003  *
0004  * Copyright (C) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
0005  *
0006  * Contact: Suresh Chande suresh.chande@nokia.com
0007  *
0008  * This library is free software; you can redistribute it and/or
0009  * modify it under the terms of the GNU Lesser General Public License
0010  * version 2.1 as published by the Free Software Foundation.
0011  *
0012  * This library is distributed in the hope that it will be useful, but
0013  * WITHOUT ANY WARRANTY; without even the implied warranty of
0014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
0015  * Lesser General Public License for more details.
0016  *
0017  * You should have received a copy of the GNU Lesser General Public
0018  * License along with this library; if not, write to the Free Software
0019  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
0020  * 02110-1301 USA
0021  *
0022  */
0023 
0024 #include "MsooXmlRelationships.h"
0025 #include "MsooXmlRelationshipsReader.h"
0026 #include "MsooXmlImport.h"
0027 
0028 #include <KoOdfExporter.h>
0029 
0030 #include <klocalizedstring.h>
0031 
0032 #include <QSet>
0033 #include "MsooXmlDebug.h"
0034 
0035 using namespace MSOOXML;
0036 
0037 class Q_DECL_HIDDEN MsooXmlRelationships::Private
0038 {
0039 public:
0040     Private()
0041     {
0042     }
0043     ~Private() {
0044     }
0045     KoFilter::ConversionStatus loadRels(const QString& path, const QString& file);
0046 
0047     MsooXmlImport* importer;
0048     KoOdfWriters* writers;
0049     QString *errorMessage;
0050     QMap<QString, QString> rels;
0051     QMap<QString, QString> targetsForTypes;
0052     QSet<QString> loadedFiles;
0053 };
0054 
0055 KoFilter::ConversionStatus MsooXmlRelationships::Private::loadRels(const QString& path, const QString& file)
0056 {
0057     debugMsooXml << (path + '/' + file) << "...";
0058     loadedFiles.insert(path + '/' + file);
0059     MsooXmlRelationshipsReaderContext context(path, file, rels, targetsForTypes);
0060     MsooXmlRelationshipsReader reader(writers);
0061 
0062     const QString realPath(path + "/_rels/" + file + ".rels");
0063     return importer->loadAndParseDocument(
0064                &reader, realPath, *errorMessage, &context);
0065 }
0066 
0067 MsooXmlRelationships::MsooXmlRelationships(MsooXmlImport& importer, KoOdfWriters *writers, QString& errorMessage)
0068         : d(new Private)
0069 {
0070     d->importer = &importer;
0071     d->writers = writers;
0072     d->errorMessage = &errorMessage;
0073 }
0074 
0075 MsooXmlRelationships::~MsooXmlRelationships()
0076 {
0077     delete d;
0078 }
0079 
0080 unsigned MsooXmlRelationships::targetCountWithWord(const QString& searchTerm)
0081 {
0082     unsigned count = 0;
0083     QMapIterator<QString, QString> i(d->rels);
0084     while (i.hasNext()) {
0085         i.next();
0086         if (i.value().contains(searchTerm)) {
0087             ++count;
0088         }
0089     }
0090     return count;
0091 }
0092 
0093 
0094 QString MsooXmlRelationships::target(const QString& path, const QString& file, const QString& id)
0095 {
0096     const QString key(MsooXmlRelationshipsReader::relKey(path, file, id));
0097     const QString result(d->rels.value(key));
0098     if (!result.isEmpty())
0099         return result;
0100     const QString filePath = path + QLatin1Char('/') + file;
0101     if (d->loadedFiles.contains(filePath)) {
0102         *d->errorMessage = i18n("Could not find target for id \"%1\" in file \"%2\"", id, filePath);
0103         return QString(); // cannot be found
0104     }
0105     if (d->loadRels(path, file) != KoFilter::OK) {
0106         *d->errorMessage = i18n("Could not find relationships file \"%1\"", filePath);
0107         return QString();
0108     }
0109     return d->rels.value(key);
0110 }
0111 
0112 QString MsooXmlRelationships::targetForType(const QString& path, const QString& file, const QString& relType)
0113 {
0114     const QString filePath = path + QLatin1Char('/') + file;
0115     const QString key(MsooXmlRelationshipsReader::targetKey(filePath, relType));
0116     //debugMsooXml << key;
0117     const QString target(d->targetsForTypes.value(key));
0118     if (!target.isEmpty())
0119         return target;
0120     if (d->loadedFiles.contains(filePath)) {
0121         *d->errorMessage = i18n("Could not find target for relationship \"%1\" in file \"%2\"",
0122                                 relType, filePath);
0123         return QString(); // cannot be found
0124     }
0125     if (d->loadRels(path, file) != KoFilter::OK) {
0126         *d->errorMessage = i18n("Could not find relationships file \"%1\"", filePath);
0127         return QString();
0128     }
0129     return d->targetsForTypes.value(key);
0130 }