QSet<QString> QgsServerProjectParser::findRestrictedLayers() const { QSet<QString> restrictedLayerSet; if ( !mXMLDoc ) { return restrictedLayerSet; } //names of unpublished layers / groups QDomElement propertiesElem = mXMLDoc->documentElement().firstChildElement( "properties" ); if ( !propertiesElem.isNull() ) { QDomElement wmsLayerRestrictionElem = propertiesElem.firstChildElement( "WMSRestrictedLayers" ); if ( !wmsLayerRestrictionElem.isNull() ) { QStringList restrictedLayersAndGroups; QDomNodeList wmsLayerRestrictionValues = wmsLayerRestrictionElem.elementsByTagName( "value" ); for ( int i = 0; i < wmsLayerRestrictionValues.size(); ++i ) { restrictedLayerSet.insert( wmsLayerRestrictionValues.at( i ).toElement().text() ); } } } //get legend dom element if ( restrictedLayerSet.size() < 1 || !mXMLDoc ) { return restrictedLayerSet; } QDomElement legendElem = mXMLDoc->documentElement().firstChildElement( "legend" ); if ( legendElem.isNull() ) { return restrictedLayerSet; } //go through all legend groups and insert names of subgroups / sublayers if there is a match QDomNodeList legendGroupList = legendElem.elementsByTagName( "legendgroup" ); for ( int i = 0; i < legendGroupList.size(); ++i ) { //get name QDomElement groupElem = legendGroupList.at( i ).toElement(); QString groupName = groupElem.attribute( "name" ); if ( restrictedLayerSet.contains( groupName ) ) //match: add names of subgroups and sublayers to set { //embedded group? -> also get names of subgroups and sublayers from embedded projects if ( groupElem.attribute( "embedded" ) == "1" ) { sublayersOfEmbeddedGroup( convertToAbsolutePath( groupElem.attribute( "project" ) ), groupName, restrictedLayerSet ); } else //local group { QDomNodeList subgroupList = groupElem.elementsByTagName( "legendgroup" ); for ( int j = 0; j < subgroupList.size(); ++j ) { restrictedLayerSet.insert( subgroupList.at( j ).toElement().attribute( "name" ) ); } QDomNodeList sublayerList = groupElem.elementsByTagName( "legendlayer" ); for ( int k = 0; k < sublayerList.size(); ++k ) { restrictedLayerSet.insert( sublayerList.at( k ).toElement().attribute( "name" ) ); } } } } // wmsLayerRestrictionValues contains LayerIDs if ( mUseLayerIDs ) { QDomNodeList legendLayerList = legendElem.elementsByTagName( "legendlayer" ); for ( int i = 0; i < legendLayerList.size(); ++i ) { //get name QDomElement layerElem = legendLayerList.at( i ).toElement(); QString layerName = layerElem.attribute( "name" ); if ( restrictedLayerSet.contains( layerName ) ) //match: add layer id { // get legend layer file element QDomNodeList layerfileList = layerElem.elementsByTagName( "legendlayerfile" ); if ( !layerfileList.isEmpty() ) { // add layer id restrictedLayerSet.insert( layerfileList.at( 0 ).toElement().attribute( "layerid" ) ); } } } } return restrictedLayerSet; }
QgsMapLayer* QgsServerProjectParser::createLayerFromElement( const QDomElement& elem, bool useCache ) const { if ( elem.isNull() || !mXMLDoc ) { return nullptr; } addJoinLayersForElement( elem ); addGetFeatureLayers( elem ); QDomElement dataSourceElem = elem.firstChildElement( "datasource" ); QString uri = dataSourceElem.text(); QString absoluteUri; // If QgsProject instance fileName is set, // Is converting relative pathes to absolute still relevant ? if ( !dataSourceElem.isNull() ) { //convert relative pathes to absolute ones if necessary if ( uri.startsWith( "dbname" ) ) //database { QgsDataSourceUri dsUri( uri ); if ( dsUri.host().isEmpty() ) //only convert path for file based databases { QString dbnameUri = dsUri.database(); QString dbNameUriAbsolute = convertToAbsolutePath( dbnameUri ); if ( dbnameUri != dbNameUriAbsolute ) { dsUri.setDatabase( dbNameUriAbsolute ); absoluteUri = dsUri.uri(); QDomText absoluteTextNode = mXMLDoc->createTextNode( absoluteUri ); dataSourceElem.replaceChild( absoluteTextNode, dataSourceElem.firstChild() ); } } } else if ( uri.startsWith( "file:" ) ) //a file based datasource in url notation (e.g. delimited text layer) { QString filePath = uri.mid( 5, uri.indexOf( "?" ) - 5 ); QString absoluteFilePath = convertToAbsolutePath( filePath ); if ( filePath != absoluteFilePath ) { QUrl destUrl = QUrl::fromEncoded( uri.toAscii() ); destUrl.setScheme( "file" ); destUrl.setPath( absoluteFilePath ); absoluteUri = destUrl.toEncoded(); QDomText absoluteTextNode = mXMLDoc->createTextNode( absoluteUri ); dataSourceElem.replaceChild( absoluteTextNode, dataSourceElem.firstChild() ); } else { absoluteUri = uri; } } else //file based data source { absoluteUri = convertToAbsolutePath( uri ); if ( uri != absoluteUri ) { QDomText absoluteTextNode = mXMLDoc->createTextNode( absoluteUri ); dataSourceElem.replaceChild( absoluteTextNode, dataSourceElem.firstChild() ); } } } QString id = layerId( elem ); QgsMapLayer* layer = nullptr; if ( useCache ) { layer = QgsMSLayerCache::instance()->searchLayer( absoluteUri, id, mProjectPath ); } if ( layer ) { if ( !QgsMapLayerRegistry::instance()->mapLayer( id ) ) QgsMapLayerRegistry::instance()->addMapLayer( layer, false, false ); if ( layer->type() == QgsMapLayer::VectorLayer ) addValueRelationLayersForLayer( dynamic_cast<QgsVectorLayer *>( layer ) ); return layer; } QString type = elem.attribute( "type" ); if ( type == "vector" ) { layer = new QgsVectorLayer(); } else if ( type == "raster" ) { layer = new QgsRasterLayer(); } else if ( elem.attribute( "embedded" ) == "1" ) //layer is embedded from another project file { QString project = convertToAbsolutePath( elem.attribute( "project" ) ); QgsDebugMsg( QString( "Project path: %1" ).arg( project ) ); QgsServerProjectParser* otherConfig = QgsConfigCache::instance()->serverConfiguration( project ); if ( !otherConfig ) { return nullptr; } return otherConfig->mapLayerFromLayerId( elem.attribute( "id" ), useCache ); } if ( layer ) { if ( layer->type() == QgsMapLayer::VectorLayer ) { // see QgsEditorWidgetRegistry::mapLayerAdded() QObject::connect( layer, SIGNAL( readCustomSymbology( const QDomElement&, QString& ) ), QgsEditorWidgetRegistry::instance(), SLOT( readSymbology( const QDomElement&, QString& ) ) ); } layer->readLayerXml( const_cast<QDomElement&>( elem ) ); //should be changed to const in QgsMapLayer //layer->setLayerName( layerName( elem ) ); // Insert layer in registry and cache before addValueRelationLayersForLayer if ( !QgsMapLayerRegistry::instance()->mapLayer( id ) ) QgsMapLayerRegistry::instance()->addMapLayer( layer, false, false ); if ( useCache ) { QgsMSLayerCache::instance()->insertLayer( absoluteUri, id, layer, mProjectPath ); } else { //todo: fixme //mLayersToRemove.push_back( layer ); } if ( layer->type() == QgsMapLayer::VectorLayer ) { addValueRelationLayersForLayer( dynamic_cast<QgsVectorLayer *>( layer ) ); } } return layer; }
QgsMapLayer* QgsServerProjectParser::createLayerFromElement( const QDomElement& elem, bool useCache ) const { if ( elem.isNull() || !mXMLDoc ) { return 0; } addJoinLayersForElement( elem, useCache ); addValueRelationLayersForElement( elem, useCache ); QDomElement dataSourceElem = elem.firstChildElement( "datasource" ); QString uri = dataSourceElem.text(); QString absoluteUri; if ( !dataSourceElem.isNull() ) { //convert relative pathes to absolute ones if necessary if ( uri.startsWith( "dbname" ) ) //database { QgsDataSourceURI dsUri( uri ); if ( dsUri.host().isEmpty() ) //only convert path for file based databases { QString dbnameUri = dsUri.database(); QString dbNameUriAbsolute = convertToAbsolutePath( dbnameUri ); if ( dbnameUri != dbNameUriAbsolute ) { dsUri.setDatabase( dbNameUriAbsolute ); absoluteUri = dsUri.uri(); QDomText absoluteTextNode = mXMLDoc->createTextNode( absoluteUri ); dataSourceElem.replaceChild( absoluteTextNode, dataSourceElem.firstChild() ); } } } else if ( uri.startsWith( "file:" ) ) //a file based datasource in url notation (e.g. delimited text layer) { QString filePath = uri.mid( 5, uri.indexOf( "?" ) - 5 ); QString absoluteFilePath = convertToAbsolutePath( filePath ); if ( filePath != absoluteFilePath ) { QUrl destUrl = QUrl::fromEncoded( uri.toAscii() ); destUrl.setScheme( "file" ); destUrl.setPath( absoluteFilePath ); absoluteUri = destUrl.toEncoded(); QDomText absoluteTextNode = mXMLDoc->createTextNode( absoluteUri ); dataSourceElem.replaceChild( absoluteTextNode, dataSourceElem.firstChild() ); } else { absoluteUri = uri; } } else //file based data source { absoluteUri = convertToAbsolutePath( uri ); if ( uri != absoluteUri ) { QDomText absoluteTextNode = mXMLDoc->createTextNode( absoluteUri ); dataSourceElem.replaceChild( absoluteTextNode, dataSourceElem.firstChild() ); } } } QString id = layerId( elem ); QgsMapLayer* layer = 0; if ( useCache ) { layer = QgsMSLayerCache::instance()->searchLayer( absoluteUri, id ); } if ( layer ) { return layer; } QString type = elem.attribute( "type" ); if ( type == "vector" ) { layer = new QgsVectorLayer(); } else if ( type == "raster" ) { layer = new QgsRasterLayer(); } else if ( elem.attribute( "embedded" ) == "1" ) //layer is embedded from another project file { //todo: fixme /* QString project = convertToAbsolutePath( elem.attribute( "project" ) ); QgsDebugMsg( QString( "Project path: %1" ).arg( project ) ); QgsProjectParser* otherConfig = dynamic_cast<QgsProjectParser*>( QgsConfigCache::instance()->searchConfiguration( project ) ); if ( !otherConfig ) { return 0; } QHash< QString, QDomElement >::const_iterator layerIt = otherConfig->mProjectLayerElementsById.find( elem.attribute( "id" ) ); if ( layerIt == otherConfig->mProjectLayerElementsById.constEnd() ) { return 0; } return otherConfig->createLayerFromElement( layerIt.value() ); */ } if ( layer ) { layer->readLayerXML( const_cast<QDomElement&>( elem ) ); //should be changed to const in QgsMapLayer layer->setLayerName( layerName( elem ) ); if ( useCache ) { QgsMSLayerCache::instance()->insertLayer( absoluteUri, id, layer, mProjectPath ); } else { //todo: fixme //mLayersToRemove.push_back( layer ); } } return layer; }
QgsMapLayer* QgsProjectParser::createLayerFromElement( const QDomElement& elem ) const { if ( elem.isNull() || !mXMLDoc ) { return 0; } QString uri; QString absoluteUri; QDomElement dataSourceElem = elem.firstChildElement( "datasource" ); if ( !dataSourceElem.isNull() ) { //convert relative pathes to absolute ones if necessary uri = dataSourceElem.text(); absoluteUri = convertToAbsolutePath( uri ); if ( uri != absoluteUri ) { QDomText absoluteTextNode = mXMLDoc->createTextNode( absoluteUri ); dataSourceElem.replaceChild( absoluteTextNode, dataSourceElem.firstChild() ); } } QString id = layerId( elem ); QgsMapLayer* layer = QgsMSLayerCache::instance()->searchLayer( absoluteUri, id ); if ( layer ) { //reading symbology every time is necessary because it could have been changed by a user SLD based request QString error; layer->readSymbology( elem, error ); return layer; } QString type = elem.attribute( "type" ); if ( type == "vector" ) { layer = new QgsVectorLayer(); } else if ( type == "raster" ) { layer = new QgsRasterLayer(); } else if ( elem.attribute( "embedded" ) == "1" ) //layer is embedded from another project file { QString project = convertToAbsolutePath( elem.attribute( "project" ) ); QgsDebugMsg( QString( "Project path: %1" ).arg( project ) ); QgsProjectParser* otherConfig = dynamic_cast<QgsProjectParser*>( QgsConfigCache::instance()->searchConfiguration( project ) ); if ( !otherConfig ) { return 0; } QMap< QString, QDomElement > layerMap = otherConfig->projectLayerElementsById(); QMap< QString, QDomElement >::const_iterator layerIt = layerMap.find( elem.attribute( "id" ) ); if ( layerIt == layerMap.constEnd() ) { return 0; } return otherConfig->createLayerFromElement( layerIt.value() ); } if ( layer ) { layer->readXML( const_cast<QDomElement&>( elem ) ); //should be changed to const in QgsMapLayer layer->setLayerName( layerName( elem ) ); QgsMSLayerCache::instance()->insertLayer( absoluteUri, id, layer ); } return layer; }
QList<QgsMapLayer*> QgsProjectParser::mapLayerFromStyle( const QString& lName, const QString& styleName, bool allowCaching ) const { Q_UNUSED( styleName ); Q_UNUSED( allowCaching ); QList<QgsMapLayer*> layerList; //first assume lName refers to a leaf layer QMap< QString, QDomElement > layerElemMap = projectLayerElementsByName(); QMap< QString, QDomElement >::const_iterator layerElemIt = layerElemMap.find( lName ); if ( layerElemIt != layerElemMap.constEnd() ) { QgsMapLayer* layer = createLayerFromElement( layerElemIt.value() ); if ( layer ) { layerList.push_back( layer ); return layerList; } } //Check if layer name refers to the top level group for the project. if ( lName == projectTitle() ) { QList<QDomElement> layerElemList = projectLayerElements(); QList<QDomElement>::const_iterator layerElemIt = layerElemList.constBegin(); for ( ; layerElemIt != layerElemList.constEnd(); ++layerElemIt ) { layerList.push_back( createLayerFromElement( *layerElemIt ) ); } return layerList; } //maybe the layer is a goup. Check if lName is contained in the group list QMap< QString, QDomElement > idLayerMap = projectLayerElementsById(); QList<QDomElement> legendGroups = legendGroupElements(); QList<QDomElement>::const_iterator groupIt = legendGroups.constBegin(); for ( ; groupIt != legendGroups.constEnd(); ++groupIt ) { if ( groupIt->attribute( "name" ) == lName ) { if ( groupIt->attribute( "embedded" ) == "1" ) //requested group is embedded from another project { QString project = convertToAbsolutePath( groupIt->attribute( "project" ) ); QgsDebugMsg( QString( "Project path: %1" ).arg( project ) ); QgsProjectParser* p = dynamic_cast<QgsProjectParser*>( QgsConfigCache::instance()->searchConfiguration( project ) ); if ( p ) { QList<QDomElement> pGroupElems = p->legendGroupElements(); QList<QDomElement>::const_iterator pGroupIt = pGroupElems.constBegin(); QDomElement embeddedGroupElem; for ( ; pGroupIt != pGroupElems.constEnd(); ++pGroupIt ) { if ( pGroupIt->attribute( "name" ) == lName ) { embeddedGroupElem = *pGroupIt; break; } } if ( !embeddedGroupElem.isNull() ) { //add all the layers under the group QMap< QString, QDomElement > pLayerElems = p->projectLayerElementsById(); QDomNodeList pLayerNodes = embeddedGroupElem.elementsByTagName( "legendlayer" ); for ( int i = 0; i < pLayerNodes.size(); ++i ) { QString pLayerId = pLayerNodes.at( i ).toElement().firstChildElement( "filegroup" ).firstChildElement( "legendlayerfile" ).attribute( "layerid" ); QgsMapLayer* pLayer = p->createLayerFromElement( pLayerElems[pLayerId] ); if ( pLayer ) { layerList.push_back( pLayer ); } } } } } else //normal (not embedded) group { QDomNodeList layerFileList = groupIt->elementsByTagName( "legendlayerfile" ); for ( int i = 0; i < layerFileList.size(); ++i ) { QMap< QString, QDomElement >::const_iterator layerEntry = idLayerMap.find( layerFileList.at( i ).toElement().attribute( "layerid" ) ); if ( layerEntry != idLayerMap.constEnd() ) { layerList.push_back( createLayerFromElement( layerEntry.value() ) ); } } } return layerList; } } //maybe the layer is embedded from another project QMap< QString, QDomElement >::const_iterator layerIt = idLayerMap.constBegin(); for ( ; layerIt != idLayerMap.constEnd(); ++layerIt ) { if ( layerIt.value().attribute( "embedded" ) == "1" ) { QString id = layerIt.value().attribute( "id" ); QString project = layerIt.value().attribute( "project" ); QgsDebugMsg( QString( "Project path: %1" ).arg( project ) ); //get config parser from cache QgsProjectParser* otherParser = dynamic_cast<QgsProjectParser*>( QgsConfigCache::instance()->searchConfiguration( project ) ); if ( otherParser ) { //get element by id QMap< QString, QDomElement > otherLayerElems = otherParser->projectLayerElementsById(); QMap< QString, QDomElement >::const_iterator otherLayerIt = otherLayerElems.find( id ); if ( otherLayerIt != otherLayerElems.constEnd() ) { if ( otherLayerIt.value().firstChildElement( "layername" ).text() == lName ) { layerList.push_back( otherParser->createLayerFromElement( otherLayerIt.value() ) ); return layerList; } } } } } //layer still not found. Check if it is a single layer contained in a embedded layer group groupIt = legendGroups.constBegin(); for ( ; groupIt != legendGroups.constEnd(); ++groupIt ) { if ( groupIt->attribute( "embedded" ) == "1" ) { QString project = convertToAbsolutePath( groupIt->attribute( "project" ) ); QgsDebugMsg( QString( "Project path: %1" ).arg( project ) ); QgsProjectParser* p = dynamic_cast<QgsProjectParser*>( QgsConfigCache::instance()->searchConfiguration( project ) ); if ( p ) { QMap< QString, QDomElement > pLayers = p->projectLayerElementsByName(); QMap< QString, QDomElement >::const_iterator pLayerIt = pLayers.find( lName ); if ( pLayerIt != pLayers.constEnd() ) { QgsMapLayer* layer = p->createLayerFromElement( pLayerIt.value() ); if ( layer ) { layerList.push_back( layer ); return layerList; } } } } } //layer not found, return empty list return layerList; }
void QgsProjectParser::addLayers( QDomDocument &doc, QDomElement &parentElem, const QDomElement &legendElem, const QMap<QString, QgsMapLayer *> &layerMap, const QStringList &nonIdentifiableLayers ) const { QDomNodeList legendChildren = legendElem.childNodes(); for ( int i = 0; i < legendChildren.size(); ++i ) { QDomElement currentChildElem = legendChildren.at( i ).toElement(); QDomElement layerElem = doc.createElement( "Layer" ); if ( currentChildElem.tagName() == "legendgroup" ) { layerElem.setAttribute( "queryable", "1" ); QString name = currentChildElem.attribute( "name" ); QDomElement nameElem = doc.createElement( "Name" ); QDomText nameText = doc.createTextNode( name ); nameElem.appendChild( nameText ); layerElem.appendChild( nameElem ); QDomElement titleElem = doc.createElement( "Title" ); QDomText titleText = doc.createTextNode( name ); titleElem.appendChild( titleText ); layerElem.appendChild( titleElem ); if ( currentChildElem.attribute( "embedded" ) == "1" ) { //add layers from other project files and embed into this group QString project = convertToAbsolutePath( currentChildElem.attribute( "project" ) ); QgsDebugMsg( QString( "Project path: %1" ).arg( project ) ); QString embeddedGroupName = currentChildElem.attribute( "name" ); QgsProjectParser* p = dynamic_cast<QgsProjectParser*>( QgsConfigCache::instance()->searchConfiguration( project ) ); if ( p ) { QStringList pIdDisabled = p->identifyDisabledLayers(); QDomElement embeddedGroupElem; QList<QDomElement> pLegendElems = p->legendGroupElements(); QList<QDomElement>::const_iterator pLegendIt = pLegendElems.constBegin(); for ( ; pLegendIt != pLegendElems.constEnd(); ++pLegendIt ) { if ( pLegendIt->attribute( "name" ) == embeddedGroupName ) { embeddedGroupElem = *pLegendIt; break; } } QList<QDomElement> pLayerElems = p->projectLayerElements(); QMap<QString, QgsMapLayer *> pLayerMap; QList<QDomElement>::const_iterator pLayerIt = pLayerElems.constBegin(); for ( ; pLayerIt != pLayerElems.constEnd(); ++pLayerIt ) { pLayerMap.insert( layerId( *pLayerIt ), p->createLayerFromElement( *pLayerIt ) ); } p->addLayers( doc, layerElem, embeddedGroupElem, pLayerMap, pIdDisabled ); } } else //normal (not embedded) legend group { addLayers( doc, layerElem, currentChildElem, layerMap, nonIdentifiableLayers ); } // combine bounding boxes of children (groups/layers) combineExtentAndCrsOfGroupChildren( layerElem, doc ); } else if ( currentChildElem.tagName() == "legendlayer" ) { QString id = layerIdFromLegendLayer( currentChildElem ); if ( !layerMap.contains( id ) ) { QgsDebugMsg( QString( "layer %1 not found in map - layer cache to small?" ).arg( id ) ); continue; } QgsMapLayer *currentLayer = layerMap[ id ]; if ( !currentLayer ) { QgsDebugMsg( QString( "layer %1 not found" ).arg( id ) ); continue; } if ( nonIdentifiableLayers.contains( currentLayer->id() ) ) { layerElem.setAttribute( "queryable", "0" ); } else { layerElem.setAttribute( "queryable", "1" ); } QDomElement nameElem = doc.createElement( "Name" ); //We use the layer name even though it might not be unique. //Because the id sometimes contains user/pw information and the name is more descriptive QDomText nameText = doc.createTextNode( currentLayer->name() ); nameElem.appendChild( nameText ); layerElem.appendChild( nameElem ); QDomElement titleElem = doc.createElement( "Title" ); QDomText titleText = doc.createTextNode( currentLayer->name() ); titleElem.appendChild( titleText ); layerElem.appendChild( titleElem ); //CRS QStringList crsList = createCRSListForLayer( currentLayer ); appendCRSElementsToLayer( layerElem, doc, crsList ); //Ex_GeographicBoundingBox appendLayerBoundingBoxes( layerElem, doc, currentLayer->extent(), currentLayer->crs() ); //only one default style in project file mode QDomElement styleElem = doc.createElement( "Style" ); QDomElement styleNameElem = doc.createElement( "Name" ); QDomText styleNameText = doc.createTextNode( "default" ); styleNameElem.appendChild( styleNameText ); QDomElement styleTitleElem = doc.createElement( "Title" ); QDomText styleTitleText = doc.createTextNode( "default" ); styleTitleElem.appendChild( styleTitleText ); styleElem.appendChild( styleNameElem ); styleElem.appendChild( styleTitleElem ); layerElem.appendChild( styleElem ); } else { QgsDebugMsg( "unexpected child element" ); continue; } parentElem.appendChild( layerElem ); } }
QgsComposition* QgsProjectParser::initComposition( const QString& composerTemplate, QgsMapRenderer* mapRenderer, QList< QgsComposerMap*>& mapList, QList< QgsComposerLabel* >& labelList ) const { //Create composition from xml QDomElement composerElem = composerByName( composerTemplate ); if ( composerElem.isNull() ) { throw QgsMapServiceException( "Error", "Composer template not found" ); } QDomElement compositionElem = composerElem.firstChildElement( "Composition" ); if ( compositionElem.isNull() ) { return 0; } QgsComposition* composition = new QgsComposition( mapRenderer ); //set resolution, paper size from composer element attributes if ( !composition->readXML( compositionElem, *mXMLDoc ) ) { delete composition; return 0; } //go through all the item elements and add them to the composition (and to the lists) QDomNodeList itemNodes = composerElem.childNodes(); for ( int i = 0; i < itemNodes.size(); ++i ) { QDomElement currentElem = itemNodes.at( i ).toElement(); QString elemName = currentElem.tagName(); if ( elemName == "ComposerMap" ) { QgsComposerMap* map = new QgsComposerMap( composition ); map->readXML( currentElem, *mXMLDoc ); composition->addItem( map ); mapList.push_back( map ); } else if ( elemName == "ComposerLabel" ) { QgsComposerLabel* label = new QgsComposerLabel( composition ); label->readXML( currentElem, *mXMLDoc ); composition->addItem( label ); labelList.push_back( label ); } else if ( elemName == "ComposerLegend" ) { //legend needs to be loaded indirectly to have generic content //and to avoid usage of x-server with pixmap icons //read full legend from xml QgsComposerLegend* legend = new QgsComposerLegend( composition ); legend->readXML( currentElem, *mXMLDoc ); //dynamic legend (would be interesting in case of layers dynamically defined in SLD) //legend->_readXML( currentElem.firstChildElement( "ComposerItem" ), *mXMLDoc ); //legend->updateLegend(); composition->addItem( legend ); } else if ( elemName == "ComposerShape" ) { QgsComposerShape* shape = new QgsComposerShape( composition ); shape->readXML( currentElem, *mXMLDoc ); composition->addItem( shape ); } else if ( elemName == "ComposerArrow" ) { QgsComposerArrow* arrow = new QgsComposerArrow( composition ); arrow->readXML( currentElem, *mXMLDoc ); composition->addItem( arrow ); } else if ( elemName == "ComposerAttributeTable" ) { QgsComposerAttributeTable* table = new QgsComposerAttributeTable( composition ); table->readXML( currentElem, *mXMLDoc ); composition->addItem( table ); } } //scalebars and pictures need to be loaded after the maps to receive the correct size / rotation for ( int i = 0; i < itemNodes.size(); ++i ) { QDomElement currentElem = itemNodes.at( i ).toElement(); QString elemName = currentElem.tagName(); if ( elemName == "ComposerPicture" ) { QgsComposerPicture* picture = new QgsComposerPicture( composition ); picture->readXML( currentElem, *mXMLDoc ); //qgis mapserver needs an absolute file path picture->setPictureFile( convertToAbsolutePath( picture->pictureFile() ) ); composition->addItem( picture ); } else if ( elemName == "ComposerScaleBar" ) { QgsComposerScaleBar* bar = new QgsComposerScaleBar( composition ); bar->readXML( currentElem, *mXMLDoc ); composition->addItem( bar ); } } return composition; }