static xmlParserInputPtr external_entity_loader(const char *URL, const char *ID, xmlParserCtxtPtr ctxt) { xmlParserInputPtr input; TRACE("(%s %s %p)\n", debugstr_a(URL), debugstr_a(ID), ctxt); assert(MSXML_hInstance != NULL); assert(datatypes_rsrc != NULL); assert(datatypes_handle != NULL); assert(datatypes_src != NULL); /* TODO: if the desired schema is in the cache, load it from there */ if (lstrcmpA(URL, "urn:schemas-microsoft-com:datatypes") == 0) { TRACE("loading built-in schema for %s\n", URL); input = xmlNewStringInputStream(ctxt, datatypes_src); } else { input = _external_entity_loader(URL, ID, ctxt); } return input; }
/* * We need to trap calls to the resolver to not account memory for the catalog * which is shared to the current running test. We also don't want to have * network downloads modifying tests. */ static xmlParserInputPtr testExternalEntityLoader(const char *URL, const char *ID, xmlParserCtxtPtr ctxt) { xmlParserInputPtr ret; int i; for (i = 0;i < nb_entities;i++) { if (!strcmp(testEntitiesName[i], URL)) { ret = xmlNewStringInputStream(ctxt, (const xmlChar *) testEntitiesValue[i]); if (ret != NULL) { ret->filename = (const char *) xmlStrdup((xmlChar *)testEntitiesName[i]); } return(ret); } } if (checkTestFile(URL)) { ret = xmlNoNetExternalEntityLoader(URL, ID, ctxt); } else { int memused = xmlMemUsed(); ret = xmlNoNetExternalEntityLoader(URL, ID, ctxt); extraMemoryFromResolver += xmlMemUsed() - memused; } #if 0 if (ret == NULL) { fprintf(stderr, "Failed to find resource %s\n", URL); } #endif return(ret); }
xmlParserInputPtr xmlMyExternalEntityLoader(const char *URL, const char *UNUSED(ID), xmlParserCtxtPtr ctxt) { if (!strcmp(URL,"qy.dtd") && (dtdmem)) { return xmlNewStringInputStream(ctxt,(const xmlChar *) dtdmem); } return NULL; }
xmlParserInputPtr DTDExternalEntityLoader(const char *pURL, const char *pID, xmlParserCtxtPtr ctxt) { xmlParserInputPtr ret; /* lookup for the fileID depending on ID */ std::map<string, string>::iterator it = g_DTDMap.find(pURL); if (it != g_DTDMap.end()) { ret = xmlNewStringInputStream(ctxt, (const xmlChar *)(it->second.c_str())); return(ret); } else { ret = DefaultLoaderProc(pURL, pID, ctxt); return(ret); } }
static xmlParserInputPtr CPLExternalEntityLoader (const char * URL, const char * ID, xmlParserCtxtPtr context) { //CPLDebug("CPL", "CPLExternalEntityLoader(%s)", URL); CPLString osURL; /* Use libxml2 catalog mechanism to resolve the URL to something else */ xmlChar* pszResolved = xmlCatalogResolveSystem((const xmlChar*)URL); if (pszResolved == NULL) pszResolved = xmlCatalogResolveURI((const xmlChar*)URL); if (pszResolved) { CPLDebug("CPL", "Resolving %s in %s", URL, (const char*)pszResolved ); osURL = (const char*)pszResolved; URL = osURL.c_str(); xmlFree(pszResolved); pszResolved = NULL; } if (STARTS_WITH(URL, "http://")) { /* Make sure to use http://schemas.opengis.net/ */ /* when gml/2 or gml/3 is detected */ const char* pszGML = strstr(URL, "gml/2"); if (pszGML == NULL) pszGML = strstr(URL, "gml/3"); if (pszGML != NULL) { osURL = "http://schemas.opengis.net/"; osURL += pszGML; URL = osURL.c_str(); } else if (strcmp(URL, "http://www.w3.org/2001/xml.xsd") == 0) { CPLString osTmp = CPLFindLocalXSD("xml.xsd"); if( osTmp.size() != 0 ) { osURL = osTmp; URL = osURL.c_str(); } else { CPLDebug("CPL", "Resolving %s to local definition", "http://www.w3.org/2001/xml.xsd"); return xmlNewStringInputStream(context, (const xmlChar*) szXML_XSD); } } else if (strcmp(URL, "http://www.w3.org/1999/xlink.xsd") == 0) { CPLString osTmp = CPLFindLocalXSD("xlink.xsd"); if( osTmp.size() != 0 ) { osURL = osTmp; URL = osURL.c_str(); } else { CPLDebug("CPL", "Resolving %s to local definition", "http://www.w3.org/1999/xlink.xsd"); return xmlNewStringInputStream(context, (const xmlChar*) szXLINK_XSD); } } else if (!STARTS_WITH(URL, "http://schemas.opengis.net/")) { CPLDebug("CPL", "Loading %s", URL); return pfnLibXMLOldExtranerEntityLoader(URL, ID, context); } } else if (STARTS_WITH(URL, "ftp://")) { return pfnLibXMLOldExtranerEntityLoader(URL, ID, context); } else if (STARTS_WITH(URL, "file://")) { /* Parse file:// URI so as to be able to open them with VSI*L API */ if (STARTS_WITH(URL, "file://localhost/")) URL += 16; else URL += 7; if (URL[0] == '/' && URL[1] != '\0' && URL[2] == ':' && URL[3] == '/') /* Windows */ URL ++; else if (URL[0] == '/') /* Unix */ ; else return pfnLibXMLOldExtranerEntityLoader(URL, ID, context); } CPLString osModURL; if (STARTS_WITH(URL, "/vsizip/vsicurl/http%3A//")) { osModURL = "/vsizip/vsicurl/http://"; osModURL += URL + strlen("/vsizip/vsicurl/http%3A//"); } else if (STARTS_WITH(URL, "/vsicurl/http%3A//")) { osModURL = "vsicurl/http://"; osModURL += URL + strlen("/vsicurl/http%3A//"); } else if (STARTS_WITH(URL, "http://schemas.opengis.net/")) { const char *pszAfterOpenGIS = URL + strlen("http://schemas.opengis.net/"); const char *pszSchemasOpenGIS; pszSchemasOpenGIS = CPLGetConfigOption("GDAL_OPENGIS_SCHEMAS", NULL); if (pszSchemasOpenGIS != NULL) { int nLen = (int)strlen(pszSchemasOpenGIS); if (nLen > 0 && pszSchemasOpenGIS[nLen-1] == '/') { osModURL = pszSchemasOpenGIS; osModURL += pszAfterOpenGIS; } else { osModURL = pszSchemasOpenGIS; osModURL += "/"; osModURL += pszAfterOpenGIS; } } else if ((pszSchemasOpenGIS = CPLFindFile( "gdal", "SCHEMAS_OPENGIS_NET" )) != NULL) { osModURL = pszSchemasOpenGIS; osModURL += "/"; osModURL += pszAfterOpenGIS; } else if ((pszSchemasOpenGIS = CPLFindFile( "gdal", "SCHEMAS_OPENGIS_NET.zip" )) != NULL) { osModURL = "/vsizip/"; osModURL += pszSchemasOpenGIS; osModURL += "/"; osModURL += pszAfterOpenGIS; } else { osModURL = "/vsizip/vsicurl/http://schemas.opengis.net/SCHEMAS_OPENGIS_NET.zip/"; osModURL += pszAfterOpenGIS; } } else { osModURL = URL; } xmlChar* pszBuffer = (xmlChar*)CPLLoadSchemaStr(osModURL); if (pszBuffer == NULL) return NULL; xmlParserInputPtr poInputStream = xmlNewStringInputStream(context, pszBuffer); if (poInputStream != NULL) poInputStream->free = CPLLibXMLInputStreamCPLFree; return poInputStream; }