GDALDataset* OGRPLScenesDataV1Dataset::OpenRasterScene(GDALOpenInfo* poOpenInfo, CPLString osScene, char** papszOptions) { if( !(poOpenInfo->nOpenFlags & GDAL_OF_RASTER) ) { CPLError(CE_Failure, CPLE_AppDefined, "The scene option must only be used with vector access"); return nullptr; } int nActivationTimeout = atoi(CSLFetchNameValueDef(poOpenInfo->papszOpenOptions, "ACTIVATION_TIMEOUT", "3600")); for( char** papszIter = papszOptions; papszIter && *papszIter; papszIter ++ ) { char* pszKey = nullptr; const char* pszValue = CPLParseNameValue(*papszIter, &pszKey); if( pszValue != nullptr ) { if( !EQUAL(pszKey, "api_key") && !EQUAL(pszKey, "scene") && !EQUAL(pszKey, "product_type") && !EQUAL(pszKey, "asset") && !EQUAL(pszKey, "catalog") && !EQUAL(pszKey, "itemtypes") && !EQUAL(pszKey, "version") && !EQUAL(pszKey, "follow_links") && !EQUAL(pszKey, "metadata")) { CPLError(CE_Failure, CPLE_NotSupported, "Unsupported option %s", pszKey); CPLFree(pszKey); return nullptr; } CPLFree(pszKey); } } const char* pszCatalog = CSLFetchNameValueDef(papszOptions, "itemtypes", CSLFetchNameValueDef(papszOptions, "catalog", CSLFetchNameValueDef(poOpenInfo->papszOpenOptions, "ITEMTYPES", CSLFetchNameValue(poOpenInfo->papszOpenOptions, "CATALOG")))); if( pszCatalog == nullptr ) { CPLError(CE_Failure, CPLE_AppDefined, "Missing catalog"); return nullptr; } const char* pszProductType = CSLFetchNameValueDef(papszOptions, "asset", CSLFetchNameValueDef(papszOptions, "product_type", CSLFetchNameValueDef(poOpenInfo->papszOpenOptions, "ASSET", CSLFetchNameValue(poOpenInfo->papszOpenOptions, "PRODUCT_TYPE")))); CPLString osRasterURL; osRasterURL = m_osBaseURL; osRasterURL += "item-types/"; osRasterURL += pszCatalog; osRasterURL += "/items/"; osRasterURL += osScene; osRasterURL += "/assets/"; time_t nStartTime = time(nullptr); retry: time_t nCurrentTime = time(nullptr); if( nCurrentTime - nStartTime > nActivationTimeout ) { CPLError(CE_Failure, CPLE_AppDefined, "Activation timeout reached"); return nullptr; } json_object* poObj = RunRequest( osRasterURL ); if( poObj == nullptr ) return nullptr; json_object* poSubObj = nullptr; if( pszProductType != nullptr && (poSubObj = CPL_json_object_object_get(poObj, pszProductType)) != nullptr ) { /* do nothing */ } else if( pszProductType != nullptr && !EQUAL(pszProductType, "LIST") && (poSubObj = CPL_json_object_object_get(poObj, pszProductType)) == nullptr ) { CPLError(CE_Failure, CPLE_AppDefined, "Cannot find asset %s", pszProductType); json_object_put(poObj); return nullptr; } else if( pszProductType == nullptr && (poSubObj = CPL_json_object_object_get(poObj, "visual")) != nullptr ) { /* do nothing */ } else { json_object_iter it; it.key = nullptr; it.val = nullptr; it.entry = nullptr; char** papszSubdatasets = nullptr; int nSubDataset = 0; json_object_object_foreachC( poObj, it ) { ++nSubDataset; papszSubdatasets = CSLSetNameValue(papszSubdatasets, CPLSPrintf("SUBDATASET_%d_NAME", nSubDataset), CPLSPrintf("Scene=%s of item types %s, asset %s", osScene.c_str(), pszCatalog, it.key)); papszSubdatasets = CSLSetNameValue(papszSubdatasets, CPLSPrintf("SUBDATASET_%d_DESC", nSubDataset), CPLSPrintf("PLScenes:version=Data_V1,itemtypes=%s,scene=%s,asset=%s", pszCatalog, osScene.c_str(), it.key)); } json_object_put(poObj); if( nSubDataset != 0 ) { GDALDataset* poDS = new OGRPLScenesDataV1Dataset(); poDS->SetMetadata(papszSubdatasets, "SUBDATASETS"); CSLDestroy(papszSubdatasets); return poDS; } return nullptr; }