EVOLUTION-MANAGER
Edit File: mitab_ogr_driver.cpp
/********************************************************************** * $Id: mitab_ogr_driver.cpp,v 1.11 2005-05-21 03:15:18 fwarmerdam Exp $ * * Name: mitab_ogr_driver.cpp * Project: MapInfo Mid/Mif, Tab ogr support * Language: C++ * Purpose: Implementation of the MIDDATAFile class used to handle * reading/writing of the MID/MIF files * Author: Stephane Villeneuve, stephane.v@videotron.ca * ********************************************************************** * Copyright (c) 1999, 2000, Stephane Villeneuve * * 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. ********************************************************************** * * $Log: mitab_ogr_driver.cpp,v $ * Revision 1.11 2005-05-21 03:15:18 fwarmerdam * Removed unused stat buffer. * * Revision 1.10 2004/02/27 21:06:03 fwarmerdam * Better support for "single file" creation ... don't allow other layers to * be created. But *do* single file to satisfy the first layer creation request * made. Also, allow creating a datasource "on" an existing directory. * * Revision 1.9 2003/03/20 15:57:46 warmerda * Added delete datasource support * * Revision 1.8 2001/01/22 16:03:58 warmerda * expanded tabs * * Revision 1.7 2000/01/26 18:17:00 warmerda * reimplement OGR driver * * Revision 1.6 2000/01/15 22:30:44 daniel * Switch to MIT/X-Consortium OpenSource license * * Revision 1.5 1999/12/15 17:05:24 warmerda * Only create OGRTABDataSource if SmartOpen() result is non-NULL. * * Revision 1.4 1999/12/15 16:28:17 warmerda * fixed a few type problems * * Revision 1.3 1999/12/14 02:22:29 daniel * Merged TAB+MIF DataSource/Driver into ane using IMapInfoFile class * * Revision 1.2 1999/11/12 02:44:36 stephane * added comment, change Register name. * * Revision 1.1 1999/11/08 21:05:51 svillene * first revision * * Revision 1.1 1999/11/08 04:16:07 stephane * First Revision * **********************************************************************/ #include "mitab_ogr_driver.h" /************************************************************************/ /* ~OGRTABDriver() */ /************************************************************************/ OGRTABDriver::~OGRTABDriver() { } /************************************************************************/ /* OGRTABDriver::GetName() */ /************************************************************************/ const char *OGRTABDriver::GetName() { return "MapInfo File"; } /************************************************************************/ /* OGRTABDriver::Open() */ /************************************************************************/ OGRDataSource *OGRTABDriver::Open( const char * pszFilename, int bUpdate ) { OGRTABDataSource *poDS; if( bUpdate ) { return NULL; } poDS = new OGRTABDataSource(); if( poDS->Open( pszFilename, TRUE ) ) return poDS; else { delete poDS; return NULL; } } /************************************************************************/ /* CreateDataSource() */ /************************************************************************/ OGRDataSource *OGRTABDriver::CreateDataSource( const char * pszName, char ** papszOptions ) { OGRTABDataSource *poDS; /* -------------------------------------------------------------------- */ /* Try to create the data source. */ /* -------------------------------------------------------------------- */ poDS = new OGRTABDataSource(); if( !poDS->Create( pszName, papszOptions ) ) { delete poDS; return NULL; } else return poDS; } /************************************************************************/ /* TestCapability() */ /************************************************************************/ int OGRTABDriver::TestCapability( const char * pszCap ) { if( EQUAL(pszCap,ODrCCreateDataSource) ) return TRUE; else if( EQUAL(pszCap,ODrCDeleteDataSource) ) return TRUE; else return FALSE; } /************************************************************************/ /* DeleteDataSource() */ /************************************************************************/ OGRErr OGRTABDriver::DeleteDataSource( const char *pszDataSource ) { int iExt; VSIStatBuf sStatBuf; static const char *apszExtensions[] = { "mif", "mid", "tab", "map", "ind", "dat", "id", NULL }; if( VSIStat( pszDataSource, &sStatBuf ) != 0 ) { CPLError( CE_Failure, CPLE_AppDefined, "%s does not appear to be a file or directory.", pszDataSource ); return OGRERR_FAILURE; } if( VSI_ISREG(sStatBuf.st_mode) && (EQUAL(CPLGetExtension(pszDataSource),"mif") || EQUAL(CPLGetExtension(pszDataSource),"mid") || EQUAL(CPLGetExtension(pszDataSource),"tab")) ) { for( iExt=0; apszExtensions[iExt] != NULL; iExt++ ) { const char *pszFile = CPLResetExtension(pszDataSource, apszExtensions[iExt] ); if( VSIStat( pszFile, &sStatBuf ) == 0 ) VSIUnlink( pszFile ); } } else if( VSI_ISDIR(sStatBuf.st_mode) ) { char **papszDirEntries = CPLReadDir( pszDataSource ); int iFile; for( iFile = 0; papszDirEntries != NULL && papszDirEntries[iFile] != NULL; iFile++ ) { if( CSLFindString( (char **) apszExtensions, CPLGetExtension(papszDirEntries[iFile])) != -1) { VSIUnlink( CPLFormFilename( pszDataSource, papszDirEntries[iFile], NULL ) ); } } CSLDestroy( papszDirEntries ); VSIRmdir( pszDataSource ); } return OGRERR_NONE; } /************************************************************************/ /* RegisterOGRTAB() */ /************************************************************************/ extern "C" { void RegisterOGRTAB() { OGRSFDriverRegistrar::GetRegistrar()->RegisterDriver( new OGRTABDriver ); } }