File indexing completed on 2024-05-26 03:50:52

0001 // xlsxrelationships.cpp
0002 
0003 #include <QtGlobal>
0004 #include <QXmlStreamWriter>
0005 #include <QXmlStreamReader>
0006 #include <QDir>
0007 #include <QFile>
0008 #include <QBuffer>
0009 
0010 #include "xlsxrelationships_p.h"
0011 
0012 QT_BEGIN_NAMESPACE_XLSX
0013 
0014 const QLatin1String schema_doc("http://schemas.openxmlformats.org/officeDocument/2006/relationships");
0015 const QLatin1String schema_msPackage("http://schemas.microsoft.com/office/2006/relationships");
0016 const QLatin1String schema_package("http://schemas.openxmlformats.org/package/2006/relationships");
0017 //const QString schema_worksheet = QStringLiteral("http://schemas.openxmlformats.org/officeDocument/2006/relationships");
0018 Relationships::Relationships()
0019 {
0020 }
0021 
0022 QList<XlsxRelationship> Relationships::documentRelationships(const QString &relativeType) const
0023 {
0024     return relationships(schema_doc + relativeType);
0025 }
0026 
0027 void Relationships::addDocumentRelationship(const QString &relativeType, const QString &target)
0028 {
0029     addRelationship(schema_doc + relativeType, target);
0030 }
0031 
0032 QList<XlsxRelationship> Relationships::msPackageRelationships(const QString &relativeType) const
0033 {
0034     return relationships(schema_msPackage + relativeType);
0035 }
0036 
0037 void Relationships::addMsPackageRelationship(const QString &relativeType, const QString &target)
0038 {
0039     addRelationship(schema_msPackage + relativeType, target);
0040 }
0041 
0042 QList<XlsxRelationship> Relationships::packageRelationships(const QString &relativeType) const
0043 {
0044     return relationships(schema_package + relativeType);
0045 }
0046 
0047 void Relationships::addPackageRelationship(const QString &relativeType, const QString &target)
0048 {
0049     addRelationship(schema_package + relativeType, target);
0050 }
0051 
0052 QList<XlsxRelationship> Relationships::worksheetRelationships(const QString &relativeType) const
0053 {
0054     return relationships(schema_doc + relativeType);
0055 }
0056 
0057 void Relationships::addWorksheetRelationship(const QString &relativeType, const QString &target, const QString &targetMode)
0058 {
0059     addRelationship(schema_doc + relativeType, target, targetMode);
0060 }
0061 
0062 QList<XlsxRelationship> Relationships::relationships(const QString &type) const
0063 {
0064     QList<XlsxRelationship> res;
0065     for (const XlsxRelationship &ship : m_relationships) {
0066         if (ship.type == type)
0067             res.append(ship);
0068     }
0069     return res;
0070 }
0071 
0072 void Relationships::addRelationship(const QString &type, const QString &target, const QString &targetMode)
0073 {
0074     XlsxRelationship relation;
0075     relation.id = QStringLiteral("rId%1").arg(m_relationships.size()+1);
0076     relation.type = type;
0077     relation.target = target;
0078     relation.targetMode = targetMode;
0079 
0080     m_relationships.append(relation);
0081 }
0082 
0083 void Relationships::saveToXmlFile(QIODevice *device) const
0084 {
0085     QXmlStreamWriter writer(device);
0086 
0087     writer.writeStartDocument(QStringLiteral("1.0"), true);
0088     writer.writeStartElement(QStringLiteral("Relationships"));
0089     writer.writeAttribute(QStringLiteral("xmlns"), QStringLiteral("http://schemas.openxmlformats.org/package/2006/relationships"));
0090     for (const XlsxRelationship &relation : m_relationships) {
0091         writer.writeStartElement(QStringLiteral("Relationship"));
0092         writer.writeAttribute(QStringLiteral("Id"), relation.id);
0093         writer.writeAttribute(QStringLiteral("Type"), relation.type);
0094         writer.writeAttribute(QStringLiteral("Target"), relation.target);
0095         if (!relation.targetMode.isNull())
0096             writer.writeAttribute(QStringLiteral("TargetMode"), relation.targetMode);
0097         writer.writeEndElement();
0098     }
0099     writer.writeEndElement();//Relationships
0100     writer.writeEndDocument();
0101 }
0102 
0103 QByteArray Relationships::saveToXmlData() const
0104 {
0105     QByteArray data;
0106     QBuffer buffer(&data);
0107     buffer.open(QIODevice::WriteOnly);
0108     saveToXmlFile(&buffer);
0109 
0110     return data;
0111 }
0112 
0113 bool Relationships::loadFromXmlFile(QIODevice *device)
0114 {
0115     clear();
0116     QXmlStreamReader reader(device);
0117     while (!reader.atEnd()) {
0118          QXmlStreamReader::TokenType token = reader.readNext();
0119          if (token == QXmlStreamReader::StartElement) {
0120              if (reader.name() == QStringLiteral("Relationship")) {
0121                  QXmlStreamAttributes attributes = reader.attributes();
0122                  XlsxRelationship relationship;
0123                  relationship.id = attributes.value(QLatin1String("Id")).toString();
0124                  relationship.type = attributes.value(QLatin1String("Type")).toString();
0125                  relationship.target = attributes.value(QLatin1String("Target")).toString();
0126                  relationship.targetMode = attributes.value(QLatin1String("TargetMode")).toString();
0127                  m_relationships.append(relationship);
0128              }
0129          }
0130 
0131          if (reader.hasError())
0132             return false;
0133     }
0134     return true;
0135 }
0136 
0137 bool Relationships::loadFromXmlData(const QByteArray &data)
0138 {
0139     QBuffer buffer;
0140     buffer.setData(data);
0141     buffer.open(QIODevice::ReadOnly);
0142     return loadFromXmlFile(&buffer);
0143 }
0144 
0145 XlsxRelationship Relationships::getRelationshipById(const QString &id) const
0146 {
0147     for (const XlsxRelationship &ship : m_relationships) {
0148         if (ship.id == id)
0149             return ship;
0150     }
0151     return XlsxRelationship();
0152 }
0153 
0154 void Relationships::clear()
0155 {
0156     m_relationships.clear();
0157 }
0158 
0159 int Relationships::count() const
0160 {
0161     return m_relationships.count();
0162 }
0163 
0164 bool Relationships::isEmpty() const
0165 {
0166     return m_relationships.isEmpty();
0167 }
0168 
0169 QT_END_NAMESPACE_XLSX