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 }