Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsprojectbadlayerhandler.cpp - QgsProjectBadLayerHandler 3 : : 4 : : --------------------- 5 : : begin : 22.10.2016 6 : : copyright : (C) 2016 by Matthias Kuhn 7 : : email : matthias@opengis.ch 8 : : *************************************************************************** 9 : : * * 10 : : * This program is free software; you can redistribute it and/or modify * 11 : : * it under the terms of the GNU General Public License as published by * 12 : : * the Free Software Foundation; either version 2 of the License, or * 13 : : * (at your option) any later version. * 14 : : * * 15 : : ***************************************************************************/ 16 : : #include "qgsprojectbadlayerhandler.h" 17 : : #include "qgslogger.h" 18 : : #include "qgsmessagelog.h" 19 : : #include "qgsapplication.h" 20 : : 21 : : #include <QFileInfo> 22 : : 23 : 0 : void QgsProjectBadLayerHandler::handleBadLayers( const QList<QDomNode> &layers ) 24 : : { 25 : 0 : QgsApplication::messageLog()->logMessage( QObject::tr( "%1 unavailable layers found:" ).arg( layers.size() ) ); 26 : 0 : const auto constLayers = layers; 27 : 0 : for ( const QDomNode &layer : constLayers ) 28 : : { 29 : 0 : QgsApplication::messageLog()->logMessage( QObject::tr( " * %1" ).arg( dataSource( layer ) ) ); 30 : : } 31 : 0 : } 32 : : 33 : 0 : QgsProjectBadLayerHandler::DataType QgsProjectBadLayerHandler::dataType( const QDomNode &layerNode ) 34 : : { 35 : 0 : QString type = layerNode.toElement().attribute( QStringLiteral( "type" ) ); 36 : : 37 : 0 : if ( type.isNull() ) 38 : : { 39 : 0 : QgsDebugMsg( QStringLiteral( "cannot find ``type'' attribute" ) ); 40 : : 41 : 0 : return IS_BOGUS; 42 : : } 43 : : 44 : 0 : if ( "raster" == type ) 45 : : { 46 : 0 : QgsDebugMsg( QStringLiteral( "is a raster" ) ); 47 : : 48 : 0 : return IS_RASTER; 49 : : } 50 : 0 : else if ( "vector" == type ) 51 : : { 52 : 0 : QgsDebugMsg( QStringLiteral( "is a vector" ) ); 53 : : 54 : 0 : return IS_VECTOR; 55 : : } 56 : : 57 : 0 : QgsDebugMsg( "is unknown type " + type ); 58 : : 59 : 0 : return IS_BOGUS; 60 : 0 : } 61 : : 62 : 0 : QString QgsProjectBadLayerHandler::dataSource( const QDomNode &layerNode ) 63 : : { 64 : 0 : QDomNode dataSourceNode = layerNode.namedItem( QStringLiteral( "datasource" ) ); 65 : : 66 : 0 : if ( dataSourceNode.isNull() ) 67 : : { 68 : 0 : QgsDebugMsg( QStringLiteral( "cannot find datasource node" ) ); 69 : : 70 : 0 : return QString(); 71 : : } 72 : : 73 : 0 : return dataSourceNode.toElement().text(); 74 : 0 : } 75 : : 76 : 0 : QgsProjectBadLayerHandler::ProviderType QgsProjectBadLayerHandler::providerType( const QDomNode &layerNode ) 77 : : { 78 : : // XXX but what about rasters that can be URLs? _Can_ they be URLs? 79 : : 80 : 0 : switch ( dataType( layerNode ) ) 81 : : { 82 : : case IS_VECTOR: 83 : : { 84 : 0 : QString ds = dataSource( layerNode ); 85 : : 86 : 0 : QgsDebugMsg( "datasource is " + ds ); 87 : : 88 : 0 : if ( ds.contains( QLatin1String( "host=" ) ) ) 89 : : { 90 : 0 : return IS_URL; 91 : : } 92 : 0 : else if ( ds.contains( QLatin1String( "dbname=" ) ) ) 93 : : { 94 : 0 : return IS_DATABASE; 95 : : } 96 : : // be default, then, this should be a file based layer data source 97 : : // XXX is this a reasonable assumption? 98 : : 99 : 0 : return IS_FILE; 100 : 0 : } 101 : : 102 : : case IS_RASTER: // rasters are currently only accessed as 103 : : // physical files 104 : 0 : return IS_FILE; 105 : : 106 : : default: 107 : 0 : QgsDebugMsg( QStringLiteral( "unknown ``type'' attribute" ) ); 108 : 0 : } 109 : : 110 : 0 : return IS_Unknown; 111 : 0 : } 112 : : 113 : 0 : void QgsProjectBadLayerHandler::setDataSource( QDomNode &layerNode, const QString &dataSource ) 114 : : { 115 : 0 : QDomNode dataSourceNode = layerNode.namedItem( QStringLiteral( "datasource" ) ); 116 : 0 : QDomElement dataSourceElement = dataSourceNode.toElement(); 117 : 0 : QDomText dataSourceText = dataSourceElement.firstChild().toText(); 118 : : 119 : 0 : QgsDebugMsg( "datasource changed from " + dataSourceText.data() ); 120 : : 121 : 0 : dataSourceText.setData( dataSource ); 122 : : 123 : 0 : QgsDebugMsg( "to " + dataSourceText.data() ); 124 : 0 : }