Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Avoid crashes on debug builds when trying to write xml for more value…
… types
  • Loading branch information
nyalldawson committed May 13, 2019
1 parent e9a80d6 commit e70a15f
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 1 deletion.
1 change: 1 addition & 0 deletions src/core/qgsapplication.cpp
Expand Up @@ -209,6 +209,7 @@ void QgsApplication::init( QString profileFolder )
qRegisterMetaType<QgsAuthManager::MessageLevel>( "QgsAuthManager::MessageLevel" );
qRegisterMetaType<QgsNetworkRequestParameters>( "QgsNetworkRequestParameters" );
qRegisterMetaType<QgsNetworkReplyContent>( "QgsNetworkReplyContent" );
qRegisterMetaType<QgsGeometry>( "QgsGeometry" );

( void ) resolvePkgPath();

Expand Down
26 changes: 26 additions & 0 deletions src/core/qgsxmlutils.cpp
Expand Up @@ -154,8 +154,11 @@ QDomElement QgsXmlUtils::writeVariant( const QVariant &value, QDomDocument &doc
}

case QVariant::Int:
case QVariant::UInt:
case QVariant::Bool:
case QVariant::Double:
case QVariant::LongLong:
case QVariant::ULongLong:
case QVariant::String:
element.setAttribute( QStringLiteral( "type" ), QVariant::typeToName( value.type() ) );
element.setAttribute( QStringLiteral( "value" ), value.toString() );
Expand All @@ -177,6 +180,13 @@ QDomElement QgsXmlUtils::writeVariant( const QVariant &value, QDomDocument &doc
crs.writeXml( element, doc );
break;
}
else if ( value.canConvert< QgsGeometry >() )
{
element.setAttribute( QStringLiteral( "type" ), QStringLiteral( "QgsGeometry" ) );
const QgsGeometry geom = value.value< QgsGeometry >();
element.setAttribute( QStringLiteral( "value" ), geom.asWkt() );
break;
}
FALLTHROUGH
}

Expand All @@ -200,6 +210,18 @@ QVariant QgsXmlUtils::readVariant( const QDomElement &element )
{
return element.attribute( QStringLiteral( "value" ) ).toInt();
}
else if ( type == QLatin1String( "uint" ) )
{
return element.attribute( QStringLiteral( "value" ) ).toUInt();
}
else if ( type == QLatin1String( "qlonglong" ) )
{
return element.attribute( QStringLiteral( "value" ) ).toLongLong();
}
else if ( type == QLatin1String( "qulonglong" ) )
{
return element.attribute( QStringLiteral( "value" ) ).toULongLong();
}
else if ( type == QLatin1String( "double" ) )
{
return element.attribute( QStringLiteral( "value" ) ).toDouble();
Expand Down Expand Up @@ -265,6 +287,10 @@ QVariant QgsXmlUtils::readVariant( const QDomElement &element )
crs.readXml( element );
return crs;
}
else if ( type == QLatin1String( "QgsGeometry" ) )
{
return QgsGeometry::fromWkt( element.attribute( "value" ) );
}
else
{
return QVariant();
Expand Down
27 changes: 26 additions & 1 deletion tests/src/python/test_qgsxmlutils.py
Expand Up @@ -13,9 +13,9 @@
__revision__ = '$Format:%H$'

import qgis # NOQA switch sip api

from qgis.core import (QgsXmlUtils,
QgsProperty,
QgsGeometry,
QgsCoordinateReferenceSystem)

from qgis.PyQt.QtXml import QDomDocument
Expand Down Expand Up @@ -50,6 +50,19 @@ def test_integer(self):
prop2 = QgsXmlUtils.readVariant(elem)
self.assertEqual(my_properties, prop2)

def test_long(self):
"""
Test that maps are correctly loaded and written
"""
doc = QDomDocument("properties")

# not sure if this actually does map to a long?
my_properties = {'a': 9223372036854775808}
elem = QgsXmlUtils.writeVariant(my_properties, doc)

prop2 = QgsXmlUtils.readVariant(elem)
self.assertEqual(my_properties, prop2)

def test_string(self):
"""
Test that maps are correctly loaded and written
Expand Down Expand Up @@ -160,6 +173,18 @@ def test_crs(self):
crs2 = QgsXmlUtils.readVariant(elem)
self.assertFalse(crs2.isValid())

def test_geom(self):
"""
Test that QgsGeometry values are correctly loaded and written
"""
doc = QDomDocument("properties")

g = QgsGeometry.fromWkt('Point(3 4)')
elem = QgsXmlUtils.writeVariant(g, doc)

g2 = QgsXmlUtils.readVariant(elem)
self.assertEqual(g2.asWkt(), 'Point (3 4)')


if __name__ == '__main__':
unittest.main()

0 comments on commit e70a15f

Please sign in to comment.