コード例 #1
0
ファイル: qgsnewogrconnection.cpp プロジェクト: CS-SI/QGIS
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 );
  }
}
コード例 #2
0
/* $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();
}
コード例 #3
0
ファイル: qgsogrsourceselect.cpp プロジェクト: peterisb/QGIS
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() );
  }
}