CPLErr VRTRawRasterBand::XMLInit( CPLXMLNode * psTree, const char *pszVRTPath ) { const CPLErr eErr = VRTRasterBand::XMLInit( psTree, pszVRTPath ); if( eErr != CE_None ) return eErr; /* -------------------------------------------------------------------- */ /* Validate a bit. */ /* -------------------------------------------------------------------- */ if( psTree == NULL || psTree->eType != CXT_Element || !EQUAL(psTree->pszValue, "VRTRasterBand") || !EQUAL(CPLGetXMLValue(psTree,"subClass",""), "VRTRawRasterBand") ) { CPLError( CE_Failure, CPLE_AppDefined, "Invalid node passed to VRTRawRasterBand::XMLInit()." ); return CE_Failure; } /* -------------------------------------------------------------------- */ /* Prepare filename. */ /* -------------------------------------------------------------------- */ const char *pszFilename = CPLGetXMLValue(psTree, "SourceFilename", NULL); if( pszFilename == NULL ) { CPLError( CE_Warning, CPLE_AppDefined, "Missing <SourceFilename> element in VRTRasterBand." ); return CE_Failure; } // TODO(schwehr): Should this be a bool? const int l_bRelativeToVRT = atoi(CPLGetXMLValue( psTree, "SourceFilename.relativeToVRT", "1" ) ); /* -------------------------------------------------------------------- */ /* Collect layout information. */ /* -------------------------------------------------------------------- */ int nWordDataSize = GDALGetDataTypeSizeBytes( GetRasterDataType() ); const char* pszImageOffset = CPLGetXMLValue( psTree, "ImageOffset", "0"); const vsi_l_offset nImageOffset = CPLScanUIntBig( pszImageOffset, static_cast<int>(strlen(pszImageOffset)) ); int nPixelOffset = nWordDataSize; if( CPLGetXMLValue( psTree, "PixelOffset", NULL ) != NULL ) { nPixelOffset = atoi(CPLGetXMLValue( psTree, "PixelOffset", "0") ); } if (nPixelOffset <= 0) { CPLError( CE_Failure, CPLE_AppDefined, "Invalid value for <PixelOffset> element : %d", nPixelOffset ); return CE_Failure; } int nLineOffset = 0; if( CPLGetXMLValue( psTree, "LineOffset", NULL ) == NULL ) nLineOffset = nWordDataSize * GetXSize(); else nLineOffset = atoi(CPLGetXMLValue( psTree, "LineOffset", "0") ); const char *pszByteOrder = CPLGetXMLValue( psTree, "ByteOrder", NULL ); /* -------------------------------------------------------------------- */ /* Open the file, and setup the raw layer access to the data. */ /* -------------------------------------------------------------------- */ return SetRawLink( pszFilename, pszVRTPath, l_bRelativeToVRT, nImageOffset, nPixelOffset, nLineOffset, pszByteOrder ); }
CPLErr VRTRawRasterBand::XMLInit( CPLXMLNode * psTree, const char *pszVRTPath, void* pUniqueHandle, std::map<CPLString, GDALDataset*>& oMapSharedSources ) { const CPLErr eErr = VRTRasterBand::XMLInit( psTree, pszVRTPath, pUniqueHandle, oMapSharedSources ); if( eErr != CE_None ) return eErr; /* -------------------------------------------------------------------- */ /* Validate a bit. */ /* -------------------------------------------------------------------- */ if( psTree == nullptr || psTree->eType != CXT_Element || !EQUAL(psTree->pszValue, "VRTRasterBand") || !EQUAL(CPLGetXMLValue(psTree,"subClass",""), "VRTRawRasterBand") ) { CPLError( CE_Failure, CPLE_AppDefined, "Invalid node passed to VRTRawRasterBand::XMLInit()." ); return CE_Failure; } /* -------------------------------------------------------------------- */ /* Prepare filename. */ /* -------------------------------------------------------------------- */ const char *pszFilename = CPLGetXMLValue(psTree, "SourceFilename", nullptr); if( pszFilename == nullptr ) { CPLError( CE_Warning, CPLE_AppDefined, "Missing <SourceFilename> element in VRTRasterBand." ); return CE_Failure; } const bool l_bRelativeToVRT = CPLTestBool( CPLGetXMLValue( psTree, "SourceFilename.relativeToVRT", "1" )); /* -------------------------------------------------------------------- */ /* Collect layout information. */ /* -------------------------------------------------------------------- */ int nWordDataSize = GDALGetDataTypeSizeBytes( GetRasterDataType() ); const char* pszImageOffset = CPLGetXMLValue( psTree, "ImageOffset", "0"); const vsi_l_offset nImageOffset = CPLScanUIntBig( pszImageOffset, static_cast<int>(strlen(pszImageOffset)) ); int nPixelOffset = nWordDataSize; const char* pszPixelOffset = CPLGetXMLValue( psTree, "PixelOffset", nullptr ); if( pszPixelOffset != nullptr ) { nPixelOffset = atoi(pszPixelOffset); } if (nPixelOffset <= 0) { CPLError( CE_Failure, CPLE_AppDefined, "Invalid value for <PixelOffset> element : %d", nPixelOffset ); return CE_Failure; } int nLineOffset = 0; const char* pszLineOffset = CPLGetXMLValue( psTree, "LineOffset", nullptr ); if( pszLineOffset == nullptr ) { if( nPixelOffset > INT_MAX / GetXSize() ) { CPLError( CE_Failure, CPLE_AppDefined, "Int overflow"); return CE_Failure; } nLineOffset = nPixelOffset * GetXSize(); } else nLineOffset = atoi(pszLineOffset); const char *pszByteOrder = CPLGetXMLValue( psTree, "ByteOrder", nullptr ); /* -------------------------------------------------------------------- */ /* Open the file, and setup the raw layer access to the data. */ /* -------------------------------------------------------------------- */ return SetRawLink( pszFilename, pszVRTPath, l_bRelativeToVRT, nImageOffset, nPixelOffset, nLineOffset, pszByteOrder ); }