OGRLayer* OGRVRTDataSource::InstanciateLayerInternal(CPLXMLNode *psLTree, const char *pszVRTDirectory, int bUpdate, int nRecLevel) { /* -------------------------------------------------------------------- */ /* Create the layer object. */ /* -------------------------------------------------------------------- */ if( EQUAL(psLTree->pszValue,"OGRVRTLayer") ) { OGRVRTLayer* poVRTLayer = new OGRVRTLayer(this); if( !poVRTLayer->FastInitialize( psLTree, pszVRTDirectory, bUpdate ) ) { delete poVRTLayer; return NULL; } return poVRTLayer; } else if( EQUAL(psLTree->pszValue,"OGRVRTWarpedLayer") && nRecLevel < 30 ) { return InstanciateWarpedLayer( psLTree, pszVRTDirectory, bUpdate, nRecLevel + 1 ); } else if( EQUAL(psLTree->pszValue,"OGRVRTUnionLayer") && nRecLevel < 30 ) { return InstanciateUnionLayer( psLTree, pszVRTDirectory, bUpdate, nRecLevel + 1 ); } else return NULL; }
int OGRVRTDataSource::Initialize( CPLXMLNode *psTree, const char *pszNewName, int bUpdate ) { CPLAssert( nLayers == 0 ); this->psTree = psTree; /* -------------------------------------------------------------------- */ /* Set name, and capture the directory path so we can use it */ /* for relative datasources. */ /* -------------------------------------------------------------------- */ char *pszVRTDirectory = CPLStrdup( CPLGetPath( pszNewName ) ); pszName = CPLStrdup( pszNewName ); /* -------------------------------------------------------------------- */ /* Look for layers. */ /* -------------------------------------------------------------------- */ CPLXMLNode *psLTree; for( psLTree=psTree->psChild; psLTree != NULL; psLTree=psLTree->psNext ) { if( psLTree->eType != CXT_Element || !EQUAL(psLTree->pszValue,"OGRVRTLayer") ) continue; /* -------------------------------------------------------------------- */ /* Create the layer object. */ /* -------------------------------------------------------------------- */ OGRVRTLayer *poLayer; poLayer = new OGRVRTLayer(); if( !poLayer->FastInitialize( psLTree, pszVRTDirectory, bUpdate ) ) { CPLFree( pszVRTDirectory ); delete poLayer; return FALSE; } /* -------------------------------------------------------------------- */ /* Add layer to data source layer list. */ /* -------------------------------------------------------------------- */ papoLayers = (OGRVRTLayer **) CPLRealloc( papoLayers, sizeof(OGRVRTLayer *) * (nLayers+1) ); papoLayers[nLayers++] = poLayer; } CPLFree( pszVRTDirectory ); return TRUE; }