int MeaXMLParser::ExternalEntityRefHandler(XML_Parser parser, const XML_Char* context, const XML_Char* /*base*/, const XML_Char* systemId, const XML_Char* /*publicId*/) { if (systemId != NULL) { MeaXMLParser *ps = reinterpret_cast<MeaXMLParser*>(parser); CString sysId(FromUTF8(systemId)); if (sysId.Find(MeaXMLParser::m_homeURL) == 0) { TCHAR pathname[_MAX_PATH], drive[_MAX_DRIVE], dir[_MAX_DIR]; GetModuleFileName(NULL, pathname, _MAX_PATH); _tsplitpath_s(pathname, drive, _MAX_DRIVE, dir, _MAX_DIR, NULL, 0, NULL, 0); sysId = CString(drive) + CString(dir) + sysId.Mid(_tcslen(MeaXMLParser::m_homeURL)); sysId.Replace(_T('/'), _T('\\')); ps->m_pathnameStack->push(sysId); ps->m_context = context; ps->m_handler->ParseEntity(*ps, sysId); ps->m_context = NULL; ps->m_pathnameStack->pop(); } } return 1; }
int ParserEngine::handleExternalEntityRef(XML_Parser parser, const XML_Char* context, const XML_Char* base, const XML_Char* systemId, const XML_Char* publicId) { ParserEngine* pThis = reinterpret_cast<ParserEngine*>(XML_GetUserData(parser)); if (!context && !pThis->_externalParameterEntities) return XML_STATUS_ERROR; if (context && !pThis->_externalGeneralEntities) return XML_STATUS_ERROR; InputSource* pInputSource = 0; EntityResolver* pEntityResolver = 0; EntityResolverImpl defaultResolver; XMLString sysId(systemId); XMLString pubId; if (publicId) pubId.assign(publicId); URI uri(fromXMLString(pThis->_context.back()->getSystemId())); uri.resolve(fromXMLString(sysId)); if (pThis->_pEntityResolver) { pEntityResolver = pThis->_pEntityResolver; pInputSource = pEntityResolver->resolveEntity(publicId ? &pubId : 0, toXMLString(uri.toString())); } if (!pInputSource && pThis->_externalGeneralEntities) { pEntityResolver = &defaultResolver; pInputSource = pEntityResolver->resolveEntity(publicId ? &pubId : 0, toXMLString(uri.toString())); } if (pInputSource) { XML_Parser extParser = XML_ExternalEntityParserCreate(pThis->_parser, context, 0); if (!extParser) throw XMLException("Cannot create external entity parser"); try { pThis->parseExternal(extParser, pInputSource); } catch (XMLException&) { pEntityResolver->releaseInputSource(pInputSource); XML_ParserFree(extParser); throw; } pEntityResolver->releaseInputSource(pInputSource); XML_ParserFree(extParser); return XML_STATUS_OK; } else return XML_STATUS_ERROR; }