void QgsNewOgrConnection::testConnection() { QString uri; uri = createDatabaseURI( cmbDatabaseTypes->currentText(), txtHost->text(), txtDatabase->text(), txtPort->text(), mAuthSettingsDatabase->configId(), mAuthSettingsDatabase->username(), mAuthSettingsDatabase->password(), true ); QgsDebugMsg( "Connecting using uri = " + uri ); OGRRegisterAll(); OGRDataSourceH poDS; OGRSFDriverH pahDriver; CPLErrorReset(); poDS = OGROpen( uri.toUtf8().constData(), false, &pahDriver ); if ( !poDS ) { QMessageBox::information( this, tr( "Test Connection" ), tr( "Connection failed - Check settings and try again.\n\nExtended error information:\n%1" ).arg( QString::fromUtf8( CPLGetLastErrorMsg() ) ) ); } else { QMessageBox::information( this, tr( "Test Connection" ), tr( "Connection to %1 was successful." ).arg( uri ) ); OGRReleaseDataSource( poDS ); } }
/* $Id:$ */ #include <QSettings> #include <QFileDialog> #include <QMessageBox> #include <QInputDialog> #include <QTextCodec> #include "qgslogger.h" #include "qgsopenvectorlayerdialog.h" #include "qgsvectordataprovider.h" #include <ogr_api.h> #include "qgsproviderregistry.h" #include "qgsnewogrconnection.h" #include "qgsogrhelperfunctions.h" #include "qgscontexthelp.h" QgsOpenVectorLayerDialog::QgsOpenVectorLayerDialog( QWidget* parent, Qt::WFlags fl ) : QDialog( parent, fl ) { setupUi( this ); cmbDatabaseTypes->blockSignals( true ); cmbConnections->blockSignals( true ); radioSrcFile->setChecked( true ); mDataSourceType = "file"; //set encoding cmbEncodings->addItems( QgsVectorDataProvider::availableEncodings() ); QSettings settings; QString enc = settings.value( "/UI/encoding", QString( "System" ) ).toString(); // The specified decoding is added if not existing alread, and then set current. // This should select it. int encindex = cmbEncodings->findText( enc ); if ( encindex < 0 ) { cmbEncodings->insertItem( 0, enc ); encindex = 0; } cmbEncodings->setCurrentIndex( encindex ); //add database drivers mVectorFileFilter = QgsProviderRegistry::instance()->fileVectorFilters(); QgsDebugMsg( "Database drivers :" + QgsProviderRegistry::instance()->databaseDrivers() ); QStringList dbDrivers = QgsProviderRegistry::instance()->databaseDrivers().split( ";" ); for ( int i = 0; i < dbDrivers.count(); i++ ) { QString dbDriver = dbDrivers.at( i ); if (( !dbDriver.isEmpty() ) && ( !dbDriver.isNull() ) ) cmbDatabaseTypes->addItem( dbDriver.split( "," ).at( 0 ) ); } //add directory drivers QStringList dirDrivers = QgsProviderRegistry::instance()->directoryDrivers().split( ";" ); for ( int i = 0; i < dirDrivers.count(); i++ ) { QString dirDriver = dirDrivers.at( i ); if (( !dirDriver.isEmpty() ) && ( !dirDriver.isNull() ) ) cmbDirectoryTypes->addItem( dirDriver.split( "," ).at( 0 ) ); } //add protocol drivers QStringList proDrivers = QgsProviderRegistry::instance()->protocolDrivers().split( ";" ); for ( int i = 0; i < proDrivers.count(); i++ ) { QString proDriver = proDrivers.at( i ); if (( !proDriver.isEmpty() ) && ( !proDriver.isNull() ) ) cmbProtocolTypes->addItem( proDriver.split( "," ).at( 0 ) ); } cmbDatabaseTypes->blockSignals( false ); cmbConnections->blockSignals( false ); } QgsOpenVectorLayerDialog::~QgsOpenVectorLayerDialog() { } QStringList QgsOpenVectorLayerDialog::openFile() { QStringList selectedFiles; QgsDebugMsg( "Vector file filters: " + mVectorFileFilter ); QString enc = encoding(); QString title = tr( "Open an OGR Supported Vector Layer" ); QgisGui::openFilesRememberingFilter( "lastVectorFileFilter", mVectorFileFilter, selectedFiles, enc, title ); return selectedFiles; } QString QgsOpenVectorLayerDialog::openDirectory() { QSettings settings; bool haveLastUsedDir = settings.contains( "/UI/LastUsedDirectory" ); QString lastUsedDir = settings.value( "/UI/LastUsedDirectory", QVariant() ).toString(); if ( !haveLastUsedDir ) lastUsedDir = ""; QString path = QFileDialog::getExistingDirectory( this, tr( "Open Directory" ), lastUsedDir, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks ); settings.setValue( "/UI/LastUsedDirectory", path ); //process path if it is grass if ( cmbDirectoryTypes->currentText() == "Grass Vector" ) { #ifdef WIN32 //replace backslashes with forward slashes path.replace( "\\", "/" ); #endif path = path + "/head"; } return path; } QStringList QgsOpenVectorLayerDialog::dataSources() { return mDataSources; } QString QgsOpenVectorLayerDialog::encoding() { return cmbEncodings->currentText(); } QString QgsOpenVectorLayerDialog::dataSourceType() { return mDataSourceType; } void QgsOpenVectorLayerDialog::addNewConnection() { QgsNewOgrConnection *nc = new QgsNewOgrConnection( this ); nc->exec(); delete nc; populateConnectionList(); } void QgsOpenVectorLayerDialog::editConnection() { QgsNewOgrConnection *nc = new QgsNewOgrConnection( this, cmbDatabaseTypes->currentText(), cmbConnections->currentText() ); nc->exec(); delete nc; populateConnectionList(); } void QgsOpenVectorLayerDialog::deleteConnection() { QSettings settings; QString key = "/" + cmbDatabaseTypes->currentText() + "/connections/" + cmbConnections->currentText(); QString msg = tr( "Are you sure you want to remove the %1 connection and all associated settings?" ) .arg( cmbConnections->currentText() ); QMessageBox::StandardButton result = QMessageBox::information( this, tr( "Confirm Delete" ), msg, QMessageBox::Ok | QMessageBox::Cancel ); if ( result == QMessageBox::Ok ) { settings.remove( key + "/host" ); settings.remove( key + "/database" ); settings.remove( key + "/username" ); settings.remove( key + "/password" ); settings.remove( key + "/port" ); settings.remove( key + "/save" ); settings.remove( key ); cmbConnections->removeItem( cmbConnections->currentIndex() ); // populateConnectionList(); setConnectionListPosition(); } } void QgsOpenVectorLayerDialog::populateConnectionList() { QSettings settings; settings.beginGroup( "/" + cmbDatabaseTypes->currentText() + "/connections" ); QStringList keys = settings.childGroups(); QStringList::Iterator it = keys.begin(); cmbConnections->clear(); while ( it != keys.end() ) { cmbConnections->addItem( *it ); ++it; } settings.endGroup(); setConnectionListPosition(); } void QgsOpenVectorLayerDialog::setConnectionListPosition() { QSettings settings; // If possible, set the item currently displayed database QString toSelect = settings.value( "/" + cmbDatabaseTypes->currentText() + "/connections/selected" ).toString(); // Does toSelect exist in cmbConnections? bool set = false; for ( int i = 0; i < cmbConnections->count(); ++i ) if ( cmbConnections->itemText( i ) == toSelect ) { cmbConnections->setCurrentIndex( i ); set = true; break; } // If we couldn't find the stored item, but there are some, // default to the last item (this makes some sense when deleting // items as it allows the user to repeatidly click on delete to // remove a whole lot of items). if ( !set && cmbConnections->count() > 0 ) { // If toSelect is null, then the selected connection wasn't found // by QSettings, which probably means that this is the first time // the user has used qgis with database connections, so default to // the first in the list of connetions. Otherwise default to the last. if ( toSelect.isNull() ) cmbConnections->setCurrentIndex( 0 ); else cmbConnections->setCurrentIndex( cmbConnections->count() - 1 ); } } void QgsOpenVectorLayerDialog::setConnectionTypeListPosition() { QSettings settings; QString toSelect = settings.value( "/ogr/connections/selectedtype" ).toString(); bool set = false; for ( int i = 0; i < cmbDatabaseTypes->count(); ++i ) if ( cmbDatabaseTypes->itemText( i ) == toSelect ) { cmbDatabaseTypes->setCurrentIndex( i ); set = true; break; } } void QgsOpenVectorLayerDialog::setSelectedConnectionType() { QSettings settings; QString baseKey = "/ogr/connections/"; settings.setValue( baseKey + "selectedtype", cmbDatabaseTypes->currentText() ); QgsDebugMsg( "Setting selected type to" + cmbDatabaseTypes->currentText() ); } void QgsOpenVectorLayerDialog::setSelectedConnection() { QSettings settings; settings.setValue( "/" + cmbDatabaseTypes->currentText() + "/connections/selected", cmbConnections->currentText() ); QgsDebugMsg( "Setting selected connection to " + cmbConnections->currentText() ); } void QgsOpenVectorLayerDialog::on_buttonSelectSrc_clicked() { if ( radioSrcFile->isChecked() ) { inputSrcDataset->setText( openFile().join( ";" ) ); } else if ( radioSrcDirectory->isChecked() ) { inputSrcDataset->setText( openDirectory() ); } else if ( !radioSrcDatabase->isChecked() ) { Q_ASSERT( !"SHOULD NEVER GET HERE" ); } } //********************auto connected slots *****************/ void QgsOpenVectorLayerDialog::accept() { QSettings settings; QgsDebugMsg( "dialog button accepted" ); mDataSources.clear(); if ( radioSrcDatabase->isChecked() ) { if ( !settings.contains( "/" + cmbDatabaseTypes->currentText() + "/connections/" + cmbConnections->currentText() + "/host" ) ) { QMessageBox::information( this, tr( "Add vector layer" ), tr( "No database selected." ) ); return; } QString baseKey = "/" + cmbDatabaseTypes->currentText() + "/connections/"; baseKey += cmbConnections->currentText(); QString host = settings.value( baseKey + "/host" ).toString(); QString database = settings.value( baseKey + "/database" ).toString(); QString port = settings.value( baseKey + "/port" ).toString(); QString user = settings.value( baseKey + "/username" ).toString(); QString pass = settings.value( baseKey + "/password" ).toString(); bool makeConnection = false; if ( pass.isEmpty() ) { pass = QInputDialog::getText( this, tr( "Password for " ) + user, tr( "Please enter your password:"******"Add vector layer" ), tr( "No protocol URI entered." ) ); return; } mDataSources << createProtocolURI( cmbProtocolTypes->currentText(), protocolURI->text() ); } else if ( radioSrcFile->isChecked() ) { if ( inputSrcDataset->text().isEmpty() ) { QMessageBox::information( this, tr( "Add vector layer" ), tr( "No layers selected." ) ); return; } mDataSources << inputSrcDataset->text().split( ";" ); } else if ( radioSrcDirectory->isChecked() ) { if ( inputSrcDataset->text().isEmpty() ) { QMessageBox::information( this, tr( "Add vector layer" ), tr( "No directory selected." ) ); return; } mDataSources << inputSrcDataset->text(); } // Save the used encoding settings.setValue( "/UI/encoding", encoding() ); QDialog::accept(); }
void QgsOgrSourceSelect::addButtonClicked() { QgsSettings settings; mDataSources.clear(); if ( radioSrcDatabase->isChecked() ) { if ( !settings.contains( '/' + cmbDatabaseTypes->currentText() + "/connections/" + cmbConnections->currentText() + "/host" ) ) { QMessageBox::information( this, tr( "Add vector layer" ), tr( "No database selected." ) ); return; } QString baseKey = '/' + cmbDatabaseTypes->currentText() + "/connections/"; baseKey += cmbConnections->currentText(); QString host = settings.value( baseKey + "/host" ).toString(); QString database = settings.value( baseKey + "/database" ).toString(); QString port = settings.value( baseKey + "/port" ).toString(); QString user = settings.value( baseKey + "/username" ).toString(); QString pass = settings.value( baseKey + "/password" ).toString(); bool makeConnection = false; if ( pass.isEmpty() ) { if ( cmbDatabaseTypes->currentText() == QLatin1String( "MSSQL" ) ) makeConnection = true; else pass = QInputDialog::getText( this, tr( "Password for " ) + user, tr( "Please enter your password:"******"Add vector layer" ), tr( "No protocol URI entered." ) ); return; } mDataSources << createProtocolURI( cmbProtocolTypes->currentText(), protocolURI->text() ); } else if ( radioSrcFile->isChecked() ) { if ( inputSrcDataset->text().isEmpty() ) { QMessageBox::information( this, tr( "Add vector layer" ), tr( "No layers selected." ) ); return; } mDataSources << inputSrcDataset->text().split( ';' ); } else if ( radioSrcDirectory->isChecked() ) { if ( inputSrcDataset->text().isEmpty() ) { QMessageBox::information( this, tr( "Add vector layer" ), tr( "No directory selected." ) ); return; } mDataSources << inputSrcDataset->text(); } // Save the used encoding settings.setValue( QStringLiteral( "UI/encoding" ), encoding() ); if ( ! mDataSources.isEmpty() ) { emit addVectorLayers( mDataSources, encoding(), dataSourceType() ); } }