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

0001 /*
0002  * This file is part of Office 2007 Filters for Calligra
0003  *
0004  * Copyright (C) 2009 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 "MsooXmlCommonReader.h"
0025 #include <KoXmlWriter.h>
0026 #include <KoGenStyles.h>
0027 
0028 #include <QMap>
0029 
0030 using namespace MSOOXML;
0031 
0032 MsooXmlCommonReader::MsooXmlCommonReader(KoOdfWriters *writers)
0033         : MsooXmlReader(writers)
0034 {
0035     init();
0036 }
0037 
0038 MsooXmlCommonReader::MsooXmlCommonReader(QIODevice* io, KoOdfWriters *writers)
0039         : MsooXmlReader(io, writers)
0040 {
0041     init();
0042 }
0043 
0044 MsooXmlCommonReader::~MsooXmlCommonReader()
0045 {
0046     delete m_currentTextStyleProperties;
0047     m_currentTextStyleProperties = nullptr;
0048 }
0049 
0050 void MsooXmlCommonReader::init()
0051 {
0052     m_currentTextStyleProperties = 0;
0053     m_read_p_args = 0;
0054     m_pPr_lvl = 0;
0055     m_addManifestEntryForPicturesDirExecuted = false;
0056     m_moveToStylesXml = false;
0057 }
0058 
0059 //! CASE #420
0060 bool MsooXmlCommonReader::isDefaultTocStyle(const QString& name) const
0061 {
0062     if (name == QLatin1String("TOCHeading"))
0063         return true;
0064     if (name.startsWith(QLatin1String("TOC"))) {
0065         const QString num(name.mid(3));
0066         if (num.length() == 1 && num[0].isDigit() && num[0] != '0')
0067             return true;
0068     }
0069     return false;
0070 }
0071 
0072 void MsooXmlCommonReader::setupParagraphStyle()
0073 {
0074     if (m_moveToStylesXml) {
0075         m_currentParagraphStyle.setAutoStyleInStylesDotXml(true);
0076     }
0077 
0078     QString currentParagraphStyleName(mainStyles->insert(m_currentParagraphStyle));
0079     if (currentParagraphStyleName.isEmpty()) {
0080         currentParagraphStyleName = QLatin1String("Standard");
0081     }
0082     body->addAttribute("text:style-name", currentParagraphStyleName);
0083     m_paragraphStyleNameWritten = true;
0084 //debugMsooXml << "currentParagraphStyleName:" << currentParagraphStyleName;
0085 }
0086 
0087 class MediaTypeMap : public QMap<QByteArray, QByteArray>
0088 {
0089 public:
0090     MediaTypeMap() {
0091         insert("bmp", "image/x-bmp");
0092         insert("gif", "image/gif");
0093         insert("jpg", "image/jpeg");
0094         insert("jpeg", "image/jpeg");
0095         insert("jpe", "image/jpeg");
0096         insert("jfif", "image/jpeg");
0097         insert("tif", "image/tiff");
0098         insert("tiff", "image/tiff");
0099         insert("png", "image/png");
0100         insert("emf", "application/x-openoffice-wmf;windows_formatname=\"Image EMF\"");
0101         insert("wmf", "application/x-openoffice-wmf;windows_formatname=\"Image WMF\"");
0102         insert("bin", "application/vnd.sun.star.oleobject");
0103         insert("xls", "application/vnd.sun.star.oleobject");
0104         insert("doc", "application/vnd.sun.star.oleobject");
0105         insert("ppt", "application/vnd.sun.star.oleobject");
0106         insert("", "application/vnd.sun.star.oleobject");
0107     }
0108 };
0109 
0110 void MsooXmlCommonReader::pushCurrentDrawStyle(KoGenStyle *newStyle)
0111 {
0112     m_drawStyleStack.append(m_currentDrawStyle);
0113 
0114     // This step also takes ownership, so we have to delete it when popping.
0115     m_currentDrawStyle = newStyle;
0116 }
0117 
0118 void MsooXmlCommonReader::popCurrentDrawStyle()
0119 {
0120     Q_ASSERT(!m_drawStyleStack.isEmpty());
0121 
0122     delete m_currentDrawStyle;
0123     m_currentDrawStyle = m_drawStyleStack.last();
0124     m_drawStyleStack.removeLast();
0125 }
0126 
0127 Q_GLOBAL_STATIC(MediaTypeMap, g_mediaTypes)
0128 
0129 void MsooXmlCommonReader::addManifestEntryForFile(const QString& path)
0130 {
0131     if (path.isEmpty())
0132         return;
0133 
0134     if (path.endsWith('/')) { // dir
0135         manifest->addManifestEntry(path, QString());
0136         return;
0137     }
0138     const int lastDot = path.lastIndexOf(QLatin1Char('.'));
0139     const QByteArray ext(path.mid(lastDot + 1).toLatin1().toLower());
0140     manifest->addManifestEntry(path, g_mediaTypes->value(ext));
0141 }
0142 
0143 //! Adds manifest entry for "Pictures/"
0144 void MsooXmlCommonReader::addManifestEntryForPicturesDir()
0145 {
0146     if (m_addManifestEntryForPicturesDirExecuted)
0147         return;
0148     m_addManifestEntryForPicturesDirExecuted = true;
0149     manifest->addManifestEntry("Pictures/", QString());
0150 }