From 5afccf7bd1b470a1172901665fd5e2d585b4e73c Mon Sep 17 00:00:00 2001
From: Boris Kolpackov <borisk@apache.org>
Date: Wed, 18 Nov 2009 07:54:36 +0000
Subject: [PATCH] Load schemas specified with the external schema location
 properties even if the load-schema property is set to false (XERCESC-1713).

git-svn-id: https://svn.apache.org/repos/asf/xerces/c/trunk@881694 13f79535-47bb-0310-9956-ffa450edef68
---
 src/xercesc/internal/IGXMLScanner.cpp  |  4 ++--
 src/xercesc/internal/IGXMLScanner.hpp  |  4 ++--
 src/xercesc/internal/IGXMLScanner2.cpp |  8 ++++----
 src/xercesc/internal/SGXMLScanner.cpp  | 12 ++++++------
 src/xercesc/internal/SGXMLScanner.hpp  |  4 ++--
 5 files changed, 16 insertions(+), 16 deletions(-)

diff --git a/src/xercesc/internal/IGXMLScanner.cpp b/src/xercesc/internal/IGXMLScanner.cpp
index 5fb9187b8..55661fd38 100644
--- a/src/xercesc/internal/IGXMLScanner.cpp
+++ b/src/xercesc/internal/IGXMLScanner.cpp
@@ -2194,9 +2194,9 @@ bool IGXMLScanner::scanStartTagNS(bool& gotData)
         && (fExternalSchemaLocation || fExternalNoNamespaceSchemaLocation)) {
 
         if (fExternalSchemaLocation)
-            parseSchemaLocation(fExternalSchemaLocation);
+            parseSchemaLocation(fExternalSchemaLocation, true);
         if (fExternalNoNamespaceSchemaLocation)
-            resolveSchemaGrammar(fExternalNoNamespaceSchemaLocation, XMLUni::fgZeroLenString);
+            resolveSchemaGrammar(fExternalNoNamespaceSchemaLocation, XMLUni::fgZeroLenString, true);
     }
 
     //  Make an initial pass through the list and find any xmlns attributes or
diff --git a/src/xercesc/internal/IGXMLScanner.hpp b/src/xercesc/internal/IGXMLScanner.hpp
index e0a385293..6361dfd79 100644
--- a/src/xercesc/internal/IGXMLScanner.hpp
+++ b/src/xercesc/internal/IGXMLScanner.hpp
@@ -155,8 +155,8 @@ private :
         , const int             colonPosition
     );
     void scanRawAttrListforNameSpaces(XMLSize_t attCount);
-    void parseSchemaLocation(const XMLCh* const schemaLocationStr);
-    void resolveSchemaGrammar(const XMLCh* const loc, const XMLCh* const uri);
+    void parseSchemaLocation(const XMLCh* const schemaLocationStr, bool ignoreLoadSchema = false);
+    void resolveSchemaGrammar(const XMLCh* const loc, const XMLCh* const uri, bool ignoreLoadSchema = false);
     bool switchGrammar(const XMLCh* const newGrammarNameSpace);
     bool laxElementValidation(QName* element, ContentLeafNameTypeVector* cv,
                               const XMLContentModel* const cm,
diff --git a/src/xercesc/internal/IGXMLScanner2.cpp b/src/xercesc/internal/IGXMLScanner2.cpp
index c94e88119..ebbf50a69 100644
--- a/src/xercesc/internal/IGXMLScanner2.cpp
+++ b/src/xercesc/internal/IGXMLScanner2.cpp
@@ -1683,7 +1683,7 @@ void IGXMLScanner::scanRawAttrListforNameSpaces(XMLSize_t attCount)
     }
 }
 
-void IGXMLScanner::parseSchemaLocation(const XMLCh* const schemaLocationStr)
+void IGXMLScanner::parseSchemaLocation(const XMLCh* const schemaLocationStr, bool ignoreLoadSchema)
 {
     XMLCh* locStr = XMLString::replicate(schemaLocationStr, fMemoryManager);
     ArrayJanitor<XMLCh> janLoc(locStr, fMemoryManager);
@@ -1698,12 +1698,12 @@ void IGXMLScanner::parseSchemaLocation(const XMLCh* const schemaLocationStr)
         XMLBuffer normalBuf(1023, fMemoryManager);
         for(XMLSize_t i=0; i<size; i=i+2) {
             normalizeAttRawValue(SchemaSymbols::fgXSI_SCHEMALOCATION, fLocationPairs->elementAt(i), normalBuf);
-            resolveSchemaGrammar(fLocationPairs->elementAt(i+1), normalBuf.getRawBuffer());
+            resolveSchemaGrammar(fLocationPairs->elementAt(i+1), normalBuf.getRawBuffer(), ignoreLoadSchema);
         }
     }
 }
 
-void IGXMLScanner::resolveSchemaGrammar(const XMLCh* const loc, const XMLCh* const uri) {
+void IGXMLScanner::resolveSchemaGrammar(const XMLCh* const loc, const XMLCh* const uri, bool ignoreLoadSchema) {
 
     Grammar* grammar = 0;
 
@@ -1715,7 +1715,7 @@ void IGXMLScanner::resolveSchemaGrammar(const XMLCh* const loc, const XMLCh* con
 
     if (!grammar || grammar->getGrammarType() == Grammar::DTDGrammarType)
     {
-      if (fLoadSchema)
+      if (fLoadSchema || ignoreLoadSchema)
       {
         XSDDOMParser parser(0, fMemoryManager, 0);
 
diff --git a/src/xercesc/internal/SGXMLScanner.cpp b/src/xercesc/internal/SGXMLScanner.cpp
index ea3d7cebd..59a02af9e 100644
--- a/src/xercesc/internal/SGXMLScanner.cpp
+++ b/src/xercesc/internal/SGXMLScanner.cpp
@@ -1167,9 +1167,9 @@ bool SGXMLScanner::scanStartTag(bool& gotData)
         && (fExternalSchemaLocation || fExternalNoNamespaceSchemaLocation)) {
 
         if (fExternalSchemaLocation)
-            parseSchemaLocation(fExternalSchemaLocation);
+            parseSchemaLocation(fExternalSchemaLocation, true);
         if (fExternalNoNamespaceSchemaLocation)
-            resolveSchemaGrammar(fExternalNoNamespaceSchemaLocation, XMLUni::fgZeroLenString);
+            resolveSchemaGrammar(fExternalNoNamespaceSchemaLocation, XMLUni::fgZeroLenString, true);
     }
 
     //  Make an initial pass through the list and find any xmlns attributes or
@@ -3514,7 +3514,7 @@ void SGXMLScanner::scanRawAttrListforNameSpaces(XMLSize_t attCount)
     }
 }
 
-void SGXMLScanner::parseSchemaLocation(const XMLCh* const schemaLocationStr)
+void SGXMLScanner::parseSchemaLocation(const XMLCh* const schemaLocationStr, bool ignoreLoadSchema)
 {
     BaseRefVectorOf<XMLCh>* schemaLocation = XMLString::tokenizeString(schemaLocationStr, fMemoryManager);
     Janitor<BaseRefVectorOf<XMLCh> > janLoc(schemaLocation);
@@ -3527,12 +3527,12 @@ void SGXMLScanner::parseSchemaLocation(const XMLCh* const schemaLocationStr)
         XMLBuffer normalBuf(1023, fMemoryManager);
         for(XMLSize_t i=0; i<size; i=i+2) {
             normalizeAttRawValue(SchemaSymbols::fgXSI_SCHEMALOCATION, schemaLocation->elementAt(i), normalBuf);
-            resolveSchemaGrammar(schemaLocation->elementAt(i+1), normalBuf.getRawBuffer());
+            resolveSchemaGrammar(schemaLocation->elementAt(i+1), normalBuf.getRawBuffer(), ignoreLoadSchema);
         }
     }
 }
 
-void SGXMLScanner::resolveSchemaGrammar(const XMLCh* const loc, const XMLCh* const uri) {
+void SGXMLScanner::resolveSchemaGrammar(const XMLCh* const loc, const XMLCh* const uri, bool ignoreLoadSchema) {
 
     Grammar* grammar = 0;
 
@@ -3544,7 +3544,7 @@ void SGXMLScanner::resolveSchemaGrammar(const XMLCh* const loc, const XMLCh* con
 
     if (!grammar || grammar->getGrammarType() == Grammar::DTDGrammarType)
     {
-      if (fLoadSchema)
+      if (fLoadSchema || ignoreLoadSchema)
       {
         XSDDOMParser parser(0, fMemoryManager, 0);
 
diff --git a/src/xercesc/internal/SGXMLScanner.hpp b/src/xercesc/internal/SGXMLScanner.hpp
index 05bdd4234..fbdde52a4 100644
--- a/src/xercesc/internal/SGXMLScanner.hpp
+++ b/src/xercesc/internal/SGXMLScanner.hpp
@@ -236,8 +236,8 @@ private :
         ,       XMLBuffer&          toFill
     );
     void scanRawAttrListforNameSpaces(XMLSize_t attCount);
-    void parseSchemaLocation(const XMLCh* const schemaLocationStr);
-    void resolveSchemaGrammar(const XMLCh* const loc, const XMLCh* const uri);
+    void parseSchemaLocation(const XMLCh* const schemaLocationStr, bool ignoreLoadSchema = false);
+    void resolveSchemaGrammar(const XMLCh* const loc, const XMLCh* const uri, bool ignoreLoadSchema = false);
     bool switchGrammar(const XMLCh* const newGrammarNameSpace);
     bool anyAttributeValidation(SchemaAttDef* attWildCard,
                                 unsigned int uriId,
-- 
GitLab