34
34
#include " qgscomposershape.h"
35
35
36
36
37
- QgsProjectParser::QgsProjectParser ( QDomDocument* xmlDoc ): QgsConfigParser(), mXMLDoc( xmlDoc )
37
+ QgsProjectParser::QgsProjectParser ( QDomDocument* xmlDoc, const QString& filePath ): QgsConfigParser(), mXMLDoc( xmlDoc ), mProjectPath( filePath )
38
38
{
39
39
mOutputUnits = QgsMapRenderer::Millimeters;
40
40
setLegendParametersFromProject ();
@@ -673,7 +673,7 @@ QMap< QString, QDomElement > QgsProjectParser::projectLayerElementsByName() cons
673
673
674
674
QgsMapLayer* QgsProjectParser::createLayerFromElement ( const QDomElement& elem ) const
675
675
{
676
- if ( elem.isNull () )
676
+ if ( elem.isNull () || ! mXMLDoc )
677
677
{
678
678
return 0 ;
679
679
}
@@ -684,14 +684,22 @@ QgsMapLayer* QgsProjectParser::createLayerFromElement( const QDomElement& elem )
684
684
return 0 ;
685
685
}
686
686
687
+ // convert relative pathes to absolute ones if necessary
687
688
QString uri = dataSourceElem.text ();
689
+ QString absoluteUri = convertToAbsolutePath ( uri );
690
+ if ( uri != absoluteUri )
691
+ {
692
+ QDomText absoluteTextNode = mXMLDoc ->createTextNode ( absoluteUri );
693
+ dataSourceElem.replaceChild ( absoluteTextNode, dataSourceElem.firstChild () );
694
+ }
695
+
688
696
QString id = layerId ( elem );
689
697
if ( id.isNull () )
690
698
{
691
699
return 0 ;
692
700
}
693
701
694
- QgsMapLayer* layer = QgsMSLayerCache::instance ()->searchLayer ( uri , id );
702
+ QgsMapLayer* layer = QgsMSLayerCache::instance ()->searchLayer ( absoluteUri , id );
695
703
if ( layer )
696
704
{
697
705
// reading symbology every time is necessary because it could have been changed by a user SLD based request
@@ -714,7 +722,7 @@ QgsMapLayer* QgsProjectParser::createLayerFromElement( const QDomElement& elem )
714
722
{
715
723
layer->readXML ( const_cast <QDomElement&>( elem ) ); // should be changed to const in QgsMapLayer
716
724
layer->setLayerName ( layerName ( elem ) );
717
- QgsMSLayerCache::instance ()->insertLayer ( uri , id, layer );
725
+ QgsMSLayerCache::instance ()->insertLayer ( absoluteUri , id, layer );
718
726
}
719
727
return layer;
720
728
}
@@ -930,6 +938,8 @@ QgsComposition* QgsProjectParser::initComposition( const QString& composerTempla
930
938
{
931
939
QgsComposerPicture* picture = new QgsComposerPicture ( composition );
932
940
picture->readXML ( currentElem, *mXMLDoc );
941
+ // qgis mapserver needs an absolute file path
942
+ picture->setPictureFile ( convertToAbsolutePath ( picture->pictureFile () ) );
933
943
composition->addItem ( picture );
934
944
}
935
945
else if ( elemName == " ComposerScaleBar" )
@@ -1138,3 +1148,55 @@ void QgsProjectParser::serviceCapabilities( QDomElement& parentElement, QDomDocu
1138
1148
parentElement.appendChild ( contactInfoElem );
1139
1149
}
1140
1150
1151
+ QString QgsProjectParser::convertToAbsolutePath ( const QString& file ) const
1152
+ {
1153
+ if ( !file.startsWith ( " ./" ) && !file.startsWith ( " ../" ) )
1154
+ {
1155
+ return file;
1156
+ }
1157
+
1158
+ QString srcPath = file;
1159
+ QString projPath = mProjectPath ;
1160
+
1161
+ #if defined(Q_OS_WIN)
1162
+ srcPath.replace ( " \\ " , " /" );
1163
+ projPath.replace ( " \\ " , " /" );
1164
+
1165
+ bool uncPath = projPath.startsWith ( " //" );
1166
+ #endif
1167
+
1168
+ QStringList srcElems = file.split ( " /" , QString::SkipEmptyParts );
1169
+ QStringList projElems = mProjectPath .split ( " /" , QString::SkipEmptyParts );
1170
+
1171
+ #if defined(Q_OS_WIN)
1172
+ if ( uncPath )
1173
+ {
1174
+ projElems.insert ( 0 , " " );
1175
+ projElems.insert ( 0 , " " );
1176
+ }
1177
+ #endif
1178
+
1179
+ // remove project file element
1180
+ projElems.removeLast ();
1181
+
1182
+ // append source path elements
1183
+ projElems << srcElems;
1184
+ projElems.removeAll ( " ." );
1185
+
1186
+ // resolve ..
1187
+ int pos;
1188
+ while (( pos = projElems.indexOf ( " .." ) ) > 0 )
1189
+ {
1190
+ // remove preceding element and ..
1191
+ projElems.removeAt ( pos - 1 );
1192
+ projElems.removeAt ( pos - 1 );
1193
+ }
1194
+
1195
+ #if !defined(Q_OS_WIN)
1196
+ // make path absolute
1197
+ projElems.prepend ( " " );
1198
+ #endif
1199
+
1200
+ return projElems.join ( " /" );
1201
+ }
1202
+
0 commit comments