20#include "qgsgdalcloudconnection.h"
38#include "moc_qgsmanageconnectionsdialog.cpp"
40using namespace Qt::StringLiterals;
44 enum class ActionOnDuplicate
51 static bool loadDocument( QWidget *parent,
const QString &fileName, QDomDocument &document )
53 QFile file( fileName );
54 if ( !file.open( QIODevice::ReadOnly | QIODevice::Text ) )
58 QCoreApplication::translate(
"QgsManageConnectionsDialog",
"Loading Connections" ),
59 QCoreApplication::translate(
"QgsManageConnectionsDialog",
"Cannot read file %1:\n%2." ).arg( fileName, file.errorString() )
68 if ( !document.setContent( &file,
true, &errorString, &errorLine, &errorColumn ) )
73 if ( !document.setContent( &file,
false, &errorString, &errorLine, &errorColumn ) )
77 QCoreApplication::translate(
"QgsManageConnectionsDialog",
"Loading Connections" ),
78 QCoreApplication::translate(
"QgsManageConnectionsDialog",
"Parse error at line %1, column %2:\n%3" ).arg( errorLine ).arg( errorColumn ).arg( errorString )
87 static ActionOnDuplicate checkOverwritePrompt( QWidget *parent,
const QString &connectionName,
bool &prompt,
bool &overwrite )
91 const int result = QMessageBox::warning(
93 QCoreApplication::translate(
"QgsManageConnectionsDialog",
"Loading Connections" ),
94 QCoreApplication::translate(
"QgsManageConnectionsDialog",
"Connection with name '%1' already exists. Overwrite?" ).arg( connectionName ),
95 QMessageBox::Yes | QMessageBox::YesToAll | QMessageBox::No | QMessageBox::NoToAll | QMessageBox::Cancel
99 case QMessageBox::Yes:
102 case QMessageBox::YesToAll:
106 case QMessageBox::No:
109 case QMessageBox::NoToAll:
113 case QMessageBox::Cancel:
115 return ActionOnDuplicate::Cancel;
118 return overwrite ? ActionOnDuplicate::Overwrite : ActionOnDuplicate::Skip;
132 static void saveDatabaseConnection( QDomElement &element,
const QgsSettings &settings,
const QString &path,
const QStringList &keys,
const QVariantMap &defaults = {} )
134 for (
const QString &key : keys )
136 const QVariant defaultValue = defaults.value( key, QString() );
137 element.setAttribute( key, settings.
value( path + u
'/' + key, defaultValue ).toString() );
140 const bool saveUsername = settings.
value( path +
"/saveUsername"_L1,
"false"_L1 ).toString() ==
"true"_L1;
141 element.setAttribute( u
"saveUsername"_s, saveUsername ? u
"true"_s : u
"false"_s );
144 element.setAttribute( u
"username"_s, settings.
value( path +
"/username"_L1 ).toString() );
146 const bool savePassword = settings.
value( path +
"/savePassword"_L1,
"false"_L1 ).toString() ==
"true"_L1;
147 element.setAttribute( u
"savePassword"_s, savePassword ? u
"true"_s : u
"false"_s );
150 element.setAttribute( u
"password"_s, settings.
value( path +
"/password"_L1 ).toString() );
166 static void loadDatabaseConnection(
const QDomElement &element,
QgsSettings &settings,
const QStringList &keys,
const QVariantMap &defaults = {} )
168 for (
const QString &key : keys )
170 const QString defaultValue = defaults.value( key, QString() ).toString();
171 settings.
setValue( u
'/' + key, element.attribute( key, defaultValue ) );
174 settings.
setValue( u
"/saveUsername"_s, element.attribute( u
"saveUsername"_s ) );
175 settings.
setValue( u
"/username"_s, element.attribute( u
"username"_s ) );
176 settings.
setValue( u
"/savePassword"_s, element.attribute( u
"savePassword"_s ) );
177 settings.
setValue( u
"/password"_s, element.attribute( u
"password"_s ) );
185 return u
"qgsWMSConnections"_s;
187 return u
"qgsWFSConnections"_s;
189 return u
"qgsWCSConnections"_s;
191 return u
"qgsPgConnections"_s;
193 return u
"qgsMssqlConnections"_s;
195 return u
"qgsOracleConnections"_s;
197 return u
"qgsHanaConnections"_s;
199 return u
"qgsXyzTilesConnections"_s;
202 return u
"qgsArcgisConnections"_s;
204 return u
"qgsVectorTileConnections"_s;
206 return u
"qgsTiledSceneConnections"_s;
208 return u
"qgsSensorThingsConnections"_s;
210 return u
"qgsCloudStorageConnections"_s;
212 return u
"qgsStacConnections"_s;
216 static bool checkRootTag( QWidget *parent,
const QDomDocument &document,
const QString &expectedTag )
218 const QDomElement root = document.documentElement();
219 if ( expectedTag.isEmpty() || root.tagName() != expectedTag )
221 QMessageBox::information( parent, QCoreApplication::translate(
"QgsManageConnectionsDialog",
"Loading Connections" ), QCoreApplication::translate(
"QgsManageConnectionsDialog",
"The file is not a valid connections exchange file for the selected service." ) );
229 return checkRootTag( parent, document, rootTagForConnectionType( type ) );
232 static bool isValidDocumentType( QWidget *parent,
const QDomDocument &document,
const QString &service )
234 return checkRootTag( parent, document, u
"qgs"_s + service.toUpper() + u
"Connections"_s );
237 static void addNamespaceDeclarations( QDomElement &root,
const QMap<QString, QString> &namespaceDeclarations )
239 for (
auto it = namespaceDeclarations.begin(); it != namespaceDeclarations.end(); ++it )
241 root.setAttribute( u
"xmlns:"_s + it.key(), it.value() );
252 , mFileName( fileName )
253 , mDialogMode( mode )
254 , mConnectionType( type )
259 QPushButton *pb =
nullptr;
260 pb =
new QPushButton( tr(
"Select All" ) );
261 buttonBox->addButton( pb, QDialogButtonBox::ActionRole );
264 pb =
new QPushButton( tr(
"Clear Selection" ) );
265 buttonBox->addButton( pb, QDialogButtonBox::ActionRole );
268 if ( mDialogMode ==
Import )
270 label->setText( tr(
"Select connections to import" ) );
271 buttonBox->button( QDialogButtonBox::Ok )->setText( tr(
"Import" ) );
272 buttonBox->button( QDialogButtonBox::Ok )->setEnabled(
false );
277 buttonBox->button( QDialogButtonBox::Ok )->setText( tr(
"Export" ) );
278 buttonBox->button( QDialogButtonBox::Ok )->setEnabled(
false );
281 if ( !populateConnections() )
283 QApplication::postEvent(
this,
new QCloseEvent() );
287 disconnect( buttonBox, &QDialogButtonBox::accepted,
this, &QDialog::accept );
295 buttonBox->button( QDialogButtonBox::Ok )->setEnabled( !listConnections->selectedItems().isEmpty() );
300 const QList<QListWidgetItem *> selection = listConnections->selectedItems();
301 if ( selection.isEmpty() )
303 QMessageBox::warning(
this, tr(
"Export/Import Error" ), tr(
"You should select at least one connection from list." ) );
308 items.reserve( selection.size() );
309 for (
int i = 0; i < selection.size(); ++i )
311 items.append( selection.at( i )->text() );
314 if ( mDialogMode ==
Export )
316 QString fileName = QFileDialog::getSaveFileName(
this, tr(
"Save Connections" ), QDir::homePath(), tr(
"XML files (*.xml *.XML)" ) );
320 if ( fileName.isEmpty() )
327 mFileName = fileName;
330 switch ( mConnectionType )
333 doc = saveOWSConnections( items, u
"WMS"_s );
336 doc = saveWfsConnections( items );
339 doc = savePgConnections( items );
342 doc = saveMssqlConnections( items );
345 doc = saveOWSConnections( items, u
"WCS"_s );
348 doc = saveOracleConnections( items );
351 doc = saveHanaConnections( items );
354 doc = saveXyzTilesConnections( items );
358 doc = saveArcgisConnections( items );
361 doc = saveVectorTileConnections( items );
364 doc = saveTiledSceneConnections( items );
367 doc = saveSensorThingsConnections( items );
370 doc = saveCloudStorageConnections( items );
373 doc = saveStacConnections( items );
377 QFile file( mFileName );
378 if ( !file.open( QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate ) )
380 QMessageBox::warning(
this, tr(
"Saving Connections" ), tr(
"Cannot write file %1:\n%2." ).arg( mFileName, file.errorString() ) );
384 QTextStream out( &file );
391 if ( !loadDocument(
this, mFileName, doc ) )
396 switch ( mConnectionType )
399 loadOWSConnections( doc, items, u
"WMS"_s );
402 loadWfsConnections( doc, items );
405 loadPgConnections( doc, items );
408 loadMssqlConnections( doc, items );
411 loadOWSConnections( doc, items, u
"WCS"_s );
414 loadOracleConnections( doc, items );
417 loadHanaConnections( doc, items );
420 loadXyzTilesConnections( doc, items );
423 loadArcgisConnections( doc, items, u
"ARCGISMAPSERVER"_s );
426 loadArcgisConnections( doc, items, u
"ARCGISFEATURESERVER"_s );
429 loadVectorTileConnections( doc, items );
432 loadTiledSceneConnections( doc, items );
435 loadSensorThingsConnections( doc, items );
438 loadCloudStorageConnections( doc, items );
441 loadStacConnections( doc, items );
445 listConnections->clear();
452bool QgsManageConnectionsDialog::populateConnections()
455 if ( mDialogMode ==
Export )
457 QStringList connections;
459 switch ( mConnectionType )
471 settings.
beginGroup( u
"/PostgreSQL/connections"_s );
475 settings.
beginGroup( u
"/MSSQL/connections"_s );
479 settings.
beginGroup( u
"/Oracle/connections"_s );
483 settings.
beginGroup( u
"/HANA/connections"_s );
494 connections = QgsVectorTileProviderConnection::sTreeConnectionVectorTile->items();
497 connections = QgsTiledSceneProviderConnection::sTreeConnectionTiledScene->items();
500 connections = QgsSensorThingsProviderConnection::sTreeSensorThingsConnections->items();
503 connections = QgsGdalCloudProviderConnection::sTreeConnectionCloud->items();
506 connections = QgsStacConnection::sTreeConnectionStac->items();
509 for (
const QString &connection : std::as_const( connections ) )
511 QListWidgetItem *item =
new QListWidgetItem();
512 item->setText( connection );
513 listConnections->addItem( item );
520 if ( !loadDocument(
this, mFileName, doc ) )
525 if ( !isValidDocumentType(
this, doc, mConnectionType ) )
530 const QDomElement root = doc.documentElement();
531 QDomElement child = root.firstChildElement();
532 while ( !child.isNull() )
534 QListWidgetItem *item =
new QListWidgetItem();
535 item->setText( child.attribute( u
"name"_s ) );
536 listConnections->addItem( item );
537 child = child.nextSiblingElement();
543QDomDocument QgsManageConnectionsDialog::saveOWSConnections(
const QStringList &connections,
const QString &service )
545 QDomDocument doc( u
"connections"_s );
546 QDomElement root = doc.createElement(
"qgs" + service.toUpper() +
"Connections" );
547 root.setAttribute( u
"version"_s, u
"1.0"_s );
548 doc.appendChild( root );
550 QMap<QString, QString> namespaceDeclarations;
551 for (
int i = 0; i < connections.count(); ++i )
553 QDomElement el = doc.createElement( service.toLower() );
554 el.setAttribute( u
"name"_s, connections[i] );
557 if ( service ==
"WMS"_L1 )
568 httpHeader.updateDomElement( el, namespaceDeclarations );
573 root.appendChild( el );
576 addNamespaceDeclarations( root, namespaceDeclarations );
581QDomDocument QgsManageConnectionsDialog::saveWfsConnections(
const QStringList &connections )
583 QDomDocument doc( u
"connections"_s );
584 QDomElement root = doc.createElement( u
"qgsWFSConnections"_s );
585 root.setAttribute( u
"version"_s, u
"1.1"_s );
586 doc.appendChild( root );
588 for (
int i = 0; i < connections.count(); ++i )
590 QDomElement el = doc.createElement( u
"wfs"_s );
591 el.setAttribute( u
"name"_s, connections[i] );
605 root.appendChild( el );
611QDomDocument QgsManageConnectionsDialog::savePgConnections(
const QStringList &connections )
613 QDomDocument doc( u
"connections"_s );
614 QDomElement root = doc.createElement( u
"qgsPgConnections"_s );
615 root.setAttribute( u
"version"_s, u
"1.0"_s );
616 doc.appendChild( root );
618 const QgsSettings settings;
620 for (
int i = 0; i < connections.count(); ++i )
622 path =
"/PostgreSQL/connections/" + connections[i];
623 QDomElement element = doc.createElement( u
"postgis"_s );
624 saveDatabaseConnection(
634 u
"estimatedMetadata"_s,
635 u
"projectsInDatabase"_s,
636 u
"dontResolveType"_s,
637 u
"allowGeometrylessTables"_s,
638 u
"geometryColumnsOnly"_s,
641 { { u
"sslmode"_s,
"1" },
642 { u
"estimatedMetadata"_s,
"0" },
643 { u
"projectsInDatabase"_s,
"0" },
644 { u
"dontResolveType"_s,
"0" },
645 { u
"allowGeometrylessTables"_s,
"0" },
646 { u
"geometryColumnsOnly"_s,
"0" },
647 { u
"publicOnly"_s,
"0" },
651 root.appendChild( element );
657QDomDocument QgsManageConnectionsDialog::saveMssqlConnections(
const QStringList &connections )
659 QDomDocument doc( u
"connections"_s );
660 QDomElement root = doc.createElement( u
"qgsMssqlConnections"_s );
661 root.setAttribute( u
"version"_s, u
"1.0"_s );
662 doc.appendChild( root );
664 const QgsSettings settings;
666 for (
int i = 0; i < connections.count(); ++i )
668 path =
"/MSSQL/connections/" + connections[i];
669 QDomElement element = doc.createElement( u
"mssql"_s );
670 saveDatabaseConnection( element, settings, path, { u
"name"_s, u
"host"_s, u
"port"_s, u
"database"_s, u
"service"_s, u
"sslmode"_s, u
"estimatedMetadata"_s }, { { u
"sslmode"_s,
"1" }, { u
"estimatedMetadata"_s,
"0" } } );
671 root.appendChild( element );
677QDomDocument QgsManageConnectionsDialog::saveOracleConnections(
const QStringList &connections )
679 QDomDocument doc( u
"connections"_s );
680 QDomElement root = doc.createElement( u
"qgsOracleConnections"_s );
681 root.setAttribute( u
"version"_s, u
"1.0"_s );
682 doc.appendChild( root );
684 const QgsSettings settings;
686 for (
int i = 0; i < connections.count(); ++i )
688 path =
"/Oracle/connections/" + connections[i];
689 QDomElement element = doc.createElement( u
"oracle"_s );
690 saveDatabaseConnection(
694 { u
"name"_s, u
"host"_s, u
"port"_s, u
"database"_s, u
"dboptions"_s, u
"dbworkspace"_s, u
"schema"_s, u
"estimatedMetadata"_s, u
"userTablesOnly"_s, u
"geometryColumnsOnly"_s, u
"allowGeometrylessTables"_s },
695 { { u
"estimatedMetadata"_s,
"0" }, { u
"userTablesOnly"_s,
"0" }, { u
"geometryColumnsOnly"_s,
"0" }, { u
"allowGeometrylessTables"_s,
"0" } }
698 root.appendChild( element );
704QDomDocument QgsManageConnectionsDialog::saveHanaConnections(
const QStringList &connections )
706 QDomDocument doc( u
"connections"_s );
707 QDomElement root = doc.createElement( u
"qgsHanaConnections"_s );
708 root.setAttribute( u
"version"_s, u
"1.0"_s );
709 doc.appendChild( root );
711 const QgsSettings settings;
713 for (
int i = 0; i < connections.count(); ++i )
715 path =
"/HANA/connections/" + connections[i];
716 QDomElement element = doc.createElement( u
"hana"_s );
717 saveDatabaseConnection(
730 u
"allowGeometrylessTables"_s,
732 u
"sslCryptoProvider"_s,
735 u
"sslValidateCertificate"_s,
736 u
"sslHostNameInCertificate"_s },
737 { { u
"userTablesOnly"_s,
"0" }, { u
"allowGeometrylessTables"_s,
"0" }, { u
"sslEnabled"_s, u
"false"_s }, { u
"sslCryptoProvider"_s, u
"openssl"_s }, { u
"sslValidateCertificate"_s, u
"false"_s } }
739 root.appendChild( element );
745QDomDocument QgsManageConnectionsDialog::saveXyzTilesConnections(
const QStringList &connections )
747 QDomDocument doc( u
"connections"_s );
748 QDomElement root = doc.createElement( u
"qgsXYZTilesConnections"_s );
749 root.setAttribute( u
"version"_s, u
"1.0"_s );
750 doc.appendChild( root );
752 QMap<QString, QString> namespaceDeclarations;
753 for (
int i = 0; i < connections.count(); ++i )
755 QDomElement el = doc.createElement( u
"xyztiles"_s );
757 el.setAttribute( u
"name"_s, connections[i] );
767 httpHeader.updateDomElement( el, namespaceDeclarations );
769 root.appendChild( el );
772 addNamespaceDeclarations( root, namespaceDeclarations );
777QDomDocument QgsManageConnectionsDialog::saveArcgisConnections(
const QStringList &connections )
779 QDomDocument doc( u
"connections"_s );
780 QDomElement root = doc.createElement(
"qgsARCGISFEATURESERVERConnections" );
781 root.setAttribute( u
"version"_s, u
"1.0"_s );
782 doc.appendChild( root );
784 QMap<QString, QString> namespaceDeclarations;
785 for (
const QString &connection : connections )
787 QDomElement el = doc.createElement( u
"arcgisfeatureserver"_s );
788 el.setAttribute( u
"name"_s, connection );
792 httpHeader.updateDomElement( el, namespaceDeclarations );
798 root.appendChild( el );
801 addNamespaceDeclarations( root, namespaceDeclarations );
806QDomDocument QgsManageConnectionsDialog::saveVectorTileConnections(
const QStringList &connections )
808 QDomDocument doc( u
"connections"_s );
809 QDomElement root = doc.createElement( u
"qgsVectorTileConnections"_s );
810 root.setAttribute( u
"version"_s, u
"1.0"_s );
811 doc.appendChild( root );
813 QMap<QString, QString> namespaceDeclarations;
814 for (
int i = 0; i < connections.count(); ++i )
816 QDomElement el = doc.createElement( u
"vectortile"_s );
818 el.setAttribute( u
"name"_s, connections[i] );
819 el.setAttribute( u
"url"_s, QgsVectorTileProviderConnection::settingsUrl->value( connections[i] ) );
820 el.setAttribute( u
"zmin"_s, QgsVectorTileProviderConnection::settingsZmin->value( connections[i] ) );
821 el.setAttribute( u
"zmax"_s, QgsVectorTileProviderConnection::settingsZmax->value( connections[i] ) );
822 el.setAttribute( u
"serviceType"_s, QgsVectorTileProviderConnection::settingsServiceType->value( connections[i] ) );
823 el.setAttribute( u
"authcfg"_s, QgsVectorTileProviderConnection::settingsAuthcfg->value( connections[i] ) );
824 el.setAttribute( u
"username"_s, QgsVectorTileProviderConnection::settingsUsername->value( connections[i] ) );
825 el.setAttribute( u
"password"_s, QgsVectorTileProviderConnection::settingsPassword->value( connections[i] ) );
826 el.setAttribute( u
"styleUrl"_s, QgsVectorTileProviderConnection::settingsStyleUrl->value( connections[i] ) );
828 QgsHttpHeaders httpHeader( QgsVectorTileProviderConnection::settingsHeaders->value( connections[i] ) );
829 httpHeader.updateDomElement( el, namespaceDeclarations );
831 root.appendChild( el );
834 addNamespaceDeclarations( root, namespaceDeclarations );
839QDomDocument QgsManageConnectionsDialog::saveTiledSceneConnections(
const QStringList &connections )
841 QDomDocument doc( u
"connections"_s );
842 QDomElement root = doc.createElement( u
"qgsTiledSceneConnections"_s );
843 root.setAttribute( u
"version"_s, u
"1.0"_s );
844 doc.appendChild( root );
846 QMap<QString, QString> namespaceDeclarations;
847 for (
int i = 0; i < connections.count(); ++i )
849 QDomElement el = doc.createElement( u
"tiledscene"_s );
851 el.setAttribute( u
"name"_s, connections[i] );
852 el.setAttribute( u
"provider"_s, QgsTiledSceneProviderConnection::settingsProvider->value( connections[i] ) );
853 el.setAttribute( u
"url"_s, QgsTiledSceneProviderConnection::settingsUrl->value( connections[i] ) );
854 el.setAttribute( u
"authcfg"_s, QgsTiledSceneProviderConnection::settingsAuthcfg->value( connections[i] ) );
855 el.setAttribute( u
"username"_s, QgsTiledSceneProviderConnection::settingsUsername->value( connections[i] ) );
856 el.setAttribute( u
"password"_s, QgsTiledSceneProviderConnection::settingsPassword->value( connections[i] ) );
858 QgsHttpHeaders httpHeader( QgsTiledSceneProviderConnection::settingsHeaders->value( connections[i] ) );
859 httpHeader.updateDomElement( el, namespaceDeclarations );
861 root.appendChild( el );
864 addNamespaceDeclarations( root, namespaceDeclarations );
869QDomDocument QgsManageConnectionsDialog::saveSensorThingsConnections(
const QStringList &connections )
871 QDomDocument doc( u
"connections"_s );
872 QDomElement root = doc.createElement( u
"qgsSensorThingsConnections"_s );
873 root.setAttribute( u
"version"_s, u
"1.0"_s );
874 doc.appendChild( root );
876 QMap<QString, QString> namespaceDeclarations;
877 for (
int i = 0; i < connections.count(); ++i )
879 QDomElement el = doc.createElement( u
"sensorthings"_s );
881 el.setAttribute( u
"name"_s, connections[i] );
882 el.setAttribute( u
"url"_s, QgsSensorThingsProviderConnection::settingsUrl->value( connections[i] ) );
883 el.setAttribute( u
"authcfg"_s, QgsSensorThingsProviderConnection::settingsAuthcfg->value( connections[i] ) );
884 el.setAttribute( u
"username"_s, QgsSensorThingsProviderConnection::settingsUsername->value( connections[i] ) );
885 el.setAttribute( u
"password"_s, QgsSensorThingsProviderConnection::settingsPassword->value( connections[i] ) );
887 QgsHttpHeaders httpHeader( QgsSensorThingsProviderConnection::settingsHeaders->value( connections[i] ) );
888 httpHeader.updateDomElement( el, namespaceDeclarations );
890 root.appendChild( el );
893 addNamespaceDeclarations( root, namespaceDeclarations );
898QDomDocument QgsManageConnectionsDialog::saveCloudStorageConnections(
const QStringList &connections )
900 QDomDocument doc( u
"connections"_s );
901 QDomElement root = doc.createElement( u
"qgsCloudStorageConnections"_s );
902 root.setAttribute( u
"version"_s, u
"1.0"_s );
903 doc.appendChild( root );
905 for (
int i = 0; i < connections.count(); ++i )
907 QDomElement el = doc.createElement( u
"cloudstorage"_s );
909 el.setAttribute( u
"name"_s, connections[i] );
910 el.setAttribute( u
"handler"_s, QgsGdalCloudProviderConnection::settingsVsiHandler->value( connections[i] ) );
911 el.setAttribute( u
"container"_s, QgsGdalCloudProviderConnection::settingsContainer->value( connections[i] ) );
912 el.setAttribute( u
"path"_s, QgsGdalCloudProviderConnection::settingsPath->value( connections[i] ) );
914 const QVariantMap credentialOptions = QgsGdalCloudProviderConnection::settingsCredentialOptions->value( connections[i] );
915 QString credentialString;
916 for (
auto it = credentialOptions.constBegin(); it != credentialOptions.constEnd(); ++it )
918 if ( !it.value().toString().isEmpty() )
920 credentialString += u
"|credential:%1=%2"_s.arg( it.key(), it.value().toString() );
923 el.setAttribute( u
"credentials"_s, credentialString );
925 root.appendChild( el );
931QDomDocument QgsManageConnectionsDialog::saveStacConnections(
const QStringList &connections )
933 QDomDocument doc( u
"connections"_s );
934 QDomElement root = doc.createElement( u
"qgsStacConnections"_s );
935 root.setAttribute( u
"version"_s, u
"1.0"_s );
936 doc.appendChild( root );
938 QMap<QString, QString> namespaceDeclarations;
939 for (
int i = 0; i < connections.count(); ++i )
941 QDomElement el = doc.createElement( u
"stac"_s );
943 el.setAttribute( u
"name"_s, connections[i] );
944 el.setAttribute( u
"url"_s, QgsStacConnection::settingsUrl->value( connections[i] ) );
945 el.setAttribute( u
"authcfg"_s, QgsStacConnection::settingsAuthcfg->value( connections[i] ) );
946 el.setAttribute( u
"username"_s, QgsStacConnection::settingsUsername->value( connections[i] ) );
947 el.setAttribute( u
"password"_s, QgsStacConnection::settingsPassword->value( connections[i] ) );
949 QgsHttpHeaders httpHeader( QgsStacConnection::settingsHeaders->value( connections[i] ) );
950 httpHeader.updateDomElement( el, namespaceDeclarations );
952 root.appendChild( el );
955 addNamespaceDeclarations( root, namespaceDeclarations );
960void QgsManageConnectionsDialog::loadOWSConnections(
const QDomDocument &doc,
const QStringList &items,
const QString &service )
962 if ( !isValidDocumentType(
this, doc, service ) )
967 QString connectionName;
968 const QDomElement root = doc.documentElement();
969 QDomElement child = root.firstChildElement();
971 bool overwrite =
true;
973 while ( !child.isNull() )
975 connectionName = child.attribute( u
"name"_s );
976 if ( !items.contains( connectionName ) )
978 child = child.nextSiblingElement();
984 switch ( checkOverwritePrompt(
this, connectionName, prompt, overwrite ) )
986 case ActionOnDuplicate::Overwrite:
988 case ActionOnDuplicate::Skip:
989 child = child.nextSiblingElement();
991 case ActionOnDuplicate::Cancel:
1005 QgsHttpHeaders httpHeader( child );
1008 if ( !child.attribute( u
"username"_s ).isEmpty() )
1013 child = child.nextSiblingElement();
1017void QgsManageConnectionsDialog::loadWfsConnections(
const QDomDocument &doc,
const QStringList &items )
1024 QString connectionName;
1027 const QDomElement root = doc.documentElement();
1028 QDomElement child = root.firstChildElement();
1030 bool overwrite =
true;
1032 while ( !child.isNull() )
1034 connectionName = child.attribute( u
"name"_s );
1035 if ( !items.contains( connectionName ) )
1037 child = child.nextSiblingElement();
1042 if ( keys.contains( connectionName ) )
1044 switch ( checkOverwritePrompt(
this, connectionName, prompt, overwrite ) )
1046 case ActionOnDuplicate::Overwrite:
1048 case ActionOnDuplicate::Skip:
1049 child = child.nextSiblingElement();
1051 case ActionOnDuplicate::Cancel:
1057 keys << connectionName;
1072 if ( !child.attribute( u
"username"_s ).isEmpty() )
1077 child = child.nextSiblingElement();
1081void QgsManageConnectionsDialog::loadPgConnections(
const QDomDocument &doc,
const QStringList &items )
1088 QString connectionName;
1089 QgsSettings settings;
1090 settings.
beginGroup( u
"/PostgreSQL/connections"_s );
1093 const QDomElement root = doc.documentElement();
1094 QDomElement child = root.firstChildElement();
1096 bool overwrite =
true;
1098 while ( !child.isNull() )
1100 connectionName = child.attribute( u
"name"_s );
1101 if ( !items.contains( connectionName ) )
1103 child = child.nextSiblingElement();
1107 if ( keys.contains( connectionName ) )
1109 switch ( checkOverwritePrompt(
this, connectionName, prompt, overwrite ) )
1111 case ActionOnDuplicate::Overwrite:
1113 case ActionOnDuplicate::Skip:
1114 child = child.nextSiblingElement();
1116 case ActionOnDuplicate::Cancel:
1122 keys << connectionName;
1125 settings.
beginGroup(
"/PostgreSQL/connections/" + connectionName );
1126 loadDatabaseConnection(
1134 u
"estimatedMetadata"_s,
1135 u
"projectsInDatabase"_s,
1136 u
"dontResolveType"_s,
1137 u
"allowGeometrylessTables"_s,
1138 u
"geometryColumnsOnly"_s,
1141 { { u
"service"_s,
"" }, { u
"projectsInDatabase"_s, 0 }, { u
"dontResolveType"_s, 0 }, { u
"allowGeometrylessTables"_s, 0 }, { u
"geometryColumnsOnly"_s, 0 }, { u
"publicOnly"_s, 0 } }
1145 child = child.nextSiblingElement();
1149void QgsManageConnectionsDialog::loadMssqlConnections(
const QDomDocument &doc,
const QStringList &items )
1156 QString connectionName;
1157 QgsSettings settings;
1158 settings.
beginGroup( u
"/MSSQL/connections"_s );
1161 const QDomElement root = doc.documentElement();
1162 QDomElement child = root.firstChildElement();
1164 bool overwrite =
true;
1166 while ( !child.isNull() )
1168 connectionName = child.attribute( u
"name"_s );
1169 if ( !items.contains( connectionName ) )
1171 child = child.nextSiblingElement();
1176 if ( keys.contains( connectionName ) )
1178 switch ( checkOverwritePrompt(
this, connectionName, prompt, overwrite ) )
1180 case ActionOnDuplicate::Overwrite:
1182 case ActionOnDuplicate::Skip:
1183 child = child.nextSiblingElement();
1185 case ActionOnDuplicate::Cancel:
1191 keys << connectionName;
1194 settings.
beginGroup(
"/MSSQL/connections/" + connectionName );
1195 loadDatabaseConnection( child, settings, { u
"host"_s, u
"port"_s, u
"database"_s, u
"service"_s, u
"sslmode"_s, u
"estimatedMetadata"_s }, { { u
"service"_s,
"" } } );
1198 child = child.nextSiblingElement();
1202void QgsManageConnectionsDialog::loadOracleConnections(
const QDomDocument &doc,
const QStringList &items )
1209 QString connectionName;
1210 QgsSettings settings;
1211 settings.
beginGroup( u
"/Oracle/connections"_s );
1214 const QDomElement root = doc.documentElement();
1215 QDomElement child = root.firstChildElement();
1217 bool overwrite =
true;
1219 while ( !child.isNull() )
1221 connectionName = child.attribute( u
"name"_s );
1222 if ( !items.contains( connectionName ) )
1224 child = child.nextSiblingElement();
1228 if ( keys.contains( connectionName ) )
1230 switch ( checkOverwritePrompt(
this, connectionName, prompt, overwrite ) )
1232 case ActionOnDuplicate::Overwrite:
1234 case ActionOnDuplicate::Skip:
1235 child = child.nextSiblingElement();
1237 case ActionOnDuplicate::Cancel:
1243 keys << connectionName;
1246 settings.
beginGroup(
"/Oracle/connections/" + connectionName );
1247 loadDatabaseConnection( child, settings, { u
"host"_s, u
"port"_s, u
"database"_s, u
"dboptions"_s, u
"dbworkspace"_s, u
"schema"_s, u
"estimatedMetadata"_s, u
"userTablesOnly"_s, u
"geometryColumnsOnly"_s, u
"allowGeometrylessTables"_s } );
1250 child = child.nextSiblingElement();
1254void QgsManageConnectionsDialog::loadHanaConnections(
const QDomDocument &doc,
const QStringList &items )
1261 QDomElement root = doc.documentElement();
1262 const QDomAttr version = root.attributeNode(
"version" );
1263 if ( version.value() !=
"1.0"_L1 )
1265 QMessageBox::warning(
this, tr(
"Loading Connections" ), tr(
"The HANA connections exchange file version '%1' is not supported." ).arg( version.value() ) );
1269 QgsSettings settings;
1270 settings.
beginGroup( u
"/HANA/connections"_s );
1273 QDomElement child = root.firstChildElement();
1275 bool overwrite =
true;
1277 while ( !child.isNull() )
1279 const QString connectionName = child.attribute( u
"name"_s );
1280 if ( !items.contains( connectionName ) )
1282 child = child.nextSiblingElement();
1286 if ( keys.contains( connectionName ) )
1288 switch ( checkOverwritePrompt(
this, connectionName, prompt, overwrite ) )
1290 case ActionOnDuplicate::Overwrite:
1292 case ActionOnDuplicate::Skip:
1293 child = child.nextSiblingElement();
1295 case ActionOnDuplicate::Cancel:
1301 keys << connectionName;
1304 settings.
beginGroup(
"/HANA/connections/" + connectionName );
1305 loadDatabaseConnection(
1311 u
"identifierType"_s,
1315 u
"userTablesOnly"_s,
1316 u
"allowGeometrylessTables"_s,
1322 u
"sslCryptoProvider"_s,
1325 u
"sslValidateCertificate"_s,
1326 u
"sslHostNameInCertificate"_s }
1330 child = child.nextSiblingElement();
1334void QgsManageConnectionsDialog::loadXyzTilesConnections(
const QDomDocument &doc,
const QStringList &items )
1341 QString connectionName;
1343 const QDomElement root = doc.documentElement();
1344 QDomElement child = root.firstChildElement();
1346 bool overwrite =
true;
1348 while ( !child.isNull() )
1350 connectionName = child.attribute( u
"name"_s );
1351 if ( !items.contains( connectionName ) )
1353 child = child.nextSiblingElement();
1357 if ( keys.contains( connectionName ) )
1359 switch ( checkOverwritePrompt(
this, connectionName, prompt, overwrite ) )
1361 case ActionOnDuplicate::Overwrite:
1363 case ActionOnDuplicate::Skip:
1364 child = child.nextSiblingElement();
1366 case ActionOnDuplicate::Cancel:
1372 keys << connectionName;
1383 QgsHttpHeaders httpHeader( child );
1386 child = child.nextSiblingElement();
1390void QgsManageConnectionsDialog::loadArcgisConnections(
const QDomDocument &doc,
const QStringList &items,
const QString &service )
1392 if ( !isValidDocumentType(
this, doc, service ) )
1397 QString connectionName;
1399 const QDomElement root = doc.documentElement();
1400 QDomElement child = root.firstChildElement();
1402 bool overwrite =
true;
1404 while ( !child.isNull() )
1406 connectionName = child.attribute( u
"name"_s );
1407 if ( !items.contains( connectionName ) )
1409 child = child.nextSiblingElement();
1413 if ( keys.contains( connectionName ) )
1415 switch ( checkOverwritePrompt(
this, connectionName, prompt, overwrite ) )
1417 case ActionOnDuplicate::Overwrite:
1419 case ActionOnDuplicate::Skip:
1420 child = child.nextSiblingElement();
1422 case ActionOnDuplicate::Cancel:
1428 keys << connectionName;
1437 child = child.nextSiblingElement();
1441void QgsManageConnectionsDialog::loadVectorTileConnections(
const QDomDocument &doc,
const QStringList &items )
1445 QMessageBox::information(
this, tr(
"Loading Connections" ), tr(
"The file is not a Vector Tile connections exchange file." ) );
1449 QString connectionName;
1450 QgsSettings settings;
1451 settings.
beginGroup( u
"/qgis/connections-vector-tile"_s );
1454 const QDomElement root = doc.documentElement();
1455 QDomElement child = root.firstChildElement();
1457 bool overwrite =
true;
1459 while ( !child.isNull() )
1461 connectionName = child.attribute( u
"name"_s );
1462 if ( !items.contains( connectionName ) )
1464 child = child.nextSiblingElement();
1468 if ( keys.contains( connectionName ) )
1470 switch ( checkOverwritePrompt(
this, connectionName, prompt, overwrite ) )
1472 case ActionOnDuplicate::Overwrite:
1474 case ActionOnDuplicate::Skip:
1475 child = child.nextSiblingElement();
1477 case ActionOnDuplicate::Cancel:
1483 keys << connectionName;
1486 QgsVectorTileProviderConnection::settingsUrl->setValue( child.attribute( u
"url"_s ), connectionName );
1487 QgsVectorTileProviderConnection::settingsZmin->setValue( child.attribute( u
"zmin"_s ).toInt(), connectionName );
1488 QgsVectorTileProviderConnection::settingsZmax->setValue( child.attribute( u
"zmax"_s ).toInt(), connectionName );
1489 QgsVectorTileProviderConnection::settingsServiceType->setValue( child.attribute( u
"serviceType"_s ), connectionName );
1490 QgsVectorTileProviderConnection::settingsAuthcfg->setValue( child.attribute( u
"authcfg"_s ), connectionName );
1491 QgsVectorTileProviderConnection::settingsUsername->setValue( child.attribute( u
"username"_s ), connectionName );
1492 QgsVectorTileProviderConnection::settingsPassword->setValue( child.attribute( u
"password"_s ), connectionName );
1493 QgsVectorTileProviderConnection::settingsStyleUrl->setValue( child.attribute( u
"styleUrl"_s ), connectionName );
1495 QgsHttpHeaders httpHeader( child );
1496 QgsVectorTileProviderConnection::settingsHeaders->setValue( httpHeader.headers(), connectionName );
1498 child = child.nextSiblingElement();
1502void QgsManageConnectionsDialog::loadTiledSceneConnections(
const QDomDocument &doc,
const QStringList &items )
1509 QString connectionName;
1510 QgsSettings settings;
1511 settings.
beginGroup( u
"/qgis/connections-tiled-scene"_s );
1514 const QDomElement root = doc.documentElement();
1515 QDomElement child = root.firstChildElement();
1517 bool overwrite =
true;
1519 while ( !child.isNull() )
1521 connectionName = child.attribute( u
"name"_s );
1522 if ( !items.contains( connectionName ) )
1524 child = child.nextSiblingElement();
1528 if ( keys.contains( connectionName ) )
1530 switch ( checkOverwritePrompt(
this, connectionName, prompt, overwrite ) )
1532 case ActionOnDuplicate::Overwrite:
1534 case ActionOnDuplicate::Skip:
1535 child = child.nextSiblingElement();
1537 case ActionOnDuplicate::Cancel:
1543 keys << connectionName;
1546 QgsTiledSceneProviderConnection::settingsProvider->setValue( child.attribute( u
"provider"_s ), connectionName );
1547 QgsTiledSceneProviderConnection::settingsUrl->setValue( child.attribute( u
"url"_s ), connectionName );
1548 QgsTiledSceneProviderConnection::settingsAuthcfg->setValue( child.attribute( u
"authcfg"_s ), connectionName );
1549 QgsTiledSceneProviderConnection::settingsUsername->setValue( child.attribute( u
"username"_s ), connectionName );
1550 QgsTiledSceneProviderConnection::settingsPassword->setValue( child.attribute( u
"password"_s ), connectionName );
1552 QgsHttpHeaders httpHeader( child );
1553 QgsTiledSceneProviderConnection::settingsHeaders->setValue( httpHeader.headers(), connectionName );
1555 child = child.nextSiblingElement();
1559void QgsManageConnectionsDialog::loadSensorThingsConnections(
const QDomDocument &doc,
const QStringList &items )
1563 QMessageBox::information(
this, tr(
"Loading Connections" ), tr(
"The file is not a SensorThings connections exchange file." ) );
1567 QString connectionName;
1568 QgsSettings settings;
1569 settings.
beginGroup( u
"/connections/sensorthings/items"_s );
1572 const QDomElement root = doc.documentElement();
1573 QDomElement child = root.firstChildElement();
1575 bool overwrite =
true;
1577 while ( !child.isNull() )
1579 connectionName = child.attribute( u
"name"_s );
1580 if ( !items.contains( connectionName ) )
1582 child = child.nextSiblingElement();
1587 if ( keys.contains( connectionName ) )
1589 switch ( checkOverwritePrompt(
this, connectionName, prompt, overwrite ) )
1591 case ActionOnDuplicate::Overwrite:
1593 case ActionOnDuplicate::Skip:
1594 child = child.nextSiblingElement();
1596 case ActionOnDuplicate::Cancel:
1602 keys << connectionName;
1605 QgsSensorThingsProviderConnection::settingsUrl->setValue( child.attribute( u
"url"_s ), connectionName );
1606 QgsSensorThingsProviderConnection::settingsAuthcfg->setValue( child.attribute( u
"authcfg"_s ), connectionName );
1607 QgsSensorThingsProviderConnection::settingsUsername->setValue( child.attribute( u
"username"_s ), connectionName );
1608 QgsSensorThingsProviderConnection::settingsPassword->setValue( child.attribute( u
"password"_s ), connectionName );
1610 QgsHttpHeaders httpHeader( child );
1611 QgsSensorThingsProviderConnection::settingsHeaders->setValue( httpHeader.headers(), connectionName );
1613 child = child.nextSiblingElement();
1617void QgsManageConnectionsDialog::loadCloudStorageConnections(
const QDomDocument &doc,
const QStringList &items )
1619 const QDomElement root = doc.documentElement();
1620 if ( root.tagName() !=
"qgsCloudStorageConnections"_L1 )
1622 QMessageBox::information(
this, tr(
"Loading Connections" ), tr(
"The file is not a cloud storage connections exchange file." ) );
1626 QString connectionName;
1627 QgsSettings settings;
1628 settings.
beginGroup( u
"/connections/cloud/items"_s );
1631 QDomElement child = root.firstChildElement();
1633 bool overwrite =
true;
1635 while ( !child.isNull() )
1637 connectionName = child.attribute( u
"name"_s );
1638 if ( !items.contains( connectionName ) )
1640 child = child.nextSiblingElement();
1644 if ( keys.contains( connectionName ) )
1646 switch ( checkOverwritePrompt(
this, connectionName, prompt, overwrite ) )
1648 case ActionOnDuplicate::Overwrite:
1650 case ActionOnDuplicate::Skip:
1651 child = child.nextSiblingElement();
1653 case ActionOnDuplicate::Cancel:
1659 keys << connectionName;
1662 QgsGdalCloudProviderConnection::settingsVsiHandler->setValue( child.attribute( u
"handler"_s ), connectionName );
1663 QgsGdalCloudProviderConnection::settingsContainer->setValue( child.attribute( u
"container"_s ), connectionName );
1664 QgsGdalCloudProviderConnection::settingsPath->setValue( child.attribute( u
"path"_s ), connectionName );
1666 QString credentialString = child.attribute( u
"credentials"_s );
1668 QVariantMap credentialOptions;
1671 const thread_local QRegularExpression credentialOptionRegex( u
"\\|credential:([^|]*)"_s );
1672 const thread_local QRegularExpression credentialOptionKeyValueRegex( u
"(.*?)=(.*)"_s );
1674 const QRegularExpressionMatch match = credentialOptionRegex.match( credentialString );
1675 if ( match.hasMatch() )
1677 const QRegularExpressionMatch keyValueMatch = credentialOptionKeyValueRegex.match( match.captured( 1 ) );
1678 if ( keyValueMatch.hasMatch() )
1680 credentialOptions.insert( keyValueMatch.captured( 1 ), keyValueMatch.captured( 2 ) );
1682 credentialString = credentialString.remove( match.capturedStart( 0 ), match.capturedLength( 0 ) );
1690 QgsGdalCloudProviderConnection::settingsCredentialOptions->setValue( credentialOptions, connectionName );
1692 child = child.nextSiblingElement();
1696void QgsManageConnectionsDialog::loadStacConnections(
const QDomDocument &doc,
const QStringList &items )
1698 const QDomElement root = doc.documentElement();
1699 if ( root.tagName() !=
"qgsStacConnections"_L1 )
1701 QMessageBox::information(
this, tr(
"Loading Connections" ), tr(
"The file is not a STAC connections exchange file." ) );
1705 QString connectionName;
1706 QgsSettings settings;
1707 settings.
beginGroup( u
"/qgis/connections-stac"_s );
1710 QDomElement child = root.firstChildElement();
1712 bool overwrite =
true;
1714 while ( !child.isNull() )
1716 connectionName = child.attribute( u
"name"_s );
1717 if ( !items.contains( connectionName ) )
1719 child = child.nextSiblingElement();
1723 if ( keys.contains( connectionName ) )
1725 switch ( checkOverwritePrompt(
this, connectionName, prompt, overwrite ) )
1727 case ActionOnDuplicate::Overwrite:
1729 case ActionOnDuplicate::Skip:
1730 child = child.nextSiblingElement();
1732 case ActionOnDuplicate::Cancel:
1738 keys << connectionName;
1741 QgsStacConnection::settingsUrl->setValue( child.attribute( u
"url"_s ), connectionName );
1742 QgsStacConnection::settingsAuthcfg->setValue( child.attribute( u
"authcfg"_s ), connectionName );
1743 QgsStacConnection::settingsUsername->setValue( child.attribute( u
"username"_s ), connectionName );
1744 QgsStacConnection::settingsPassword->setValue( child.attribute( u
"password"_s ), connectionName );
1746 QgsHttpHeaders httpHeader( child );
1747 QgsStacConnection::settingsHeaders->setValue( httpHeader.headers(), connectionName );
1749 child = child.nextSiblingElement();
1755 listConnections->selectAll();
1756 buttonBox->button( QDialogButtonBox::Ok )->setEnabled( !listConnections->selectedItems().isEmpty() );
1761 listConnections->clearSelection();
1762 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
static QString ensureFileNameHasExtension(const QString &fileName, const QStringList &extensions)
Ensures that a fileName ends with an extension from the provided list of extensions.
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 * settingsDisableDecompressedSafetyCheckThreshold
static const QgsSettingsEntryBool * settingsIgnoreGetMapURI
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