diff --git a/src/xlsx/xlsxrelationships.cpp b/src/xlsx/xlsxrelationships.cpp index fd98653..a255197 100755 --- a/src/xlsx/xlsxrelationships.cpp +++ b/src/xlsx/xlsxrelationships.cpp @@ -24,38 +24,68 @@ ****************************************************************************/ #include "xlsxrelationships_p.h" #include "xlsxxmlwriter_p.h" +#include "xlsxxmlreader_p.h" #include #include namespace QXlsx { -Relationships::Relationships(QObject *parent) : - QObject(parent) +const QString schema_doc = QStringLiteral("http://schemas.openxmlformats.org/officeDocument/2006/relationships"); +const QString schema_msPackage = QStringLiteral("http://schemas.microsoft.com/office/2006/relationships"); +const QString schema_package = QStringLiteral("http://schemas.openxmlformats.org/package/2006/relationships"); +//const QString schema_worksheet = QStringLiteral("http://schemas.openxmlformats.org/officeDocument/2006/relationships"); +Relationships::Relationships() { } +QList Relationships::documentRelationships(const QString &relativeType) const +{ + return relationships(schema_doc + relativeType); +} + void Relationships::addDocumentRelationship(const QString &relativeType, const QString &target) { - QString type = QStringLiteral("http://schemas.openxmlformats.org/officeDocument/2006/relationships") + relativeType; - addRelationship(type, target); + addRelationship(schema_doc + relativeType, target); +} + +QList Relationships::msPackageRelationships(const QString &relativeType) const +{ + return relationships(schema_msPackage + relativeType); } void Relationships::addMsPackageRelationship(const QString &relativeType, const QString &target) { - QString type = QStringLiteral("http://schemas.microsoft.com/office/2006/relationships") + relativeType; - addRelationship(type, target); + addRelationship(schema_msPackage + relativeType, target); +} + +QList Relationships::packageRelationships(const QString &relativeType) const +{ + return relationships(schema_package + relativeType); } void Relationships::addPackageRelationship(const QString &relativeType, const QString &target) { - QString type = QStringLiteral("http://schemas.openxmlformats.org/package/2006/relationships") + relativeType; - addRelationship(type, target); + addRelationship(schema_package + relativeType, target); +} + +QList Relationships::worksheetRelationships(const QString &relativeType) const +{ + return relationships(schema_doc + relativeType); } void Relationships::addWorksheetRelationship(const QString &relativeType, const QString &target, const QString &targetMode) { - QString type = QStringLiteral("http://schemas.openxmlformats.org/officeDocument/2006/relationships") + relativeType; - addRelationship(type, target, targetMode); + addRelationship(schema_doc + relativeType, target, targetMode); +} + +QList Relationships::relationships(const QString &type) const +{ + QList res; + foreach (XlsxRelationship ship, m_relationships) { + if (ship.type == type) + res.append(ship); + } + return res; } void Relationships::addRelationship(const QString &type, const QString &target, const QString &targetMode) @@ -89,4 +119,28 @@ void Relationships::saveToXmlFile(QIODevice *device) writer.writeEndDocument(); } +void Relationships::loadFromXmlFile(QIODevice *device) +{ + m_relationships.clear(); + XmlStreamReader reader(device); + while(!reader.atEnd()) { + QXmlStreamReader::TokenType token = reader.readNext(); + if (token == QXmlStreamReader::StartElement) { + if (reader.name() == QStringLiteral("Relationship")) { + QXmlStreamAttributes attributes = reader.attributes(); + XlsxRelationship relationship; + relationship.id = attributes.value(QLatin1String("Id")).toString(); + relationship.type = attributes.value(QLatin1String("Type")).toString(); + relationship.target = attributes.value(QLatin1String("Target")).toString(); + relationship.targetMode = attributes.value(QLatin1String("TargetMode")).toString(); + m_relationships.append(relationship); + } + } + + if (reader.hasError()) { + + } + } +} + } //namespace diff --git a/src/xlsx/xlsxrelationships_p.h b/src/xlsx/xlsxrelationships_p.h index 6c80a82..2d78c02 100755 --- a/src/xlsx/xlsxrelationships_p.h +++ b/src/xlsx/xlsxrelationships_p.h @@ -25,6 +25,7 @@ #ifndef XLSXRELATIONSHIPS_H #define XLSXRELATIONSHIPS_H +#include "xlsxglobal.h" #include #include class QIODevice; @@ -39,23 +40,28 @@ struct XlsxRelationship QString targetMode; }; -class Relationships : public QObject +class XLSX_AUTOTEST_EXPORT Relationships { - Q_OBJECT public: - explicit Relationships(QObject *parent = 0); - -signals: - -public slots: + Relationships(); + + QList documentRelationships(const QString &relativeType) const; + QList packageRelationships(const QString &relativeType) const; + QList msPackageRelationships(const QString &relativeType) const; + QList worksheetRelationships(const QString &relativeType) const; + void addDocumentRelationship(const QString &relativeType, const QString &target); void addPackageRelationship(const QString &relativeType, const QString &target); void addMsPackageRelationship(const QString &relativeType, const QString &target); void addWorksheetRelationship(const QString &relativeType, const QString &target, const QString &targetMode=QString()); void saveToXmlFile(QIODevice *device); + void loadFromXmlFile(QIODevice *device); + private: + QList relationships(const QString &type) const; void addRelationship(const QString &type, const QString &target, const QString &targetMode=QString()); + QList m_relationships; }; diff --git a/tests/auto/auto.pro b/tests/auto/auto.pro index 24d0c2d..2b253ba 100644 --- a/tests/auto/auto.pro +++ b/tests/auto/auto.pro @@ -2,4 +2,5 @@ TEMPLATE=subdirs SUBDIRS=\ utility \ mergecell \ - zipreader + zipreader \ + relationships diff --git a/tests/auto/relationships/relationships.pro b/tests/auto/relationships/relationships.pro new file mode 100644 index 0000000..03d4c7b --- /dev/null +++ b/tests/auto/relationships/relationships.pro @@ -0,0 +1,19 @@ +#------------------------------------------------- +# +# Project created by QtCreator 2013-09-10T13:27:11 +# +#------------------------------------------------- + +QT += testlib xlsx xlsx-private +CONFIG += testcase +DEFINES += XLSX_TEST + +TARGET = tst_relationshipstest +CONFIG += console +CONFIG -= app_bundle + +TEMPLATE = app + + +SOURCES += tst_relationshipstest.cpp +DEFINES += SRCDIR=\\\"$$PWD/\\\" diff --git a/tests/auto/relationships/tst_relationshipstest.cpp b/tests/auto/relationships/tst_relationshipstest.cpp new file mode 100644 index 0000000..f1bf954 --- /dev/null +++ b/tests/auto/relationships/tst_relationshipstest.cpp @@ -0,0 +1,52 @@ +#include "private/xlsxrelationships_p.h" +#include +#include + +class RelationshipsTest : public QObject +{ + Q_OBJECT + +public: + RelationshipsTest(); + +private Q_SLOTS: + void testSaveXml(); + void testLoadXml(); +}; + +RelationshipsTest::RelationshipsTest() +{ + +} + +void RelationshipsTest::testSaveXml() +{ + QXlsx::Relationships rels; + rels.addDocumentRelationship("/officeDocument", "xl/workbook.xml"); + + QByteArray xmldata; + QBuffer buffer(&xmldata); + buffer.open(QIODevice::WriteOnly); + rels.saveToXmlFile(&buffer); + + QVERIFY2(xmldata.contains(""), ""); +} + +void RelationshipsTest::testLoadXml() +{ + QByteArray xmldata("<\?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"\?>" + "" + "" + ""); + QBuffer buffer(&xmldata); + buffer.open(QIODevice::ReadOnly); + + QXlsx::Relationships rels; + rels.loadFromXmlFile(&buffer); + + QCOMPARE(rels.documentRelationships("/officeDocument").size(), 1); +} + +QTEST_APPLESS_MAIN(RelationshipsTest) + +#include "tst_relationshipstest.moc"