Skip to content

Commit 10c3a1a

Browse files
committedMar 10, 2021
Fix application hangs when attempting to load qlr file for
non vector/raster/vector-tile layer types Refs #42112
1 parent ebdb7ba commit 10c3a1a

File tree

4 files changed

+28
-14
lines changed

4 files changed

+28
-14
lines changed
 

‎python/core/auto_generated/qgslayerdefinition.sip.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ Whether some dependency is missing
116116
%End
117117

118118
};
119+
119120
};
120121

121122
/************************************************************************

‎src/app/qgisapp.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7290,7 +7290,7 @@ void QgisApp::openLayerDefinition( const QString &path )
72907290
{
72917291
QString errorMessage;
72927292
bool loaded = QgsLayerDefinition::loadLayerDefinition( path, QgsProject::instance(), QgsProject::instance()->layerTreeRoot(), errorMessage );
7293-
if ( !loaded )
7293+
if ( !loaded || !errorMessage.isEmpty() )
72947294
{
72957295
QgsDebugMsg( errorMessage );
72967296
visibleMessageBar()->pushMessage( tr( "Error loading layer definition" ), errorMessage, Qgis::Warning );
@@ -10819,7 +10819,7 @@ void QgisApp::pasteLayer()
1081910819
bool loaded = QgsLayerDefinition::loadLayerDefinition( doc, QgsProject::instance(), root,
1082010820
errorMessage, readWriteContext );
1082110821

10822-
if ( !loaded )
10822+
if ( !loaded || !errorMessage.isEmpty() )
1082310823
{
1082410824
visibleMessageBar()->pushMessage( tr( "Error pasting layer" ), errorMessage, Qgis::Warning );
1082510825
}

‎src/core/qgslayerdefinition.cpp

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ bool QgsLayerDefinition::loadLayerDefinition( const QString &path, QgsProject *p
6060

6161
bool QgsLayerDefinition::loadLayerDefinition( QDomDocument doc, QgsProject *project, QgsLayerTreeGroup *rootGroup, QString &errorMessage, QgsReadWriteContext &context )
6262
{
63-
Q_UNUSED( errorMessage )
63+
errorMessage.clear();
6464

6565
QgsLayerTreeGroup *root = new QgsLayerTreeGroup();
6666

@@ -172,7 +172,7 @@ bool QgsLayerDefinition::loadLayerDefinition( QDomDocument doc, QgsProject *proj
172172
loadInLegend = false;
173173
}
174174

175-
QList<QgsMapLayer *> layers = QgsLayerDefinition::loadLayerDefinitionLayers( doc, context );
175+
QList<QgsMapLayer *> layers = QgsLayerDefinition::loadLayerDefinitionLayersInternal( doc, context, errorMessage );
176176

177177
project->addMapLayers( layers, loadInLegend );
178178

@@ -195,7 +195,6 @@ bool QgsLayerDefinition::loadLayerDefinition( QDomDocument doc, QgsProject *proj
195195
rootGroup->insertChildNodes( -1, nodes );
196196

197197
return true;
198-
199198
}
200199

201200
bool QgsLayerDefinition::exportLayerDefinition( QString path, const QList<QgsLayerTreeNode *> &selectedTreeNodes, QString &errorMessage )
@@ -275,6 +274,12 @@ QDomDocument QgsLayerDefinition::exportLayerDefinitionLayers( const QList<QgsMap
275274
}
276275

277276
QList<QgsMapLayer *> QgsLayerDefinition::loadLayerDefinitionLayers( QDomDocument &document, QgsReadWriteContext &context )
277+
{
278+
QString errorMessage;
279+
return loadLayerDefinitionLayersInternal( document, context, errorMessage );
280+
}
281+
282+
QList<QgsMapLayer *> QgsLayerDefinition::loadLayerDefinitionLayersInternal( QDomDocument &document, QgsReadWriteContext &context, QString &errorMessage )
278283
{
279284
QList<QgsMapLayer *> layers;
280285
QDomElement layerElem = document.documentElement().firstChildElement( QStringLiteral( "projectlayers" ) ).firstChildElement( QStringLiteral( "maplayer" ) );
@@ -287,7 +292,6 @@ QList<QgsMapLayer *> QgsLayerDefinition::loadLayerDefinitionLayers( QDomDocument
287292
while ( ! layerElem.isNull() )
288293
{
289294
const QString type = layerElem.attribute( QStringLiteral( "type" ) );
290-
QgsDebugMsg( type );
291295
QgsMapLayer *layer = nullptr;
292296

293297
if ( type == QLatin1String( "vector" ) )
@@ -307,14 +311,18 @@ QList<QgsMapLayer *> QgsLayerDefinition::loadLayerDefinitionLayers( QDomDocument
307311
QString typeName = layerElem.attribute( QStringLiteral( "name" ) );
308312
layer = QgsApplication::pluginLayerRegistry()->createLayer( typeName );
309313
}
314+
else
315+
{
316+
errorMessage = QObject::tr( "Unsupported layer type: %1" ).arg( type );
317+
}
310318

311-
if ( !layer )
312-
continue;
313-
314-
// always add the layer, even if the source is invalid -- this allows users to fix the source
315-
// at a later stage and still retain all the layer properties intact
316-
layer->readLayerXml( layerElem, context );
317-
layers << layer;
319+
if ( layer )
320+
{
321+
// always add the layer, even if the source is invalid -- this allows users to fix the source
322+
// at a later stage and still retain all the layer properties intact
323+
layer->readLayerXml( layerElem, context );
324+
layers << layer;
325+
}
318326
layerElem = layerElem.nextSiblingElement( QStringLiteral( "maplayer" ) );
319327
}
320328
return layers;
@@ -342,7 +350,6 @@ QList<QgsMapLayer *> QgsLayerDefinition::loadLayerDefinitionLayers( const QStrin
342350
return QgsLayerDefinition::loadLayerDefinitionLayers( doc, context );
343351
}
344352

345-
346353
void QgsLayerDefinition::DependencySorter::init( const QDomDocument &doc )
347354
{
348355
// Determine a loading order of layers based on a graph of dependencies

‎src/core/qgslayerdefinition.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,12 @@ class CORE_EXPORT QgsLayerDefinition
115115
bool mHasMissingDependency;
116116
void init( const QDomDocument &doc );
117117
};
118+
119+
private:
120+
121+
static QList<QgsMapLayer *> loadLayerDefinitionLayersInternal( QDomDocument &document, QgsReadWriteContext &context, QString &errorMessage );
122+
123+
118124
};
119125

120126
#endif // QGSLAYERDEFINITION_H

0 commit comments

Comments
 (0)
Please sign in to comment.