File indexing completed on 2025-01-12 10:34:25

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