static toff_t _tiffSizeProc(thandle_t fd) { vsi_l_offset old_off; toff_t file_size; old_off = VSIFTellL( (VSILFILE *) fd ); CPL_IGNORE_RET_VAL_INT(VSIFSeekL( (VSILFILE *) fd, 0, SEEK_END )); file_size = (toff_t) VSIFTellL( (VSILFILE *) fd ); CPL_IGNORE_RET_VAL_INT(VSIFSeekL( (VSILFILE *) fd, old_off, SEEK_SET )); return file_size; }
void CEOSClose( CEOSImage * psCEOS ) { CPLFree( psCEOS->panDataStart ); CPL_IGNORE_RET_VAL_INT(VSIFCloseL( psCEOS->fpImage )); CPLFree( psCEOS ); }
/* * Open a TIFF file for read/writing. */ TIFF* TIFFOpen(const char* name, const char* mode) { static const char module[] = "TIFFOpen"; int i, a_out; char szAccess[32]; VSILFILE *fp; TIFF *tif; char *pszAccess = szAccess; a_out = 0; pszAccess[0] = '\0'; for( i = 0; mode[i] != '\0'; i++ ) { if( mode[i] == 'r' || mode[i] == 'w' || mode[i] == '+' || mode[i] == 'a' ) { szAccess[a_out++] = mode[i]; szAccess[a_out] = '\0'; } } strcat( szAccess, "b" ); fp = VSIFOpenL( name, szAccess ); if (fp == NULL) { if( errno >= 0 ) TIFFError(module,"%s: %s", name, VSIStrerror( errno ) ); else TIFFError(module, "%s: Cannot open", name); return ((TIFF *)0); } tif = TIFFClientOpen(name, mode, (thandle_t) fp, _tiffReadProc, _tiffWriteProc, _tiffSeekProc, _tiffCloseProc, _tiffSizeProc, _tiffMapProc, _tiffUnmapProc); if( tif != NULL ) tif->tif_fd = 0; else CPL_IGNORE_RET_VAL_INT(VSIFCloseL( fp )); return tif; }
int NITFDESExtractShapefile(NITFDES* psDES, const char* pszRadixFileName) { NITFSegmentInfo* psSegInfo; const char* apszExt[3]; int anOffset[4]; int iShpFile; char* pszFilename; size_t nFilenameLen; if ( CSLFetchNameValue(psDES->papszMetadata, "NITF_SHAPE_USE") == NULL ) return FALSE; psSegInfo = psDES->psFile->pasSegmentInfo + psDES->iSegment; apszExt[0] = CSLFetchNameValue(psDES->papszMetadata, "NITF_SHAPE1_NAME"); anOffset[0] = atoi(CSLFetchNameValue(psDES->papszMetadata, "NITF_SHAPE1_START")); apszExt[1] = CSLFetchNameValue(psDES->papszMetadata, "NITF_SHAPE2_NAME"); anOffset[1] = atoi(CSLFetchNameValue(psDES->papszMetadata, "NITF_SHAPE2_START")); apszExt[2] = CSLFetchNameValue(psDES->papszMetadata, "NITF_SHAPE3_NAME"); anOffset[2] = atoi(CSLFetchNameValue(psDES->papszMetadata, "NITF_SHAPE3_START")); anOffset[3] = (int) psSegInfo->nSegmentSize; for(iShpFile = 0; iShpFile < 3; iShpFile ++) { if (!EQUAL(apszExt[iShpFile], "SHP") && !EQUAL(apszExt[iShpFile], "SHX") && !EQUAL(apszExt[iShpFile], "DBF")) return FALSE; if (anOffset[iShpFile] < 0 || anOffset[iShpFile] >= anOffset[iShpFile+1]) return FALSE; } nFilenameLen = strlen(pszRadixFileName) + 4 + 1; pszFilename = (char*) VSI_MALLOC_VERBOSE(nFilenameLen); if (pszFilename == NULL) return FALSE; for(iShpFile = 0; iShpFile < 3; iShpFile ++) { VSILFILE* fp; GByte* pabyBuffer; int nSize = anOffset[iShpFile+1] - anOffset[iShpFile]; pabyBuffer = (GByte*) VSI_MALLOC_VERBOSE(nSize); if (pabyBuffer == NULL) { VSIFree(pszFilename); return FALSE; } if( VSIFSeekL(psDES->psFile->fp, psSegInfo->nSegmentStart + anOffset[iShpFile], SEEK_SET) != 0 || VSIFReadL(pabyBuffer, 1, nSize, psDES->psFile->fp) != (size_t)nSize) { VSIFree(pabyBuffer); VSIFree(pszFilename); return FALSE; } snprintf(pszFilename, nFilenameLen, "%s.%s", pszRadixFileName, apszExt[iShpFile]); fp = VSIFOpenL(pszFilename, "wb"); if (fp == NULL) { VSIFree(pabyBuffer); VSIFree(pszFilename); return FALSE; } if( (int) VSIFWriteL(pabyBuffer, 1, nSize, fp) != nSize ) { CPL_IGNORE_RET_VAL_INT(VSIFCloseL(fp)); VSIFree(pabyBuffer); VSIFree(pszFilename); return FALSE; } CPL_IGNORE_RET_VAL_INT(VSIFCloseL(fp)); VSIFree(pabyBuffer); } VSIFree(pszFilename); return TRUE; }