From a2bf97a7ca620067bd9a5250001543e725413327 Mon Sep 17 00:00:00 2001
From: Khaled Noaman <knoaman@apache.org>
Date: Wed, 14 Aug 2002 15:20:38 +0000
Subject: [PATCH] [Bug 3111] Problem with LexicalHandler::startDTD() and
 LexicalHandler::endDTD().

git-svn-id: https://svn.apache.org/repos/asf/xerces/c/trunk@174120 13f79535-47bb-0310-9956-ffa450edef68
---
 src/xercesc/dom/deprecated/DOMParser.cpp      |  1 +
 src/xercesc/dom/deprecated/DOMParser.hpp      |  1 +
 src/xercesc/internal/XMLScanner.cpp           |  4 ++--
 src/xercesc/parsers/AbstractDOMParser.cpp     |  1 +
 src/xercesc/parsers/AbstractDOMParser.hpp     |  1 +
 src/xercesc/parsers/SAX2XMLReaderImpl.cpp     | 14 +++++++++-----
 src/xercesc/parsers/SAX2XMLReaderImpl.hpp     |  6 ++++++
 src/xercesc/parsers/SAXParser.cpp             |  6 +++++-
 src/xercesc/parsers/SAXParser.hpp             |  6 ++++++
 src/xercesc/validators/DTD/DocTypeHandler.hpp |  8 ++++++--
 10 files changed, 38 insertions(+), 10 deletions(-)

diff --git a/src/xercesc/dom/deprecated/DOMParser.cpp b/src/xercesc/dom/deprecated/DOMParser.cpp
index c0d1d4ee0..7255e1cec 100644
--- a/src/xercesc/dom/deprecated/DOMParser.cpp
+++ b/src/xercesc/dom/deprecated/DOMParser.cpp
@@ -961,6 +961,7 @@ void DOMParser::doctypeDecl
     , const XMLCh* const    publicId
     , const XMLCh* const    systemId
     , const bool            hasIntSubset
+    , const bool            hasExtSubset
 )
 {
 	DOM_DocumentType dt;
diff --git a/src/xercesc/dom/deprecated/DOMParser.hpp b/src/xercesc/dom/deprecated/DOMParser.hpp
index ec192f2fd..cce6b4640 100644
--- a/src/xercesc/dom/deprecated/DOMParser.hpp
+++ b/src/xercesc/dom/deprecated/DOMParser.hpp
@@ -1501,6 +1501,7 @@ public :
         , const XMLCh* const    publicId
         , const XMLCh* const    systemId
         , const bool            hasIntSubset
+        , const bool            hasExtSubset = false
     );
 
     virtual void doctypePI
diff --git a/src/xercesc/internal/XMLScanner.cpp b/src/xercesc/internal/XMLScanner.cpp
index ca5457016..30ec9f228 100644
--- a/src/xercesc/internal/XMLScanner.cpp
+++ b/src/xercesc/internal/XMLScanner.cpp
@@ -2457,7 +2457,7 @@ void XMLScanner::scanDocTypeDecl()
     //  call the doctype event.
     //
     if (fDocTypeHandler)
-        fDocTypeHandler->doctypeDecl(*rootDecl, pubId, sysId, hasIntSubset);
+        fDocTypeHandler->doctypeDecl(*rootDecl, pubId, sysId, hasIntSubset, hasExtSubset);
 
     //
     //  Ok, if we had an internal subset, we are just past the [ character
@@ -4531,7 +4531,7 @@ Grammar* XMLScanner::loadDTDGrammar(const InputSource& src,
         rootDecl->setExternalElemDeclaration(true);
         Janitor<DTDElementDecl> janSrc(rootDecl);
 
-        fDocTypeHandler->doctypeDecl(*rootDecl, src.getPublicId(), src.getSystemId(), false);
+        fDocTypeHandler->doctypeDecl(*rootDecl, src.getPublicId(), src.getSystemId(), false, true);
     }
 
     // Create DTDScanner
diff --git a/src/xercesc/parsers/AbstractDOMParser.cpp b/src/xercesc/parsers/AbstractDOMParser.cpp
index 65ab0a5b0..2bedf8567 100644
--- a/src/xercesc/parsers/AbstractDOMParser.cpp
+++ b/src/xercesc/parsers/AbstractDOMParser.cpp
@@ -978,6 +978,7 @@ void AbstractDOMParser::doctypeDecl
     , const XMLCh* const    publicId
     , const XMLCh* const    systemId
     , const bool            hasIntSubset
+    , const bool            hasExtSubset
 )
 {
     fDocumentType = (DOMDocumentTypeImpl *) fDocument->createDocumentType(elemDecl.getFullName(), publicId, systemId);
diff --git a/src/xercesc/parsers/AbstractDOMParser.hpp b/src/xercesc/parsers/AbstractDOMParser.hpp
index 08046b303..4f2f8d038 100644
--- a/src/xercesc/parsers/AbstractDOMParser.hpp
+++ b/src/xercesc/parsers/AbstractDOMParser.hpp
@@ -1063,6 +1063,7 @@ public :
         , const XMLCh* const    publicId
         , const XMLCh* const    systemId
         , const bool            hasIntSubset
+        , const bool            hasExtSubset = false
     );
 
     virtual void doctypePI
diff --git a/src/xercesc/parsers/SAX2XMLReaderImpl.cpp b/src/xercesc/parsers/SAX2XMLReaderImpl.cpp
index 2ffb05024..3d0951582 100644
--- a/src/xercesc/parsers/SAX2XMLReaderImpl.cpp
+++ b/src/xercesc/parsers/SAX2XMLReaderImpl.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.10  2002/08/14 15:20:38  knoaman
+ * [Bug 3111] Problem with LexicalHandler::startDTD() and LexicalHandler::endDTD().
+ *
  * Revision 1.9  2002/07/11 18:27:20  knoaman
  * Grammar caching/preparsing - initial implementation.
  *
@@ -1055,12 +1058,15 @@ void SAX2XMLReaderImpl::doctypeComment(const XMLCh* const commentText)
 void SAX2XMLReaderImpl::doctypeDecl(const   DTDElementDecl& elemDecl
                             , const XMLCh* const    publicId
                             , const XMLCh* const    systemId
-                            , const bool            hasIntSubset)
+                            , const bool            hasIntSubset
+                            , const bool            hasExtSubset)
 {
-   // Call the installed LexicalHandler.
-   if (fLexicalHandler)
+    // Call the installed LexicalHandler.
+    if (fLexicalHandler && (hasIntSubset || hasExtSubset))
         fLexicalHandler->startDTD(elemDecl.getFullName(), publicId, systemId);
 
+    fHasExternalSubset = hasExtSubset;
+
     // Unused by SAX DTDHandler interface at this time
 }
 
@@ -1214,8 +1220,6 @@ void SAX2XMLReaderImpl::startIntSubset()
 
 void SAX2XMLReaderImpl::startExtSubset()
 {
-    fHasExternalSubset = true;
-
     if (fLexicalHandler)
         fLexicalHandler->startEntity(gDTDEntityStr);
 }
diff --git a/src/xercesc/parsers/SAX2XMLReaderImpl.hpp b/src/xercesc/parsers/SAX2XMLReaderImpl.hpp
index 060535ccd..9c7cb7833 100644
--- a/src/xercesc/parsers/SAX2XMLReaderImpl.hpp
+++ b/src/xercesc/parsers/SAX2XMLReaderImpl.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.13  2002/08/14 15:20:38  knoaman
+ * [Bug 3111] Problem with LexicalHandler::startDTD() and LexicalHandler::endDTD().
+ *
  * Revision 1.12  2002/07/11 18:27:04  knoaman
  * Grammar caching/preparsing - initial implementation.
  *
@@ -1433,6 +1436,8 @@ public :
       *                 system id of the DTD file.
       * @param hasIntSubset A flag indicating if this XML file contains any
       *                     internal subset.
+      * @param hasExtSubset A flag indicating if this XML file contains any
+      *                     external subset. Default is false.
       */
     virtual void doctypeDecl
     (
@@ -1440,6 +1445,7 @@ public :
         , const XMLCh* const    publicId
         , const XMLCh* const    systemId
         , const bool            hasIntSubset
+        , const bool            hasExtSubset = false
     );
 
     /**
diff --git a/src/xercesc/parsers/SAXParser.cpp b/src/xercesc/parsers/SAXParser.cpp
index a349dde06..9e8da44a4 100644
--- a/src/xercesc/parsers/SAXParser.cpp
+++ b/src/xercesc/parsers/SAXParser.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.8  2002/08/14 15:20:38  knoaman
+ * [Bug 3111] Problem with LexicalHandler::startDTD() and LexicalHandler::endDTD().
+ *
  * Revision 1.7  2002/07/11 18:27:04  knoaman
  * Grammar caching/preparsing - initial implementation.
  *
@@ -943,7 +946,8 @@ void SAXParser::doctypeComment(const XMLCh* const)
 void SAXParser::doctypeDecl(const   DTDElementDecl& elemDecl
                             , const XMLCh* const    publicId
                             , const XMLCh* const    systemId
-                            , const bool            hasIntSubset)
+                            , const bool            hasIntSubset
+                            , const bool            hasExtSubset)
 {
     // Unused by SAX DTDHandler interface at this time
 }
diff --git a/src/xercesc/parsers/SAXParser.hpp b/src/xercesc/parsers/SAXParser.hpp
index b7910ef30..ec1bf8f22 100644
--- a/src/xercesc/parsers/SAXParser.hpp
+++ b/src/xercesc/parsers/SAXParser.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.13  2002/08/14 15:20:38  knoaman
+ * [Bug 3111] Problem with LexicalHandler::startDTD() and LexicalHandler::endDTD().
+ *
  * Revision 1.12  2002/07/11 18:27:03  knoaman
  * Grammar caching/preparsing - initial implementation.
  *
@@ -1547,6 +1550,8 @@ public :
       *                 system id of the DTD file.
       * @param hasIntSubset A flag indicating if this XML file contains any
       *                     internal subset.
+      * @param hasExtSubset A flag indicating if this XML file contains any
+      *                     external subset. Default is false.
       */
     virtual void doctypeDecl
     (
@@ -1554,6 +1559,7 @@ public :
         , const XMLCh* const    publicId
         , const XMLCh* const    systemId
         , const bool            hasIntSubset
+        , const bool            hasExtSubset = false
     );
 
     /**
diff --git a/src/xercesc/validators/DTD/DocTypeHandler.hpp b/src/xercesc/validators/DTD/DocTypeHandler.hpp
index 72dba6275..ede4202fc 100644
--- a/src/xercesc/validators/DTD/DocTypeHandler.hpp
+++ b/src/xercesc/validators/DTD/DocTypeHandler.hpp
@@ -56,8 +56,11 @@
 
 /*
  * $Log$
- * Revision 1.1  2002/02/01 22:22:43  peiyongz
- * Initial revision
+ * Revision 1.2  2002/08/14 15:20:38  knoaman
+ * [Bug 3111] Problem with LexicalHandler::startDTD() and LexicalHandler::endDTD().
+ *
+ * Revision 1.1.1.1  2002/02/01 22:22:43  peiyongz
+ * sane_include
  *
  * Revision 1.5  2001/06/19 16:43:46  tng
  * Correct description of DocTypeHandler
@@ -134,6 +137,7 @@ public:
         , const XMLCh* const    publicId
         , const XMLCh* const    systemId
         , const bool            hasIntSubset
+        , const bool            hasExtSubset = false
     ) = 0;
 
     virtual void doctypePI
-- 
GitLab