From f6452d229d2072b459c5f6e4ac3f895032e9060f Mon Sep 17 00:00:00 2001
From: Neil Graham <neilg@apache.org>
Date: Tue, 19 Aug 2003 14:15:18 +0000
Subject: [PATCH] fixing bug 21001; thanks to David Cargill

git-svn-id: https://svn.apache.org/repos/asf/xerces/c/trunk@175149 13f79535-47bb-0310-9956-ffa450edef68
---
 src/xercesc/parsers/DOMBuilderImpl.cpp  | 20 +++++++++++++++++++-
 src/xercesc/parsers/XercesDOMParser.cpp | 18 ++++++++++++++++++
 2 files changed, 37 insertions(+), 1 deletion(-)

diff --git a/src/xercesc/parsers/DOMBuilderImpl.cpp b/src/xercesc/parsers/DOMBuilderImpl.cpp
index e408b3154..0f3d34cf8 100644
--- a/src/xercesc/parsers/DOMBuilderImpl.cpp
+++ b/src/xercesc/parsers/DOMBuilderImpl.cpp
@@ -545,18 +545,24 @@ Grammar* DOMBuilderImpl::loadGrammar(const char* const systemId,
     try
     {
         setParseInProgress(true);
+        if (grammarType == Grammar::DTDGrammarType) 
+            getScanner()->setDocTypeHandler(0);
         grammar = getScanner()->loadGrammar(systemId, grammarType, toCache);
 
         // Release DOM tree - DTD
         DOMDocument* doc = adoptDocument();
         if (doc)
             doc->release();
-
+        
+        if (grammarType == Grammar::DTDGrammarType) 
+            getScanner()->setDocTypeHandler(this);
         setParseInProgress(false);
     }
 
     catch(...)
     {
+        if (grammarType == Grammar::DTDGrammarType) 
+            getScanner()->setDocTypeHandler(this);
         setParseInProgress(false);
         throw;
     }
@@ -576,6 +582,8 @@ Grammar* DOMBuilderImpl::loadGrammar(const XMLCh* const systemId,
     try
     {
         setParseInProgress(true);
+        if (grammarType == Grammar::DTDGrammarType) 
+            getScanner()->setDocTypeHandler(0);
         grammar = getScanner()->loadGrammar(systemId, grammarType, toCache);
 
         // Release DOM tree - DTD
@@ -583,11 +591,15 @@ Grammar* DOMBuilderImpl::loadGrammar(const XMLCh* const systemId,
         if (doc)
             doc->release();
 
+        if (grammarType == Grammar::DTDGrammarType) 
+            getScanner()->setDocTypeHandler(this);
         setParseInProgress(false);
     }
 
     catch(...)
     {
+        if (grammarType == Grammar::DTDGrammarType) 
+            getScanner()->setDocTypeHandler(this);
         setParseInProgress(false);
         throw;
     }
@@ -609,6 +621,8 @@ Grammar* DOMBuilderImpl::loadGrammar(const DOMInputSource& source,
         Wrapper4DOMInputSource isWrapper((DOMInputSource*) &source, false, getMemoryManager());
 
         setParseInProgress(true);
+        if (grammarType == Grammar::DTDGrammarType) 
+            getScanner()->setDocTypeHandler(0);
         grammar = getScanner()->loadGrammar(isWrapper, grammarType, toCache);
 
         // Release DOM tree - DTD
@@ -616,11 +630,15 @@ Grammar* DOMBuilderImpl::loadGrammar(const DOMInputSource& source,
         if (doc)
             doc->release();
 
+        if (grammarType == Grammar::DTDGrammarType) 
+            getScanner()->setDocTypeHandler(this);
         setParseInProgress(false);
     }
 
     catch(...)
     {
+        if (grammarType == Grammar::DTDGrammarType) 
+            getScanner()->setDocTypeHandler(this);
         setParseInProgress(false);
         throw;
     }
diff --git a/src/xercesc/parsers/XercesDOMParser.cpp b/src/xercesc/parsers/XercesDOMParser.cpp
index 484b9c2f3..7b8288f2e 100644
--- a/src/xercesc/parsers/XercesDOMParser.cpp
+++ b/src/xercesc/parsers/XercesDOMParser.cpp
@@ -265,12 +265,18 @@ Grammar* XercesDOMParser::loadGrammar(const char* const systemId,
     try
     {
         setParseInProgress(true);
+        if (grammarType == Grammar::DTDGrammarType) 
+            getScanner()->setDocTypeHandler(0);
         grammar = getScanner()->loadGrammar(systemId, grammarType, toCache);
+        if (grammarType == Grammar::DTDGrammarType) 
+            getScanner()->setDocTypeHandler(this);
         setParseInProgress(false);
     }
 
     catch(...)
     {
+        if (grammarType == Grammar::DTDGrammarType) 
+            getScanner()->setDocTypeHandler(this);        
         setParseInProgress(false);
         throw;
     }
@@ -290,12 +296,18 @@ Grammar* XercesDOMParser::loadGrammar(const XMLCh* const systemId,
     try
     {
         setParseInProgress(true);
+        if (grammarType == Grammar::DTDGrammarType) 
+            getScanner()->setDocTypeHandler(0);
         grammar = getScanner()->loadGrammar(systemId, grammarType, toCache);
+        if (grammarType == Grammar::DTDGrammarType) 
+            getScanner()->setDocTypeHandler(this);
         setParseInProgress(false);
     }
 
     catch(...)
     {
+        if (grammarType == Grammar::DTDGrammarType) 
+            getScanner()->setDocTypeHandler(this);        
         setParseInProgress(false);
         throw;
     }
@@ -315,12 +327,18 @@ Grammar* XercesDOMParser::loadGrammar(const InputSource& source,
     try
     {
         setParseInProgress(true);
+        if (grammarType == Grammar::DTDGrammarType) 
+            getScanner()->setDocTypeHandler(0);
         grammar = getScanner()->loadGrammar(source, grammarType, toCache);
+        if (grammarType == Grammar::DTDGrammarType) 
+            getScanner()->setDocTypeHandler(this);
         setParseInProgress(false);
     }
 
     catch(...)
     {
+        if (grammarType == Grammar::DTDGrammarType) 
+            getScanner()->setDocTypeHandler(this);
         setParseInProgress(false);
         throw;
     }
-- 
GitLab