From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/msxml3/saxreader.c | 44 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+)
diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c index e9355c6bf6c..0daf6d8425d 100644 --- a/dlls/msxml3/saxreader.c +++ b/dlls/msxml3/saxreader.c @@ -2023,6 +2023,48 @@ static void libxml_pi(void *ctx, const xmlChar *_target, const xmlChar *_data) format_error_message_from_id(locator, hr); }
+static void libxml_internalsubset(void *ctx, const xmlChar *_name, const xmlChar *external_id, const xmlChar *system_id) +{ + saxlocator *locator = ctx; + struct saxlexicalhandler_iface *lexical = saxreader_get_lexicalhandler(locator->saxreader); + BSTR name, pubid, sysid; + HRESULT hr; + + update_position(locator, FALSE); + if (!saxreader_has_handler(locator, SAXLexicalHandler)) return; + + name = pooled_bstr_from_xmlChar(&locator->saxreader->pool, _name); + pubid = pooled_bstr_from_xmlChar(&locator->saxreader->pool, external_id); + sysid = pooled_bstr_from_xmlChar(&locator->saxreader->pool, system_id); + + if (locator->vbInterface) + hr = IVBSAXLexicalHandler_startDTD(lexical->vbhandler, &name, &pubid, &sysid); + else + hr = ISAXLexicalHandler_startDTD(lexical->handler, name, SysStringLen(name), + pubid, SysStringLen(pubid), sysid, SysStringLen(sysid)); + + if (FAILED(hr)) + format_error_message_from_id(locator, hr); +} + +static void libxml_externalsubset(void *ctx, const xmlChar *name, const xmlChar *external_id, const xmlChar *system_id) +{ + saxlocator *locator = ctx; + struct saxlexicalhandler_iface *lexical = saxreader_get_lexicalhandler(locator->saxreader); + HRESULT hr = S_OK; + + update_position(locator, FALSE); + if (!saxreader_has_handler(locator, SAXLexicalHandler)) return; + + if (locator->vbInterface) + hr = IVBSAXLexicalHandler_endDTD(lexical->vbhandler); + else + hr = ISAXLexicalHandler_endDTD(lexical->handler); + + if (FAILED(hr)) + format_error_message_from_id(locator, hr); +} + static xmlParserInputPtr libxmlresolveentity(void *ctx, const xmlChar *publicid, const xmlChar *systemid) { FIXME("entity resolving not implemented, %s, %s\n", publicid, systemid); @@ -3401,6 +3443,8 @@ HRESULT SAXXMLReader_create(MSXML_VERSION version, LPVOID *ppObj) reader->sax.cdataBlock = libxml_cdatablock; reader->sax.resolveEntity = libxmlresolveentity; reader->sax.processingInstruction = libxml_pi; + reader->sax.internalSubset = libxml_internalsubset; + reader->sax.externalSubset = libxml_externalsubset;
*ppObj = &reader->IVBSAXXMLReader_iface;