📄 ogrsfdriverregistrar.cpp
字号:
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 ) { 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 ); delete 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; } 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 ){ poRegistrar->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) poRegistrar->GetDriverByName( pszName );}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -