From 8e054830124999a4ebd448e9476cb43bda9ff39f Mon Sep 17 00:00:00 2001 From: 0xd34df00d <0xd34df00d@gmail.com> Date: Mon, 3 Mar 2014 12:03:52 +0400 Subject: Avoid keeping the source QDomDocument in QXmppElement. Serialize the node instead of keeping QDomElement with a ref to the original QDomDOcument. --- src/base/QXmppElement.cpp | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) (limited to 'src/base/QXmppElement.cpp') diff --git a/src/base/QXmppElement.cpp b/src/base/QXmppElement.cpp index cbb6d8bb..ecb88cad 100644 --- a/src/base/QXmppElement.cpp +++ b/src/base/QXmppElement.cpp @@ -25,6 +25,7 @@ #include "QXmppUtils.h" #include +#include class QXmppElementPrivate { @@ -41,7 +42,7 @@ public: QString name; QString value; - QDomElement source; + QByteArray serializedSource; }; QXmppElementPrivate::QXmppElementPrivate() @@ -50,7 +51,7 @@ QXmppElementPrivate::QXmppElementPrivate() } QXmppElementPrivate::QXmppElementPrivate(const QDomElement &element) - : counter(1), parent(NULL), source(element) + : counter(1), parent(NULL) { if (element.isNull()) return; @@ -80,6 +81,9 @@ QXmppElementPrivate::QXmppElementPrivate(const QDomElement &element) } childNode = childNode.nextSibling(); } + + QTextStream stream(&serializedSource); + element.save(stream, 0); } QXmppElementPrivate::~QXmppElementPrivate() @@ -126,9 +130,19 @@ QXmppElement &QXmppElement::operator=(const QXmppElement &other) return *this; } -const QDomElement &QXmppElement::sourceDomElement() const +QDomElement QXmppElement::sourceDomElement() const { - return d->source; + if (d->serializedSource.isEmpty()) + return QDomElement(); + + QDomDocument doc; + if (!doc.setContent(d->serializedSource, true)) + { + qWarning("[QXmpp] QXmppElement::sourceDomElement(): cannot parse source element"); + return QDomElement(); + } + + return doc.documentElement(); } QStringList QXmppElement::attributeNames() const -- cgit v1.2.3