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 #ifndef MSOOXMLREADER_H
0025 #define MSOOXMLREADER_H
0026 
0027 #include "komsooxml_export.h"
0028 
0029 #include <QXmlStreamReader>
0030 #include <QStack>
0031 #include <QUrl>
0032 
0033 #include "MsooXmlDebug.h"
0034 #include <KoXmlReader.h>
0035 #include <KoFilter.h>
0036 #include <KoOdfExporter.h>
0037 
0038 
0039 namespace MSOOXML
0040 {
0041 
0042 class MsooXmlRelationships;
0043 
0044 //! Context for MsooXmlReader::read()
0045 class KOMSOOXML_EXPORT MsooXmlReaderContext
0046 {
0047 protected:
0048     MsooXmlReaderContext(MsooXmlRelationships* _relationships = 0);
0049 public:
0050     virtual ~MsooXmlReaderContext();
0051     MSOOXML::MsooXmlRelationships* relationships;
0052     QMap<QString, QString> colorMap;
0053 
0054     // element:graphic - A frame might contain a graphic object that was
0055     // generated by an external source and needs a container in which to be
0056     // displayed.  A graphic object might represent a group of objects.
0057     bool graphicObjectIsGroup;
0058 
0059 private:
0060     Q_DISABLE_COPY(MsooXmlReaderContext)
0061 };
0062 
0063 //! A base class reading MSOOXML parts like document.xml or styles.xml.
0064 class KOMSOOXML_EXPORT MsooXmlReader : public QXmlStreamReader, public KoOdfWriters
0065 {
0066 public:
0067     explicit MsooXmlReader(KoOdfWriters *writers);
0068 
0069     MsooXmlReader(QIODevice* io, KoOdfWriters *writers);
0070 
0071     virtual ~MsooXmlReader();
0072 
0073     //! Reads/parses the file
0074     virtual KoFilter::ConversionStatus read(MsooXmlReaderContext* context = 0) = 0;
0075 
0076     //! Sets filename for the document being read.
0077     //! Only for error reporting purposes, used in raiseError().
0078     void setFileName(const QString &fileName) {
0079         m_fileName = fileName;
0080     }
0081 
0082     //! @return filename for the document being read.
0083     //! Only for error reporting purposes, used in raiseError().
0084     QString fileName() const  {
0085         return m_fileName;
0086     }
0087 
0088     //! Reimplemented after QXmlStreamReader: adds line, column and filename information
0089     void raiseError(const QString & message = QString());
0090 
0091     // Uncomment if debugging is needed
0092     //! Reimplemented after QXmlStreamReader for supporting undo read and for debugging purposes
0093     //TokenType readNext();
0094 
0095     //! Undoes recent readNext(); only one recent readNext() can be undoed
0096     //void undoReadNext();
0097 
0098     // const strings (for optimization)
0099     static const char constOn[];
0100     static const char constOff[];
0101     static const char constTrue[];
0102     static const char constFalse[];
0103     static const char constNone[];
0104     static const char const1[];
0105     static const char const0[];
0106     static const char constAuto[];
0107     static const char constFloat[];
0108     static const char constPercentage[];
0109     static const char constCurrency[];
0110     static const char constDate[];
0111     static const char constTime[];
0112     static const char constBoolean[];
0113     static const char constString[];
0114 
0115 protected:
0116     // -- general
0117     bool expectElName(const char* elementName);
0118     bool expectElNameEnd(const char* elementName);
0119     bool expectEl(const char* qualifiedElementName);
0120     bool expectEl(const QString& qualifiedElementName);
0121     bool expectEl(const QList<QByteArray>& qualifiedElementNames);
0122     bool expectElEnd(const QString& qualifiedElementName);
0123     bool expectElEnd(const char* qualifiedElementName);
0124     bool expectNS(const char* nsName);
0125     void raiseElNotFoundError(const char* elementName);
0126     void raiseAttributeNotFoundError(const char* attrName);
0127     void raiseNSNotFoundError(const char* nsName);
0128     void raiseUnexpectedAttributeValueError(const QString& value, const char* attrName);
0129     void raiseUnexpectedSecondOccurenceOfElError(const char* elementName);
0130 
0131     //! Decodes boolean attribute. Used by read_b(), read_i(), etc.
0132     bool readBooleanAttr(const char* attrName, bool defaultValue = false) const;
0133 
0134     QString m_defaultNamespace; //!< stores namespace (for optimization)
0135 
0136     QStack<QByteArray> m_callsNames;
0137 #ifndef NDEBUG
0138     QStack<QByteArray> m_callsNamesDebug;
0139 #endif
0140 
0141 private:
0142     Q_DISABLE_COPY(MsooXmlReader)
0143 
0144     QString m_fileName;
0145     bool m_readUndoed;
0146     QXmlStreamReader::TokenType m_recentType;
0147 
0148     void init();
0149 };
0150 
0151 } // namespace MSOOXML
0152 
0153 //! debugMsooXml stream operator. Writes this reader to the debug output in a nicely formatted way.
0154 //! @todo add the same for QXmlStreamWriter
0155 KOMSOOXML_EXPORT QDebug operator<<(QDebug dbg, const QXmlStreamReader& reader);
0156 
0157 #endif //MSOOXMLREADER_H