From 86046c48dc577838c650800d437572d8bfabcaef Mon Sep 17 00:00:00 2001 From: Debao Zhang Date: Sat, 11 Jan 2014 23:26:46 +0800 Subject: [PATCH] Code refactoring: Remove magic things for ContentTypes --- src/xlsx/xlsxcontenttypes.cpp | 37 +++++++++++++++++++++++------------ src/xlsx/xlsxcontenttypes_p.h | 6 +++++- src/xlsx/xlsxdocument.cpp | 17 +++++++++++++--- src/xlsx/xlsxdocument_p.h | 2 ++ 4 files changed, 46 insertions(+), 16 deletions(-) diff --git a/src/xlsx/xlsxcontenttypes.cpp b/src/xlsx/xlsxcontenttypes.cpp index 532b855..3040d88 100755 --- a/src/xlsx/xlsxcontenttypes.cpp +++ b/src/xlsx/xlsxcontenttypes.cpp @@ -39,12 +39,6 @@ ContentTypes::ContentTypes() m_defaults.insert(QStringLiteral("rels"), m_package_prefix + QStringLiteral("relationships+xml")); m_defaults.insert(QStringLiteral("xml"), QStringLiteral("application/xml")); - - m_overrides.insert(QStringLiteral("/docProps/app.xml"), m_document_prefix + QStringLiteral("extended-properties+xml")); - m_overrides.insert(QStringLiteral("/docProps/core.xml"), m_package_prefix + QStringLiteral("core-properties+xml")); - m_overrides.insert(QStringLiteral("/xl/styles.xml"), m_document_prefix + QStringLiteral("spreadsheetml.styles+xml")); - m_overrides.insert(QStringLiteral("/xl/theme/theme1.xml"), m_document_prefix + QStringLiteral("theme+xml")); - m_overrides.insert(QStringLiteral("/xl/workbook.xml"), m_document_prefix + QStringLiteral("spreadsheetml.sheet.main+xml")); } void ContentTypes::addDefault(const QString &key, const QString &value) @@ -57,6 +51,31 @@ void ContentTypes::addOverride(const QString &key, const QString &value) m_overrides.insert(key, value); } +void ContentTypes::addDocPropApp() +{ + addOverride(QStringLiteral("/docProps/app.xml"), m_document_prefix + QStringLiteral("extended-properties+xml")); +} + +void ContentTypes::addDocPropCore() +{ + addOverride(QStringLiteral("/docProps/core.xml"), m_package_prefix + QStringLiteral("core-properties+xml")); +} + +void ContentTypes::addStyles() +{ + addOverride(QStringLiteral("/xl/styles.xml"), m_document_prefix + QStringLiteral("spreadsheetml.styles+xml")); +} + +void ContentTypes::addTheme() +{ + addOverride(QStringLiteral("/xl/theme/theme1.xml"), m_document_prefix + QStringLiteral("theme+xml")); +} + +void ContentTypes::addWorkbook() +{ + addOverride(QStringLiteral("/xl/workbook.xml"), m_document_prefix + QStringLiteral("spreadsheetml.sheet.main+xml")); +} + void ContentTypes::addWorksheetName(const QString &name) { addOverride(QStringLiteral("/xl/worksheets/%1.xml").arg(name), m_document_prefix + QStringLiteral("spreadsheetml.worksheet+xml")); @@ -82,12 +101,6 @@ void ContentTypes::addCommentName(const QString &name) addOverride(QStringLiteral("/xl/%1.xml").arg(name), m_document_prefix + QStringLiteral("spreadsheetml.comments+xml")); } -void ContentTypes::addImageTypes(const QStringList &imageTypes) -{ - foreach (QString type, imageTypes) - addDefault(type, QStringLiteral("image/") + type); -} - void ContentTypes::addTableName(const QString &name) { addOverride(QStringLiteral("/xl/tables/%1.xml").arg(name), m_document_prefix + QStringLiteral("spreadsheetml.table+xml")); diff --git a/src/xlsx/xlsxcontenttypes_p.h b/src/xlsx/xlsxcontenttypes_p.h index c53cfbd..4c5aafa 100755 --- a/src/xlsx/xlsxcontenttypes_p.h +++ b/src/xlsx/xlsxcontenttypes_p.h @@ -53,12 +53,16 @@ public: void addOverride(const QString &key, const QString &value); //Convenient funcation for addOverride() + void addDocPropCore(); + void addDocPropApp(); + void addStyles(); + void addTheme(); + void addWorkbook(); void addWorksheetName(const QString &name); void addChartsheetName(const QString &name); void addChartName(const QString &name); void addDrawingName(const QString &name); void addCommentName(const QString &name); - void addImageTypes(const QStringList &imageTypes); void addTableName(const QString &name); void addSharedString(); void addVmlName(); diff --git a/src/xlsx/xlsxdocument.cpp b/src/xlsx/xlsxdocument.cpp index f39b2ba..2e9c531 100644 --- a/src/xlsx/xlsxdocument.cpp +++ b/src/xlsx/xlsxdocument.cpp @@ -99,9 +99,14 @@ bool DocumentPrivate::loadPackage(QIODevice *device) ZipReader zipReader(device); QStringList filePaths = zipReader.filePaths(); - if (!filePaths.contains(QLatin1String("_rels/.rels"))) + //Load the Content_Types file + if (!filePaths.contains(QLatin1String("[Content_Types].xml"))) return false; + contentTypes.loadFromXmlData(zipReader.fileData(QStringLiteral("[Content_Types].xml"))); + //Load root rels file + if (!filePaths.contains(QLatin1String("_rels/.rels"))) + return false; Relationships rootRels; rootRels.loadFromXmlData(zipReader.fileData(QStringLiteral("_rels/.rels"))); @@ -196,7 +201,8 @@ bool DocumentPrivate::savePackage(QIODevice *device) const if (zipWriter.error()) return false; - ContentTypes contentTypes; + contentTypes.clearOverrides(); + DocPropsApp docPropsApp; DocPropsCore docPropsCore; @@ -216,6 +222,7 @@ bool DocumentPrivate::savePackage(QIODevice *device) const } // save workbook xml file + contentTypes.addWorkbook(); zipWriter.addFile(QStringLiteral("xl/workbook.xml"), workbook->saveToXmlData()); zipWriter.addFile(QStringLiteral("xl/_rels/workbook.xml.rels"), workbook->relationships().saveToXmlData()); @@ -247,6 +254,8 @@ bool DocumentPrivate::savePackage(QIODevice *device) const } if (workbook->worksheetCount()) docPropsApp.addHeadingPair(QStringLiteral("Worksheets"), workbook->worksheetCount()); + contentTypes.addDocPropApp(); + contentTypes.addDocPropCore(); zipWriter.addFile(QStringLiteral("docProps/app.xml"), docPropsApp.saveToXmlData()); zipWriter.addFile(QStringLiteral("docProps/core.xml"), docPropsCore.saveToXmlData()); @@ -257,14 +266,16 @@ bool DocumentPrivate::savePackage(QIODevice *device) const } // save styles xml file + contentTypes.addStyles(); zipWriter.addFile(QStringLiteral("xl/styles.xml"), workbook->styles()->saveToXmlData()); // save theme xml file + contentTypes.addTheme(); zipWriter.addFile(QStringLiteral("xl/theme/theme1.xml"), workbook->theme()->saveToXmlData()); // save image files if (!workbook->images().isEmpty()) - contentTypes.addImageTypes(QStringList()<images().size(); ++i) { QImage image = workbook->images()[i]; diff --git a/src/xlsx/xlsxdocument_p.h b/src/xlsx/xlsxdocument_p.h index 1b9bf33..e57a473 100644 --- a/src/xlsx/xlsxdocument_p.h +++ b/src/xlsx/xlsxdocument_p.h @@ -39,6 +39,7 @@ #include "xlsxdocument.h" #include "xlsxworkbook.h" +#include "xlsxcontenttypes_p.h" #include @@ -60,6 +61,7 @@ public: QMap documentProperties; //core, app and custom properties QSharedPointer workbook; + mutable ContentTypes contentTypes; }; }