void writeAsDxf( QgsServerInterface *serverIface, const QgsProject *project, const QString &version, const QgsServerRequest &request, QgsServerResponse &response ) { Q_UNUSED( version ); QgsServerRequest::Parameters params = request.parameters(); QgsWmsParameters wmsParameters( QUrlQuery( request.url() ) ); QgsRenderer renderer( serverIface, project, wmsParameters ); QMap<QString, QString> formatOptionsMap = parseFormatOptions( params.value( QStringLiteral( "FORMAT_OPTIONS" ) ) ); QgsDxfExport dxf = renderer.getDxf( formatOptionsMap ); QString codec = QStringLiteral( "ISO-8859-1" ); QMap<QString, QString>::const_iterator codecIt = formatOptionsMap.find( QStringLiteral( "CODEC" ) ); if ( codecIt != formatOptionsMap.constEnd() ) { codec = formatOptionsMap.value( QStringLiteral( "CODEC" ) ); } // Write output response.setHeader( "Content-Type", "application/dxf" ); dxf.writeToFile( response.io(), codec ); }
// Write image response void writeImage( QgsServerResponse &response, QImage &img, const QString &formatStr, int imageQuality ) { ImageOutputFormat outputFormat = parseImageFormat( formatStr ); QImage result; QString saveFormat; QString contentType; switch ( outputFormat ) { case PNG: result = img; contentType = "image/png"; saveFormat = "PNG"; break; case PNG8: { QVector<QRgb> colorTable; medianCut( colorTable, 256, img ); result = img.convertToFormat( QImage::Format_Indexed8, colorTable, Qt::ColorOnly | Qt::ThresholdDither | Qt::ThresholdAlphaDither | Qt::NoOpaqueDetection ); } contentType = "image/png"; saveFormat = "PNG"; break; case PNG16: result = img.convertToFormat( QImage::Format_ARGB4444_Premultiplied ); contentType = "image/png"; saveFormat = "PNG"; break; case PNG1: result = img.convertToFormat( QImage::Format_Mono, Qt::MonoOnly | Qt::ThresholdDither | Qt::ThresholdAlphaDither | Qt::NoOpaqueDetection ); contentType = "image/png"; saveFormat = "PNG"; break; case JPEG: result = img; contentType = "image/jpeg"; saveFormat = "JPEG"; break; default: QgsMessageLog::logMessage( QString( "Unsupported format string %1" ).arg( formatStr ) ); saveFormat = UNKN; break; } if ( outputFormat != UNKN ) { response.setHeader( "Content-Type", contentType ); result.save( response.io(), qPrintable( saveFormat ), imageQuality ); } else { throw QgsServiceException( "InvalidFormat", QString( "Output format '%1' is not supported in the GetMap request" ).arg( formatStr ) ); } }
void writeGetTile( QgsServerInterface *serverIface, const QgsProject *project, const QString &version, const QgsServerRequest &request, QgsServerResponse &response ) { Q_UNUSED( version ); const QgsWmtsParameters params( QUrlQuery( request.url() ) ); // WMS query QUrlQuery query = translateWmtsParamToWmsQueryItem( QStringLiteral( "GetMap" ), params, project, serverIface ); // Get cached image QgsAccessControl *accessControl = serverIface->accessControls(); QgsServerCacheManager *cacheManager = serverIface->cacheManager(); if ( cacheManager ) { QgsWmtsParameters::Format f = params.format(); QString contentType; QString saveFormat; std::unique_ptr<QImage> image; if ( f == QgsWmtsParameters::Format::JPG ) { contentType = QStringLiteral( "image/jpeg" ); saveFormat = QStringLiteral( "JPEG" ); image = qgis::make_unique<QImage>( 256, 256, QImage::Format_RGB32 ); } else { contentType = QStringLiteral( "image/png" ); saveFormat = QStringLiteral( "PNG" ); image = qgis::make_unique<QImage>( 256, 256, QImage::Format_ARGB32_Premultiplied ); } QByteArray content = cacheManager->getCachedImage( project, request, accessControl ); if ( !content.isEmpty() && image->loadFromData( content ) ) { response.setHeader( QStringLiteral( "Content-Type" ), contentType ); image->save( response.io(), qPrintable( saveFormat ) ); return; } } QgsServerParameters wmsParams( query ); QgsServerRequest wmsRequest( "?" + query.query( QUrl::FullyDecoded ) ); QgsService *service = serverIface->serviceRegistry()->getService( wmsParams.service(), wmsParams.version() ); service->executeRequest( wmsRequest, response, project ); if ( cacheManager ) { QByteArray content = response.data(); if ( !content.isEmpty() ) cacheManager->setCachedImage( &content, project, request, accessControl ); } }