📄 ogrsfdriverregistrar.cpp
字号:
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 + -