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] );
 
  532    root.appendChild( el );
 
  538QDomDocument QgsManageConnectionsDialog::savePgConnections( 
const QStringList &connections )
 
  540  QDomDocument doc( QStringLiteral( 
"connections" ) );
 
  541  QDomElement root = doc.createElement( QStringLiteral( 
"qgsPgConnections" ) );
 
  542  root.setAttribute( QStringLiteral( 
"version" ), QStringLiteral( 
"1.0" ) );
 
  543  doc.appendChild( root );
 
  547  for ( 
int i = 0; i < connections.count(); ++i )
 
  549    path = 
"/PostgreSQL/connections/" + connections[i];
 
  550    QDomElement el = doc.createElement( QStringLiteral( 
"postgis" ) );
 
  551    el.setAttribute( QStringLiteral( 
"name" ), connections[i] );
 
  552    el.setAttribute( QStringLiteral( 
"host" ), settings.
value( path + 
"/host" ).toString() );
 
  553    el.setAttribute( QStringLiteral( 
"port" ), settings.
value( path + 
"/port" ).toString() );
 
  554    el.setAttribute( QStringLiteral( 
"database" ), settings.
value( path + 
"/database" ).toString() );
 
  555    el.setAttribute( QStringLiteral( 
"service" ), settings.
value( path + 
"/service" ).toString() );
 
  556    el.setAttribute( QStringLiteral( 
"sslmode" ), settings.
value( path + 
"/sslmode", 
"1" ).toString() );
 
  557    el.setAttribute( QStringLiteral( 
"estimatedMetadata" ), settings.
value( path + 
"/estimatedMetadata", 
"0" ).toString() );
 
  558    el.setAttribute( QStringLiteral( 
"projectsInDatabase" ), settings.
value( path + 
"/projectsInDatabase", 
"0" ).toString() );
 
  559    el.setAttribute( QStringLiteral( 
"dontResolveType" ), settings.
value( path + 
"/dontResolveType", 
"0" ).toString() );
 
  560    el.setAttribute( QStringLiteral( 
"allowGeometrylessTables" ), settings.
value( path + 
"/allowGeometrylessTables", 
"0" ).toString() );
 
  561    el.setAttribute( QStringLiteral( 
"geometryColumnsOnly" ), settings.
value( path + 
"/geometryColumnsOnly", 
"0" ).toString() );
 
  562    el.setAttribute( QStringLiteral( 
"publicOnly" ), settings.
value( path + 
"/publicOnly", 
"0" ).toString() );
 
  563    el.setAttribute( QStringLiteral( 
"schema" ), settings.
value( path + 
"/schema" ).toString() );
 
  564    el.setAttribute( QStringLiteral( 
"saveUsername" ), settings.
value( path + 
"/saveUsername", 
"false" ).toString() );
 
  566    if ( settings.
value( path + 
"/saveUsername", 
"false" ).toString() == QLatin1String( 
"true" ) )
 
  568      el.setAttribute( QStringLiteral( 
"username" ), settings.
value( path + 
"/username" ).toString() );
 
  571    el.setAttribute( QStringLiteral( 
"savePassword" ), settings.
value( path + 
"/savePassword", 
"false" ).toString() );
 
  573    if ( settings.
value( path + 
"/savePassword", 
"false" ).toString() == QLatin1String( 
"true" ) )
 
  575      el.setAttribute( QStringLiteral( 
"password" ), settings.
value( path + 
"/password" ).toString() );
 
  578    root.appendChild( el );
 
  584QDomDocument QgsManageConnectionsDialog::saveMssqlConnections( 
const QStringList &connections )
 
  586  QDomDocument doc( QStringLiteral( 
"connections" ) );
 
  587  QDomElement root = doc.createElement( QStringLiteral( 
"qgsMssqlConnections" ) );
 
  588  root.setAttribute( QStringLiteral( 
"version" ), QStringLiteral( 
"1.0" ) );
 
  589  doc.appendChild( root );
 
  593  for ( 
int i = 0; i < connections.count(); ++i )
 
  595    path = 
"/MSSQL/connections/" + connections[i];
 
  596    QDomElement el = doc.createElement( QStringLiteral( 
"mssql" ) );
 
  597    el.setAttribute( QStringLiteral( 
"name" ), connections[i] );
 
  598    el.setAttribute( QStringLiteral( 
"host" ), settings.
value( path + 
"/host" ).toString() );
 
  599    el.setAttribute( QStringLiteral( 
"port" ), settings.
value( path + 
"/port" ).toString() );
 
  600    el.setAttribute( QStringLiteral( 
"database" ), settings.
value( path + 
"/database" ).toString() );
 
  601    el.setAttribute( QStringLiteral( 
"service" ), settings.
value( path + 
"/service" ).toString() );
 
  602    el.setAttribute( QStringLiteral( 
"sslmode" ), settings.
value( path + 
"/sslmode", 
"1" ).toString() );
 
  603    el.setAttribute( QStringLiteral( 
"estimatedMetadata" ), settings.
value( path + 
"/estimatedMetadata", 
"0" ).toString() );
 
  605    el.setAttribute( QStringLiteral( 
"saveUsername" ), settings.
value( path + 
"/saveUsername", 
"false" ).toString() );
 
  607    if ( settings.
value( path + 
"/saveUsername", 
"false" ).toString() == QLatin1String( 
"true" ) )
 
  609      el.setAttribute( QStringLiteral( 
"username" ), settings.
value( path + 
"/username" ).toString() );
 
  612    el.setAttribute( QStringLiteral( 
"savePassword" ), settings.
value( path + 
"/savePassword", 
"false" ).toString() );
 
  614    if ( settings.
value( path + 
"/savePassword", 
"false" ).toString() == QLatin1String( 
"true" ) )
 
  616      el.setAttribute( QStringLiteral( 
"password" ), settings.
value( path + 
"/password" ).toString() );
 
  619    root.appendChild( el );
 
  625QDomDocument QgsManageConnectionsDialog::saveOracleConnections( 
const QStringList &connections )
 
  627  QDomDocument doc( QStringLiteral( 
"connections" ) );
 
  628  QDomElement root = doc.createElement( QStringLiteral( 
"qgsOracleConnections" ) );
 
  629  root.setAttribute( QStringLiteral( 
"version" ), QStringLiteral( 
"1.0" ) );
 
  630  doc.appendChild( root );
 
  634  for ( 
int i = 0; i < connections.count(); ++i )
 
  636    path = 
"/Oracle/connections/" + connections[i];
 
  637    QDomElement el = doc.createElement( QStringLiteral( 
"oracle" ) );
 
  638    el.setAttribute( QStringLiteral( 
"name" ), connections[i] );
 
  639    el.setAttribute( QStringLiteral( 
"host" ), settings.
value( path + 
"/host" ).toString() );
 
  640    el.setAttribute( QStringLiteral( 
"port" ), settings.
value( path + 
"/port" ).toString() );
 
  641    el.setAttribute( QStringLiteral( 
"database" ), settings.
value( path + 
"/database" ).toString() );
 
  642    el.setAttribute( QStringLiteral( 
"dboptions" ), settings.
value( path + 
"/dboptions" ).toString() );
 
  643    el.setAttribute( QStringLiteral( 
"dbworkspace" ), settings.
value( path + 
"/dbworkspace" ).toString() );
 
  644    el.setAttribute( QStringLiteral( 
"schema" ), settings.
value( path + 
"/schema" ).toString() );
 
  645    el.setAttribute( QStringLiteral( 
"estimatedMetadata" ), settings.
value( path + 
"/estimatedMetadata", 
"0" ).toString() );
 
  646    el.setAttribute( QStringLiteral( 
"userTablesOnly" ), settings.
value( path + 
"/userTablesOnly", 
"0" ).toString() );
 
  647    el.setAttribute( QStringLiteral( 
"geometryColumnsOnly" ), settings.
value( path + 
"/geometryColumnsOnly", 
"0" ).toString() );
 
  648    el.setAttribute( QStringLiteral( 
"allowGeometrylessTables" ), settings.
value( path + 
"/allowGeometrylessTables", 
"0" ).toString() );
 
  650    el.setAttribute( QStringLiteral( 
"saveUsername" ), settings.
value( path + 
"/saveUsername", 
"false" ).toString() );
 
  652    if ( settings.
value( path + 
"/saveUsername", 
"false" ).toString() == QLatin1String( 
"true" ) )
 
  654      el.setAttribute( QStringLiteral( 
"username" ), settings.
value( path + 
"/username" ).toString() );
 
  657    el.setAttribute( QStringLiteral( 
"savePassword" ), settings.
value( path + 
"/savePassword", 
"false" ).toString() );
 
  659    if ( settings.
value( path + 
"/savePassword", 
"false" ).toString() == QLatin1String( 
"true" ) )
 
  661      el.setAttribute( QStringLiteral( 
"password" ), settings.
value( path + 
"/password" ).toString() );
 
  664    root.appendChild( el );
 
  670QDomDocument QgsManageConnectionsDialog::saveHanaConnections( 
const QStringList &connections )
 
  672  QDomDocument doc( QStringLiteral( 
"connections" ) );
 
  673  QDomElement root = doc.createElement( QStringLiteral( 
"qgsHanaConnections" ) );
 
  674  root.setAttribute( QStringLiteral( 
"version" ), QStringLiteral( 
"1.0" ) );
 
  675  doc.appendChild( root );
 
  679  for ( 
int i = 0; i < connections.count(); ++i )
 
  681    path = 
"/HANA/connections/" + connections[i];
 
  682    QDomElement el = doc.createElement( QStringLiteral( 
"hana" ) );
 
  683    el.setAttribute( QStringLiteral( 
"name" ), connections[i] );
 
  684    el.setAttribute( QStringLiteral( 
"driver" ), settings.
value( path + 
"/driver", QString() ).toString() );
 
  685    el.setAttribute( QStringLiteral( 
"host" ), settings.
value( path + 
"/host", QString() ).toString() );
 
  686    el.setAttribute( QStringLiteral( 
"identifierType" ), settings.
value( path + 
"/identifierType", QString() ).toString() );
 
  687    el.setAttribute( QStringLiteral( 
"identifier" ), settings.
value( path + 
"/identifier", QString() ).toString() );
 
  688    el.setAttribute( QStringLiteral( 
"multitenant" ), settings.
value( path + 
"/multitenant", QString() ).toString() );
 
  689    el.setAttribute( QStringLiteral( 
"database" ), settings.
value( path + 
"/database", QString() ).toString() );
 
  690    el.setAttribute( QStringLiteral( 
"schema" ), settings.
value( path + 
"/schema", QString() ).toString() );
 
  691    el.setAttribute( QStringLiteral( 
"userTablesOnly" ), settings.
value( path + 
"/userTablesOnly", QStringLiteral( 
"0" ) ).toString() );
 
  692    el.setAttribute( QStringLiteral( 
"allowGeometrylessTables" ), settings.
value( path + 
"/allowGeometrylessTables", QStringLiteral( 
"0" ) ).toString() );
 
  694    el.setAttribute( QStringLiteral( 
"saveUsername" ), settings.
value( path + 
"/saveUsername", QStringLiteral( 
"false" ) ).toString() );
 
  695    if ( settings.
value( path + 
"/saveUsername", 
"false" ).toString() == QLatin1String( 
"true" ) )
 
  697      el.setAttribute( QStringLiteral( 
"username" ), settings.
value( path + 
"/username", QString() ).toString() );
 
  700    el.setAttribute( QStringLiteral( 
"savePassword" ), settings.
value( path + 
"/savePassword", QStringLiteral( 
"false" ) ).toString() );
 
  701    if ( settings.
value( path + 
"/savePassword", 
"false" ).toString() == QLatin1String( 
"true" ) )
 
  703      el.setAttribute( QStringLiteral( 
"password" ), settings.
value( path + 
"/password", QString() ).toString() );
 
  706    el.setAttribute( QStringLiteral( 
"sslEnabled" ), settings.
value( path + 
"/sslEnabled", QStringLiteral( 
"false" ) ).toString() );
 
  707    el.setAttribute( QStringLiteral( 
"sslCryptoProvider" ), settings.
value( path + 
"/sslCryptoProvider", QStringLiteral( 
"openssl" ) ).toString() );
 
  708    el.setAttribute( QStringLiteral( 
"sslKeyStore" ), settings.
value( path + 
"/sslKeyStore", QString() ).toString() );
 
  709    el.setAttribute( QStringLiteral( 
"sslTrustStore" ), settings.
value( path + 
"/sslTrustStore", QString() ).toString() );
 
  710    el.setAttribute( QStringLiteral( 
"sslValidateCertificate" ), settings.
value( path + 
"/sslValidateCertificate", QStringLiteral( 
"false" ) ).toString() );
 
  711    el.setAttribute( QStringLiteral( 
"sslHostNameInCertificate" ), settings.
value( path + 
"/sslHostNameInCertificate", QString() ).toString() );
 
  713    root.appendChild( el );
 
  719QDomDocument QgsManageConnectionsDialog::saveXyzTilesConnections( 
const QStringList &connections )
 
  721  QDomDocument doc( QStringLiteral( 
"connections" ) );
 
  722  QDomElement root = doc.createElement( QStringLiteral( 
"qgsXYZTilesConnections" ) );
 
  723  root.setAttribute( QStringLiteral( 
"version" ), QStringLiteral( 
"1.0" ) );
 
  724  doc.appendChild( root );
 
  726  QMap<QString, QString> namespaceDeclarations;
 
  727  for ( 
int i = 0; i < connections.count(); ++i )
 
  729    QDomElement el = doc.createElement( QStringLiteral( 
"xyztiles" ) );
 
  731    el.setAttribute( QStringLiteral( 
"name" ), connections[i] );
 
  741    httpHeader.updateDomElement( el, namespaceDeclarations );
 
  743    root.appendChild( el );
 
  746  addNamespaceDeclarations( root, namespaceDeclarations );
 
  751QDomDocument QgsManageConnectionsDialog::saveArcgisConnections( 
const QStringList &connections )
 
  753  QDomDocument doc( QStringLiteral( 
"connections" ) );
 
  754  QDomElement root = doc.createElement( 
"qgsARCGISFEATURESERVERConnections" );
 
  755  root.setAttribute( QStringLiteral( 
"version" ), QStringLiteral( 
"1.0" ) );
 
  756  doc.appendChild( root );
 
  758  QMap<QString, QString> namespaceDeclarations;
 
  759  for ( 
const QString &connection : connections )
 
  761    QDomElement el = doc.createElement( QStringLiteral( 
"arcgisfeatureserver" ) );
 
  762    el.setAttribute( QStringLiteral( 
"name" ), connection );
 
  766    httpHeader.updateDomElement( el, namespaceDeclarations );
 
  772    root.appendChild( el );
 
  775  addNamespaceDeclarations( root, namespaceDeclarations );
 
  780QDomDocument QgsManageConnectionsDialog::saveVectorTileConnections( 
const QStringList &connections )
 
  782  QDomDocument doc( QStringLiteral( 
"connections" ) );
 
  783  QDomElement root = doc.createElement( QStringLiteral( 
"qgsVectorTileConnections" ) );
 
  784  root.setAttribute( QStringLiteral( 
"version" ), QStringLiteral( 
"1.0" ) );
 
  785  doc.appendChild( root );
 
  787  QMap<QString, QString> namespaceDeclarations;
 
  788  for ( 
int i = 0; i < connections.count(); ++i )
 
  790    QDomElement el = doc.createElement( QStringLiteral( 
"vectortile" ) );
 
  792    el.setAttribute( QStringLiteral( 
"name" ), connections[i] );
 
  793    el.setAttribute( QStringLiteral( 
"url" ), QgsVectorTileProviderConnection::settingsUrl->value( connections[i] ) );
 
  794    el.setAttribute( QStringLiteral( 
"zmin" ), QgsVectorTileProviderConnection::settingsZmin->value( connections[i] ) );
 
  795    el.setAttribute( QStringLiteral( 
"zmax" ), QgsVectorTileProviderConnection::settingsZmax->value( connections[i] ) );
 
  796    el.setAttribute( QStringLiteral( 
"serviceType" ), QgsVectorTileProviderConnection::settingsServiceType->value( connections[i] ) );
 
  797    el.setAttribute( QStringLiteral( 
"authcfg" ), QgsVectorTileProviderConnection::settingsAuthcfg->value( connections[i] ) );
 
  798    el.setAttribute( QStringLiteral( 
"username" ), QgsVectorTileProviderConnection::settingsUsername->value( connections[i] ) );
 
  799    el.setAttribute( QStringLiteral( 
"password" ), QgsVectorTileProviderConnection::settingsPassword->value( connections[i] ) );
 
  800    el.setAttribute( QStringLiteral( 
"styleUrl" ), QgsVectorTileProviderConnection::settingsStyleUrl->value( connections[i] ) );
 
  802    QgsHttpHeaders httpHeader( QgsVectorTileProviderConnection::settingsHeaders->value( connections[i] ) );
 
  803    httpHeader.updateDomElement( el, namespaceDeclarations );
 
  805    root.appendChild( el );
 
  808  addNamespaceDeclarations( root, namespaceDeclarations );
 
  813QDomDocument QgsManageConnectionsDialog::saveTiledSceneConnections( 
const QStringList &connections )
 
  815  QDomDocument doc( QStringLiteral( 
"connections" ) );
 
  816  QDomElement root = doc.createElement( QStringLiteral( 
"qgsTiledSceneConnections" ) );
 
  817  root.setAttribute( QStringLiteral( 
"version" ), QStringLiteral( 
"1.0" ) );
 
  818  doc.appendChild( root );
 
  820  QMap<QString, QString> namespaceDeclarations;
 
  821  for ( 
int i = 0; i < connections.count(); ++i )
 
  823    QDomElement el = doc.createElement( QStringLiteral( 
"tiledscene" ) );
 
  825    el.setAttribute( QStringLiteral( 
"name" ), connections[i] );
 
  826    el.setAttribute( QStringLiteral( 
"provider" ), QgsTiledSceneProviderConnection::settingsProvider->value( connections[i] ) );
 
  827    el.setAttribute( QStringLiteral( 
"url" ), QgsTiledSceneProviderConnection::settingsUrl->value( connections[i] ) );
 
  828    el.setAttribute( QStringLiteral( 
"authcfg" ), QgsTiledSceneProviderConnection::settingsAuthcfg->value( connections[i] ) );
 
  829    el.setAttribute( QStringLiteral( 
"username" ), QgsTiledSceneProviderConnection::settingsUsername->value( connections[i] ) );
 
  830    el.setAttribute( QStringLiteral( 
"password" ), QgsTiledSceneProviderConnection::settingsPassword->value( connections[i] ) );
 
  832    QgsHttpHeaders httpHeader( QgsTiledSceneProviderConnection::settingsHeaders->value( connections[i] ) );
 
  833    httpHeader.updateDomElement( el, namespaceDeclarations );
 
  835    root.appendChild( el );
 
  838  addNamespaceDeclarations( root, namespaceDeclarations );
 
  843QDomDocument QgsManageConnectionsDialog::saveSensorThingsConnections( 
const QStringList &connections )
 
  845  QDomDocument doc( QStringLiteral( 
"connections" ) );
 
  846  QDomElement root = doc.createElement( QStringLiteral( 
"qgsSensorThingsConnections" ) );
 
  847  root.setAttribute( QStringLiteral( 
"version" ), QStringLiteral( 
"1.0" ) );
 
  848  doc.appendChild( root );
 
  850  QMap<QString, QString> namespaceDeclarations;
 
  851  for ( 
int i = 0; i < connections.count(); ++i )
 
  853    QDomElement el = doc.createElement( QStringLiteral( 
"sensorthings" ) );
 
  855    el.setAttribute( QStringLiteral( 
"name" ), connections[i] );
 
  856    el.setAttribute( QStringLiteral( 
"url" ), QgsSensorThingsProviderConnection::settingsUrl->value( connections[i] ) );
 
  857    el.setAttribute( QStringLiteral( 
"authcfg" ), QgsSensorThingsProviderConnection::settingsAuthcfg->value( connections[i] ) );
 
  858    el.setAttribute( QStringLiteral( 
"username" ), QgsSensorThingsProviderConnection::settingsUsername->value( connections[i] ) );
 
  859    el.setAttribute( QStringLiteral( 
"password" ), QgsSensorThingsProviderConnection::settingsPassword->value( connections[i] ) );
 
  861    QgsHttpHeaders httpHeader( QgsTiledSceneProviderConnection::settingsHeaders->value( connections[i] ) );
 
  862    httpHeader.updateDomElement( el, namespaceDeclarations );
 
  864    root.appendChild( el );
 
  867  addNamespaceDeclarations( root, namespaceDeclarations );
 
  873QDomDocument QgsManageConnectionsDialog::saveCloudStorageConnections( 
const QStringList &connections )
 
  875  QDomDocument doc( QStringLiteral( 
"connections" ) );
 
  876  QDomElement root = doc.createElement( QStringLiteral( 
"qgsCloudStorageConnections" ) );
 
  877  root.setAttribute( QStringLiteral( 
"version" ), QStringLiteral( 
"1.0" ) );
 
  878  doc.appendChild( root );
 
  880  for ( 
int i = 0; i < connections.count(); ++i )
 
  882    QDomElement el = doc.createElement( QStringLiteral( 
"cloudstorage" ) );
 
  884    el.setAttribute( QStringLiteral( 
"name" ), connections[i] );
 
  885    el.setAttribute( QStringLiteral( 
"handler" ), QgsGdalCloudProviderConnection::settingsVsiHandler->value( connections[i] ) );
 
  886    el.setAttribute( QStringLiteral( 
"container" ), QgsGdalCloudProviderConnection::settingsContainer->value( connections[i] ) );
 
  887    el.setAttribute( QStringLiteral( 
"path" ), QgsGdalCloudProviderConnection::settingsPath->value( connections[i] ) );
 
  889    const QVariantMap credentialOptions = QgsGdalCloudProviderConnection::settingsCredentialOptions->value( connections[i] );
 
  890    QString credentialString;
 
  891    for ( 
auto it = credentialOptions.constBegin(); it != credentialOptions.constEnd(); ++it )
 
  893      if ( !it.value().toString().isEmpty() )
 
  895        credentialString += QStringLiteral( 
"|credential:%1=%2" ).arg( it.key(), it.value().toString() );
 
  898    el.setAttribute( QStringLiteral( 
"credentials" ), credentialString );
 
  900    root.appendChild( el );
 
  906QDomDocument QgsManageConnectionsDialog::saveStacConnections( 
const QStringList &connections )
 
  908  QDomDocument doc( QStringLiteral( 
"connections" ) );
 
  909  QDomElement root = doc.createElement( QStringLiteral( 
"qgsStacConnections" ) );
 
  910  root.setAttribute( QStringLiteral( 
"version" ), QStringLiteral( 
"1.0" ) );
 
  911  doc.appendChild( root );
 
  913  QMap<QString, QString> namespaceDeclarations;
 
  914  for ( 
int i = 0; i < connections.count(); ++i )
 
  916    QDomElement el = doc.createElement( QStringLiteral( 
"stac" ) );
 
  918    el.setAttribute( QStringLiteral( 
"name" ), connections[i] );
 
  919    el.setAttribute( QStringLiteral( 
"url" ), QgsStacConnection::settingsUrl->value( connections[i] ) );
 
  920    el.setAttribute( QStringLiteral( 
"authcfg" ), QgsStacConnection::settingsAuthcfg->value( connections[i] ) );
 
  921    el.setAttribute( QStringLiteral( 
"username" ), QgsStacConnection::settingsUsername->value( connections[i] ) );
 
  922    el.setAttribute( QStringLiteral( 
"password" ), QgsStacConnection::settingsPassword->value( connections[i] ) );
 
  924    QgsHttpHeaders httpHeader( QgsStacConnection::settingsHeaders->value( connections[i] ) );
 
  925    httpHeader.updateDomElement( el, namespaceDeclarations );
 
  927    root.appendChild( el );
 
  930  addNamespaceDeclarations( root, namespaceDeclarations );
 
  935void QgsManageConnectionsDialog::loadOWSConnections( 
const QDomDocument &doc, 
const QStringList &items, 
const QString &service )
 
  937  const QDomElement root = doc.documentElement();
 
  938  if ( root.tagName() != 
"qgs" + service.toUpper() + 
"Connections" )
 
  940    QMessageBox::information( 
this, tr( 
"Loading Connections" ), tr( 
"The file is not a %1 connections exchange file." ).arg( service ) );
 
  944  QString connectionName;
 
  946  QDomElement child = root.firstChildElement();
 
  948  bool overwrite = 
true;
 
  950  while ( !child.isNull() )
 
  952    connectionName = child.attribute( QStringLiteral( 
"name" ) );
 
  953    if ( !items.contains( connectionName ) )
 
  955      child = child.nextSiblingElement();
 
  962      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 );
 
  966        case QMessageBox::Cancel:
 
  968        case QMessageBox::No:
 
  969          child = child.nextSiblingElement();
 
  971        case QMessageBox::Yes:
 
  974        case QMessageBox::YesToAll:
 
  978        case QMessageBox::NoToAll:
 
  987      child = child.nextSiblingElement();
 
 1003    if ( !child.attribute( QStringLiteral( 
"username" ) ).isEmpty() )
 
 1008    child = child.nextSiblingElement();
 
 1012void QgsManageConnectionsDialog::loadWfsConnections( 
const QDomDocument &doc, 
const QStringList &items )
 
 1014  const QDomElement root = doc.documentElement();
 
 1015  if ( root.tagName() != QLatin1String( 
"qgsWFSConnections" ) )
 
 1017    QMessageBox::information( 
this, tr( 
"Loading Connections" ), tr( 
"The file is not a WFS connections exchange file." ) );
 
 1021  QString connectionName;
 
 1024  QDomElement child = root.firstChildElement();
 
 1026  bool overwrite = 
true;
 
 1028  while ( !child.isNull() )
 
 1030    connectionName = child.attribute( QStringLiteral( 
"name" ) );
 
 1031    if ( !items.contains( connectionName ) )
 
 1033      child = child.nextSiblingElement();
 
 1038    if ( keys.contains( connectionName ) && prompt )
 
 1040      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 );
 
 1044        case QMessageBox::Cancel:
 
 1046        case QMessageBox::No:
 
 1047          child = child.nextSiblingElement();
 
 1049        case QMessageBox::Yes:
 
 1052        case QMessageBox::YesToAll:
 
 1056        case QMessageBox::NoToAll:
 
 1063    if ( keys.contains( connectionName ) )
 
 1067        child = child.nextSiblingElement();
 
 1073      keys << connectionName;
 
 1088    if ( !child.attribute( QStringLiteral( 
"username" ) ).isEmpty() )
 
 1093    child = child.nextSiblingElement();
 
 1097void QgsManageConnectionsDialog::loadPgConnections( 
const QDomDocument &doc, 
const QStringList &items )
 
 1099  const QDomElement root = doc.documentElement();
 
 1100  if ( root.tagName() != QLatin1String( 
"qgsPgConnections" ) )
 
 1102    QMessageBox::information( 
this, tr( 
"Loading Connections" ), tr( 
"The file is not a PostGIS connections exchange file." ) );
 
 1106  QString connectionName;
 
 1108  settings.
beginGroup( QStringLiteral( 
"/PostgreSQL/connections" ) );
 
 1111  QDomElement child = root.firstChildElement();
 
 1113  bool overwrite = 
true;
 
 1115  while ( !child.isNull() )
 
 1117    connectionName = child.attribute( QStringLiteral( 
"name" ) );
 
 1118    if ( !items.contains( connectionName ) )
 
 1120      child = child.nextSiblingElement();
 
 1125    if ( keys.contains( connectionName ) && prompt )
 
 1127      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 );
 
 1130        case QMessageBox::Cancel:
 
 1132        case QMessageBox::No:
 
 1133          child = child.nextSiblingElement();
 
 1135        case QMessageBox::Yes:
 
 1138        case QMessageBox::YesToAll:
 
 1142        case QMessageBox::NoToAll:
 
 1149    if ( keys.contains( connectionName ) )
 
 1153        child = child.nextSiblingElement();
 
 1159      keys << connectionName;
 
 1163    settings.
beginGroup( 
"/PostgreSQL/connections/" + connectionName );
 
 1165    settings.
setValue( QStringLiteral( 
"/host" ), child.attribute( QStringLiteral( 
"host" ) ) );
 
 1166    settings.
setValue( QStringLiteral( 
"/port" ), child.attribute( QStringLiteral( 
"port" ) ) );
 
 1167    settings.
setValue( QStringLiteral( 
"/database" ), child.attribute( QStringLiteral( 
"database" ) ) );
 
 1168    if ( child.hasAttribute( QStringLiteral( 
"service" ) ) )
 
 1170      settings.
setValue( QStringLiteral( 
"/service" ), child.attribute( QStringLiteral( 
"service" ) ) );
 
 1174      settings.
setValue( QStringLiteral( 
"/service" ), 
"" );
 
 1176    settings.
setValue( QStringLiteral( 
"/sslmode" ), child.attribute( QStringLiteral( 
"sslmode" ) ) );
 
 1177    settings.
setValue( QStringLiteral( 
"/estimatedMetadata" ), child.attribute( QStringLiteral( 
"estimatedMetadata" ) ) );
 
 1178    settings.
setValue( QStringLiteral( 
"/projectsInDatabase" ), child.attribute( QStringLiteral( 
"projectsInDatabase" ), 0 ) );
 
 1179    settings.
setValue( QStringLiteral( 
"/dontResolveType" ), child.attribute( QStringLiteral( 
"dontResolveType" ), 0 ) );
 
 1180    settings.
setValue( QStringLiteral( 
"/allowGeometrylessTables" ), child.attribute( QStringLiteral( 
"allowGeometrylessTables" ), 0 ) );
 
 1181    settings.
setValue( QStringLiteral( 
"/geometryColumnsOnly" ), child.attribute( QStringLiteral( 
"geometryColumnsOnly" ), 0 ) );
 
 1182    settings.
setValue( QStringLiteral( 
"/publicOnly" ), child.attribute( QStringLiteral( 
"publicOnly" ), 0 ) );
 
 1183    settings.
setValue( QStringLiteral( 
"/saveUsername" ), child.attribute( QStringLiteral( 
"saveUsername" ) ) );
 
 1184    settings.
setValue( QStringLiteral( 
"/username" ), child.attribute( QStringLiteral( 
"username" ) ) );
 
 1185    settings.
setValue( QStringLiteral( 
"/savePassword" ), child.attribute( QStringLiteral( 
"savePassword" ) ) );
 
 1186    settings.
setValue( QStringLiteral( 
"/password" ), child.attribute( QStringLiteral( 
"password" ) ) );
 
 1187    settings.
setValue( QStringLiteral( 
"/schema" ), child.attribute( QStringLiteral( 
"schema" ) ) );
 
 1190    child = child.nextSiblingElement();
 
 1194void QgsManageConnectionsDialog::loadMssqlConnections( 
const QDomDocument &doc, 
const QStringList &items )
 
 1196  const QDomElement root = doc.documentElement();
 
 1197  if ( root.tagName() != QLatin1String( 
"qgsMssqlConnections" ) )
 
 1199    QMessageBox::information( 
this, tr( 
"Loading Connections" ), tr( 
"The file is not a MS SQL Server connections exchange file." ) );
 
 1203  QString connectionName;
 
 1205  settings.
beginGroup( QStringLiteral( 
"/MSSQL/connections" ) );
 
 1208  QDomElement child = root.firstChildElement();
 
 1210  bool overwrite = 
true;
 
 1212  while ( !child.isNull() )
 
 1214    connectionName = child.attribute( QStringLiteral( 
"name" ) );
 
 1215    if ( !items.contains( connectionName ) )
 
 1217      child = child.nextSiblingElement();
 
 1222    if ( keys.contains( connectionName ) && prompt )
 
 1224      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 );
 
 1227        case QMessageBox::Cancel:
 
 1229        case QMessageBox::No:
 
 1230          child = child.nextSiblingElement();
 
 1232        case QMessageBox::Yes:
 
 1235        case QMessageBox::YesToAll:
 
 1239        case QMessageBox::NoToAll:
 
 1246    if ( keys.contains( connectionName ) )
 
 1250        child = child.nextSiblingElement();
 
 1256      keys << connectionName;
 
 1260    settings.
beginGroup( 
"/MSSQL/connections/" + connectionName );
 
 1262    settings.
setValue( QStringLiteral( 
"/host" ), child.attribute( QStringLiteral( 
"host" ) ) );
 
 1263    settings.
setValue( QStringLiteral( 
"/port" ), child.attribute( QStringLiteral( 
"port" ) ) );
 
 1264    settings.
setValue( QStringLiteral( 
"/database" ), child.attribute( QStringLiteral( 
"database" ) ) );
 
 1265    if ( child.hasAttribute( QStringLiteral( 
"service" ) ) )
 
 1267      settings.
setValue( QStringLiteral( 
"/service" ), child.attribute( QStringLiteral( 
"service" ) ) );
 
 1271      settings.
setValue( QStringLiteral( 
"/service" ), 
"" );
 
 1273    settings.
setValue( QStringLiteral( 
"/sslmode" ), child.attribute( QStringLiteral( 
"sslmode" ) ) );
 
 1274    settings.
setValue( QStringLiteral( 
"/estimatedMetadata" ), child.attribute( QStringLiteral( 
"estimatedMetadata" ) ) );
 
 1275    settings.
setValue( QStringLiteral( 
"/saveUsername" ), child.attribute( QStringLiteral( 
"saveUsername" ) ) );
 
 1276    settings.
setValue( QStringLiteral( 
"/username" ), child.attribute( QStringLiteral( 
"username" ) ) );
 
 1277    settings.
setValue( QStringLiteral( 
"/savePassword" ), child.attribute( QStringLiteral( 
"savePassword" ) ) );
 
 1278    settings.
setValue( QStringLiteral( 
"/password" ), child.attribute( QStringLiteral( 
"password" ) ) );
 
 1281    child = child.nextSiblingElement();
 
 1285void QgsManageConnectionsDialog::loadOracleConnections( 
const QDomDocument &doc, 
const QStringList &items )
 
 1287  const QDomElement root = doc.documentElement();
 
 1288  if ( root.tagName() != QLatin1String( 
"qgsOracleConnections" ) )
 
 1290    QMessageBox::information( 
this, tr( 
"Loading Connections" ), tr( 
"The file is not an Oracle connections exchange file." ) );
 
 1294  QString connectionName;
 
 1296  settings.
beginGroup( QStringLiteral( 
"/Oracle/connections" ) );
 
 1299  QDomElement child = root.firstChildElement();
 
 1301  bool overwrite = 
true;
 
 1303  while ( !child.isNull() )
 
 1305    connectionName = child.attribute( QStringLiteral( 
"name" ) );
 
 1306    if ( !items.contains( connectionName ) )
 
 1308      child = child.nextSiblingElement();
 
 1313    if ( keys.contains( connectionName ) && prompt )
 
 1315      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 );
 
 1318        case QMessageBox::Cancel:
 
 1320        case QMessageBox::No:
 
 1321          child = child.nextSiblingElement();
 
 1323        case QMessageBox::Yes:
 
 1326        case QMessageBox::YesToAll:
 
 1330        case QMessageBox::NoToAll:
 
 1337    if ( keys.contains( connectionName ) )
 
 1341        child = child.nextSiblingElement();
 
 1347      keys << connectionName;
 
 1351    settings.
beginGroup( 
"/Oracle/connections/" + connectionName );
 
 1353    settings.
setValue( QStringLiteral( 
"/host" ), child.attribute( QStringLiteral( 
"host" ) ) );
 
 1354    settings.
setValue( QStringLiteral( 
"/port" ), child.attribute( QStringLiteral( 
"port" ) ) );
 
 1355    settings.
setValue( QStringLiteral( 
"/database" ), child.attribute( QStringLiteral( 
"database" ) ) );
 
 1356    settings.
setValue( QStringLiteral( 
"/dboptions" ), child.attribute( QStringLiteral( 
"dboptions" ) ) );
 
 1357    settings.
setValue( QStringLiteral( 
"/dbworkspace" ), child.attribute( QStringLiteral( 
"dbworkspace" ) ) );
 
 1358    settings.
setValue( QStringLiteral( 
"/schema" ), child.attribute( QStringLiteral( 
"schema" ) ) );
 
 1359    settings.
setValue( QStringLiteral( 
"/estimatedMetadata" ), child.attribute( QStringLiteral( 
"estimatedMetadata" ) ) );
 
 1360    settings.
setValue( QStringLiteral( 
"/userTablesOnly" ), child.attribute( QStringLiteral( 
"userTablesOnly" ) ) );
 
 1361    settings.
setValue( QStringLiteral( 
"/geometryColumnsOnly" ), child.attribute( QStringLiteral( 
"geometryColumnsOnly" ) ) );
 
 1362    settings.
setValue( QStringLiteral( 
"/allowGeometrylessTables" ), child.attribute( QStringLiteral( 
"allowGeometrylessTables" ) ) );
 
 1363    settings.
setValue( QStringLiteral( 
"/saveUsername" ), child.attribute( QStringLiteral( 
"saveUsername" ) ) );
 
 1364    settings.
setValue( QStringLiteral( 
"/username" ), child.attribute( QStringLiteral( 
"username" ) ) );
 
 1365    settings.
setValue( QStringLiteral( 
"/savePassword" ), child.attribute( QStringLiteral( 
"savePassword" ) ) );
 
 1366    settings.
setValue( QStringLiteral( 
"/password" ), child.attribute( QStringLiteral( 
"password" ) ) );
 
 1369    child = child.nextSiblingElement();
 
 1373void QgsManageConnectionsDialog::loadHanaConnections( 
const QDomDocument &doc, 
const QStringList &items )
 
 1375  QDomElement root = doc.documentElement();
 
 1376  if ( root.tagName() != QLatin1String( 
"qgsHanaConnections" ) )
 
 1378    QMessageBox::warning( 
this, tr( 
"Loading Connections" ), tr( 
"The file is not a HANA connections exchange file." ) );
 
 1382  const QDomAttr version = root.attributeNode( 
"version" );
 
 1383  if ( version.value() != QLatin1String( 
"1.0" ) )
 
 1385    QMessageBox::warning( 
this, tr( 
"Loading Connections" ), tr( 
"The HANA connections exchange file version '%1' is not supported." ).arg( version.value() ) );
 
 1390  settings.
beginGroup( QStringLiteral( 
"/HANA/connections" ) );
 
 1393  QDomElement child = root.firstChildElement();
 
 1395  bool overwrite = 
true;
 
 1397  while ( !child.isNull() )
 
 1399    const QString connectionName = child.attribute( QStringLiteral( 
"name" ) );
 
 1400    if ( !items.contains( connectionName ) )
 
 1402      child = child.nextSiblingElement();
 
 1407    if ( keys.contains( connectionName ) && prompt )
 
 1409      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 );
 
 1412        case QMessageBox::Cancel:
 
 1414        case QMessageBox::No:
 
 1415          child = child.nextSiblingElement();
 
 1417        case QMessageBox::Yes:
 
 1420        case QMessageBox::YesToAll:
 
 1424        case QMessageBox::NoToAll:
 
 1431    if ( keys.contains( connectionName ) )
 
 1435        child = child.nextSiblingElement();
 
 1441      keys << connectionName;
 
 1445    settings.
beginGroup( 
"/HANA/connections/" + connectionName );
 
 1447    for ( 
const QString param :
 
 1448          { 
"driver", 
"host", 
"database", 
"identifierType", 
"identifier", 
"multitenant", 
"schema", 
"userTablesOnly",
 
 1449            "allowGeometrylessTables", 
"saveUsername", 
"username", 
"savePassword", 
"password", 
"sslEnabled",
 
 1450            "sslCryptoProvider", 
"sslKeyStore", 
"sslTrustStore", 
"sslValidateCertificate", 
"sslHostNameInCertificate" 
 1452      settings.
setValue( QStringLiteral( 
"/" ) + param, child.attribute( param ) );
 
 1456    child = child.nextSiblingElement();
 
 1460void QgsManageConnectionsDialog::loadXyzTilesConnections( 
const QDomDocument &doc, 
const QStringList &items )
 
 1462  const QDomElement root = doc.documentElement();
 
 1463  if ( root.tagName() != QLatin1String( 
"qgsXYZTilesConnections" ) )
 
 1465    QMessageBox::information( 
this, tr( 
"Loading Connections" ), tr( 
"The file is not a XYZ Tiles connections exchange file." ) );
 
 1469  QString connectionName;
 
 1471  QDomElement child = root.firstChildElement();
 
 1473  bool overwrite = 
true;
 
 1475  while ( !child.isNull() )
 
 1477    connectionName = child.attribute( QStringLiteral( 
"name" ) );
 
 1478    if ( !items.contains( connectionName ) )
 
 1480      child = child.nextSiblingElement();
 
 1485    if ( keys.contains( connectionName ) && prompt )
 
 1487      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 );
 
 1491        case QMessageBox::Cancel:
 
 1493        case QMessageBox::No:
 
 1494          child = child.nextSiblingElement();
 
 1496        case QMessageBox::Yes:
 
 1499        case QMessageBox::YesToAll:
 
 1503        case QMessageBox::NoToAll:
 
 1510    if ( keys.contains( connectionName ) )
 
 1514        child = child.nextSiblingElement();
 
 1520      keys << connectionName;
 
 1535    child = child.nextSiblingElement();
 
 1539void QgsManageConnectionsDialog::loadArcgisConnections( 
const QDomDocument &doc, 
const QStringList &items, 
const QString &service )
 
 1541  const QDomElement root = doc.documentElement();
 
 1542  if ( root.tagName() != 
"qgs" + service.toUpper() + 
"Connections" )
 
 1544    QMessageBox::information( 
this, tr( 
"Loading Connections" ), tr( 
"The file is not a %1 connections exchange file." ).arg( service ) );
 
 1548  QString connectionName;
 
 1550  QDomElement child = root.firstChildElement();
 
 1552  bool overwrite = 
true;
 
 1554  while ( !child.isNull() )
 
 1556    connectionName = child.attribute( QStringLiteral( 
"name" ) );
 
 1557    if ( !items.contains( connectionName ) )
 
 1559      child = child.nextSiblingElement();
 
 1564    if ( keys.contains( connectionName ) && prompt )
 
 1566      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 );
 
 1570        case QMessageBox::Cancel:
 
 1572        case QMessageBox::No:
 
 1573          child = child.nextSiblingElement();
 
 1575        case QMessageBox::Yes:
 
 1578        case QMessageBox::YesToAll:
 
 1582        case QMessageBox::NoToAll:
 
 1589    if ( keys.contains( connectionName ) )
 
 1593        child = child.nextSiblingElement();
 
 1599      keys << connectionName;
 
 1612    child = child.nextSiblingElement();
 
 1616void QgsManageConnectionsDialog::loadVectorTileConnections( 
const QDomDocument &doc, 
const QStringList &items )
 
 1618  const QDomElement root = doc.documentElement();
 
 1619  if ( root.tagName() != QLatin1String( 
"qgsVectorTileConnections" ) )
 
 1621    QMessageBox::information( 
this, tr( 
"Loading Connections" ), tr( 
"The file is not a Vector Tile connections exchange file." ) );
 
 1625  QString connectionName;
 
 1627  settings.
beginGroup( QStringLiteral( 
"/qgis/connections-vector-tile" ) );
 
 1630  QDomElement child = root.firstChildElement();
 
 1632  bool overwrite = 
true;
 
 1634  while ( !child.isNull() )
 
 1636    connectionName = child.attribute( QStringLiteral( 
"name" ) );
 
 1637    if ( !items.contains( connectionName ) )
 
 1639      child = child.nextSiblingElement();
 
 1644    if ( keys.contains( connectionName ) && prompt )
 
 1646      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 );
 
 1650        case QMessageBox::Cancel:
 
 1652        case QMessageBox::No:
 
 1653          child = child.nextSiblingElement();
 
 1655        case QMessageBox::Yes:
 
 1658        case QMessageBox::YesToAll:
 
 1662        case QMessageBox::NoToAll:
 
 1669    if ( keys.contains( connectionName ) )
 
 1673        child = child.nextSiblingElement();
 
 1679      keys << connectionName;
 
 1682    QgsVectorTileProviderConnection::settingsUrl->setValue( child.attribute( QStringLiteral( 
"url" ) ), connectionName );
 
 1683    QgsVectorTileProviderConnection::settingsZmin->setValue( child.attribute( QStringLiteral( 
"zmin" ) ).toInt(), connectionName );
 
 1684    QgsVectorTileProviderConnection::settingsZmax->setValue( child.attribute( QStringLiteral( 
"zmax" ) ).toInt(), connectionName );
 
 1685    QgsVectorTileProviderConnection::settingsServiceType->setValue( child.attribute( QStringLiteral( 
"serviceType" ) ), connectionName );
 
 1686    QgsVectorTileProviderConnection::settingsAuthcfg->setValue( child.attribute( QStringLiteral( 
"authcfg" ) ), connectionName );
 
 1687    QgsVectorTileProviderConnection::settingsUsername->setValue( child.attribute( QStringLiteral( 
"username" ) ), connectionName );
 
 1688    QgsVectorTileProviderConnection::settingsPassword->setValue( child.attribute( QStringLiteral( 
"password" ) ), connectionName );
 
 1689    QgsVectorTileProviderConnection::settingsStyleUrl->setValue( child.attribute( QStringLiteral( 
"styleUrl" ) ), connectionName );
 
 1692    QgsVectorTileProviderConnection::settingsHeaders->setValue( httpHeader.headers(), connectionName );
 
 1694    child = child.nextSiblingElement();
 
 1698void QgsManageConnectionsDialog::loadTiledSceneConnections( 
const QDomDocument &doc, 
const QStringList &items )
 
 1700  const QDomElement root = doc.documentElement();
 
 1701  if ( root.tagName() != QLatin1String( 
"qgsTiledSceneConnections" ) )
 
 1703    QMessageBox::information( 
this, tr( 
"Loading Connections" ), tr( 
"The file is not a tiled scene connections exchange file." ) );
 
 1707  QString connectionName;
 
 1709  settings.
beginGroup( QStringLiteral( 
"/qgis/connections-tiled-scene" ) );
 
 1712  QDomElement child = root.firstChildElement();
 
 1714  bool overwrite = 
true;
 
 1716  while ( !child.isNull() )
 
 1718    connectionName = child.attribute( QStringLiteral( 
"name" ) );
 
 1719    if ( !items.contains( connectionName ) )
 
 1721      child = child.nextSiblingElement();
 
 1726    if ( keys.contains( connectionName ) && prompt )
 
 1728      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 );
 
 1732        case QMessageBox::Cancel:
 
 1734        case QMessageBox::No:
 
 1735          child = child.nextSiblingElement();
 
 1737        case QMessageBox::Yes:
 
 1740        case QMessageBox::YesToAll:
 
 1744        case QMessageBox::NoToAll:
 
 1751    if ( keys.contains( connectionName ) )
 
 1755        child = child.nextSiblingElement();
 
 1761      keys << connectionName;
 
 1764    QgsTiledSceneProviderConnection::settingsProvider->setValue( child.attribute( QStringLiteral( 
"provider" ) ), connectionName );
 
 1765    QgsTiledSceneProviderConnection::settingsUrl->setValue( child.attribute( QStringLiteral( 
"url" ) ), connectionName );
 
 1766    QgsTiledSceneProviderConnection::settingsAuthcfg->setValue( child.attribute( QStringLiteral( 
"authcfg" ) ), connectionName );
 
 1767    QgsTiledSceneProviderConnection::settingsUsername->setValue( child.attribute( QStringLiteral( 
"username" ) ), connectionName );
 
 1768    QgsTiledSceneProviderConnection::settingsPassword->setValue( child.attribute( QStringLiteral( 
"password" ) ), connectionName );
 
 1771    QgsTiledSceneProviderConnection::settingsHeaders->setValue( httpHeader.headers(), connectionName );
 
 1773    child = child.nextSiblingElement();
 
 1777void QgsManageConnectionsDialog::loadSensorThingsConnections( 
const QDomDocument &doc, 
const QStringList &items )
 
 1779  const QDomElement root = doc.documentElement();
 
 1780  if ( root.tagName() != QLatin1String( 
"qgsSensorThingsConnections" ) )
 
 1782    QMessageBox::information( 
this, tr( 
"Loading Connections" ), tr( 
"The file is not a SensorThings connections exchange file." ) );
 
 1786  QString connectionName;
 
 1788  settings.
beginGroup( QStringLiteral( 
"/connections/sensorthings/items" ) );
 
 1791  QDomElement child = root.firstChildElement();
 
 1793  bool overwrite = 
true;
 
 1795  while ( !child.isNull() )
 
 1797    connectionName = child.attribute( QStringLiteral( 
"name" ) );
 
 1798    if ( !items.contains( connectionName ) )
 
 1800      child = child.nextSiblingElement();
 
 1805    if ( keys.contains( connectionName ) && prompt )
 
 1807      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 );
 
 1811        case QMessageBox::Cancel:
 
 1813        case QMessageBox::No:
 
 1814          child = child.nextSiblingElement();
 
 1816        case QMessageBox::Yes:
 
 1819        case QMessageBox::YesToAll:
 
 1823        case QMessageBox::NoToAll:
 
 1830    if ( keys.contains( connectionName ) )
 
 1834        child = child.nextSiblingElement();
 
 1840      keys << connectionName;
 
 1843    QgsSensorThingsProviderConnection::settingsUrl->setValue( child.attribute( QStringLiteral( 
"url" ) ), connectionName );
 
 1844    QgsSensorThingsProviderConnection::settingsAuthcfg->setValue( child.attribute( QStringLiteral( 
"authcfg" ) ), connectionName );
 
 1845    QgsSensorThingsProviderConnection::settingsUsername->setValue( child.attribute( QStringLiteral( 
"username" ) ), connectionName );
 
 1846    QgsSensorThingsProviderConnection::settingsPassword->setValue( child.attribute( QStringLiteral( 
"password" ) ), connectionName );
 
 1849    QgsSensorThingsProviderConnection::settingsHeaders->setValue( httpHeader.headers(), connectionName );
 
 1851    child = child.nextSiblingElement();
 
 1855void QgsManageConnectionsDialog::loadCloudStorageConnections( 
const QDomDocument &doc, 
const QStringList &items )
 
 1857  const QDomElement root = doc.documentElement();
 
 1858  if ( root.tagName() != QLatin1String( 
"qgsCloudStorageConnections" ) )
 
 1860    QMessageBox::information( 
this, tr( 
"Loading Connections" ), tr( 
"The file is not a cloud storage connections exchange file." ) );
 
 1864  QString connectionName;
 
 1866  settings.
beginGroup( QStringLiteral( 
"/connections/cloud/items" ) );
 
 1869  QDomElement child = root.firstChildElement();
 
 1871  bool overwrite = 
true;
 
 1873  while ( !child.isNull() )
 
 1875    connectionName = child.attribute( QStringLiteral( 
"name" ) );
 
 1876    if ( !items.contains( connectionName ) )
 
 1878      child = child.nextSiblingElement();
 
 1883    if ( keys.contains( connectionName ) && prompt )
 
 1885      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 );
 
 1889        case QMessageBox::Cancel:
 
 1891        case QMessageBox::No:
 
 1892          child = child.nextSiblingElement();
 
 1894        case QMessageBox::Yes:
 
 1897        case QMessageBox::YesToAll:
 
 1901        case QMessageBox::NoToAll:
 
 1908    if ( keys.contains( connectionName ) )
 
 1912        child = child.nextSiblingElement();
 
 1918      keys << connectionName;
 
 1921    QgsGdalCloudProviderConnection::settingsVsiHandler->setValue( child.attribute( QStringLiteral( 
"handler" ) ), connectionName );
 
 1922    QgsGdalCloudProviderConnection::settingsContainer->setValue( child.attribute( QStringLiteral( 
"container" ) ), connectionName );
 
 1923    QgsGdalCloudProviderConnection::settingsPath->setValue( child.attribute( QStringLiteral( 
"path" ) ), connectionName );
 
 1925    QString credentialString = child.attribute( QStringLiteral( 
"credentials" ) );
 
 1927    QVariantMap credentialOptions;
 
 1930      const thread_local QRegularExpression credentialOptionRegex( QStringLiteral( 
"\\|credential:([^|]*)" ) );
 
 1931      const thread_local QRegularExpression credentialOptionKeyValueRegex( QStringLiteral( 
"(.*?)=(.*)" ) );
 
 1933      const QRegularExpressionMatch match = credentialOptionRegex.match( credentialString );
 
 1934      if ( match.hasMatch() )
 
 1936        const QRegularExpressionMatch keyValueMatch = credentialOptionKeyValueRegex.match( match.captured( 1 ) );
 
 1937        if ( keyValueMatch.hasMatch() )
 
 1939          credentialOptions.insert( keyValueMatch.captured( 1 ), keyValueMatch.captured( 2 ) );
 
 1941        credentialString = credentialString.remove( match.capturedStart( 0 ), match.capturedLength( 0 ) );
 
 1949    QgsGdalCloudProviderConnection::settingsCredentialOptions->setValue( credentialOptions, connectionName );
 
 1951    child = child.nextSiblingElement();
 
 1955void QgsManageConnectionsDialog::loadStacConnections( 
const QDomDocument &doc, 
const QStringList &items )
 
 1957  const QDomElement root = doc.documentElement();
 
 1958  if ( root.tagName() != QLatin1String( 
"qgsStacConnections" ) )
 
 1960    QMessageBox::information( 
this, tr( 
"Loading Connections" ), tr( 
"The file is not a STAC connections exchange file." ) );
 
 1964  QString connectionName;
 
 1966  settings.
beginGroup( QStringLiteral( 
"/qgis/connections-stac" ) );
 
 1969  QDomElement child = root.firstChildElement();
 
 1971  bool overwrite = 
true;
 
 1973  while ( !child.isNull() )
 
 1975    connectionName = child.attribute( QStringLiteral( 
"name" ) );
 
 1976    if ( !items.contains( connectionName ) )
 
 1978      child = child.nextSiblingElement();
 
 1983    if ( keys.contains( connectionName ) && prompt )
 
 1985      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 );
 
 1989        case QMessageBox::Cancel:
 
 1991        case QMessageBox::No:
 
 1992          child = child.nextSiblingElement();
 
 1994        case QMessageBox::Yes:
 
 1997        case QMessageBox::YesToAll:
 
 2001        case QMessageBox::NoToAll:
 
 2008    if ( keys.contains( connectionName ) )
 
 2012        child = child.nextSiblingElement();
 
 2018      keys << connectionName;
 
 2021    QgsStacConnection::settingsUrl->setValue( child.attribute( QStringLiteral( 
"url" ) ), connectionName );
 
 2022    QgsStacConnection::settingsAuthcfg->setValue( child.attribute( QStringLiteral( 
"authcfg" ) ), connectionName );
 
 2023    QgsStacConnection::settingsUsername->setValue( child.attribute( QStringLiteral( 
"username" ) ), connectionName );
 
 2024    QgsStacConnection::settingsPassword->setValue( child.attribute( QStringLiteral( 
"password" ) ), connectionName );
 
 2027    QgsStacConnection::settingsHeaders->setValue( httpHeader.headers(), connectionName );
 
 2029    child = child.nextSiblingElement();
 
 2035  listConnections->selectAll();
 
 2036  buttonBox->button( QDialogButtonBox::Ok )->setEnabled( !listConnections->selectedItems().isEmpty() );
 
 
 2041  listConnections->clearSelection();
 
 2042  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 QgsSettingsEntryEnumFlag< Qgis::HttpMethod > * settingsPreferredHttpMethod
 
static const QgsSettingsEntryString * settingsPagingEnabled
 
static const QgsSettingsEntryString * settingsMaxNumFeatures
 
static QgsSettingsTreeNamedListNode * sTreeOwsConnections
 
static const QgsSettingsEntryBool * settingsIgnoreGetFeatureInfoURI
 
static const QgsSettingsEntryString * settingsPassword
 
static const QgsSettingsEntryString * settingsWfsFeatureMode
 
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.
 
Stores settings for use within QGIS.
 
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