25#include "moc_qgsmanageconnectionsdialog.cpp" 
   33#include "qgsgdalcloudconnection.h" 
   34#include "qgsstacconnection.h" 
   38  , mFileName( fileName )
 
   40  , mConnectionType( type )
 
   45  QPushButton *pb = 
nullptr;
 
   46  pb = 
new QPushButton( tr( 
"Select All" ) );
 
   47  buttonBox->addButton( pb, QDialogButtonBox::ActionRole );
 
   50  pb = 
new QPushButton( tr( 
"Clear Selection" ) );
 
   51  buttonBox->addButton( pb, QDialogButtonBox::ActionRole );
 
   54  if ( mDialogMode == 
Import )
 
   56    label->setText( tr( 
"Select connections to import" ) );
 
   57    buttonBox->button( QDialogButtonBox::Ok )->setText( tr( 
"Import" ) );
 
   58    buttonBox->button( QDialogButtonBox::Ok )->setEnabled( 
false );
 
   63    buttonBox->button( QDialogButtonBox::Ok )->setText( tr( 
"Export" ) );
 
   64    buttonBox->button( QDialogButtonBox::Ok )->setEnabled( 
false );
 
   67  if ( !populateConnections() )
 
   69    QApplication::postEvent( 
this, 
new QCloseEvent() );
 
   73  disconnect( buttonBox, &QDialogButtonBox::accepted, 
this, &QDialog::accept );
 
 
   81  buttonBox->button( QDialogButtonBox::Ok )->setEnabled( !listConnections->selectedItems().isEmpty() );
 
 
   86  const QList<QListWidgetItem *> selection = listConnections->selectedItems();
 
   87  if ( selection.isEmpty() )
 
   89    QMessageBox::warning( 
this, tr( 
"Export/Import Error" ), tr( 
"You should select at least one connection from list." ) );
 
   94  items.reserve( selection.size() );
 
   95  for ( 
int i = 0; i < selection.size(); ++i )
 
   97    items.append( selection.at( i )->text() );
 
  100  if ( mDialogMode == 
Export )
 
  102    QString fileName = QFileDialog::getSaveFileName( 
this, tr( 
"Save Connections" ), QDir::homePath(), tr( 
"XML files (*.xml *.XML)" ) );
 
  106    if ( fileName.isEmpty() )
 
  112    if ( !fileName.endsWith( QLatin1String( 
".xml" ), Qt::CaseInsensitive ) )
 
  114      fileName += QLatin1String( 
".xml" );
 
  117    mFileName = fileName;
 
  120    switch ( mConnectionType )
 
  123        doc = saveOWSConnections( items, QStringLiteral( 
"WMS" ) );
 
  126        doc = saveWfsConnections( items );
 
  129        doc = savePgConnections( items );
 
  132        doc = saveMssqlConnections( items );
 
  135        doc = saveOWSConnections( items, QStringLiteral( 
"WCS" ) );
 
  138        doc = saveOracleConnections( items );
 
  141        doc = saveHanaConnections( items );
 
  144        doc = saveXyzTilesConnections( items );
 
  148        doc = saveArcgisConnections( items );
 
  151        doc = saveVectorTileConnections( items );
 
  154        doc = saveTiledSceneConnections( items );
 
  157        doc = saveSensorThingsConnections( items );
 
  160        doc = saveCloudStorageConnections( items );
 
  163        doc = saveStacConnections( items );
 
  167    QFile file( mFileName );
 
  168    if ( !file.open( QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate ) )
 
  170      QMessageBox::warning( 
this, tr( 
"Saving Connections" ), tr( 
"Cannot write file %1:\n%2." ).arg( mFileName, file.errorString() ) );
 
  174    QTextStream out( &file );
 
  179    QFile file( mFileName );
 
  180    if ( !file.open( QIODevice::ReadOnly | QIODevice::Text ) )
 
  182      QMessageBox::warning( 
this, tr( 
"Loading Connections" ), tr( 
"Cannot read file %1:\n%2." ).arg( mFileName, file.errorString() ) );
 
  191    if ( !doc.setContent( &file, 
true, &errorStr, &errorLine, &errorColumn ) )
 
  193      QMessageBox::warning( 
this, tr( 
"Loading Connections" ), tr( 
"Parse error at line %1, column %2:\n%3" ).arg( errorLine ).arg( errorColumn ).arg( errorStr ) );
 
  197    switch ( mConnectionType )
 
  200        loadOWSConnections( doc, items, QStringLiteral( 
"WMS" ) );
 
  203        loadWfsConnections( doc, items );
 
  206        loadPgConnections( doc, items );
 
  209        loadMssqlConnections( doc, items );
 
  212        loadOWSConnections( doc, items, QStringLiteral( 
"WCS" ) );
 
  215        loadOracleConnections( doc, items );
 
  218        loadHanaConnections( doc, items );
 
  221        loadXyzTilesConnections( doc, items );
 
  224        loadArcgisConnections( doc, items, QStringLiteral( 
"ARCGISMAPSERVER" ) );
 
  227        loadArcgisConnections( doc, items, QStringLiteral( 
"ARCGISFEATURESERVER" ) );
 
  230        loadVectorTileConnections( doc, items );
 
  233        loadTiledSceneConnections( doc, items );
 
  236        loadSensorThingsConnections( doc, items );
 
  239        loadCloudStorageConnections( doc, items );
 
  242        loadStacConnections( doc, items );
 
  246    listConnections->clear();
 
 
  253bool QgsManageConnectionsDialog::populateConnections()
 
  256  if ( mDialogMode == 
Export )
 
  258    QStringList connections;
 
  260    switch ( mConnectionType )
 
  272        settings.
beginGroup( QStringLiteral( 
"/PostgreSQL/connections" ) );
 
  276        settings.
beginGroup( QStringLiteral( 
"/MSSQL/connections" ) );
 
  280        settings.
beginGroup( QStringLiteral( 
"/Oracle/connections" ) );
 
  284        settings.
beginGroup( QStringLiteral( 
"/HANA/connections" ) );
 
  295        connections = QgsVectorTileProviderConnection::sTreeConnectionVectorTile->items();
 
  298        connections = QgsTiledSceneProviderConnection::sTreeConnectionTiledScene->items();
 
  301        connections = QgsSensorThingsProviderConnection::sTreeSensorThingsConnections->items();
 
  304        connections = QgsGdalCloudProviderConnection::sTreeConnectionCloud->items();
 
  307        connections = QgsStacConnection::sTreeConnectionStac->items();
 
  310    for ( 
const QString &connection : std::as_const( connections ) )
 
  312      QListWidgetItem *item = 
new QListWidgetItem();
 
  313      item->setText( connection );
 
  314      listConnections->addItem( item );
 
  320    QFile file( mFileName );
 
  321    if ( !file.open( QIODevice::ReadOnly | QIODevice::Text ) )
 
  323      QMessageBox::warning( 
this, tr( 
"Loading Connections" ), tr( 
"Cannot read file %1:\n%2." ).arg( mFileName, file.errorString() ) );
 
  332    if ( !doc.setContent( &file, 
true, &errorStr, &errorLine, &errorColumn ) )
 
  334      QMessageBox::warning( 
this, tr( 
"Loading Connections" ), tr( 
"Parse error at line %1, column %2:\n%3" ).arg( errorLine ).arg( errorColumn ).arg( errorStr ) );
 
  338    const QDomElement root = doc.documentElement();
 
  339    switch ( mConnectionType )
 
  342        if ( root.tagName() != QLatin1String( 
"qgsWMSConnections" ) )
 
  344          QMessageBox::information( 
this, tr( 
"Loading Connections" ), tr( 
"The file is not a WMS connections exchange file." ) );
 
  350        if ( root.tagName() != QLatin1String( 
"qgsWFSConnections" ) )
 
  352          QMessageBox::information( 
this, tr( 
"Loading Connections" ), tr( 
"The file is not a WFS connections exchange file." ) );
 
  358        if ( root.tagName() != QLatin1String( 
"qgsWCSConnections" ) )
 
  360          QMessageBox::information( 
this, tr( 
"Loading Connections" ), tr( 
"The file is not a WCS connections exchange file." ) );
 
  366        if ( root.tagName() != QLatin1String( 
"qgsPgConnections" ) )
 
  368          QMessageBox::information( 
this, tr( 
"Loading Connections" ), tr( 
"The file is not a PostGIS connections exchange file." ) );
 
  374        if ( root.tagName() != QLatin1String( 
"qgsMssqlConnections" ) )
 
  376          QMessageBox::information( 
this, tr( 
"Loading Connections" ), tr( 
"The file is not a MS SQL Server connections exchange file." ) );
 
  381        if ( root.tagName() != QLatin1String( 
"qgsOracleConnections" ) )
 
  383          QMessageBox::information( 
this, tr( 
"Loading Connections" ), tr( 
"The file is not an Oracle connections exchange file." ) );
 
  388        if ( root.tagName() != QLatin1String( 
"qgsHanaConnections" ) )
 
  390          QMessageBox::warning( 
this, tr( 
"Loading Connections" ), tr( 
"The file is not a HANA connections exchange file." ) );
 
  395        if ( root.tagName() != QLatin1String( 
"qgsXYZTilesConnections" ) )
 
  397          QMessageBox::information( 
this, tr( 
"Loading Connections" ), tr( 
"The file is not a XYZ Tiles connections exchange file." ) );
 
  402        if ( root.tagName() != QLatin1String( 
"qgsARCGISMAPSERVERConnections" ) )
 
  404          QMessageBox::information( 
this, tr( 
"Loading Connections" ), tr( 
"The file is not a ArcGIS Map Service connections exchange file." ) );
 
  409        if ( root.tagName() != QLatin1String( 
"qgsARCGISFEATURESERVERConnections" ) )
 
  411          QMessageBox::information( 
this, tr( 
"Loading Connections" ), tr( 
"The file is not a ArcGIS Feature Service connections exchange file." ) );
 
  416        if ( root.tagName() != QLatin1String( 
"qgsVectorTileConnections" ) )
 
  418          QMessageBox::information( 
this, tr( 
"Loading Connections" ), tr( 
"The file is not a Vector Tile connections exchange file." ) );
 
  423        if ( root.tagName() != QLatin1String( 
"qgsTiledSceneConnections" ) )
 
  425          QMessageBox::information( 
this, tr( 
"Loading Connections" ), tr( 
"The file is not a tiled scene connections exchange file." ) );
 
  430        if ( root.tagName() != QLatin1String( 
"qgsSensorThingsConnections" ) )
 
  432          QMessageBox::information( 
this, tr( 
"Loading Connections" ), tr( 
"The file is not a SensorThings connections exchange file." ) );
 
  437        if ( root.tagName() != QLatin1String( 
"qgsCloudStorageConnections" ) )
 
  439          QMessageBox::information( 
this, tr( 
"Loading Connections" ), tr( 
"The file is not a cloud storage connections exchange file." ) );
 
  444        if ( root.tagName() != QLatin1String( 
"qgsStacConnections" ) )
 
  446          QMessageBox::information( 
this, tr( 
"Loading Connections" ), tr( 
"The file is not a STAC connections exchange file." ) );
 
  452    QDomElement child = root.firstChildElement();
 
  453    while ( !child.isNull() )
 
  455      QListWidgetItem *item = 
new QListWidgetItem();
 
  456      item->setText( child.attribute( QStringLiteral( 
"name" ) ) );
 
  457      listConnections->addItem( item );
 
  458      child = child.nextSiblingElement();
 
  464static void addNamespaceDeclarations( QDomElement &root, 
const QMap<QString, QString> &namespaceDeclarations )
 
  466  for ( 
auto it = namespaceDeclarations.begin(); it != namespaceDeclarations.end(); ++it )
 
  468    root.setAttribute( QStringLiteral( 
"xmlns:" ) + it.key(), it.value() );
 
  472QDomDocument QgsManageConnectionsDialog::saveOWSConnections( 
const QStringList &connections, 
const QString &service )
 
  474  QDomDocument doc( QStringLiteral( 
"connections" ) );
 
  475  QDomElement root = doc.createElement( 
"qgs" + service.toUpper() + 
"Connections" );
 
  476  root.setAttribute( QStringLiteral( 
"version" ), QStringLiteral( 
"1.0" ) );
 
  477  doc.appendChild( root );
 
  479  QMap<QString, QString> namespaceDeclarations;
 
  480  for ( 
int i = 0; i < connections.count(); ++i )
 
  482    QDomElement el = doc.createElement( service.toLower() );
 
  483    el.setAttribute( QStringLiteral( 
"name" ), connections[i] );
 
  486    if ( service == QLatin1String( 
"WMS" ) )
 
  496      httpHeader.updateDomElement( el, namespaceDeclarations );
 
  501    root.appendChild( el );
 
  504  addNamespaceDeclarations( root, namespaceDeclarations );
 
  509QDomDocument QgsManageConnectionsDialog::saveWfsConnections( 
const QStringList &connections )
 
  511  QDomDocument doc( QStringLiteral( 
"connections" ) );
 
  512  QDomElement root = doc.createElement( QStringLiteral( 
"qgsWFSConnections" ) );
 
  513  root.setAttribute( QStringLiteral( 
"version" ), QStringLiteral( 
"1.1" ) );
 
  514  doc.appendChild( root );
 
  516  for ( 
int i = 0; i < connections.count(); ++i )
 
  518    QDomElement el = doc.createElement( QStringLiteral( 
"wfs" ) );
 
  519    el.setAttribute( QStringLiteral( 
"name" ), connections[i] );
 
  530    root.appendChild( el );
 
  536QDomDocument QgsManageConnectionsDialog::savePgConnections( 
const QStringList &connections )
 
  538  QDomDocument doc( QStringLiteral( 
"connections" ) );
 
  539  QDomElement root = doc.createElement( QStringLiteral( 
"qgsPgConnections" ) );
 
  540  root.setAttribute( QStringLiteral( 
"version" ), QStringLiteral( 
"1.0" ) );
 
  541  doc.appendChild( root );
 
  545  for ( 
int i = 0; i < connections.count(); ++i )
 
  547    path = 
"/PostgreSQL/connections/" + connections[i];
 
  548    QDomElement el = doc.createElement( QStringLiteral( 
"postgis" ) );
 
  549    el.setAttribute( QStringLiteral( 
"name" ), connections[i] );
 
  550    el.setAttribute( QStringLiteral( 
"host" ), settings.
value( path + 
"/host" ).toString() );
 
  551    el.setAttribute( QStringLiteral( 
"port" ), settings.
value( path + 
"/port" ).toString() );
 
  552    el.setAttribute( QStringLiteral( 
"database" ), settings.
value( path + 
"/database" ).toString() );
 
  553    el.setAttribute( QStringLiteral( 
"service" ), settings.
value( path + 
"/service" ).toString() );
 
  554    el.setAttribute( QStringLiteral( 
"sslmode" ), settings.
value( path + 
"/sslmode", 
"1" ).toString() );
 
  555    el.setAttribute( QStringLiteral( 
"estimatedMetadata" ), settings.
value( path + 
"/estimatedMetadata", 
"0" ).toString() );
 
  556    el.setAttribute( QStringLiteral( 
"projectsInDatabase" ), settings.
value( path + 
"/projectsInDatabase", 
"0" ).toString() );
 
  557    el.setAttribute( QStringLiteral( 
"dontResolveType" ), settings.
value( path + 
"/dontResolveType", 
"0" ).toString() );
 
  558    el.setAttribute( QStringLiteral( 
"allowGeometrylessTables" ), settings.
value( path + 
"/allowGeometrylessTables", 
"0" ).toString() );
 
  559    el.setAttribute( QStringLiteral( 
"geometryColumnsOnly" ), settings.
value( path + 
"/geometryColumnsOnly", 
"0" ).toString() );
 
  560    el.setAttribute( QStringLiteral( 
"publicOnly" ), settings.
value( path + 
"/publicOnly", 
"0" ).toString() );
 
  562    el.setAttribute( QStringLiteral( 
"saveUsername" ), settings.
value( path + 
"/saveUsername", 
"false" ).toString() );
 
  564    if ( settings.
value( path + 
"/saveUsername", 
"false" ).toString() == QLatin1String( 
"true" ) )
 
  566      el.setAttribute( QStringLiteral( 
"username" ), settings.
value( path + 
"/username" ).toString() );
 
  569    el.setAttribute( QStringLiteral( 
"savePassword" ), settings.
value( path + 
"/savePassword", 
"false" ).toString() );
 
  571    if ( settings.
value( path + 
"/savePassword", 
"false" ).toString() == QLatin1String( 
"true" ) )
 
  573      el.setAttribute( QStringLiteral( 
"password" ), settings.
value( path + 
"/password" ).toString() );
 
  576    root.appendChild( el );
 
  582QDomDocument QgsManageConnectionsDialog::saveMssqlConnections( 
const QStringList &connections )
 
  584  QDomDocument doc( QStringLiteral( 
"connections" ) );
 
  585  QDomElement root = doc.createElement( QStringLiteral( 
"qgsMssqlConnections" ) );
 
  586  root.setAttribute( QStringLiteral( 
"version" ), QStringLiteral( 
"1.0" ) );
 
  587  doc.appendChild( root );
 
  591  for ( 
int i = 0; i < connections.count(); ++i )
 
  593    path = 
"/MSSQL/connections/" + connections[i];
 
  594    QDomElement el = doc.createElement( QStringLiteral( 
"mssql" ) );
 
  595    el.setAttribute( QStringLiteral( 
"name" ), connections[i] );
 
  596    el.setAttribute( QStringLiteral( 
"host" ), settings.
value( path + 
"/host" ).toString() );
 
  597    el.setAttribute( QStringLiteral( 
"port" ), settings.
value( path + 
"/port" ).toString() );
 
  598    el.setAttribute( QStringLiteral( 
"database" ), settings.
value( path + 
"/database" ).toString() );
 
  599    el.setAttribute( QStringLiteral( 
"service" ), settings.
value( path + 
"/service" ).toString() );
 
  600    el.setAttribute( QStringLiteral( 
"sslmode" ), settings.
value( path + 
"/sslmode", 
"1" ).toString() );
 
  601    el.setAttribute( QStringLiteral( 
"estimatedMetadata" ), settings.
value( path + 
"/estimatedMetadata", 
"0" ).toString() );
 
  603    el.setAttribute( QStringLiteral( 
"saveUsername" ), settings.
value( path + 
"/saveUsername", 
"false" ).toString() );
 
  605    if ( settings.
value( path + 
"/saveUsername", 
"false" ).toString() == QLatin1String( 
"true" ) )
 
  607      el.setAttribute( QStringLiteral( 
"username" ), settings.
value( path + 
"/username" ).toString() );
 
  610    el.setAttribute( QStringLiteral( 
"savePassword" ), settings.
value( path + 
"/savePassword", 
"false" ).toString() );
 
  612    if ( settings.
value( path + 
"/savePassword", 
"false" ).toString() == QLatin1String( 
"true" ) )
 
  614      el.setAttribute( QStringLiteral( 
"password" ), settings.
value( path + 
"/password" ).toString() );
 
  617    root.appendChild( el );
 
  623QDomDocument QgsManageConnectionsDialog::saveOracleConnections( 
const QStringList &connections )
 
  625  QDomDocument doc( QStringLiteral( 
"connections" ) );
 
  626  QDomElement root = doc.createElement( QStringLiteral( 
"qgsOracleConnections" ) );
 
  627  root.setAttribute( QStringLiteral( 
"version" ), QStringLiteral( 
"1.0" ) );
 
  628  doc.appendChild( root );
 
  632  for ( 
int i = 0; i < connections.count(); ++i )
 
  634    path = 
"/Oracle/connections/" + connections[i];
 
  635    QDomElement el = doc.createElement( QStringLiteral( 
"oracle" ) );
 
  636    el.setAttribute( QStringLiteral( 
"name" ), connections[i] );
 
  637    el.setAttribute( QStringLiteral( 
"host" ), settings.
value( path + 
"/host" ).toString() );
 
  638    el.setAttribute( QStringLiteral( 
"port" ), settings.
value( path + 
"/port" ).toString() );
 
  639    el.setAttribute( QStringLiteral( 
"database" ), settings.
value( path + 
"/database" ).toString() );
 
  640    el.setAttribute( QStringLiteral( 
"dboptions" ), settings.
value( path + 
"/dboptions" ).toString() );
 
  641    el.setAttribute( QStringLiteral( 
"dbworkspace" ), settings.
value( path + 
"/dbworkspace" ).toString() );
 
  642    el.setAttribute( QStringLiteral( 
"schema" ), settings.
value( path + 
"/schema" ).toString() );
 
  643    el.setAttribute( QStringLiteral( 
"estimatedMetadata" ), settings.
value( path + 
"/estimatedMetadata", 
"0" ).toString() );
 
  644    el.setAttribute( QStringLiteral( 
"userTablesOnly" ), settings.
value( path + 
"/userTablesOnly", 
"0" ).toString() );
 
  645    el.setAttribute( QStringLiteral( 
"geometryColumnsOnly" ), settings.
value( path + 
"/geometryColumnsOnly", 
"0" ).toString() );
 
  646    el.setAttribute( QStringLiteral( 
"allowGeometrylessTables" ), settings.
value( path + 
"/allowGeometrylessTables", 
"0" ).toString() );
 
  648    el.setAttribute( QStringLiteral( 
"saveUsername" ), settings.
value( path + 
"/saveUsername", 
"false" ).toString() );
 
  650    if ( settings.
value( path + 
"/saveUsername", 
"false" ).toString() == QLatin1String( 
"true" ) )
 
  652      el.setAttribute( QStringLiteral( 
"username" ), settings.
value( path + 
"/username" ).toString() );
 
  655    el.setAttribute( QStringLiteral( 
"savePassword" ), settings.
value( path + 
"/savePassword", 
"false" ).toString() );
 
  657    if ( settings.
value( path + 
"/savePassword", 
"false" ).toString() == QLatin1String( 
"true" ) )
 
  659      el.setAttribute( QStringLiteral( 
"password" ), settings.
value( path + 
"/password" ).toString() );
 
  662    root.appendChild( el );
 
  668QDomDocument QgsManageConnectionsDialog::saveHanaConnections( 
const QStringList &connections )
 
  670  QDomDocument doc( QStringLiteral( 
"connections" ) );
 
  671  QDomElement root = doc.createElement( QStringLiteral( 
"qgsHanaConnections" ) );
 
  672  root.setAttribute( QStringLiteral( 
"version" ), QStringLiteral( 
"1.0" ) );
 
  673  doc.appendChild( root );
 
  677  for ( 
int i = 0; i < connections.count(); ++i )
 
  679    path = 
"/HANA/connections/" + connections[i];
 
  680    QDomElement el = doc.createElement( QStringLiteral( 
"hana" ) );
 
  681    el.setAttribute( QStringLiteral( 
"name" ), connections[i] );
 
  682    el.setAttribute( QStringLiteral( 
"driver" ), settings.
value( path + 
"/driver", QString() ).toString() );
 
  683    el.setAttribute( QStringLiteral( 
"host" ), settings.
value( path + 
"/host", QString() ).toString() );
 
  684    el.setAttribute( QStringLiteral( 
"identifierType" ), settings.
value( path + 
"/identifierType", QString() ).toString() );
 
  685    el.setAttribute( QStringLiteral( 
"identifier" ), settings.
value( path + 
"/identifier", QString() ).toString() );
 
  686    el.setAttribute( QStringLiteral( 
"multitenant" ), settings.
value( path + 
"/multitenant", QString() ).toString() );
 
  687    el.setAttribute( QStringLiteral( 
"database" ), settings.
value( path + 
"/database", QString() ).toString() );
 
  688    el.setAttribute( QStringLiteral( 
"schema" ), settings.
value( path + 
"/schema", QString() ).toString() );
 
  689    el.setAttribute( QStringLiteral( 
"userTablesOnly" ), settings.
value( path + 
"/userTablesOnly", QStringLiteral( 
"0" ) ).toString() );
 
  690    el.setAttribute( QStringLiteral( 
"allowGeometrylessTables" ), settings.
value( path + 
"/allowGeometrylessTables", QStringLiteral( 
"0" ) ).toString() );
 
  692    el.setAttribute( QStringLiteral( 
"saveUsername" ), settings.
value( path + 
"/saveUsername", QStringLiteral( 
"false" ) ).toString() );
 
  693    if ( settings.
value( path + 
"/saveUsername", 
"false" ).toString() == QLatin1String( 
"true" ) )
 
  695      el.setAttribute( QStringLiteral( 
"username" ), settings.
value( path + 
"/username", QString() ).toString() );
 
  698    el.setAttribute( QStringLiteral( 
"savePassword" ), settings.
value( path + 
"/savePassword", QStringLiteral( 
"false" ) ).toString() );
 
  699    if ( settings.
value( path + 
"/savePassword", 
"false" ).toString() == QLatin1String( 
"true" ) )
 
  701      el.setAttribute( QStringLiteral( 
"password" ), settings.
value( path + 
"/password", QString() ).toString() );
 
  704    el.setAttribute( QStringLiteral( 
"sslEnabled" ), settings.
value( path + 
"/sslEnabled", QStringLiteral( 
"false" ) ).toString() );
 
  705    el.setAttribute( QStringLiteral( 
"sslCryptoProvider" ), settings.
value( path + 
"/sslCryptoProvider", QStringLiteral( 
"openssl" ) ).toString() );
 
  706    el.setAttribute( QStringLiteral( 
"sslKeyStore" ), settings.
value( path + 
"/sslKeyStore", QString() ).toString() );
 
  707    el.setAttribute( QStringLiteral( 
"sslTrustStore" ), settings.
value( path + 
"/sslTrustStore", QString() ).toString() );
 
  708    el.setAttribute( QStringLiteral( 
"sslValidateCertificate" ), settings.
value( path + 
"/sslValidateCertificate", QStringLiteral( 
"false" ) ).toString() );
 
  709    el.setAttribute( QStringLiteral( 
"sslHostNameInCertificate" ), settings.
value( path + 
"/sslHostNameInCertificate", QString() ).toString() );
 
  711    root.appendChild( el );
 
  717QDomDocument QgsManageConnectionsDialog::saveXyzTilesConnections( 
const QStringList &connections )
 
  719  QDomDocument doc( QStringLiteral( 
"connections" ) );
 
  720  QDomElement root = doc.createElement( QStringLiteral( 
"qgsXYZTilesConnections" ) );
 
  721  root.setAttribute( QStringLiteral( 
"version" ), QStringLiteral( 
"1.0" ) );
 
  722  doc.appendChild( root );
 
  724  QMap<QString, QString> namespaceDeclarations;
 
  725  for ( 
int i = 0; i < connections.count(); ++i )
 
  727    QDomElement el = doc.createElement( QStringLiteral( 
"xyztiles" ) );
 
  729    el.setAttribute( QStringLiteral( 
"name" ), connections[i] );
 
  739    httpHeader.updateDomElement( el, namespaceDeclarations );
 
  741    root.appendChild( el );
 
  744  addNamespaceDeclarations( root, namespaceDeclarations );
 
  749QDomDocument QgsManageConnectionsDialog::saveArcgisConnections( 
const QStringList &connections )
 
  751  QDomDocument doc( QStringLiteral( 
"connections" ) );
 
  752  QDomElement root = doc.createElement( 
"qgsARCGISFEATURESERVERConnections" );
 
  753  root.setAttribute( QStringLiteral( 
"version" ), QStringLiteral( 
"1.0" ) );
 
  754  doc.appendChild( root );
 
  756  QMap<QString, QString> namespaceDeclarations;
 
  757  for ( 
const QString &connection : connections )
 
  759    QDomElement el = doc.createElement( QStringLiteral( 
"arcgisfeatureserver" ) );
 
  760    el.setAttribute( QStringLiteral( 
"name" ), connection );
 
  764    httpHeader.updateDomElement( el, namespaceDeclarations );
 
  770    root.appendChild( el );
 
  773  addNamespaceDeclarations( root, namespaceDeclarations );
 
  778QDomDocument QgsManageConnectionsDialog::saveVectorTileConnections( 
const QStringList &connections )
 
  780  QDomDocument doc( QStringLiteral( 
"connections" ) );
 
  781  QDomElement root = doc.createElement( QStringLiteral( 
"qgsVectorTileConnections" ) );
 
  782  root.setAttribute( QStringLiteral( 
"version" ), QStringLiteral( 
"1.0" ) );
 
  783  doc.appendChild( root );
 
  785  QMap<QString, QString> namespaceDeclarations;
 
  786  for ( 
int i = 0; i < connections.count(); ++i )
 
  788    QDomElement el = doc.createElement( QStringLiteral( 
"vectortile" ) );
 
  790    el.setAttribute( QStringLiteral( 
"name" ), connections[i] );
 
  791    el.setAttribute( QStringLiteral( 
"url" ), QgsVectorTileProviderConnection::settingsUrl->value( connections[i] ) );
 
  792    el.setAttribute( QStringLiteral( 
"zmin" ), QgsVectorTileProviderConnection::settingsZmin->value( connections[i] ) );
 
  793    el.setAttribute( QStringLiteral( 
"zmax" ), QgsVectorTileProviderConnection::settingsZmax->value( connections[i] ) );
 
  794    el.setAttribute( QStringLiteral( 
"serviceType" ), QgsVectorTileProviderConnection::settingsServiceType->value( connections[i] ) );
 
  795    el.setAttribute( QStringLiteral( 
"authcfg" ), QgsVectorTileProviderConnection::settingsAuthcfg->value( connections[i] ) );
 
  796    el.setAttribute( QStringLiteral( 
"username" ), QgsVectorTileProviderConnection::settingsUsername->value( connections[i] ) );
 
  797    el.setAttribute( QStringLiteral( 
"password" ), QgsVectorTileProviderConnection::settingsPassword->value( connections[i] ) );
 
  798    el.setAttribute( QStringLiteral( 
"styleUrl" ), QgsVectorTileProviderConnection::settingsStyleUrl->value( connections[i] ) );
 
  800    QgsHttpHeaders httpHeader( QgsVectorTileProviderConnection::settingsHeaders->value( connections[i] ) );
 
  801    httpHeader.updateDomElement( el, namespaceDeclarations );
 
  803    root.appendChild( el );
 
  806  addNamespaceDeclarations( root, namespaceDeclarations );
 
  811QDomDocument QgsManageConnectionsDialog::saveTiledSceneConnections( 
const QStringList &connections )
 
  813  QDomDocument doc( QStringLiteral( 
"connections" ) );
 
  814  QDomElement root = doc.createElement( QStringLiteral( 
"qgsTiledSceneConnections" ) );
 
  815  root.setAttribute( QStringLiteral( 
"version" ), QStringLiteral( 
"1.0" ) );
 
  816  doc.appendChild( root );
 
  818  QMap<QString, QString> namespaceDeclarations;
 
  819  for ( 
int i = 0; i < connections.count(); ++i )
 
  821    QDomElement el = doc.createElement( QStringLiteral( 
"tiledscene" ) );
 
  823    el.setAttribute( QStringLiteral( 
"name" ), connections[i] );
 
  824    el.setAttribute( QStringLiteral( 
"provider" ), QgsTiledSceneProviderConnection::settingsProvider->value( connections[i] ) );
 
  825    el.setAttribute( QStringLiteral( 
"url" ), QgsTiledSceneProviderConnection::settingsUrl->value( connections[i] ) );
 
  826    el.setAttribute( QStringLiteral( 
"authcfg" ), QgsTiledSceneProviderConnection::settingsAuthcfg->value( connections[i] ) );
 
  827    el.setAttribute( QStringLiteral( 
"username" ), QgsTiledSceneProviderConnection::settingsUsername->value( connections[i] ) );
 
  828    el.setAttribute( QStringLiteral( 
"password" ), QgsTiledSceneProviderConnection::settingsPassword->value( connections[i] ) );
 
  830    QgsHttpHeaders httpHeader( QgsTiledSceneProviderConnection::settingsHeaders->value( connections[i] ) );
 
  831    httpHeader.updateDomElement( el, namespaceDeclarations );
 
  833    root.appendChild( el );
 
  836  addNamespaceDeclarations( root, namespaceDeclarations );
 
  841QDomDocument QgsManageConnectionsDialog::saveSensorThingsConnections( 
const QStringList &connections )
 
  843  QDomDocument doc( QStringLiteral( 
"connections" ) );
 
  844  QDomElement root = doc.createElement( QStringLiteral( 
"qgsSensorThingsConnections" ) );
 
  845  root.setAttribute( QStringLiteral( 
"version" ), QStringLiteral( 
"1.0" ) );
 
  846  doc.appendChild( root );
 
  848  QMap<QString, QString> namespaceDeclarations;
 
  849  for ( 
int i = 0; i < connections.count(); ++i )
 
  851    QDomElement el = doc.createElement( QStringLiteral( 
"sensorthings" ) );
 
  853    el.setAttribute( QStringLiteral( 
"name" ), connections[i] );
 
  854    el.setAttribute( QStringLiteral( 
"url" ), QgsSensorThingsProviderConnection::settingsUrl->value( connections[i] ) );
 
  855    el.setAttribute( QStringLiteral( 
"authcfg" ), QgsSensorThingsProviderConnection::settingsAuthcfg->value( connections[i] ) );
 
  856    el.setAttribute( QStringLiteral( 
"username" ), QgsSensorThingsProviderConnection::settingsUsername->value( connections[i] ) );
 
  857    el.setAttribute( QStringLiteral( 
"password" ), QgsSensorThingsProviderConnection::settingsPassword->value( connections[i] ) );
 
  859    QgsHttpHeaders httpHeader( QgsTiledSceneProviderConnection::settingsHeaders->value( connections[i] ) );
 
  860    httpHeader.updateDomElement( el, namespaceDeclarations );
 
  862    root.appendChild( el );
 
  865  addNamespaceDeclarations( root, namespaceDeclarations );
 
  871QDomDocument QgsManageConnectionsDialog::saveCloudStorageConnections( 
const QStringList &connections )
 
  873  QDomDocument doc( QStringLiteral( 
"connections" ) );
 
  874  QDomElement root = doc.createElement( QStringLiteral( 
"qgsCloudStorageConnections" ) );
 
  875  root.setAttribute( QStringLiteral( 
"version" ), QStringLiteral( 
"1.0" ) );
 
  876  doc.appendChild( root );
 
  878  for ( 
int i = 0; i < connections.count(); ++i )
 
  880    QDomElement el = doc.createElement( QStringLiteral( 
"cloudstorage" ) );
 
  882    el.setAttribute( QStringLiteral( 
"name" ), connections[i] );
 
  883    el.setAttribute( QStringLiteral( 
"handler" ), QgsGdalCloudProviderConnection::settingsVsiHandler->value( connections[i] ) );
 
  884    el.setAttribute( QStringLiteral( 
"container" ), QgsGdalCloudProviderConnection::settingsContainer->value( connections[i] ) );
 
  885    el.setAttribute( QStringLiteral( 
"path" ), QgsGdalCloudProviderConnection::settingsPath->value( connections[i] ) );
 
  887    const QVariantMap credentialOptions = QgsGdalCloudProviderConnection::settingsCredentialOptions->value( connections[i] );
 
  888    QString credentialString;
 
  889    for ( 
auto it = credentialOptions.constBegin(); it != credentialOptions.constEnd(); ++it )
 
  891      if ( !it.value().toString().isEmpty() )
 
  893        credentialString += QStringLiteral( 
"|credential:%1=%2" ).arg( it.key(), it.value().toString() );
 
  896    el.setAttribute( QStringLiteral( 
"credentials" ), credentialString );
 
  898    root.appendChild( el );
 
  904QDomDocument QgsManageConnectionsDialog::saveStacConnections( 
const QStringList &connections )
 
  906  QDomDocument doc( QStringLiteral( 
"connections" ) );
 
  907  QDomElement root = doc.createElement( QStringLiteral( 
"qgsStacConnections" ) );
 
  908  root.setAttribute( QStringLiteral( 
"version" ), QStringLiteral( 
"1.0" ) );
 
  909  doc.appendChild( root );
 
  911  QMap<QString, QString> namespaceDeclarations;
 
  912  for ( 
int i = 0; i < connections.count(); ++i )
 
  914    QDomElement el = doc.createElement( QStringLiteral( 
"stac" ) );
 
  916    el.setAttribute( QStringLiteral( 
"name" ), connections[i] );
 
  917    el.setAttribute( QStringLiteral( 
"url" ), QgsStacConnection::settingsUrl->value( connections[i] ) );
 
  918    el.setAttribute( QStringLiteral( 
"authcfg" ), QgsStacConnection::settingsAuthcfg->value( connections[i] ) );
 
  919    el.setAttribute( QStringLiteral( 
"username" ), QgsStacConnection::settingsUsername->value( connections[i] ) );
 
  920    el.setAttribute( QStringLiteral( 
"password" ), QgsStacConnection::settingsPassword->value( connections[i] ) );
 
  922    QgsHttpHeaders httpHeader( QgsStacConnection::settingsHeaders->value( connections[i] ) );
 
  923    httpHeader.updateDomElement( el, namespaceDeclarations );
 
  925    root.appendChild( el );
 
  928  addNamespaceDeclarations( root, namespaceDeclarations );
 
  933void QgsManageConnectionsDialog::loadOWSConnections( 
const QDomDocument &doc, 
const QStringList &items, 
const QString &service )
 
  935  const QDomElement root = doc.documentElement();
 
  936  if ( root.tagName() != 
"qgs" + service.toUpper() + 
"Connections" )
 
  938    QMessageBox::information( 
this, tr( 
"Loading Connections" ), tr( 
"The file is not a %1 connections exchange file." ).arg( service ) );
 
  942  QString connectionName;
 
  944  QDomElement child = root.firstChildElement();
 
  946  bool overwrite = 
true;
 
  948  while ( !child.isNull() )
 
  950    connectionName = child.attribute( QStringLiteral( 
"name" ) );
 
  951    if ( !items.contains( connectionName ) )
 
  953      child = child.nextSiblingElement();
 
  960      const int res = QMessageBox::warning( 
this, tr( 
"Loading Connections" ), tr( 
"Connection with name '%1' already exists. Overwrite?" ).arg( connectionName ), QMessageBox::Yes | QMessageBox::YesToAll | QMessageBox::No | QMessageBox::NoToAll | QMessageBox::Cancel );
 
  964        case QMessageBox::Cancel:
 
  966        case QMessageBox::No:
 
  967          child = child.nextSiblingElement();
 
  969        case QMessageBox::Yes:
 
  972        case QMessageBox::YesToAll:
 
  976        case QMessageBox::NoToAll:
 
  985      child = child.nextSiblingElement();
 
 1001    if ( !child.attribute( QStringLiteral( 
"username" ) ).isEmpty() )
 
 1006    child = child.nextSiblingElement();
 
 1010void QgsManageConnectionsDialog::loadWfsConnections( 
const QDomDocument &doc, 
const QStringList &items )
 
 1012  const QDomElement root = doc.documentElement();
 
 1013  if ( root.tagName() != QLatin1String( 
"qgsWFSConnections" ) )
 
 1015    QMessageBox::information( 
this, tr( 
"Loading Connections" ), tr( 
"The file is not a WFS connections exchange file." ) );
 
 1019  QString connectionName;
 
 1022  QDomElement child = root.firstChildElement();
 
 1024  bool overwrite = 
true;
 
 1026  while ( !child.isNull() )
 
 1028    connectionName = child.attribute( QStringLiteral( 
"name" ) );
 
 1029    if ( !items.contains( connectionName ) )
 
 1031      child = child.nextSiblingElement();
 
 1036    if ( keys.contains( connectionName ) && prompt )
 
 1038      const int res = QMessageBox::warning( 
this, tr( 
"Loading Connections" ), tr( 
"Connection with name '%1' already exists. Overwrite?" ).arg( connectionName ), QMessageBox::Yes | QMessageBox::YesToAll | QMessageBox::No | QMessageBox::NoToAll | QMessageBox::Cancel );
 
 1042        case QMessageBox::Cancel:
 
 1044        case QMessageBox::No:
 
 1045          child = child.nextSiblingElement();
 
 1047        case QMessageBox::Yes:
 
 1050        case QMessageBox::YesToAll:
 
 1054        case QMessageBox::NoToAll:
 
 1061    if ( keys.contains( connectionName ) )
 
 1065        child = child.nextSiblingElement();
 
 1071      keys << connectionName;
 
 1084    if ( !child.attribute( QStringLiteral( 
"username" ) ).isEmpty() )
 
 1089    child = child.nextSiblingElement();
 
 1093void QgsManageConnectionsDialog::loadPgConnections( 
const QDomDocument &doc, 
const QStringList &items )
 
 1095  const QDomElement root = doc.documentElement();
 
 1096  if ( root.tagName() != QLatin1String( 
"qgsPgConnections" ) )
 
 1098    QMessageBox::information( 
this, tr( 
"Loading Connections" ), tr( 
"The file is not a PostGIS connections exchange file." ) );
 
 1102  QString connectionName;
 
 1104  settings.
beginGroup( QStringLiteral( 
"/PostgreSQL/connections" ) );
 
 1107  QDomElement child = root.firstChildElement();
 
 1109  bool overwrite = 
true;
 
 1111  while ( !child.isNull() )
 
 1113    connectionName = child.attribute( QStringLiteral( 
"name" ) );
 
 1114    if ( !items.contains( connectionName ) )
 
 1116      child = child.nextSiblingElement();
 
 1121    if ( keys.contains( connectionName ) && prompt )
 
 1123      const int res = QMessageBox::warning( 
this, tr( 
"Loading Connections" ), tr( 
"Connection with name '%1' already exists. Overwrite?" ).arg( connectionName ), QMessageBox::Yes | QMessageBox::YesToAll | QMessageBox::No | QMessageBox::NoToAll | QMessageBox::Cancel );
 
 1126        case QMessageBox::Cancel:
 
 1128        case QMessageBox::No:
 
 1129          child = child.nextSiblingElement();
 
 1131        case QMessageBox::Yes:
 
 1134        case QMessageBox::YesToAll:
 
 1138        case QMessageBox::NoToAll:
 
 1145    if ( keys.contains( connectionName ) )
 
 1149        child = child.nextSiblingElement();
 
 1155      keys << connectionName;
 
 1159    settings.
beginGroup( 
"/PostgreSQL/connections/" + connectionName );
 
 1161    settings.
setValue( QStringLiteral( 
"/host" ), child.attribute( QStringLiteral( 
"host" ) ) );
 
 1162    settings.
setValue( QStringLiteral( 
"/port" ), child.attribute( QStringLiteral( 
"port" ) ) );
 
 1163    settings.
setValue( QStringLiteral( 
"/database" ), child.attribute( QStringLiteral( 
"database" ) ) );
 
 1164    if ( child.hasAttribute( QStringLiteral( 
"service" ) ) )
 
 1166      settings.
setValue( QStringLiteral( 
"/service" ), child.attribute( QStringLiteral( 
"service" ) ) );
 
 1170      settings.
setValue( QStringLiteral( 
"/service" ), 
"" );
 
 1172    settings.
setValue( QStringLiteral( 
"/sslmode" ), child.attribute( QStringLiteral( 
"sslmode" ) ) );
 
 1173    settings.
setValue( QStringLiteral( 
"/estimatedMetadata" ), child.attribute( QStringLiteral( 
"estimatedMetadata" ) ) );
 
 1174    settings.
setValue( QStringLiteral( 
"/projectsInDatabase" ), child.attribute( QStringLiteral( 
"projectsInDatabase" ), 0 ) );
 
 1175    settings.
setValue( QStringLiteral( 
"/dontResolveType" ), child.attribute( QStringLiteral( 
"dontResolveType" ), 0 ) );
 
 1176    settings.
setValue( QStringLiteral( 
"/allowGeometrylessTables" ), child.attribute( QStringLiteral( 
"allowGeometrylessTables" ), 0 ) );
 
 1177    settings.
setValue( QStringLiteral( 
"/geometryColumnsOnly" ), child.attribute( QStringLiteral( 
"geometryColumnsOnly" ), 0 ) );
 
 1178    settings.
setValue( QStringLiteral( 
"/publicOnly" ), child.attribute( QStringLiteral( 
"publicOnly" ), 0 ) );
 
 1179    settings.
setValue( QStringLiteral( 
"/saveUsername" ), child.attribute( QStringLiteral( 
"saveUsername" ) ) );
 
 1180    settings.
setValue( QStringLiteral( 
"/username" ), child.attribute( QStringLiteral( 
"username" ) ) );
 
 1181    settings.
setValue( QStringLiteral( 
"/savePassword" ), child.attribute( QStringLiteral( 
"savePassword" ) ) );
 
 1182    settings.
setValue( QStringLiteral( 
"/password" ), child.attribute( QStringLiteral( 
"password" ) ) );
 
 1185    child = child.nextSiblingElement();
 
 1189void QgsManageConnectionsDialog::loadMssqlConnections( 
const QDomDocument &doc, 
const QStringList &items )
 
 1191  const QDomElement root = doc.documentElement();
 
 1192  if ( root.tagName() != QLatin1String( 
"qgsMssqlConnections" ) )
 
 1194    QMessageBox::information( 
this, tr( 
"Loading Connections" ), tr( 
"The file is not a MS SQL Server connections exchange file." ) );
 
 1198  QString connectionName;
 
 1200  settings.
beginGroup( QStringLiteral( 
"/MSSQL/connections" ) );
 
 1203  QDomElement child = root.firstChildElement();
 
 1205  bool overwrite = 
true;
 
 1207  while ( !child.isNull() )
 
 1209    connectionName = child.attribute( QStringLiteral( 
"name" ) );
 
 1210    if ( !items.contains( connectionName ) )
 
 1212      child = child.nextSiblingElement();
 
 1217    if ( keys.contains( connectionName ) && prompt )
 
 1219      const int res = QMessageBox::warning( 
this, tr( 
"Loading Connections" ), tr( 
"Connection with name '%1' already exists. Overwrite?" ).arg( connectionName ), QMessageBox::Yes | QMessageBox::YesToAll | QMessageBox::No | QMessageBox::NoToAll | QMessageBox::Cancel );
 
 1222        case QMessageBox::Cancel:
 
 1224        case QMessageBox::No:
 
 1225          child = child.nextSiblingElement();
 
 1227        case QMessageBox::Yes:
 
 1230        case QMessageBox::YesToAll:
 
 1234        case QMessageBox::NoToAll:
 
 1241    if ( keys.contains( connectionName ) )
 
 1245        child = child.nextSiblingElement();
 
 1251      keys << connectionName;
 
 1255    settings.
beginGroup( 
"/MSSQL/connections/" + connectionName );
 
 1257    settings.
setValue( QStringLiteral( 
"/host" ), child.attribute( QStringLiteral( 
"host" ) ) );
 
 1258    settings.
setValue( QStringLiteral( 
"/port" ), child.attribute( QStringLiteral( 
"port" ) ) );
 
 1259    settings.
setValue( QStringLiteral( 
"/database" ), child.attribute( QStringLiteral( 
"database" ) ) );
 
 1260    if ( child.hasAttribute( QStringLiteral( 
"service" ) ) )
 
 1262      settings.
setValue( QStringLiteral( 
"/service" ), child.attribute( QStringLiteral( 
"service" ) ) );
 
 1266      settings.
setValue( QStringLiteral( 
"/service" ), 
"" );
 
 1268    settings.
setValue( QStringLiteral( 
"/sslmode" ), child.attribute( QStringLiteral( 
"sslmode" ) ) );
 
 1269    settings.
setValue( QStringLiteral( 
"/estimatedMetadata" ), child.attribute( QStringLiteral( 
"estimatedMetadata" ) ) );
 
 1270    settings.
setValue( QStringLiteral( 
"/saveUsername" ), child.attribute( QStringLiteral( 
"saveUsername" ) ) );
 
 1271    settings.
setValue( QStringLiteral( 
"/username" ), child.attribute( QStringLiteral( 
"username" ) ) );
 
 1272    settings.
setValue( QStringLiteral( 
"/savePassword" ), child.attribute( QStringLiteral( 
"savePassword" ) ) );
 
 1273    settings.
setValue( QStringLiteral( 
"/password" ), child.attribute( QStringLiteral( 
"password" ) ) );
 
 1276    child = child.nextSiblingElement();
 
 1280void QgsManageConnectionsDialog::loadOracleConnections( 
const QDomDocument &doc, 
const QStringList &items )
 
 1282  const QDomElement root = doc.documentElement();
 
 1283  if ( root.tagName() != QLatin1String( 
"qgsOracleConnections" ) )
 
 1285    QMessageBox::information( 
this, tr( 
"Loading Connections" ), tr( 
"The file is not an Oracle connections exchange file." ) );
 
 1289  QString connectionName;
 
 1291  settings.
beginGroup( QStringLiteral( 
"/Oracle/connections" ) );
 
 1294  QDomElement child = root.firstChildElement();
 
 1296  bool overwrite = 
true;
 
 1298  while ( !child.isNull() )
 
 1300    connectionName = child.attribute( QStringLiteral( 
"name" ) );
 
 1301    if ( !items.contains( connectionName ) )
 
 1303      child = child.nextSiblingElement();
 
 1308    if ( keys.contains( connectionName ) && prompt )
 
 1310      const int res = QMessageBox::warning( 
this, tr( 
"Loading Connections" ), tr( 
"Connection with name '%1' already exists. Overwrite?" ).arg( connectionName ), QMessageBox::Yes | QMessageBox::YesToAll | QMessageBox::No | QMessageBox::NoToAll | QMessageBox::Cancel );
 
 1313        case QMessageBox::Cancel:
 
 1315        case QMessageBox::No:
 
 1316          child = child.nextSiblingElement();
 
 1318        case QMessageBox::Yes:
 
 1321        case QMessageBox::YesToAll:
 
 1325        case QMessageBox::NoToAll:
 
 1332    if ( keys.contains( connectionName ) )
 
 1336        child = child.nextSiblingElement();
 
 1342      keys << connectionName;
 
 1346    settings.
beginGroup( 
"/Oracle/connections/" + connectionName );
 
 1348    settings.
setValue( QStringLiteral( 
"/host" ), child.attribute( QStringLiteral( 
"host" ) ) );
 
 1349    settings.
setValue( QStringLiteral( 
"/port" ), child.attribute( QStringLiteral( 
"port" ) ) );
 
 1350    settings.
setValue( QStringLiteral( 
"/database" ), child.attribute( QStringLiteral( 
"database" ) ) );
 
 1351    settings.
setValue( QStringLiteral( 
"/dboptions" ), child.attribute( QStringLiteral( 
"dboptions" ) ) );
 
 1352    settings.
setValue( QStringLiteral( 
"/dbworkspace" ), child.attribute( QStringLiteral( 
"dbworkspace" ) ) );
 
 1353    settings.
setValue( QStringLiteral( 
"/schema" ), child.attribute( QStringLiteral( 
"schema" ) ) );
 
 1354    settings.
setValue( QStringLiteral( 
"/estimatedMetadata" ), child.attribute( QStringLiteral( 
"estimatedMetadata" ) ) );
 
 1355    settings.
setValue( QStringLiteral( 
"/userTablesOnly" ), child.attribute( QStringLiteral( 
"userTablesOnly" ) ) );
 
 1356    settings.
setValue( QStringLiteral( 
"/geometryColumnsOnly" ), child.attribute( QStringLiteral( 
"geometryColumnsOnly" ) ) );
 
 1357    settings.
setValue( QStringLiteral( 
"/allowGeometrylessTables" ), child.attribute( QStringLiteral( 
"allowGeometrylessTables" ) ) );
 
 1358    settings.
setValue( QStringLiteral( 
"/saveUsername" ), child.attribute( QStringLiteral( 
"saveUsername" ) ) );
 
 1359    settings.
setValue( QStringLiteral( 
"/username" ), child.attribute( QStringLiteral( 
"username" ) ) );
 
 1360    settings.
setValue( QStringLiteral( 
"/savePassword" ), child.attribute( QStringLiteral( 
"savePassword" ) ) );
 
 1361    settings.
setValue( QStringLiteral( 
"/password" ), child.attribute( QStringLiteral( 
"password" ) ) );
 
 1364    child = child.nextSiblingElement();
 
 1368void QgsManageConnectionsDialog::loadHanaConnections( 
const QDomDocument &doc, 
const QStringList &items )
 
 1370  QDomElement root = doc.documentElement();
 
 1371  if ( root.tagName() != QLatin1String( 
"qgsHanaConnections" ) )
 
 1373    QMessageBox::warning( 
this, tr( 
"Loading Connections" ), tr( 
"The file is not a HANA connections exchange file." ) );
 
 1377  const QDomAttr version = root.attributeNode( 
"version" );
 
 1378  if ( version.value() != QLatin1String( 
"1.0" ) )
 
 1380    QMessageBox::warning( 
this, tr( 
"Loading Connections" ), tr( 
"The HANA connections exchange file version '%1' is not supported." ).arg( version.value() ) );
 
 1385  settings.
beginGroup( QStringLiteral( 
"/HANA/connections" ) );
 
 1388  QDomElement child = root.firstChildElement();
 
 1390  bool overwrite = 
true;
 
 1392  while ( !child.isNull() )
 
 1394    const QString connectionName = child.attribute( QStringLiteral( 
"name" ) );
 
 1395    if ( !items.contains( connectionName ) )
 
 1397      child = child.nextSiblingElement();
 
 1402    if ( keys.contains( connectionName ) && prompt )
 
 1404      const int res = QMessageBox::warning( 
this, tr( 
"Loading Connections" ), tr( 
"Connection with name '%1' already exists. Overwrite?" ).arg( connectionName ), QMessageBox::Yes | QMessageBox::YesToAll | QMessageBox::No | QMessageBox::NoToAll | QMessageBox::Cancel );
 
 1407        case QMessageBox::Cancel:
 
 1409        case QMessageBox::No:
 
 1410          child = child.nextSiblingElement();
 
 1412        case QMessageBox::Yes:
 
 1415        case QMessageBox::YesToAll:
 
 1419        case QMessageBox::NoToAll:
 
 1426    if ( keys.contains( connectionName ) )
 
 1430        child = child.nextSiblingElement();
 
 1436      keys << connectionName;
 
 1440    settings.
beginGroup( 
"/HANA/connections/" + connectionName );
 
 1442    for ( 
const QString param :
 
 1443          { 
"driver", 
"host", 
"database", 
"identifierType", 
"identifier", 
"multitenant", 
"schema", 
"userTablesOnly",
 
 1444            "allowGeometrylessTables", 
"saveUsername", 
"username", 
"savePassword", 
"password", 
"sslEnabled",
 
 1445            "sslCryptoProvider", 
"sslKeyStore", 
"sslTrustStore", 
"sslValidateCertificate", 
"sslHostNameInCertificate" 
 1447      settings.
setValue( QStringLiteral( 
"/" ) + param, child.attribute( param ) );
 
 1451    child = child.nextSiblingElement();
 
 1455void QgsManageConnectionsDialog::loadXyzTilesConnections( 
const QDomDocument &doc, 
const QStringList &items )
 
 1457  const QDomElement root = doc.documentElement();
 
 1458  if ( root.tagName() != QLatin1String( 
"qgsXYZTilesConnections" ) )
 
 1460    QMessageBox::information( 
this, tr( 
"Loading Connections" ), tr( 
"The file is not a XYZ Tiles connections exchange file." ) );
 
 1464  QString connectionName;
 
 1466  QDomElement child = root.firstChildElement();
 
 1468  bool overwrite = 
true;
 
 1470  while ( !child.isNull() )
 
 1472    connectionName = child.attribute( QStringLiteral( 
"name" ) );
 
 1473    if ( !items.contains( connectionName ) )
 
 1475      child = child.nextSiblingElement();
 
 1480    if ( keys.contains( connectionName ) && prompt )
 
 1482      const int res = QMessageBox::warning( 
this, tr( 
"Loading Connections" ), tr( 
"Connection with name '%1' already exists. Overwrite?" ).arg( connectionName ), QMessageBox::Yes | QMessageBox::YesToAll | QMessageBox::No | QMessageBox::NoToAll | QMessageBox::Cancel );
 
 1486        case QMessageBox::Cancel:
 
 1488        case QMessageBox::No:
 
 1489          child = child.nextSiblingElement();
 
 1491        case QMessageBox::Yes:
 
 1494        case QMessageBox::YesToAll:
 
 1498        case QMessageBox::NoToAll:
 
 1505    if ( keys.contains( connectionName ) )
 
 1509        child = child.nextSiblingElement();
 
 1515      keys << connectionName;
 
 1530    child = child.nextSiblingElement();
 
 1534void QgsManageConnectionsDialog::loadArcgisConnections( 
const QDomDocument &doc, 
const QStringList &items, 
const QString &service )
 
 1536  const QDomElement root = doc.documentElement();
 
 1537  if ( root.tagName() != 
"qgs" + service.toUpper() + 
"Connections" )
 
 1539    QMessageBox::information( 
this, tr( 
"Loading Connections" ), tr( 
"The file is not a %1 connections exchange file." ).arg( service ) );
 
 1543  QString connectionName;
 
 1545  QDomElement child = root.firstChildElement();
 
 1547  bool overwrite = 
true;
 
 1549  while ( !child.isNull() )
 
 1551    connectionName = child.attribute( QStringLiteral( 
"name" ) );
 
 1552    if ( !items.contains( connectionName ) )
 
 1554      child = child.nextSiblingElement();
 
 1559    if ( keys.contains( connectionName ) && prompt )
 
 1561      const int res = QMessageBox::warning( 
this, tr( 
"Loading Connections" ), tr( 
"Connection with name '%1' already exists. Overwrite?" ).arg( connectionName ), QMessageBox::Yes | QMessageBox::YesToAll | QMessageBox::No | QMessageBox::NoToAll | QMessageBox::Cancel );
 
 1565        case QMessageBox::Cancel:
 
 1567        case QMessageBox::No:
 
 1568          child = child.nextSiblingElement();
 
 1570        case QMessageBox::Yes:
 
 1573        case QMessageBox::YesToAll:
 
 1577        case QMessageBox::NoToAll:
 
 1584    if ( keys.contains( connectionName ) )
 
 1588        child = child.nextSiblingElement();
 
 1594      keys << connectionName;
 
 1607    child = child.nextSiblingElement();
 
 1611void QgsManageConnectionsDialog::loadVectorTileConnections( 
const QDomDocument &doc, 
const QStringList &items )
 
 1613  const QDomElement root = doc.documentElement();
 
 1614  if ( root.tagName() != QLatin1String( 
"qgsVectorTileConnections" ) )
 
 1616    QMessageBox::information( 
this, tr( 
"Loading Connections" ), tr( 
"The file is not a Vector Tile connections exchange file." ) );
 
 1620  QString connectionName;
 
 1622  settings.
beginGroup( QStringLiteral( 
"/qgis/connections-vector-tile" ) );
 
 1625  QDomElement child = root.firstChildElement();
 
 1627  bool overwrite = 
true;
 
 1629  while ( !child.isNull() )
 
 1631    connectionName = child.attribute( QStringLiteral( 
"name" ) );
 
 1632    if ( !items.contains( connectionName ) )
 
 1634      child = child.nextSiblingElement();
 
 1639    if ( keys.contains( connectionName ) && prompt )
 
 1641      const int res = QMessageBox::warning( 
this, tr( 
"Loading Connections" ), tr( 
"Connection with name '%1' already exists. Overwrite?" ).arg( connectionName ), QMessageBox::Yes | QMessageBox::YesToAll | QMessageBox::No | QMessageBox::NoToAll | QMessageBox::Cancel );
 
 1645        case QMessageBox::Cancel:
 
 1647        case QMessageBox::No:
 
 1648          child = child.nextSiblingElement();
 
 1650        case QMessageBox::Yes:
 
 1653        case QMessageBox::YesToAll:
 
 1657        case QMessageBox::NoToAll:
 
 1664    if ( keys.contains( connectionName ) )
 
 1668        child = child.nextSiblingElement();
 
 1674      keys << connectionName;
 
 1677    QgsVectorTileProviderConnection::settingsUrl->setValue( child.attribute( QStringLiteral( 
"url" ) ), connectionName );
 
 1678    QgsVectorTileProviderConnection::settingsZmin->setValue( child.attribute( QStringLiteral( 
"zmin" ) ).toInt(), connectionName );
 
 1679    QgsVectorTileProviderConnection::settingsZmax->setValue( child.attribute( QStringLiteral( 
"zmax" ) ).toInt(), connectionName );
 
 1680    QgsVectorTileProviderConnection::settingsServiceType->setValue( child.attribute( QStringLiteral( 
"serviceType" ) ), connectionName );
 
 1681    QgsVectorTileProviderConnection::settingsAuthcfg->setValue( child.attribute( QStringLiteral( 
"authcfg" ) ), connectionName );
 
 1682    QgsVectorTileProviderConnection::settingsUsername->setValue( child.attribute( QStringLiteral( 
"username" ) ), connectionName );
 
 1683    QgsVectorTileProviderConnection::settingsPassword->setValue( child.attribute( QStringLiteral( 
"password" ) ), connectionName );
 
 1684    QgsVectorTileProviderConnection::settingsStyleUrl->setValue( child.attribute( QStringLiteral( 
"styleUrl" ) ), connectionName );
 
 1687    QgsVectorTileProviderConnection::settingsHeaders->setValue( httpHeader.headers(), connectionName );
 
 1689    child = child.nextSiblingElement();
 
 1693void QgsManageConnectionsDialog::loadTiledSceneConnections( 
const QDomDocument &doc, 
const QStringList &items )
 
 1695  const QDomElement root = doc.documentElement();
 
 1696  if ( root.tagName() != QLatin1String( 
"qgsTiledSceneConnections" ) )
 
 1698    QMessageBox::information( 
this, tr( 
"Loading Connections" ), tr( 
"The file is not a tiled scene connections exchange file." ) );
 
 1702  QString connectionName;
 
 1704  settings.
beginGroup( QStringLiteral( 
"/qgis/connections-tiled-scene" ) );
 
 1707  QDomElement child = root.firstChildElement();
 
 1709  bool overwrite = 
true;
 
 1711  while ( !child.isNull() )
 
 1713    connectionName = child.attribute( QStringLiteral( 
"name" ) );
 
 1714    if ( !items.contains( connectionName ) )
 
 1716      child = child.nextSiblingElement();
 
 1721    if ( keys.contains( connectionName ) && prompt )
 
 1723      const int res = QMessageBox::warning( 
this, tr( 
"Loading Connections" ), tr( 
"Connection with name '%1' already exists. Overwrite?" ).arg( connectionName ), QMessageBox::Yes | QMessageBox::YesToAll | QMessageBox::No | QMessageBox::NoToAll | QMessageBox::Cancel );
 
 1727        case QMessageBox::Cancel:
 
 1729        case QMessageBox::No:
 
 1730          child = child.nextSiblingElement();
 
 1732        case QMessageBox::Yes:
 
 1735        case QMessageBox::YesToAll:
 
 1739        case QMessageBox::NoToAll:
 
 1746    if ( keys.contains( connectionName ) )
 
 1750        child = child.nextSiblingElement();
 
 1756      keys << connectionName;
 
 1759    QgsTiledSceneProviderConnection::settingsProvider->setValue( child.attribute( QStringLiteral( 
"provider" ) ), connectionName );
 
 1760    QgsTiledSceneProviderConnection::settingsUrl->setValue( child.attribute( QStringLiteral( 
"url" ) ), connectionName );
 
 1761    QgsTiledSceneProviderConnection::settingsAuthcfg->setValue( child.attribute( QStringLiteral( 
"authcfg" ) ), connectionName );
 
 1762    QgsTiledSceneProviderConnection::settingsUsername->setValue( child.attribute( QStringLiteral( 
"username" ) ), connectionName );
 
 1763    QgsTiledSceneProviderConnection::settingsPassword->setValue( child.attribute( QStringLiteral( 
"password" ) ), connectionName );
 
 1766    QgsTiledSceneProviderConnection::settingsHeaders->setValue( httpHeader.headers(), connectionName );
 
 1768    child = child.nextSiblingElement();
 
 1772void QgsManageConnectionsDialog::loadSensorThingsConnections( 
const QDomDocument &doc, 
const QStringList &items )
 
 1774  const QDomElement root = doc.documentElement();
 
 1775  if ( root.tagName() != QLatin1String( 
"qgsSensorThingsConnections" ) )
 
 1777    QMessageBox::information( 
this, tr( 
"Loading Connections" ), tr( 
"The file is not a SensorThings connections exchange file." ) );
 
 1781  QString connectionName;
 
 1783  settings.
beginGroup( QStringLiteral( 
"/connections/sensorthings/items" ) );
 
 1786  QDomElement child = root.firstChildElement();
 
 1788  bool overwrite = 
true;
 
 1790  while ( !child.isNull() )
 
 1792    connectionName = child.attribute( QStringLiteral( 
"name" ) );
 
 1793    if ( !items.contains( connectionName ) )
 
 1795      child = child.nextSiblingElement();
 
 1800    if ( keys.contains( connectionName ) && prompt )
 
 1802      const int res = QMessageBox::warning( 
this, tr( 
"Loading Connections" ), tr( 
"Connection with name '%1' already exists. Overwrite?" ).arg( connectionName ), QMessageBox::Yes | QMessageBox::YesToAll | QMessageBox::No | QMessageBox::NoToAll | QMessageBox::Cancel );
 
 1806        case QMessageBox::Cancel:
 
 1808        case QMessageBox::No:
 
 1809          child = child.nextSiblingElement();
 
 1811        case QMessageBox::Yes:
 
 1814        case QMessageBox::YesToAll:
 
 1818        case QMessageBox::NoToAll:
 
 1825    if ( keys.contains( connectionName ) )
 
 1829        child = child.nextSiblingElement();
 
 1835      keys << connectionName;
 
 1838    QgsSensorThingsProviderConnection::settingsUrl->setValue( child.attribute( QStringLiteral( 
"url" ) ), connectionName );
 
 1839    QgsSensorThingsProviderConnection::settingsAuthcfg->setValue( child.attribute( QStringLiteral( 
"authcfg" ) ), connectionName );
 
 1840    QgsSensorThingsProviderConnection::settingsUsername->setValue( child.attribute( QStringLiteral( 
"username" ) ), connectionName );
 
 1841    QgsSensorThingsProviderConnection::settingsPassword->setValue( child.attribute( QStringLiteral( 
"password" ) ), connectionName );
 
 1844    QgsSensorThingsProviderConnection::settingsHeaders->setValue( httpHeader.headers(), connectionName );
 
 1846    child = child.nextSiblingElement();
 
 1850void QgsManageConnectionsDialog::loadCloudStorageConnections( 
const QDomDocument &doc, 
const QStringList &items )
 
 1852  const QDomElement root = doc.documentElement();
 
 1853  if ( root.tagName() != QLatin1String( 
"qgsCloudStorageConnections" ) )
 
 1855    QMessageBox::information( 
this, tr( 
"Loading Connections" ), tr( 
"The file is not a cloud storage connections exchange file." ) );
 
 1859  QString connectionName;
 
 1861  settings.
beginGroup( QStringLiteral( 
"/connections/cloud/items" ) );
 
 1864  QDomElement child = root.firstChildElement();
 
 1866  bool overwrite = 
true;
 
 1868  while ( !child.isNull() )
 
 1870    connectionName = child.attribute( QStringLiteral( 
"name" ) );
 
 1871    if ( !items.contains( connectionName ) )
 
 1873      child = child.nextSiblingElement();
 
 1878    if ( keys.contains( connectionName ) && prompt )
 
 1880      const int res = QMessageBox::warning( 
this, tr( 
"Loading Connections" ), tr( 
"Connection with name '%1' already exists. Overwrite?" ).arg( connectionName ), QMessageBox::Yes | QMessageBox::YesToAll | QMessageBox::No | QMessageBox::NoToAll | QMessageBox::Cancel );
 
 1884        case QMessageBox::Cancel:
 
 1886        case QMessageBox::No:
 
 1887          child = child.nextSiblingElement();
 
 1889        case QMessageBox::Yes:
 
 1892        case QMessageBox::YesToAll:
 
 1896        case QMessageBox::NoToAll:
 
 1903    if ( keys.contains( connectionName ) )
 
 1907        child = child.nextSiblingElement();
 
 1913      keys << connectionName;
 
 1916    QgsGdalCloudProviderConnection::settingsVsiHandler->setValue( child.attribute( QStringLiteral( 
"handler" ) ), connectionName );
 
 1917    QgsGdalCloudProviderConnection::settingsContainer->setValue( child.attribute( QStringLiteral( 
"container" ) ), connectionName );
 
 1918    QgsGdalCloudProviderConnection::settingsPath->setValue( child.attribute( QStringLiteral( 
"path" ) ), connectionName );
 
 1920    QString credentialString = child.attribute( QStringLiteral( 
"credentials" ) );
 
 1922    QVariantMap credentialOptions;
 
 1925      const thread_local QRegularExpression credentialOptionRegex( QStringLiteral( 
"\\|credential:([^|]*)" ) );
 
 1926      const thread_local QRegularExpression credentialOptionKeyValueRegex( QStringLiteral( 
"(.*?)=(.*)" ) );
 
 1928      const QRegularExpressionMatch match = credentialOptionRegex.match( credentialString );
 
 1929      if ( match.hasMatch() )
 
 1931        const QRegularExpressionMatch keyValueMatch = credentialOptionKeyValueRegex.match( match.captured( 1 ) );
 
 1932        if ( keyValueMatch.hasMatch() )
 
 1934          credentialOptions.insert( keyValueMatch.captured( 1 ), keyValueMatch.captured( 2 ) );
 
 1936        credentialString = credentialString.remove( match.capturedStart( 0 ), match.capturedLength( 0 ) );
 
 1944    QgsGdalCloudProviderConnection::settingsCredentialOptions->setValue( credentialOptions, connectionName );
 
 1946    child = child.nextSiblingElement();
 
 1950void QgsManageConnectionsDialog::loadStacConnections( 
const QDomDocument &doc, 
const QStringList &items )
 
 1952  const QDomElement root = doc.documentElement();
 
 1953  if ( root.tagName() != QLatin1String( 
"qgsStacConnections" ) )
 
 1955    QMessageBox::information( 
this, tr( 
"Loading Connections" ), tr( 
"The file is not a STAC connections exchange file." ) );
 
 1959  QString connectionName;
 
 1961  settings.
beginGroup( QStringLiteral( 
"/qgis/connections-stac" ) );
 
 1964  QDomElement child = root.firstChildElement();
 
 1966  bool overwrite = 
true;
 
 1968  while ( !child.isNull() )
 
 1970    connectionName = child.attribute( QStringLiteral( 
"name" ) );
 
 1971    if ( !items.contains( connectionName ) )
 
 1973      child = child.nextSiblingElement();
 
 1978    if ( keys.contains( connectionName ) && prompt )
 
 1980      const int res = QMessageBox::warning( 
this, tr( 
"Loading Connections" ), tr( 
"Connection with name '%1' already exists. Overwrite?" ).arg( connectionName ), QMessageBox::Yes | QMessageBox::YesToAll | QMessageBox::No | QMessageBox::NoToAll | QMessageBox::Cancel );
 
 1984        case QMessageBox::Cancel:
 
 1986        case QMessageBox::No:
 
 1987          child = child.nextSiblingElement();
 
 1989        case QMessageBox::Yes:
 
 1992        case QMessageBox::YesToAll:
 
 1996        case QMessageBox::NoToAll:
 
 2003    if ( keys.contains( connectionName ) )
 
 2007        child = child.nextSiblingElement();
 
 2013      keys << connectionName;
 
 2016    QgsStacConnection::settingsUrl->setValue( child.attribute( QStringLiteral( 
"url" ) ), connectionName );
 
 2017    QgsStacConnection::settingsAuthcfg->setValue( child.attribute( QStringLiteral( 
"authcfg" ) ), connectionName );
 
 2018    QgsStacConnection::settingsUsername->setValue( child.attribute( QStringLiteral( 
"username" ) ), connectionName );
 
 2019    QgsStacConnection::settingsPassword->setValue( child.attribute( QStringLiteral( 
"password" ) ), connectionName );
 
 2022    QgsStacConnection::settingsHeaders->setValue( httpHeader.headers(), connectionName );
 
 2024    child = child.nextSiblingElement();
 
 2030  listConnections->selectAll();
 
 2031  buttonBox->button( QDialogButtonBox::Ok )->setEnabled( !listConnections->selectedItems().isEmpty() );
 
 
 2036  listConnections->clearSelection();
 
 2037  buttonBox->button( QDialogButtonBox::Ok )->setEnabled( 
false );
 
 
static const QgsSettingsEntryString * settingsUsername
 
static const QgsSettingsEntryString * settingsUrl
 
static const QgsSettingsEntryString * settingsPassword
 
static const QgsSettingsEntryVariantMap * settingsHeaders
 
static QgsSettingsTreeNamedListNode * sTreeConnectionArcgis
 
static const QgsSettingsEntryString * settingsAuthcfg
 
QgsManageConnectionsDialog(QWidget *parent=nullptr, Mode mode=Export, Type type=WMS, const QString &fileName=QString())
Constructor for QgsManageConnectionsDialog.
 
@ STAC
SpatioTemporal Asset Catalog connections.
 
@ SensorThings
SensorThings connections.
 
@ TiledScene
Tiled scene connection.
 
@ CloudStorage
Cloud storage connections.
 
static const QgsSettingsEntryString * settingsPagingEnabled
 
static const QgsSettingsEntryString * settingsMaxNumFeatures
 
static QgsSettingsTreeNamedListNode * sTreeOwsConnections
 
static const QgsSettingsEntryBool * settingsIgnoreGetFeatureInfoURI
 
static const QgsSettingsEntryString * settingsPassword
 
static const QgsSettingsEntryEnumFlag< Qgis::DpiMode > * settingsDpiMode
 
static const QgsSettingsEntryBool * settingsIgnoreAxisOrientation
 
static const QgsSettingsEntryBool * settingsInvertAxisOrientation
 
static const QgsSettingsEntryString * settingsVersion
 
static const QgsSettingsEntryString * settingsPagesize
 
static const QgsSettingsEntryVariantMap * settingsHeaders
 
static const QgsSettingsEntryString * settingsUsername
 
static const QgsSettingsEntryBool * settingsSmoothPixmapTransform
 
static const QgsSettingsEntryString * settingsUrl
 
static const QgsSettingsEntryBool * settingsIgnoreGetMapURI
 
T value(const QString &dynamicKeyPart=QString()) const
Returns settings value.
 
bool setValue(const T &value, const QString &dynamicKeyPart=QString()) const
Set settings value.
 
QStringList items(const QStringList &parentsNamedItems=QStringList()) const
Returns the list of items.
 
This class is a composition of two QSettings instances:
 
QStringList childGroups(Qgis::SettingsOrigin origin=Qgis::SettingsOrigin::Any) const
Returns a list of all key top-level groups that contain keys that can be read using the QSettings obj...
 
void endGroup()
Resets the group to what it was before the corresponding beginGroup() call.
 
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
 
void beginGroup(const QString &prefix, QgsSettings::Section section=QgsSettings::NoSection)
Appends prefix to the current group.
 
void setValue(const QString &key, const QVariant &value, QgsSettings::Section section=QgsSettings::NoSection)
Sets the value of setting key to value.
 
static QgsSettingsTreeNamedListNode * sTreeXyzConnections
 
static const QgsSettingsEntryString * settingsPassword
 
static const QgsSettingsEntryDouble * settingsTilePixelRatio
 
static const QgsSettingsEntryString * settingsUsername
 
static const QgsSettingsEntryString * settingsAuthcfg
 
static const QgsSettingsEntryInteger * settingsZmin
 
static const QgsSettingsEntryInteger * settingsZmax
 
static const QgsSettingsEntryString * settingsUrl
 
static const QgsSettingsEntryVariantMap * settingsHeaders