bool OGRGeoJSONSeqDataSource::Create( const char* pszName, char** /* papszOptions */ ) { CPLAssert( nullptr == m_fpOut ); if( strcmp(pszName, "/dev/stdout") == 0 ) pszName = "/vsistdout/"; /* -------------------------------------------------------------------- */ /* Create the output file. */ /* -------------------------------------------------------------------- */ m_fpOut = VSIFOpenExL( pszName, "w", true ); if( nullptr == m_fpOut ) { CPLError( CE_Failure, CPLE_OpenFailed, "Failed to create %s: %s", pszName, VSIGetLastErrorMsg() ); return false; } return true; }
int OGRSelafinDataSource::OpenTable(const char * pszFilename) { #ifdef DEBUG_VERBOSE CPLDebug("Selafin", "OpenTable(%s,%i)", pszFilename, static_cast<int>(bUpdate)); #endif // Open the file VSILFILE *fp = nullptr; if( bUpdate ) { fp = VSIFOpenExL( pszFilename, "rb+", true ); } else { fp = VSIFOpenExL( pszFilename, "rb", true ); } if( fp == nullptr ) { CPLError( CE_Warning, CPLE_OpenFailed, "Failed to open %s.", VSIGetLastErrorMsg() ); return FALSE; } if( !bUpdate && strstr(pszFilename, "/vsigzip/") == nullptr && strstr(pszFilename, "/vsizip/") == nullptr ) fp = (VSILFILE*) VSICreateBufferedReaderHandle((VSIVirtualHandle*)fp); // Quickly check if the file is in Selafin format, before actually starting to read to make it faster char szBuf[9]; VSIFReadL(szBuf,1,4,fp); if (szBuf[0]!=0 || szBuf[1]!=0 || szBuf[2]!=0 || szBuf[3]!=0x50) { VSIFCloseL(fp); return FALSE; } VSIFSeekL(fp,84,SEEK_SET); VSIFReadL(szBuf,1,8,fp); if (szBuf[0]!=0 || szBuf[1]!=0 || szBuf[2]!=0 || szBuf[3]!=0x50 || szBuf[4]!=0 || szBuf[5]!=0 || szBuf[6]!=0 || szBuf[7]!=8) { VSIFCloseL(fp); return FALSE; } /* VSIFSeekL(fp,76,SEEK_SET); VSIFReadL(szBuf,1,8,fp); if (STRNCASECMP(szBuf,"Seraphin",8)!=0 && STRNCASECMP(szBuf,"Serafin",7)!=0) { VSIFCloseL(fp); return FALSE; } */ // Get layer base name CPLString osBaseLayerName = CPLGetBasename(pszFilename); CPLString osExt = CPLGetExtension(pszFilename); if( STARTS_WITH(pszFilename, "/vsigzip/") && EQUAL(osExt, "gz") ) { size_t nPos=std::string::npos; if (strlen(pszFilename)>3) nPos=osExt.find_last_of('.',strlen(pszFilename)-4); if (nPos!=std::string::npos) { osExt=osExt.substr(nPos+1,strlen(pszFilename)-4-nPos); osBaseLayerName=osBaseLayerName.substr(0,nPos); } else { osExt=""; } } // Read header of file to get common information for all layers // poHeader now owns fp poHeader=Selafin::read_header(fp,pszFilename); if (poHeader==nullptr) { CPLError( CE_Failure, CPLE_OpenFailed, "Failed to open %s, wrong format.\n", pszFilename); return FALSE; } if (poHeader->nEpsg!=0) { poSpatialRef=new OGRSpatialReference(); poSpatialRef->SetAxisMappingStrategy(OAMS_TRADITIONAL_GIS_ORDER); if (poSpatialRef->importFromEPSG(poHeader->nEpsg)!=OGRERR_NONE) { CPLError( CE_Warning, CPLE_AppDefined, "EPSG %d not found. Could not set datasource SRS.\n", poHeader->nEpsg); delete poSpatialRef; poSpatialRef=nullptr; } } // To prevent int overflow in poRange.getSize() call where we do // nSteps * 2 if( poHeader->nSteps >= INT_MAX / 2 ) { CPLError( CE_Failure, CPLE_OpenFailed, "Invalid nSteps value" ); return FALSE; } // Create two layers for each selected time step: one for points, the other for elements poRange.setMaxValue(poHeader->nSteps); const int nNewLayers = static_cast<int>(poRange.getSize()); if (EQUAL(pszFilename, "/vsistdin/")) osBaseLayerName = "layer"; CPLString osLayerName; papoLayers = (OGRSelafinLayer **) CPLRealloc(papoLayers, sizeof(void*) * (nLayers+nNewLayers)); for (size_t j=0;j<2;++j) { SelafinTypeDef eType=(j==0)?POINTS:ELEMENTS; for (int i=0;i<poHeader->nSteps;++i) { if (poRange.contains(eType,i)) { char szTemp[30]; double dfTime = 0.0; if( VSIFSeekL(fp, poHeader->getPosition(i)+4, SEEK_SET)!=0 || Selafin::read_float(fp, dfTime)==0 ) { CPLError( CE_Failure, CPLE_OpenFailed, "Failed to open %s, wrong format.\n", pszFilename); return FALSE; } if (poHeader->panStartDate==nullptr) snprintf(szTemp,29,"%d",i); else { struct tm sDate; memset(&sDate, 0, sizeof(sDate)); sDate.tm_year=poHeader->panStartDate[0]-1900; sDate.tm_mon=poHeader->panStartDate[1]-1; sDate.tm_mday=poHeader->panStartDate[2]; sDate.tm_hour=poHeader->panStartDate[3]; sDate.tm_min=poHeader->panStartDate[4]; double dfSec=poHeader->panStartDate[5]+dfTime; if( dfSec >= 0 && dfSec < 60 ) sDate.tm_sec=static_cast<int>(dfSec); mktime(&sDate); strftime(szTemp,29,"%Y_%m_%d_%H_%M_%S",&sDate); } if (eType==POINTS) osLayerName=osBaseLayerName+"_p"+szTemp; else osLayerName=osBaseLayerName+"_e"+szTemp; papoLayers[nLayers++] = new OGRSelafinLayer( osLayerName, bUpdate, poSpatialRef, poHeader, i, eType); //poHeader->nRefCount++; } } } // Free allocated variables and exit return TRUE; }
int OGRDXFWriterDS::Open( const char * pszFilename, char **papszOptions ) { /* -------------------------------------------------------------------- */ /* Open the standard header, or a user provided header. */ /* -------------------------------------------------------------------- */ if( CSLFetchNameValue(papszOptions,"HEADER") != NULL ) osHeaderFile = CSLFetchNameValue(papszOptions,"HEADER"); else { const char *pszValue = CPLFindFile( "gdal", "header.dxf" ); if( pszValue == NULL ) { CPLError( CE_Failure, CPLE_OpenFailed, "Failed to find template header file header.dxf for reading,\nis GDAL_DATA set properly?" ); return FALSE; } osHeaderFile = pszValue; } /* -------------------------------------------------------------------- */ /* Establish the name for our trailer file. */ /* -------------------------------------------------------------------- */ if( CSLFetchNameValue(papszOptions,"TRAILER") != NULL ) osTrailerFile = CSLFetchNameValue(papszOptions,"TRAILER"); else { const char *pszValue = CPLFindFile( "gdal", "trailer.dxf" ); if( pszValue != NULL ) osTrailerFile = pszValue; } /* -------------------------------------------------------------------- */ /* What entity id do we want to start with when writing? Small */ /* values run a risk of overlapping some undetected entity in */ /* the header or trailer despite the prescanning we do. */ /* -------------------------------------------------------------------- */ #ifdef DEBUG nNextFID = 80; #else nNextFID = 131072; #endif if( CSLFetchNameValue( papszOptions, "FIRST_ENTITY" ) != NULL ) nNextFID = atoi(CSLFetchNameValue( papszOptions, "FIRST_ENTITY" )); /* -------------------------------------------------------------------- */ /* Prescan the header and trailer for entity codes. */ /* -------------------------------------------------------------------- */ ScanForEntities( osHeaderFile, "HEADER" ); ScanForEntities( osTrailerFile, "TRAILER" ); /* -------------------------------------------------------------------- */ /* Attempt to read the template header file so we have a list */ /* of layers, linestyles and blocks. */ /* -------------------------------------------------------------------- */ if( !oHeaderDS.Open( osHeaderFile, TRUE ) ) return FALSE; /* -------------------------------------------------------------------- */ /* Create the output file. */ /* -------------------------------------------------------------------- */ fp = VSIFOpenExL( pszFilename, "w+", true ); if( fp == NULL ) { CPLError( CE_Failure, CPLE_OpenFailed, "Failed to open '%s' for writing: %s", pszFilename, VSIGetLastErrorMsg() ); return FALSE; } /* -------------------------------------------------------------------- */ /* Establish the temporary file. */ /* -------------------------------------------------------------------- */ osTempFilename = pszFilename; osTempFilename += ".tmp"; fpTemp = VSIFOpenL( osTempFilename, "w" ); if( fpTemp == NULL ) { CPLError( CE_Failure, CPLE_OpenFailed, "Failed to open '%s' for writing.", osTempFilename.c_str() ); return FALSE; } return TRUE; }