diff --git a/src/app/qgsprojectproperties.cpp b/src/app/qgsprojectproperties.cpp index 8fec88120f7..9d90fc97bd8 100644 --- a/src/app/qgsprojectproperties.cpp +++ b/src/app/qgsprojectproperties.cpp @@ -229,6 +229,20 @@ QgsProjectProperties::QgsProjectProperties( QgsMapCanvas* mapCanvas, QWidget *pa bool addWktGeometry = QgsProject::instance()->readBoolEntry( "WMSAddWktGeometry", "/" ); mAddWktGeometryCheckBox->setChecked( addWktGeometry ); + //WMS maxWidth / maxHeight + mMaxWidthLineEdit->setValidator( new QIntValidator( mMaxWidthLineEdit ) ); + int maxWidth = QgsProject::instance()->readNumEntry( "WMSMaxWidth", "/", -1 ); + if ( maxWidth != -1 ) + { + mMaxWidthLineEdit->setText( QString::number( maxWidth ) ); + } + mMaxHeightLineEdit->setValidator( new QIntValidator( mMaxHeightLineEdit ) ); + int maxHeight = QgsProject::instance()->readNumEntry( "WMSMaxHeight", "/", -1 ); + if ( maxHeight != -1 ) + { + mMaxHeightLineEdit->setText( QString::number( maxHeight ) ); + } + QStringList wfsLayerIdList = QgsProject::instance()->readListEntry( "WFSLayers", "/" ); twWFSLayers->setColumnCount( 2 ); @@ -460,6 +474,25 @@ void QgsProjectProperties::apply() QgsProject::instance()->writeEntry( "WMSAddWktGeometry", "/", mAddWktGeometryCheckBox->isChecked() ); + QString maxWidthText = mMaxWidthLineEdit->text(); + if ( maxWidthText.isEmpty() ) + { + QgsProject::instance()->removeEntry( "WMSMaxWidth", "/" ); + } + else + { + QgsProject::instance()->writeEntry( "WMSMaxWidth", "/", maxWidthText.toInt() ); + } + QString maxHeightText = mMaxHeightLineEdit->text(); + if ( maxHeightText.isEmpty() ) + { + QgsProject::instance()->removeEntry( "WMSMaxHeight", "/" ); + } + else + { + QgsProject::instance()->writeEntry( "WMSMaxHeight", "/", maxHeightText.toInt() ); + } + QStringList wfsLayerList; for ( int i = 0; i < twWFSLayers->rowCount(); i++ ) { diff --git a/src/mapserver/qgsconfigparser.cpp b/src/mapserver/qgsconfigparser.cpp index e8398baf3e9..3209ad883be 100644 --- a/src/mapserver/qgsconfigparser.cpp +++ b/src/mapserver/qgsconfigparser.cpp @@ -31,6 +31,8 @@ QgsConfigParser::QgsConfigParser() : mFallbackParser( 0 ) , mScaleDenominator( 0 ) , mOutputUnits( QgsMapRenderer::Millimeters ) + , mMaxWidth( -1 ) + , mMaxHeight( -1 ) { setDefaultLegendSettings(); mSelectionColor = QColor( 255, 255, 0 ); //yellow opaque is default selection color diff --git a/src/mapserver/qgsconfigparser.h b/src/mapserver/qgsconfigparser.h index a165e8bf3e6..682463db6a1 100644 --- a/src/mapserver/qgsconfigparser.h +++ b/src/mapserver/qgsconfigparser.h @@ -121,6 +121,9 @@ class QgsConfigParser QColor selectionColor() const { return mSelectionColor; } void setSelectionColor( const QColor& c ) { mSelectionColor = c; } + int maxWidth() const { return mMaxWidth; } + int maxHeight() const { return mMaxHeight; } + protected: /**Parser to forward not resolved requests (e.g. SLD parser based on user request might have a fallback parser with admin configuration)*/ QgsConfigParser* mFallbackParser; @@ -160,6 +163,10 @@ class QgsConfigParser QColor mSelectionColor; + //maximum width/height for the GetMap request. Disabled by default (-1) + int mMaxWidth; + int mMaxHeight; + /**Transforms layer extent to epsg 4326 and appends ExGeographicBoundingBox and BoundingBox elements to the layer element*/ void appendLayerBoundingBoxes( QDomElement& layerElem, QDomDocument& doc, const QgsRectangle& layerExtent, const QgsCoordinateReferenceSystem& layerCRS ) const; diff --git a/src/mapserver/qgsprojectparser.cpp b/src/mapserver/qgsprojectparser.cpp index e1dfdbb8b6f..d4fe7737e27 100644 --- a/src/mapserver/qgsprojectparser.cpp +++ b/src/mapserver/qgsprojectparser.cpp @@ -45,6 +45,7 @@ QgsProjectParser::QgsProjectParser( QDomDocument* xmlDoc, const QString& filePat mOutputUnits = QgsMapRenderer::Millimeters; setLegendParametersFromProject(); setSelectionColor(); + setMaxWidthHeight(); //accelerate search for layers and groups if ( mXMLDoc ) @@ -1439,6 +1440,27 @@ void QgsProjectParser::serviceCapabilities( QDomElement& parentElement, QDomDocu } serviceElem.appendChild( contactInfoElem ); + + //MaxWidth / MaxHeight for WMS 1.3 + QString version = doc.documentElement().attribute( "version" ); + if ( version != "1.1.1" ) + { + if ( mMaxWidth != -1 ) + { + QDomElement maxWidthElem = doc.createElement( "MaxWidth" ); + QDomText maxWidthText = doc.createTextNode( QString::number( mMaxWidth ) ); + maxWidthElem.appendChild( maxWidthText ); + serviceElem.appendChild( maxWidthElem ); + } + if ( mMaxHeight != -1 ) + { + QDomElement maxHeightElem = doc.createElement( "MaxHeight" ); + QDomText maxHeightText = doc.createTextNode( QString::number( mMaxHeight ) ); + maxHeightElem.appendChild( maxHeightText ); + serviceElem.appendChild( maxHeightElem ); + } + } + parentElement.appendChild( serviceElem ); } @@ -1541,6 +1563,31 @@ void QgsProjectParser::setSelectionColor() mSelectionColor = QColor( red, green, blue, alpha ); } +void QgsProjectParser::setMaxWidthHeight() +{ + if ( mXMLDoc ) + { + QDomElement qgisElem = mXMLDoc->documentElement(); + if ( !qgisElem.isNull() ) + { + QDomElement propertiesElem = qgisElem.firstChildElement( "properties" ); + if ( !propertiesElem.isNull() ) + { + QDomElement maxWidthElem = propertiesElem.firstChildElement( "WMSMaxWidth" ); + if ( !maxWidthElem.isNull() ) + { + mMaxWidth = maxWidthElem.text().toInt(); + } + QDomElement maxHeightElem = propertiesElem.firstChildElement( "WMSMaxHeight" ); + if ( !maxHeightElem.isNull() ) + { + mMaxHeight = maxHeightElem.text().toInt(); + } + } + } + } +} + const QgsCoordinateReferenceSystem& QgsProjectParser::projectCRS() const { //mapcanvas->destinationsrs->spatialrefsys->authid diff --git a/src/mapserver/qgsprojectparser.h b/src/mapserver/qgsprojectparser.h index d4152a92610..b5138005a46 100644 --- a/src/mapserver/qgsprojectparser.h +++ b/src/mapserver/qgsprojectparser.h @@ -167,6 +167,8 @@ class QgsProjectParser: public QgsConfigParser /**Reads selection color from project and sets it to QgsConfigParser::mSelectionColor*/ void setSelectionColor(); + /**Reads maxWidth / maxHeight from project and sets it to QgsConfigParser::mMaxWidth / mMaxHeight*/ + void setMaxWidthHeight(); }; #endif // QGSPROJECTPARSER_H diff --git a/src/mapserver/qgswmsserver.cpp b/src/mapserver/qgswmsserver.cpp index 1de6a91099c..9cd9074c2d2 100644 --- a/src/mapserver/qgswmsserver.cpp +++ b/src/mapserver/qgswmsserver.cpp @@ -669,6 +669,10 @@ QImage* QgsWMSServer::printCompositionToImage( QgsComposition* c ) const QImage* QgsWMSServer::getMap() { + if ( !checkMaximumWidthHeight() ) + { + throw QgsMapServiceException( "Size error", "The requested map size is too large" ); + } QStringList layersList, stylesList, layerIdList; QImage* theImage = initializeRendering( layersList, stylesList, layerIdList ); @@ -1994,3 +1998,31 @@ void QgsWMSServer::clearFeatureSelections( const QStringList& layerIds ) const return; } + +bool QgsWMSServer::checkMaximumWidthHeight() const +{ + //test if maxWidth / maxHeight set and WIDTH / HEIGHT parameter is in the range + if ( mConfigParser->maxWidth() != -1 ) + { + QMap<QString, QString>::const_iterator widthIt = mParameterMap.find( "WIDTH" ); + if ( widthIt != mParameterMap.constEnd() ) + { + if ( widthIt->toInt() > mConfigParser->maxWidth() ) + { + return false; + } + } + } + if ( mConfigParser->maxHeight() != -1 ) + { + QMap<QString, QString>::const_iterator heightIt = mParameterMap.find( "HEIGHT" ); + if ( heightIt != mParameterMap.constEnd() ) + { + if ( heightIt->toInt() > mConfigParser->maxHeight() ) + { + return false; + } + } + } + return true; +} diff --git a/src/mapserver/qgswmsserver.h b/src/mapserver/qgswmsserver.h index 79ef589331a..a87cd2f2bcb 100644 --- a/src/mapserver/qgswmsserver.h +++ b/src/mapserver/qgswmsserver.h @@ -163,6 +163,10 @@ class QgsWMSServer void appendFormats( QDomDocument &doc, QDomElement &elem, const QStringList &formats ); + /**Checks WIDTH/HEIGHT values agains MaxWidth and MaxHeight + @return true if width/height values are okay*/ + bool checkMaximumWidthHeight() const; + /**Map containing the WMS parameters*/ QMap<QString, QString> mParameterMap; QgsConfigParser* mConfigParser; diff --git a/src/ui/qgsprojectpropertiesbase.ui b/src/ui/qgsprojectpropertiesbase.ui index cd58ba453c9..ff758a5ff4a 100644 --- a/src/ui/qgsprojectpropertiesbase.ui +++ b/src/ui/qgsprojectpropertiesbase.ui @@ -6,8 +6,8 @@ <rect> <x>0</x> <y>0</y> - <width>676</width> - <height>522</height> + <width>571</width> + <height>448</height> </rect> </property> <property name="windowTitle"> @@ -368,7 +368,7 @@ <string>OWS Server</string> </attribute> <layout class="QGridLayout" name="gridLayout_3"> - <item row="0" column="0" rowspan="2"> + <item row="0" column="0"> <widget class="QScrollArea" name="scrollArea"> <property name="widgetResizable"> <bool>true</bool> @@ -377,13 +377,13 @@ <property name="geometry"> <rect> <x>0</x> - <y>0</y> - <width>616</width> - <height>538</height> + <y>-271</y> + <width>526</width> + <height>668</height> </rect> </property> - <layout class="QGridLayout" name="gridLayout_7"> - <item row="0" column="0" colspan="2"> + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="0"> <widget class="QGroupBox" name="grpOWSServiceCapabilities"> <property name="title"> <string>Service Capabilitities</string> @@ -483,148 +483,158 @@ </layout> </widget> </item> - <item row="1" column="0" colspan="2"> + <item row="1" column="0"> <widget class="QGroupBox" name="grpWMSCapabilities"> <property name="title"> <string>WMS Capabilitities</string> </property> <layout class="QGridLayout" name="gridLayout_10"> - <item row="1" column="0"> - <widget class="QGroupBox" name="grpWMSExt"> - <property name="title"> - <string>Advertised Extent</string> - </property> - <property name="checkable"> - <bool>true</bool> - </property> - <property name="checked"> - <bool>false</bool> - </property> - <layout class="QGridLayout" name="gridLayout_4"> - <item row="0" column="0"> - <widget class="QLabel" name="label_11"> - <property name="text"> - <string>Min. X</string> - </property> - <property name="buddy"> - <cstring>mWMSExtMinX</cstring> - </property> - </widget> - </item> - <item row="0" column="1"> - <widget class="QLineEdit" name="mWMSExtMinX"> - <property name="text"> - <string/> - </property> - </widget> - </item> <item row="1" column="0"> - <widget class="QLabel" name="label_12"> - <property name="text"> - <string>Min. Y</string> + <widget class="QGroupBox" name="grpWMSExt"> + <property name="title"> + <string>Advertised Extent</string> </property> - <property name="buddy"> - <cstring>mWMSExtMinY</cstring> + <property name="checkable"> + <bool>true</bool> </property> + <property name="checked"> + <bool>false</bool> + </property> + <layout class="QGridLayout" name="gridLayout_4"> + <item row="0" column="0"> + <widget class="QLabel" name="label_11"> + <property name="text"> + <string>Min. X</string> + </property> + <property name="buddy"> + <cstring>mWMSExtMinX</cstring> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QLineEdit" name="mWMSExtMinX"> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="label_12"> + <property name="text"> + <string>Min. Y</string> + </property> + <property name="buddy"> + <cstring>mWMSExtMinY</cstring> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QLineEdit" name="mWMSExtMinY"> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="label_9"> + <property name="text"> + <string>Max. X</string> + </property> + <property name="buddy"> + <cstring>mWMSExtMaxX</cstring> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QLineEdit" name="mWMSExtMaxX"> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item row="3" column="0"> + <widget class="QLabel" name="label_10"> + <property name="text"> + <string>Max. Y</string> + </property> + <property name="buddy"> + <cstring>mWMSExtMaxY</cstring> + </property> + </widget> + </item> + <item row="3" column="1"> + <widget class="QLineEdit" name="mWMSExtMaxY"> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item row="4" column="0" colspan="2"> + <widget class="QPushButton" name="pbnWMSExtCanvas"> + <property name="text"> + <string>Use Current Canvas Extent</string> + </property> + </widget> + </item> + <item row="5" column="0" colspan="2"> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> </widget> </item> <item row="1" column="1"> - <widget class="QLineEdit" name="mWMSExtMinY"> - <property name="text"> - <string/> + <widget class="QGroupBox" name="grpWMSList"> + <property name="title"> + <string>Coordinate Systems Restrictions</string> </property> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="checked"> + <bool>false</bool> + </property> + <layout class="QGridLayout" name="gridLayout_5"> + <item row="0" column="0" colspan="3"> + <widget class="QListWidget" name="mWMSList"/> + </item> + <item row="1" column="0"> + <widget class="QPushButton" name="pbnWMSAddSRS"> + <property name="text"> + <string>Add</string> + </property> + </widget> + </item> + <item row="1" column="2"> + <widget class="QPushButton" name="pbnWMSRemoveSRS"> + <property name="text"> + <string>Remove</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QPushButton" name="pbnWMSSetUsedSRS"> + <property name="text"> + <string>Used</string> + </property> + </widget> + </item> + </layout> </widget> </item> <item row="2" column="0"> - <widget class="QLabel" name="label_9"> + <widget class="QCheckBox" name="mAddWktGeometryCheckBox"> <property name="text"> - <string>Max. X</string> - </property> - <property name="buddy"> - <cstring>mWMSExtMaxX</cstring> - </property> - </widget> - </item> - <item row="2" column="1"> - <widget class="QLineEdit" name="mWMSExtMaxX"> - <property name="text"> - <string/> - </property> - </widget> - </item> - <item row="3" column="0"> - <widget class="QLabel" name="label_10"> - <property name="text"> - <string>Max. Y</string> - </property> - <property name="buddy"> - <cstring>mWMSExtMaxY</cstring> - </property> - </widget> - </item> - <item row="3" column="1"> - <widget class="QLineEdit" name="mWMSExtMaxY"> - <property name="text"> - <string/> - </property> - </widget> - </item> - <item row="4" column="0" colspan="2"> - <widget class="QPushButton" name="pbnWMSExtCanvas"> - <property name="text"> - <string>Use Current Canvas Extent</string> - </property> - </widget> - </item> - <item row="5" column="0" colspan="2"> - <spacer name="verticalSpacer"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>40</height> - </size> - </property> - </spacer> - </item> - </layout> - </widget> - </item> - <item row="1" column="1"> - <widget class="QGroupBox" name="grpWMSList"> - <property name="title"> - <string>Coordinate Systems Restrictions</string> - </property> - <property name="checkable"> - <bool>true</bool> - </property> - <property name="checked"> - <bool>false</bool> - </property> - <layout class="QGridLayout" name="gridLayout_5"> - <item row="0" column="0" colspan="3"> - <widget class="QListWidget" name="mWMSList"/> - </item> - <item row="1" column="0"> - <widget class="QPushButton" name="pbnWMSAddSRS"> - <property name="text"> - <string>Add</string> - </property> - </widget> - </item> - <item row="1" column="2"> - <widget class="QPushButton" name="pbnWMSRemoveSRS"> - <property name="text"> - <string>Remove</string> - </property> - </widget> - </item> - <item row="1" column="1"> - <widget class="QPushButton" name="pbnWMSSetUsedSRS"> - <property name="text"> - <string>Used</string> + <string>Add WKT geometry to feature info response</string> </property> </widget> </item> @@ -632,16 +642,30 @@ </widget> </item> <item row="2" column="0"> - <widget class="QCheckBox" name="mAddWktGeometryCheckBox"> - <property name="text"> - <string>Add WKT geometry to feature info response</string> - </property> - </widget> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <widget class="QLabel" name="mMaxWidthLabel"> + <property name="text"> + <string>Maximum width</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="mMaxWidthLineEdit"/> + </item> + <item> + <widget class="QLabel" name="mMaxHeightLabel"> + <property name="text"> + <string>Maximum height</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="mMaxHeightLineEdit"/> + </item> + </layout> </item> - </layout> - </widget> - </item> - <item row="3" column="0" colspan="2"> + <item row="3" column="0"> <widget class="QGroupBox" name="grpWFSCapabilities"> <property name="title"> <string>WFS Capabilitities</string>