⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ogrsfdriverregistrar.cpp

📁 支持各种栅格图像和矢量图像读取的库
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************** * $Id: ogrsfdriverregistrar.cpp 10646 2007-01-18 02:38:10Z warmerdam $ * * Project:  OpenGIS Simple Features Reference Implementation * Purpose:  The OGRSFDriverRegistrar class implementation. * Author:   Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 1999,  Les Technologies SoftMap Inc. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/#include "ogrsf_frmts.h"#include "ogr_api.h"#include "ogr_p.h"#include "cpl_multiproc.h"CPL_CVSID("$Id: ogrsfdriverregistrar.cpp 10646 2007-01-18 02:38:10Z warmerdam $");static OGRSFDriverRegistrar *poRegistrar = NULL;static char *pszUpdatableINST_DATA = "__INST_DATA_TARGET:                                                                                                                                      ";/************************************************************************//*                         OGRSFDriverRegistrar                         *//************************************************************************/OGRSFDriverRegistrar::OGRSFDriverRegistrar(){    CPLAssert( poRegistrar == NULL );    nDrivers = 0;    papoDrivers = NULL;    nOpenDSCount = 0;    papszOpenDSRawName = NULL;    papoOpenDS = NULL;    papoOpenDSDriver = NULL;/* -------------------------------------------------------------------- *//*      We want to push a location to search for data files             *//*      supporting GDAL/OGR such as EPSG csv files, S-57 definition     *//*      files, and so forth.  The static pszUpdateableINST_DATA         *//*      string can be updated within the shared library or              *//*      executable during an install to point installed data            *//*      directory.  If it isn't burned in here then we use the          *//*      INST_DATA macro (setup at configure time) if                    *//*      available. Otherwise we don't push anything and we hope         *//*      other mechanisms such as environment variables will have        *//*      been employed.                                                  *//* -------------------------------------------------------------------- */    if( CPLGetConfigOption( "GDAL_DATA", NULL ) != NULL )    {        CPLPushFinderLocation( CPLGetConfigOption( "GDAL_DATA", NULL ) );    }    else if( pszUpdatableINST_DATA[19] != ' ' )    {        CPLPushFinderLocation( pszUpdatableINST_DATA + 19 );    }    else    {#ifdef INST_DATA        CPLPushFinderLocation( INST_DATA );#endif    }}/************************************************************************//*                       ~OGRSFDriverRegistrar()                        *//************************************************************************/OGRSFDriverRegistrar::~OGRSFDriverRegistrar(){    for( int i = 0; i < nDrivers; i++ )    {        delete papoDrivers[i];    }    CPLFree( papoDrivers );    papoDrivers = NULL;    poRegistrar = NULL;}/************************************************************************//*                           OGRCleanupAll()                            *//************************************************************************/void OGRCleanupAll(){    if( poRegistrar != NULL )        delete poRegistrar;    OSRCleanup();    CPLFinderClean();    VSICleanupFileManager();    CPLFreeConfig();    CPLCleanupTLS();}/************************************************************************//*                            GetRegistrar()                            *//************************************************************************/OGRSFDriverRegistrar *OGRSFDriverRegistrar::GetRegistrar(){    if( poRegistrar == NULL )        poRegistrar = new OGRSFDriverRegistrar();    return poRegistrar;}/************************************************************************//*                                Open()                                *//************************************************************************/OGRDataSource *OGRSFDriverRegistrar::Open( const char * pszName,                                           int bUpdate,                                           OGRSFDriver ** ppoDriver ){    OGRDataSource       *poDS;    if( ppoDriver != NULL )        *ppoDriver = NULL;    GetRegistrar();        CPLErrorReset();    for( int iDriver = 0; iDriver < poRegistrar->nDrivers; iDriver++ )    {        poDS = poRegistrar->papoDrivers[iDriver]->Open( pszName, bUpdate );        if( poDS != NULL )        {            if( ppoDriver != NULL )                *ppoDriver = poRegistrar->papoDrivers[iDriver];            poDS->Reference();            if( poDS->GetDriver() == NULL )                poDS->m_poDriver = poRegistrar->papoDrivers[iDriver];            CPLDebug( "OGR", "OGROpen(%s/%p) succeeded as %s.",                       pszName, poDS, poDS->GetDriver()->GetName() );                        return poDS;        }        if( CPLGetLastErrorType() == CE_Failure )            return NULL;    }    CPLDebug( "OGR", "OGROpen(%s) failed.", pszName );                return NULL;}/************************************************************************//*                              OGROpen()                               *//************************************************************************/OGRDataSourceH OGROpen( const char *pszName, int bUpdate,                        OGRSFDriverH *pahDriverList ){    if (poRegistrar)        return poRegistrar->Open( pszName, bUpdate,                                   (OGRSFDriver **) pahDriverList );    return NULL;}/************************************************************************//*                             OpenShared()                             *//************************************************************************/OGRDataSource *OGRSFDriverRegistrar::OpenShared( const char * pszName, int bUpdate,                                  OGRSFDriver ** ppoDriver ){    OGRDataSource       *poDS;    if( ppoDriver != NULL )        *ppoDriver = NULL;    CPLErrorReset();/* -------------------------------------------------------------------- *//*      First try finding an existing open dataset matching exactly     *//*      on the original datasource raw name used to open the            *//*      datasource.                                                     *//*                                                                      *//*      NOTE: It is an error, but currently we ignore the bUpdate,      *//*      and return whatever is open even if it is read-only and the     *//*      application requested update access.                            *//* -------------------------------------------------------------------- */    int iDS;    for( iDS = 0; iDS < nOpenDSCount; iDS++ )    {        poDS = papoOpenDS[iDS];        if( strcmp( pszName, papszOpenDSRawName[iDS]) == 0 )        {            poDS->Reference();            if( ppoDriver != NULL )                *ppoDriver = papoOpenDSDriver[iDS];            return poDS;        }    }/* -------------------------------------------------------------------- *//*      If that doesn't match, try matching on the name returned by     *//*      the datasource itself.                                          *//* -------------------------------------------------------------------- */    for( iDS = 0; iDS < nOpenDSCount; iDS++ )    {        poDS = papoOpenDS[iDS];        if( strcmp( pszName, poDS->GetName()) == 0 )        {            poDS->Reference();            if( ppoDriver != NULL )                *ppoDriver = papoOpenDSDriver[iDS];            return poDS;        }    }/* -------------------------------------------------------------------- *//*      We don't have the datasource.  Open it normally.                *//* -------------------------------------------------------------------- */    OGRSFDriver *poTempDriver = NULL;    poDS = Open( pszName, bUpdate, &poTempDriver );    if( poDS == NULL )        return poDS;/* -------------------------------------------------------------------- *//*      We don't have this datasource already.  Grow our list to        *//*      hold the new datasource.                                        *//* -------------------------------------------------------------------- */    papszOpenDSRawName = (char **)         CPLRealloc( papszOpenDSRawName, sizeof(char*) * (nOpenDSCount+1) );        papoOpenDS = (OGRDataSource **)         CPLRealloc( papoOpenDS, sizeof(char*) * (nOpenDSCount+1) );        papoOpenDSDriver = (OGRSFDriver **)         CPLRealloc( papoOpenDSDriver, sizeof(char*) * (nOpenDSCount+1) );    papszOpenDSRawName[nOpenDSCount] = CPLStrdup( pszName );    papoOpenDS[nOpenDSCount] = poDS;    papoOpenDSDriver[nOpenDSCount] = poTempDriver;    nOpenDSCount++;    if( ppoDriver != NULL )        *ppoDriver = poTempDriver;    return poDS;}/************************************************************************//*                           OGROpenShared()                            *//************************************************************************/OGRDataSourceH OGROpenShared( const char *pszName, int bUpdate,                              OGRSFDriverH *pahDriverList ){    OGRSFDriverRegistrar::GetRegistrar();    return poRegistrar->OpenShared( pszName, bUpdate,                                     (OGRSFDriver **) pahDriverList );}/************************************************************************//*                         ReleaseDataSource()                          *//************************************************************************/OGRErr OGRSFDriverRegistrar::ReleaseDataSource( OGRDataSource * poDS ){    int iDS;    for( iDS = 0; iDS < nOpenDSCount; iDS++ )    {        if( poDS == papoOpenDS[iDS] )            break;    }    if( iDS == nOpenDSCount )    {        CPLDebug( "OGR",                   "ReleaseDataSource(%s/%p) on unshared datasource!\n"                  "Deleting directly.",                   poDS->GetName(), poDS );        delete poDS;        return OGRERR_FAILURE;    }    if( poDS->GetRefCount() > 0 )        poDS->Dereference();    if( poDS->GetRefCount() > 0 )    {        CPLDebug( "OGR",                   "ReleaseDataSource(%s/%p) ... just dereferencing.",                  poDS->GetName(), poDS );        return OGRERR_NONE;    }    if( poDS->GetSummaryRefCount() > 0 )

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -