?? ogrsfdriverregistrar.cpp
字號:
{
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 + -