From 14edb0f00136e36e9db07ba9b2719d52e199b566 Mon Sep 17 00:00:00 2001 From: Debao Zhang Date: Wed, 26 Feb 2014 10:49:28 +0800 Subject: [PATCH] Make relationships as a property of OOXmlFile --- src/xlsx/xlsxabstractsheet.cpp | 9 --------- src/xlsx/xlsxabstractsheet.h | 2 -- src/xlsx/xlsxabstractsheet_p.h | 2 -- src/xlsx/xlsxdocument.cpp | 24 ++++++++++++------------ src/xlsx/xlsxdrawing.cpp | 2 +- src/xlsx/xlsxdrawing_p.h | 1 - src/xlsx/xlsxdrawinganchor.cpp | 12 ++++++------ src/xlsx/xlsxooxmlfile.cpp | 15 ++++++++++++++- src/xlsx/xlsxooxmlfile.h | 4 +++- src/xlsx/xlsxooxmlfile_p.h | 4 +++- src/xlsx/xlsxworkbook.cpp | 21 ++++++--------------- src/xlsx/xlsxworkbook.h | 1 - src/xlsx/xlsxworkbook_p.h | 2 -- src/xlsx/xlsxworksheet.cpp | 14 +++++++------- 14 files changed, 52 insertions(+), 61 deletions(-) diff --git a/src/xlsx/xlsxabstractsheet.cpp b/src/xlsx/xlsxabstractsheet.cpp index d8896e3..5a70cc8 100644 --- a/src/xlsx/xlsxabstractsheet.cpp +++ b/src/xlsx/xlsxabstractsheet.cpp @@ -147,13 +147,4 @@ Workbook *AbstractSheet::workbook() const return d->workbook; } -/*! - * \internal - */ -Relationships &AbstractSheet::relationships() -{ - Q_D(AbstractSheet); - return d->relationships; -} - QT_END_NAMESPACE_XLSX diff --git a/src/xlsx/xlsxabstractsheet.h b/src/xlsx/xlsxabstractsheet.h index 1f94a3f..8cfe480 100644 --- a/src/xlsx/xlsxabstractsheet.h +++ b/src/xlsx/xlsxabstractsheet.h @@ -32,7 +32,6 @@ QT_BEGIN_NAMESPACE_XLSX class Workbook; class Drawing; -class Relationships; class AbstractSheetPrivate; class Q_XLSX_EXPORT AbstractSheet : public OOXmlFile { @@ -50,7 +49,6 @@ public: QString sheetName() const; bool isHidden() const; Workbook *workbook() const; - Relationships &relationships(); protected: friend class Workbook; diff --git a/src/xlsx/xlsxabstractsheet_p.h b/src/xlsx/xlsxabstractsheet_p.h index 47111f7..0b4509b 100644 --- a/src/xlsx/xlsxabstractsheet_p.h +++ b/src/xlsx/xlsxabstractsheet_p.h @@ -39,7 +39,6 @@ #include "xlsxglobal.h" #include "xlsxabstractsheet.h" #include "xlsxooxmlfile_p.h" -#include "xlsxrelationships_p.h" #include @@ -54,7 +53,6 @@ public: Workbook *workbook; QSharedPointer drawing; - mutable Relationships relationships; QString name; int id; diff --git a/src/xlsx/xlsxdocument.cpp b/src/xlsx/xlsxdocument.cpp index 31f5a3e..e3cc110 100644 --- a/src/xlsx/xlsxdocument.cpp +++ b/src/xlsx/xlsxdocument.cpp @@ -146,12 +146,12 @@ bool DocumentPrivate::loadPackage(QIODevice *device) return false; QString xlworkbook_Path = rels_xl[0].target; QString xlworkbook_Dir = splitPath(xlworkbook_Path)[0]; - workbook->relationships().loadFromXmlData(zipReader.fileData(getRelFilePath(xlworkbook_Path))); + workbook->relationships()->loadFromXmlData(zipReader.fileData(getRelFilePath(xlworkbook_Path))); workbook->setFilePath(xlworkbook_Path); workbook->loadFromXmlData(zipReader.fileData(xlworkbook_Path)); //load styles - QList rels_styles = workbook->relationships().documentRelationships(QStringLiteral("/styles")); + QList rels_styles = workbook->relationships()->documentRelationships(QStringLiteral("/styles")); if (!rels_styles.isEmpty()) { //In normal case this should be styles.xml which in xl QString name = rels_styles[0].target; @@ -162,7 +162,7 @@ bool DocumentPrivate::loadPackage(QIODevice *device) } //load sharedStrings - QList rels_sharedStrings = workbook->relationships().documentRelationships(QStringLiteral("/sharedStrings")); + QList rels_sharedStrings = workbook->relationships()->documentRelationships(QStringLiteral("/sharedStrings")); if (!rels_sharedStrings.isEmpty()) { //In normal case this should be sharedStrings.xml which in xl QString name = rels_sharedStrings[0].target; @@ -171,7 +171,7 @@ bool DocumentPrivate::loadPackage(QIODevice *device) } //load theme - QList rels_theme = workbook->relationships().documentRelationships(QStringLiteral("/theme")); + QList rels_theme = workbook->relationships()->documentRelationships(QStringLiteral("/theme")); if (!rels_theme.isEmpty()) { //In normal case this should be theme/theme1.xml which in xl QString name = rels_theme[0].target; @@ -185,7 +185,7 @@ bool DocumentPrivate::loadPackage(QIODevice *device) QString rel_path = getRelFilePath(sheet->filePath()); //If the .rel file exists, load it. if (zipReader.filePaths().contains(rel_path)) - sheet->relationships().loadFromXmlData(zipReader.fileData(rel_path)); + sheet->relationships()->loadFromXmlData(zipReader.fileData(rel_path)); sheet->loadFromXmlData(zipReader.fileData(sheet->filePath())); } @@ -194,7 +194,7 @@ bool DocumentPrivate::loadPackage(QIODevice *device) Drawing *drawing = workbook->drawings()[i]; QString rel_path = getRelFilePath(drawing->filePath()); if (zipReader.filePaths().contains(rel_path)) - drawing->relationships.loadFromXmlData(zipReader.fileData(rel_path)); + drawing->relationships()->loadFromXmlData(zipReader.fileData(rel_path)); drawing->loadFromXmlData(zipReader.fileData(drawing->filePath())); } @@ -237,16 +237,16 @@ bool DocumentPrivate::savePackage(QIODevice *device) const docPropsApp.addPartTitle(sheet->sheetName()); zipWriter.addFile(QStringLiteral("xl/worksheets/sheet%1.xml").arg(i+1), sheet->saveToXmlData()); - Relationships &rel = sheet->relationships(); - if (!rel.isEmpty()) - zipWriter.addFile(QStringLiteral("xl/worksheets/_rels/sheet%1.xml.rels").arg(i+1), rel.saveToXmlData()); + Relationships *rel = sheet->relationships(); + if (!rel->isEmpty()) + zipWriter.addFile(QStringLiteral("xl/worksheets/_rels/sheet%1.xml.rels").arg(i+1), rel->saveToXmlData()); } } // 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()); + zipWriter.addFile(QStringLiteral("xl/_rels/workbook.xml.rels"), workbook->relationships()->saveToXmlData()); // save drawing xml files for (int i=0; idrawings().size(); ++i) { @@ -254,8 +254,8 @@ bool DocumentPrivate::savePackage(QIODevice *device) const Drawing *drawing = workbook->drawings()[i]; zipWriter.addFile(QStringLiteral("xl/drawings/drawing%1.xml").arg(i+1), drawing->saveToXmlData()); - if (!drawing->relationships.isEmpty()) - zipWriter.addFile(QStringLiteral("xl/drawings/_rels/drawing%1.xml.rels").arg(i+1), drawing->relationships.saveToXmlData()); + if (!drawing->relationships()->isEmpty()) + zipWriter.addFile(QStringLiteral("xl/drawings/_rels/drawing%1.xml.rels").arg(i+1), drawing->relationships()->saveToXmlData()); } // save docProps app/core xml file diff --git a/src/xlsx/xlsxdrawing.cpp b/src/xlsx/xlsxdrawing.cpp index 20dc71f..9aaac96 100644 --- a/src/xlsx/xlsxdrawing.cpp +++ b/src/xlsx/xlsxdrawing.cpp @@ -46,7 +46,7 @@ Drawing::~Drawing() void Drawing::saveToXmlFile(QIODevice *device) const { - relationships.clear(); + relationships()->clear(); QXmlStreamWriter writer(device); diff --git a/src/xlsx/xlsxdrawing_p.h b/src/xlsx/xlsxdrawing_p.h index 7379669..b75db16 100644 --- a/src/xlsx/xlsxdrawing_p.h +++ b/src/xlsx/xlsxdrawing_p.h @@ -65,7 +65,6 @@ public: Worksheet *worksheet; Workbook *workbook; QList anchors; - mutable Relationships relationships; }; } // namespace QXlsx diff --git a/src/xlsx/xlsxdrawinganchor.cpp b/src/xlsx/xlsxdrawinganchor.cpp index cac6a5b..0378f33 100644 --- a/src/xlsx/xlsxdrawinganchor.cpp +++ b/src/xlsx/xlsxdrawinganchor.cpp @@ -193,7 +193,7 @@ void DrawingAnchor::loadXmlObjectGraphicFrame(QXmlStreamReader &reader) if (reader.tokenType() == QXmlStreamReader::StartElement) { if (reader.name() == QLatin1String("chart")) { QString rId = reader.attributes().value(QLatin1String("r:id")).toString(); - QString name = m_drawing->relationships.getRelationshipById(rId).target; + QString name = m_drawing->relationships()->getRelationshipById(rId).target; QString path = QDir::cleanPath(splitPath(m_drawing->filePath())[0] + QLatin1String("/") + name); bool exist = false; @@ -234,7 +234,7 @@ void DrawingAnchor::loadXmlObjectPicture(QXmlStreamReader &reader) if (reader.tokenType() == QXmlStreamReader::StartElement) { if (reader.name() == QLatin1String("blip")) { QString rId = reader.attributes().value(QLatin1String("r:embed")).toString(); - QString name = m_drawing->relationships.getRelationshipById(rId).target; + QString name = m_drawing->relationships()->getRelationshipById(rId).target; QString path = QDir::cleanPath(splitPath(m_drawing->filePath())[0] + QLatin1String("/") + name); bool exist = false; @@ -329,12 +329,12 @@ void DrawingAnchor::saveXmlObjectGraphicFrame(QXmlStreamWriter &writer) const writer.writeAttribute(QStringLiteral("uri"), QStringLiteral("http://schemas.openxmlformats.org/drawingml/2006/chart")); int idx = m_drawing->workbook->chartFiles().indexOf(m_chartFile); - m_drawing->relationships.addDocumentRelationship(QStringLiteral("/chart"), QStringLiteral("../charts/chart%1.xml").arg(idx+1)); + m_drawing->relationships()->addDocumentRelationship(QStringLiteral("/chart"), QStringLiteral("../charts/chart%1.xml").arg(idx+1)); writer.writeEmptyElement(QStringLiteral("c:chart")); writer.writeAttribute(QStringLiteral("xmlns:c"), QStringLiteral("http://schemas.openxmlformats.org/drawingml/2006/chart")); writer.writeAttribute(QStringLiteral("xmlns:r"), QStringLiteral("http://schemas.openxmlformats.org/officeDocument/2006/relationships")); - writer.writeAttribute(QStringLiteral("r:id"), QStringLiteral("rId%1").arg(m_drawing->relationships.count())); + writer.writeAttribute(QStringLiteral("r:id"), QStringLiteral("rId%1").arg(m_drawing->relationships()->count())); writer.writeEndElement(); //a:graphicData writer.writeEndElement(); //a:graphic @@ -364,14 +364,14 @@ void DrawingAnchor::saveXmlObjectPicture(QXmlStreamWriter &writer) const writer.writeEndElement(); //xdr:nvPicPr - m_drawing->relationships.addDocumentRelationship(QStringLiteral("/image"), QStringLiteral("../media/image%1.%2") + m_drawing->relationships()->addDocumentRelationship(QStringLiteral("/image"), QStringLiteral("../media/image%1.%2") .arg(m_pictureFile->index()+1) .arg(m_pictureFile->suffix())); writer.writeStartElement(QStringLiteral("xdr:blipFill")); writer.writeEmptyElement(QStringLiteral("a:blip")); writer.writeAttribute(QStringLiteral("xmlns:r"), QStringLiteral("http://schemas.openxmlformats.org/officeDocument/2006/relationships")); - writer.writeAttribute(QStringLiteral("r:embed"), QStringLiteral("rId%1").arg(m_drawing->relationships.count())); + writer.writeAttribute(QStringLiteral("r:embed"), QStringLiteral("rId%1").arg(m_drawing->relationships()->count())); writer.writeStartElement(QStringLiteral("a:stretch")); writer.writeEmptyElement(QStringLiteral("a:fillRect")); writer.writeEndElement(); //a:stretch diff --git a/src/xlsx/xlsxooxmlfile.cpp b/src/xlsx/xlsxooxmlfile.cpp index 6bf0355..bbdf9ea 100644 --- a/src/xlsx/xlsxooxmlfile.cpp +++ b/src/xlsx/xlsxooxmlfile.cpp @@ -32,7 +32,7 @@ QT_BEGIN_NAMESPACE_XLSX OOXmlFilePrivate::OOXmlFilePrivate(OOXmlFile *q) - :q_ptr(q) + :q_ptr(q), relationships(new Relationships) { } @@ -63,6 +63,8 @@ OOXmlFile::OOXmlFile(OOXmlFilePrivate *d) OOXmlFile::~OOXmlFile() { + if (d_ptr->relationships) + delete d_ptr->relationships; delete d_ptr; } @@ -103,4 +105,15 @@ QString OOXmlFile::filePath() const return d->filePathInPackage; } + +/*! + * \internal + */ +Relationships *OOXmlFile::relationships() const +{ + Q_D(const OOXmlFile); + return d->relationships; +} + + QT_END_NAMESPACE_XLSX diff --git a/src/xlsx/xlsxooxmlfile.h b/src/xlsx/xlsxooxmlfile.h index 8ffb775..2a71f02 100644 --- a/src/xlsx/xlsxooxmlfile.h +++ b/src/xlsx/xlsxooxmlfile.h @@ -32,7 +32,7 @@ class QIODevice; class QByteArray; QT_BEGIN_NAMESPACE_XLSX - +class Relationships; class OOXmlFilePrivate; class Q_XLSX_EXPORT OOXmlFile @@ -47,6 +47,8 @@ public: virtual QByteArray saveToXmlData() const; virtual bool loadFromXmlData(const QByteArray &data); + Relationships *relationships() const; + void setFilePath(const QString path); QString filePath() const; protected: diff --git a/src/xlsx/xlsxooxmlfile_p.h b/src/xlsx/xlsxooxmlfile_p.h index 76b79ae..9e89043 100644 --- a/src/xlsx/xlsxooxmlfile_p.h +++ b/src/xlsx/xlsxooxmlfile_p.h @@ -38,6 +38,8 @@ // #include "xlsxooxmlfile.h" +#include "xlsxrelationships_p.h" + #include QT_BEGIN_NAMESPACE_XLSX @@ -52,7 +54,7 @@ public: QString filePathInPackage;//such as "xl/worksheets/sheet1.xml" //used when load the .xlsx file - + Relationships *relationships; OOXmlFile *q_ptr; }; diff --git a/src/xlsx/xlsxworkbook.cpp b/src/xlsx/xlsxworkbook.cpp index b2fa71b..29409f6 100755 --- a/src/xlsx/xlsxworkbook.cpp +++ b/src/xlsx/xlsxworkbook.cpp @@ -387,14 +387,14 @@ QList Workbook::drawings() void Workbook::saveToXmlFile(QIODevice *device) const { Q_D(const Workbook); - d->relationships.clear(); + d->relationships->clear(); for (int i=0; irelationships.addDocumentRelationship(QStringLiteral("/worksheet"), QStringLiteral("worksheets/sheet%1.xml").arg(i+1)); - d->relationships.addDocumentRelationship(QStringLiteral("/theme"), QStringLiteral("theme/theme1.xml")); - d->relationships.addDocumentRelationship(QStringLiteral("/styles"), QStringLiteral("styles.xml")); + d->relationships->addDocumentRelationship(QStringLiteral("/worksheet"), QStringLiteral("worksheets/sheet%1.xml").arg(i+1)); + d->relationships->addDocumentRelationship(QStringLiteral("/theme"), QStringLiteral("theme/theme1.xml")); + d->relationships->addDocumentRelationship(QStringLiteral("/styles"), QStringLiteral("styles.xml")); if (!sharedStrings()->isEmpty()) - d->relationships.addDocumentRelationship(QStringLiteral("/sharedStrings"), QStringLiteral("sharedStrings.xml")); + d->relationships->addDocumentRelationship(QStringLiteral("/sharedStrings"), QStringLiteral("sharedStrings.xml")); QXmlStreamWriter writer(device); @@ -488,7 +488,7 @@ bool Workbook::loadFromXmlFile(QIODevice *device) // if (attributes.hasAttribute(QLatin1String("state"))) // QString state = attributes.value(QLatin1String("state")).toString(); - XlsxRelationship relationship = d->relationships.getRelationshipById(rId); + XlsxRelationship relationship = d->relationships->getRelationshipById(rId); AbstractSheet::SheetType type = AbstractSheet::ST_WorkSheet; if (relationship.type.endsWith(QLatin1String("/worksheet"))) @@ -550,15 +550,6 @@ bool Workbook::loadFromXmlFile(QIODevice *device) return true; } -/*! - * \internal - */ -Relationships &Workbook::relationships() -{ - Q_D(Workbook); - return d->relationships; -} - /*! * \internal */ diff --git a/src/xlsx/xlsxworkbook.h b/src/xlsx/xlsxworkbook.h index d5ed724..775c1b4 100755 --- a/src/xlsx/xlsxworkbook.h +++ b/src/xlsx/xlsxworkbook.h @@ -93,7 +93,6 @@ private: void saveToXmlFile(QIODevice *device) const; bool loadFromXmlFile(QIODevice *device); - Relationships &relationships(); SharedStrings *sharedStrings() const; Styles *styles(); diff --git a/src/xlsx/xlsxworkbook_p.h b/src/xlsx/xlsxworkbook_p.h index 0ef0aad..7850fa9 100644 --- a/src/xlsx/xlsxworkbook_p.h +++ b/src/xlsx/xlsxworkbook_p.h @@ -70,8 +70,6 @@ class WorkbookPrivate : public OOXmlFilePrivate public: WorkbookPrivate(Workbook *q); - mutable Relationships relationships; - QSharedPointer sharedStrings; QList > sheets; QStringList sheetNames; diff --git a/src/xlsx/xlsxworksheet.cpp b/src/xlsx/xlsxworksheet.cpp index 4c75294..871473b 100755 --- a/src/xlsx/xlsxworksheet.cpp +++ b/src/xlsx/xlsxworksheet.cpp @@ -1188,7 +1188,7 @@ QList Worksheet::mergedCells() const void Worksheet::saveToXmlFile(QIODevice *device) const { Q_D(const Worksheet); - d->relationships.clear(); + d->relationships->clear(); QXmlStreamWriter writer(device); @@ -1467,9 +1467,9 @@ void WorksheetPrivate::saveXmlHyperlinks(QXmlStreamWriter &writer) const writer.writeAttribute(QStringLiteral("ref"), ref); if (data->linkType == XlsxHyperlinkData::External) { //Update relationships - relationships.addWorksheetRelationship(QStringLiteral("/hyperlink"), data->target, QStringLiteral("External")); + relationships->addWorksheetRelationship(QStringLiteral("/hyperlink"), data->target, QStringLiteral("External")); - writer.writeAttribute(QStringLiteral("r:id"), QStringLiteral("rId%1").arg(relationships.count())); + writer.writeAttribute(QStringLiteral("r:id"), QStringLiteral("rId%1").arg(relationships->count())); } if (!data->location.isEmpty()) @@ -1490,10 +1490,10 @@ void WorksheetPrivate::saveXmlDrawings(QXmlStreamWriter &writer) const return; int idx = workbook->drawings().indexOf(drawing.data()); - relationships.addWorksheetRelationship(QStringLiteral("/drawing"), QStringLiteral("../drawings/drawing%1.xml").arg(idx+1)); + relationships->addWorksheetRelationship(QStringLiteral("/drawing"), QStringLiteral("../drawings/drawing%1.xml").arg(idx+1)); writer.writeEmptyElement(QStringLiteral("drawing")); - writer.writeAttribute(QStringLiteral("r:id"), QStringLiteral("rId%1").arg(relationships.count())); + writer.writeAttribute(QStringLiteral("r:id"), QStringLiteral("rId%1").arg(relationships->count())); } /*! @@ -2083,7 +2083,7 @@ void WorksheetPrivate::loadXmlHyperlinks(QXmlStreamReader &reader) if (attrs.hasAttribute(QLatin1String("r:id"))) { link->linkType = XlsxHyperlinkData::External; - XlsxRelationship ship = relationships.getRelationshipById(attrs.value(QLatin1String("r:id")).toString()); + XlsxRelationship ship = relationships->getRelationshipById(attrs.value(QLatin1String("r:id")).toString()); link->target = ship.target; } else { link->linkType = XlsxHyperlinkData::Internal; @@ -2127,7 +2127,7 @@ bool Worksheet::loadFromXmlFile(QIODevice *device) d->loadXmlHyperlinks(reader); } else if (reader.name() == QLatin1String("drawing")) { QString rId = reader.attributes().value(QStringLiteral("r:id")).toString(); - QString name = d->relationships.getRelationshipById(rId).target; + QString name = d->relationships->getRelationshipById(rId).target; QString path = QDir::cleanPath(splitPath(filePath())[0] + QLatin1String("/") + name); d->drawing = QSharedPointer(new Drawing(this)); d->drawing->setFilePath(path);