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

📄 ogrsfdriverregistrar.cpp

📁 用于读取TAB、MIF、SHP文件的类
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    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 )    {        CPLDebug( "OGR",                   "OGRSFDriverRegistrar::ReleaseDataSource(%s)\n"                  "Datasource reference count is now zero, but some layers\n"                  "are still referenced ... not closing datasource.",                  poDS->GetName() );        return OGRERR_FAILURE;    }/* -------------------------------------------------------------------- *//*      We really want to close this file, and remove it from the       *//*      shared list.                                                    *//* -------------------------------------------------------------------- */    CPLDebug( "OGR",               "ReleaseDataSource(%s/%p) dereferenced and now destroying.",              poDS->GetName(), poDS );    CPLFree( papszOpenDSRawName[iDS] );    memmove( papszOpenDSRawName + iDS, papszOpenDSRawName + iDS + 1,              sizeof(char *) * (nOpenDSCount - iDS - 1) );    memmove( papoOpenDS + iDS, papoOpenDS + iDS + 1,              sizeof(char *) * (nOpenDSCount - iDS - 1) );    memmove( papoOpenDSDriver + iDS, papoOpenDSDriver + iDS + 1,              sizeof(char *) * (nOpenDSCount - iDS - 1) );    nOpenDSCount--;    if( nOpenDSCount == 0 )    {        CPLFree( papszOpenDSRawName );        papszOpenDSRawName = NULL;        CPLFree( papoOpenDS );        papoOpenDS = NULL;        CPLFree( papoOpenDSDriver );        papoOpenDSDriver = NULL;    }    // We are careful to only do the delete poDS after adjusting the    // table, as if it is a virtual dataset, other removals may happen    // in the meantime.    delete poDS;    return OGRERR_NONE;}/************************************************************************//*                        OGRReleaseDataSource()                        *//************************************************************************/OGRErr OGRReleaseDataSource( OGRDataSourceH hDS ){    OGRSFDriverRegistrar::GetRegistrar();    return poRegistrar->ReleaseDataSource((OGRDataSource *) hDS);}/************************************************************************//*                         OGRGetOpenDSCount()                          *//************************************************************************/int OGRGetOpenDSCount(){    OGRSFDriverRegistrar::GetRegistrar();    return poRegistrar->GetOpenDSCount();}/************************************************************************//*                             GetOpenDS()                              *//************************************************************************/OGRDataSource *OGRSFDriverRegistrar::GetOpenDS( int iDS ){    if( iDS < 0 || iDS >= nOpenDSCount )        return NULL;    else        return papoOpenDS[iDS];}/************************************************************************//*                            OGRGetOpenDS()                            *//************************************************************************/OGRDataSourceH OGRGetOpenDS( int iDS ){    OGRSFDriverRegistrar::GetRegistrar();    return (OGRDataSourceH) poRegistrar->GetOpenDS( iDS );}/************************************************************************//*                           RegisterDriver()                           *//************************************************************************/void OGRSFDriverRegistrar::RegisterDriver( OGRSFDriver * poDriver ){    int         iDriver;/* -------------------------------------------------------------------- *//*      It has no effect to register a driver more than once.           *//* -------------------------------------------------------------------- */    for( iDriver = 0; iDriver < nDrivers; iDriver++ )    {        if( poDriver == papoDrivers[iDriver] )            return;    }                                                   /* -------------------------------------------------------------------- *//*      Add to the end of the driver list.                              *//* -------------------------------------------------------------------- */    papoDrivers = (OGRSFDriver **)        CPLRealloc( papoDrivers, (nDrivers+1) * sizeof(void*) );    papoDrivers[nDrivers++] = poDriver;}/************************************************************************//*                         OGRRegisterDriver()                          *//************************************************************************/void OGRRegisterDriver( OGRSFDriverH hDriver ){    OGRSFDriverRegistrar::GetRegistrar()->RegisterDriver(         (OGRSFDriver *) hDriver );}/************************************************************************//*                           GetDriverCount()                           *//************************************************************************/int OGRSFDriverRegistrar::GetDriverCount(){    return nDrivers;}/************************************************************************//*                         OGRGetDriverCount()                          *//************************************************************************/int OGRGetDriverCount(){    if (poRegistrar)        return poRegistrar->GetDriverCount();    return 0;}/************************************************************************//*                             GetDriver()                              *//************************************************************************/OGRSFDriver *OGRSFDriverRegistrar::GetDriver( int iDriver ){    if( iDriver < 0 || iDriver >= nDrivers )        return NULL;    else        return papoDrivers[iDriver];}/************************************************************************//*                            OGRGetDriver()                            *//************************************************************************/OGRSFDriverH OGRGetDriver( int iDriver ){    return (OGRSFDriverH) poRegistrar->GetDriver( iDriver );}/************************************************************************//*                          GetDriverByName()                           *//************************************************************************/OGRSFDriver *OGRSFDriverRegistrar::GetDriverByName( const char * pszName ){    for( int i = 0; i < nDrivers; i++ )    {        if( papoDrivers[i] != NULL             && EQUAL(papoDrivers[i]->GetName(),pszName) )            return papoDrivers[i];    }    return NULL;}/************************************************************************//*                         OGRGetDriverByName()                         *//************************************************************************/OGRSFDriverH OGRGetDriverByName( const char *pszName ){    ;    return (OGRSFDriverH)         OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName( pszName );}/************************************************************************//*                          AutoLoadDrivers()                           *//************************************************************************//** * Auto-load GDAL drivers from shared libraries. * * This function will automatically load drivers from shared libraries.  It * searches the "driver path" for .so (or .dll) files that start with the * prefix "gdal_X.so".  It then tries to load them and then tries to call * a function within them called GDALRegister_X() where the 'X' is the same  * as the remainder of the shared library basename, or failing that to  * call GDALRegisterMe().   * * There are a few rules for the driver path.  If the GDAL_DRIVER_PATH * environment variable it set, it is taken to be a list of directories * to search separated by colons on unix, or semi-colons on Windows.  Otherwise * the /usr/local/lib/gdalplugins directory, and (if known) the lib/gdalplugins * subdirectory of the gdal home directory are searched.  */void OGRSFDriverRegistrar::AutoLoadDrivers(){    char     **papszSearchPath = NULL;    const char *pszGDAL_DRIVER_PATH =         CPLGetConfigOption( "OGR_DRIVER_PATH", NULL );    if( pszGDAL_DRIVER_PATH == NULL )        pszGDAL_DRIVER_PATH =             CPLGetConfigOption( "GDAL_DRIVER_PATH", NULL );/* -------------------------------------------------------------------- *//*      Where should we look for stuff?                                 *//* -------------------------------------------------------------------- */    if( pszGDAL_DRIVER_PATH != NULL )    {#ifdef WIN32        papszSearchPath =             CSLTokenizeStringComplex( pszGDAL_DRIVER_PATH, ";", TRUE, FALSE );#else        papszSearchPath =             CSLTokenizeStringComplex( pszGDAL_DRIVER_PATH, ":", TRUE, FALSE );#endif    }    else    {#ifdef GDAL_PREFIX        papszSearchPath = CSLAddString( papszSearchPath,    #ifdef MACOSX_FRAMEWORK                                        GDAL_PREFIX "/PlugIns");    #else                                        GDAL_PREFIX "/lib/gdalplugins" );    #endif#else        char szExecPath[1024];        if( CPLGetExecPath( szExecPath, sizeof(szExecPath) ) )        {            char szPluginDir[sizeof(szExecPath)+50];            strcpy( szPluginDir, CPLGetDirname( szExecPath ) );            strcat( szPluginDir, "\\gdalplugins\\" );            papszSearchPath = CSLAddString( papszSearchPath, szPluginDir );        }        else        {            papszSearchPath = CSLAddString( papszSearchPath,                                             "/usr/local/lib/gdalplugins" );        }#endif #ifdef MACOSX_FRAMEWORK        papszSearchPath = CSLAddString( papszSearchPath,                                         "/Library/Application Support/GDAL/PlugIns" );#endif    }/* -------------------------------------------------------------------- *//*      Scan each directory looking for files starting with gdal_       *//* -------------------------------------------------------------------- */    for( int iDir = 0; iDir < CSLCount(papszSearchPath); iDir++ )    {        char  **papszFiles = CPLReadDir( papszSearchPath[iDir] );        for( int iFile = 0; iFile < CSLCount(papszFiles); iFile++ )        {            char   *pszFuncName;            const char *pszFilename;            const char *pszExtension = CPLGetExtension( papszFiles[iFile] );            void   *pRegister;            if( !EQUALN(papszFiles[iFile],"ogr_",4) )                continue;            if( !EQUAL(pszExtension,"dll")                 && !EQUAL(pszExtension,"so")                 && !EQUAL(pszExtension,"dylib") )                continue;            pszFuncName = (char *) CPLCalloc(strlen(papszFiles[iFile])+20,1);            sprintf( pszFuncName, "RegisterOGR%s",                      CPLGetBasename(papszFiles[iFile]) + 4 );                        pszFilename =                 CPLFormFilename( papszSearchPath[iDir],                                  papszFiles[iFile], NULL );            pRegister = CPLGetSymbol( pszFilename, pszFuncName );            if( pRegister == NULL )            {                strcpy( pszFuncName, "GDALRegisterMe" );                pRegister = CPLGetSymbol( pszFilename, pszFuncName );            }                        if( pRegister != NULL )            {                CPLDebug( "OGR", "Auto register %s using %s.",                           pszFilename, pszFuncName );                ((void (*)()) pRegister)();            }            CPLFree( pszFuncName );        }        CSLDestroy( papszFiles );    }    CSLDestroy( papszSearchPath );}

⌨️ 快捷键说明

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