summaryrefslogtreecommitdiffstats
path: root/src/corelib/serialization/qxmlstream.h
blob: aaf969e8e926c1a45932b386a1c86f110c392caf (plain)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475
// Copyright (C) 2016 The Qt Company Ltd.// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only#ifndef QXMLSTREAM_H#define QXMLSTREAM_H#include <QtCore/qiodevice.h>#if QT_CONFIG(xmlstream)#include <QtCore/qcompare.h>#include <QtCore/qlist.h>#include <QtCore/qscopedpointer.h>#include <QtCore/qstring.h>#include <memory> QT_BEGIN_NAMESPACE namespace QtPrivate {class QXmlString { QStringPrivate m_string;public:QXmlString(QStringPrivate &&d) :m_string(std::move(d)) {}QXmlString(const QString &s) :m_string(s.data_ptr()) {} QXmlString &operator=(const QString &s) { m_string = s.data_ptr();return*this; } QXmlString &operator=(QString &&s) { m_string.swap(s.data_ptr());return*this; }inline constexprQXmlString() {}voidswap(QXmlString &other) noexcept { m_string.swap(other.m_string);}operatorQStringView()const noexcept {returnQStringView(m_string.data(), m_string.size); } qsizetype size()const noexcept {return m_string.size; }boolisNull()const noexcept {return m_string.isNull(); }private:friendboolcomparesEqual(const QXmlString &lhs,const QXmlString &rhs) noexcept {returnQStringView(lhs) ==QStringView(rhs);}Q_DECLARE_EQUALITY_COMPARABLE(QXmlString)};}Q_DECLARE_SHARED_NS_EXT(QtPrivate, QXmlString)class QXmlStreamReaderPrivate;class QXmlStreamAttributes;class Q_CORE_EXPORT QXmlStreamAttribute {QtPrivate::QXmlString m_name, m_namespaceUri, m_qualifiedName, m_value; uint m_isDefault :1;friend class QXmlStreamReaderPrivate;friend class QXmlStreamAttributes;public:QXmlStreamAttribute();QXmlStreamAttribute(const QString &qualifiedName,const QString &value);QXmlStreamAttribute(const QString &namespaceUri,const QString &name,const QString &value);inline QStringView namespaceUri()const{return m_namespaceUri; }inline QStringView name()const{return m_name; }inline QStringView qualifiedName()const{return m_qualifiedName; }inline QStringView prefix()const{returnQStringView(m_qualifiedName).left(qMax(0, m_qualifiedName.size() - m_name.size() -1));}inline QStringView value()const{return m_value; }inlineboolisDefault()const{return m_isDefault; }#if QT_CORE_REMOVED_SINCE(6, 8)inlinebooloperator==(const QXmlStreamAttribute &other)const{returncomparesEqual(*this, other); }inlinebooloperator!=(const QXmlStreamAttribute &other)const{return!operator==(other); }#endifprivate:friendboolcomparesEqual(const QXmlStreamAttribute &lhs,const QXmlStreamAttribute &rhs) noexcept {if(lhs.m_value != rhs.m_value)return false;if(lhs.m_namespaceUri.isNull())return lhs.m_qualifiedName == rhs.m_qualifiedName;return lhs.m_namespaceUri == rhs.m_namespaceUri && lhs.m_name == rhs.m_name;}Q_DECLARE_EQUALITY_COMPARABLE(QXmlStreamAttribute)};Q_DECLARE_TYPEINFO(QXmlStreamAttribute, Q_RELOCATABLE_TYPE);// We export each out-of-line method individually to prevent MSVC from// exporting the whole QList class.class QXmlStreamAttributes :public QList<QXmlStreamAttribute>{public:inlineQXmlStreamAttributes() {}#if QT_CORE_REMOVED_SINCE(6, 6) Q_CORE_EXPORT QStringView value(const QString &namespaceUri,const QString &name)const; Q_CORE_EXPORT QStringView value(const QString &namespaceUri, QLatin1StringView name)const; Q_CORE_EXPORT QStringView value(QLatin1StringView namespaceUri, QLatin1StringView name)const; Q_CORE_EXPORT QStringView value(const QString &qualifiedName)const; Q_CORE_EXPORT QStringView value(QLatin1StringView qualifiedName)const;#endif Q_CORE_EXPORT QStringView value(QAnyStringView namespaceUri, QAnyStringView name)const noexcept; Q_CORE_EXPORT QStringView value(QAnyStringView qualifiedName)const noexcept; Q_CORE_EXPORT voidappend(const QString &namespaceUri,const QString &name,const QString &value); Q_CORE_EXPORT voidappend(const QString &qualifiedName,const QString &value);boolhasAttribute(QAnyStringView qualifiedName)const{return!value(qualifiedName).isNull();}boolhasAttribute(QAnyStringView namespaceUri, QAnyStringView name)const{return!value(namespaceUri, name).isNull();}using QList<QXmlStreamAttribute>::append;};class Q_CORE_EXPORT QXmlStreamNamespaceDeclaration {QtPrivate::QXmlString m_prefix, m_namespaceUri;friend class QXmlStreamReaderPrivate;public:QXmlStreamNamespaceDeclaration();QXmlStreamNamespaceDeclaration(const QString &prefix,const QString &namespaceUri);inline QStringView prefix()const{return m_prefix; }inline QStringView namespaceUri()const{return m_namespaceUri; }#if QT_CORE_REMOVED_SINCE(6, 8)inlinebooloperator==(const QXmlStreamNamespaceDeclaration &other)const{returncomparesEqual(*this, other); }inlinebooloperator!=(const QXmlStreamNamespaceDeclaration &other)const{return!operator==(other); }#endifprivate:friendboolcomparesEqual(const QXmlStreamNamespaceDeclaration &lhs,const QXmlStreamNamespaceDeclaration &rhs) noexcept {return lhs.m_prefix == rhs.m_prefix && lhs.m_namespaceUri == rhs.m_namespaceUri;}Q_DECLARE_EQUALITY_COMPARABLE(QXmlStreamNamespaceDeclaration)};Q_DECLARE_TYPEINFO(QXmlStreamNamespaceDeclaration, Q_RELOCATABLE_TYPE);typedef QList<QXmlStreamNamespaceDeclaration> QXmlStreamNamespaceDeclarations;class Q_CORE_EXPORT QXmlStreamNotationDeclaration {QtPrivate::QXmlString m_name, m_systemId, m_publicId;friend class QXmlStreamReaderPrivate;public:QXmlStreamNotationDeclaration();inline QStringView name()const{return m_name; }inline QStringView systemId()const{return m_systemId; }inline QStringView publicId()const{return m_publicId; }#if QT_CORE_REMOVED_SINCE(6, 8)inlinebooloperator==(const QXmlStreamNotationDeclaration &other)const{returncomparesEqual(*this, other); }inlinebooloperator!=(const QXmlStreamNotationDeclaration &other)const{return!operator==(other); }#endifprivate:friendboolcomparesEqual(const QXmlStreamNotationDeclaration &lhs,const QXmlStreamNotationDeclaration &rhs) noexcept {return lhs.m_name == rhs.m_name && lhs.m_systemId == rhs.m_systemId && lhs.m_publicId == rhs.m_publicId;}Q_DECLARE_EQUALITY_COMPARABLE(QXmlStreamNotationDeclaration)};Q_DECLARE_TYPEINFO(QXmlStreamNotationDeclaration, Q_RELOCATABLE_TYPE);typedef QList<QXmlStreamNotationDeclaration> QXmlStreamNotationDeclarations;class Q_CORE_EXPORT QXmlStreamEntityDeclaration {QtPrivate::QXmlString m_name, m_notationName, m_systemId, m_publicId, m_value;friend class QXmlStreamReaderPrivate;public:QXmlStreamEntityDeclaration();inline QStringView name()const{return m_name; }inline QStringView notationName()const{return m_notationName; }inline QStringView systemId()const{return m_systemId; }inline QStringView publicId()const{return m_publicId; }inline QStringView value()const{return m_value; }#if QT_CORE_REMOVED_SINCE(6, 8)inlinebooloperator==(const QXmlStreamEntityDeclaration &other)const{returncomparesEqual(*this, other); }inlinebooloperator!=(const QXmlStreamEntityDeclaration &other)const{return!operator==(other); }#endifprivate:friendboolcomparesEqual(const QXmlStreamEntityDeclaration &lhs,const QXmlStreamEntityDeclaration &rhs) noexcept {return lhs.m_name == rhs.m_name && lhs.m_notationName == rhs.m_notationName && lhs.m_systemId == rhs.m_systemId && lhs.m_publicId == rhs.m_publicId && lhs.m_value == rhs.m_value;}Q_DECLARE_EQUALITY_COMPARABLE(QXmlStreamEntityDeclaration)};Q_DECLARE_TYPEINFO(QXmlStreamEntityDeclaration, Q_RELOCATABLE_TYPE);typedef QList<QXmlStreamEntityDeclaration> QXmlStreamEntityDeclarations;class Q_CORE_EXPORT QXmlStreamEntityResolver {Q_DISABLE_COPY_MOVE(QXmlStreamEntityResolver)public:QXmlStreamEntityResolver() =default;virtual~QXmlStreamEntityResolver();virtual QString resolveEntity(const QString& publicId,const QString& systemId);virtual QString resolveUndeclaredEntity(const QString &name);};#if QT_CONFIG(xmlstreamreader)class Q_CORE_EXPORT QXmlStreamReader {QDOC_PROPERTY(bool namespaceProcessing READ namespaceProcessing WRITE setNamespaceProcessing)public:enum TokenType { NoToken =0, Invalid, StartDocument, EndDocument, StartElement, EndElement, Characters, Comment, DTD, EntityReference, ProcessingInstruction };QXmlStreamReader();explicitQXmlStreamReader(QIODevice *device);#if QT_CORE_REMOVED_SINCE(6, 5)explicitQXmlStreamReader(const QByteArray &data);explicitQXmlStreamReader(const QString &data);explicitQXmlStreamReader(const char* data);#endif// QT_CORE_REMOVED_SINCE(6, 5) Q_WEAK_OVERLOAD explicitQXmlStreamReader(const QByteArray &data):QXmlStreamReader(data, PrivateConstructorTag{}) { }explicitQXmlStreamReader(QAnyStringView data);~QXmlStreamReader();voidsetDevice(QIODevice *device); QIODevice *device()const;#if QT_CORE_REMOVED_SINCE(6, 5)voidaddData(const QByteArray &data);voidaddData(const QString &data);voidaddData(const char*data);#endif// QT_CORE_REMOVED_SINCE(6, 5) Q_WEAK_OVERLOAD voidaddData(const QByteArray &data) {addDataImpl(data); }voidaddData(QAnyStringView data);voidclear();boolatEnd()const; TokenType readNext();boolreadNextStartElement();voidskipCurrentElement(); QString readRawInnerData(); TokenType tokenType()const; QString tokenString()const;voidsetNamespaceProcessing(bool);boolnamespaceProcessing()const;inlineboolisStartDocument()const{returntokenType() == StartDocument; }inlineboolisEndDocument()const{returntokenType() == EndDocument; }inlineboolisStartElement()const{returntokenType() == StartElement; }inlineboolisEndElement()const{returntokenType() == EndElement; }inlineboolisCharacters()const{returntokenType() == Characters; }boolisWhitespace()const;boolisCDATA()const;inlineboolisComment()const{returntokenType() == Comment; }inlineboolisDTD()const{returntokenType() == DTD; }inlineboolisEntityReference()const{returntokenType() == EntityReference; }inlineboolisProcessingInstruction()const{returntokenType() == ProcessingInstruction; }boolisStandaloneDocument()const;boolhasStandaloneDeclaration()const; QStringView documentVersion()const; QStringView documentEncoding()const; qint64 lineNumber()const; qint64 columnNumber()const; qint64 characterOffset()const; QXmlStreamAttributes attributes()const;enum ReadElementTextBehaviour { ErrorOnUnexpectedElement, IncludeChildElements, SkipChildElements }; QString readElementText(ReadElementTextBehaviour behaviour = ErrorOnUnexpectedElement); QStringView name()const; QStringView namespaceUri()const; QStringView qualifiedName()const; QStringView prefix()const; QStringView processingInstructionTarget()const; QStringView processingInstructionData()const; QStringView text()const; QXmlStreamNamespaceDeclarations namespaceDeclarations()const;voidaddExtraNamespaceDeclaration(const QXmlStreamNamespaceDeclaration &extraNamespaceDeclaraction);voidaddExtraNamespaceDeclarations(const QXmlStreamNamespaceDeclarations &extraNamespaceDeclaractions); QXmlStreamNotationDeclarations notationDeclarations()const; QXmlStreamEntityDeclarations entityDeclarations()const; QStringView dtdName()const; QStringView dtdPublicId()const; QStringView dtdSystemId()const;intentityExpansionLimit()const;voidsetEntityExpansionLimit(int limit);enum Error { NoError, UnexpectedElementError, CustomError, NotWellFormedError, PrematureEndOfDocumentError };voidraiseError(const QString& message =QString()); QString errorString()const; Error error()const;inlineboolhasError()const{returnerror() != NoError;}voidsetEntityResolver(QXmlStreamEntityResolver *resolver); QXmlStreamEntityResolver *entityResolver()const;private:struct PrivateConstructorTag { };QXmlStreamReader(const QByteArray &data, PrivateConstructorTag);voidaddDataImpl(const QByteArray &data);Q_DISABLE_COPY(QXmlStreamReader)Q_DECLARE_PRIVATE(QXmlStreamReader)std::unique_ptr<QXmlStreamReaderPrivate> d_ptr;};#endif// feature xmlstreamreader#if QT_CONFIG(xmlstreamwriter)class QXmlStreamWriterPrivate;class Q_CORE_EXPORT QXmlStreamWriter {QDOC_PROPERTY(bool autoFormatting READ autoFormatting WRITE setAutoFormatting)QDOC_PROPERTY(int autoFormattingIndent READ autoFormattingIndent WRITE setAutoFormattingIndent)public:QXmlStreamWriter();explicitQXmlStreamWriter(QIODevice *device);explicitQXmlStreamWriter(QByteArray *array);explicitQXmlStreamWriter(QString *string);~QXmlStreamWriter();voidsetDevice(QIODevice *device); QIODevice *device()const;voidsetAutoFormatting(bool);boolautoFormatting()const;voidsetAutoFormattingIndent(int spacesOrTabs);intautoFormattingIndent()const;#if QT_CORE_REMOVED_SINCE(6,5)voidwriteAttribute(const QString &qualifiedName,const QString &value);voidwriteAttribute(const QString &namespaceUri,const QString &name,const QString &value);#endifvoidwriteAttribute(QAnyStringView qualifiedName, QAnyStringView value);voidwriteAttribute(QAnyStringView namespaceUri, QAnyStringView name, QAnyStringView value);voidwriteAttribute(const QXmlStreamAttribute& attribute);voidwriteAttributes(const QXmlStreamAttributes& attributes);#if QT_CORE_REMOVED_SINCE(6,5)voidwriteCDATA(const QString &text);voidwriteCharacters(const QString &text);voidwriteComment(const QString &text);voidwriteDTD(const QString &dtd);voidwriteEmptyElement(const QString &qualifiedName);voidwriteEmptyElement(const QString &namespaceUri,const QString &name);voidwriteTextElement(const QString &qualifiedName,const QString &text);voidwriteTextElement(const QString &namespaceUri,const QString &name,const QString &text);#endifvoidwriteCDATA(QAnyStringView text);voidwriteCharacters(QAnyStringView text);voidwriteComment(QAnyStringView text);voidwriteDTD(QAnyStringView dtd);voidwriteEmptyElement(QAnyStringView qualifiedName);voidwriteEmptyElement(QAnyStringView namespaceUri, QAnyStringView name);voidwriteTextElement(QAnyStringView qualifiedName, QAnyStringView text);voidwriteTextElement(QAnyStringView namespaceUri, QAnyStringView name, QAnyStringView text);voidwriteEndDocument();voidwriteEndElement();#if QT_CORE_REMOVED_SINCE(6,5)voidwriteEntityReference(const QString &name);voidwriteNamespace(const QString &namespaceUri,const QString &prefix);voidwriteDefaultNamespace(const QString &namespaceUri);voidwriteProcessingInstruction(const QString &target,const QString &data);#endifvoidwriteEntityReference(QAnyStringView name);voidwriteNamespace(QAnyStringView namespaceUri, QAnyStringView prefix = {});voidwriteDefaultNamespace(QAnyStringView namespaceUri);voidwriteProcessingInstruction(QAnyStringView target, QAnyStringView data = {});voidwriteStartDocument();#if QT_CORE_REMOVED_SINCE(6,5)voidwriteStartDocument(const QString &version);voidwriteStartDocument(const QString &version,bool standalone);voidwriteStartElement(const QString &qualifiedName);voidwriteStartElement(const QString &namespaceUri,const QString &name);#endifvoidwriteStartDocument(QAnyStringView version);voidwriteStartDocument(QAnyStringView version,bool standalone);voidwriteStartElement(QAnyStringView qualifiedName);voidwriteStartElement(QAnyStringView namespaceUri, QAnyStringView name);#if QT_CONFIG(xmlstreamreader)voidwriteCurrentToken(const QXmlStreamReader &reader);#endifboolhasError()const;private:Q_DISABLE_COPY(QXmlStreamWriter)Q_DECLARE_PRIVATE(QXmlStreamWriter)std::unique_ptr<QXmlStreamWriterPrivate> d_ptr;};#endif// feature xmlstreamwriter QT_END_NAMESPACE #endif// feature xmlstream#endif// QXMLSTREAM_H
close