From c36384830c4536c26c69a0a00ecd727c19eb1bb9 Mon Sep 17 00:00:00 2001
From: Alberto Massari <amassari@apache.org>
Date: Thu, 11 Aug 2005 20:59:30 +0000
Subject: [PATCH] Added a Locator object to the XMLResourceIdentifier so that
 resolveEntity can know who is calling it

git-svn-id: https://svn.apache.org/repos/asf/xerces/c/trunk@231517 13f79535-47bb-0310-9956-ffa450edef68
---
 src/xercesc/internal/DGXMLScanner.cpp         |  3 ++-
 src/xercesc/internal/IGXMLScanner2.cpp        |  6 ++++--
 src/xercesc/internal/ReaderMgr.cpp            |  6 ++++--
 src/xercesc/internal/SGXMLScanner.cpp         |  6 ++++--
 src/xercesc/internal/XMLScanner.cpp           |  3 ++-
 src/xercesc/util/XMLResourceIdentifier.hpp    | 20 ++++++++++++++-----
 .../validators/schema/TraverseSchema.cpp      | 11 +++++++++-
 7 files changed, 41 insertions(+), 14 deletions(-)

diff --git a/src/xercesc/internal/DGXMLScanner.cpp b/src/xercesc/internal/DGXMLScanner.cpp
index 975d86caa..b8109719d 100644
--- a/src/xercesc/internal/DGXMLScanner.cpp
+++ b/src/xercesc/internal/DGXMLScanner.cpp
@@ -2384,7 +2384,8 @@ InputSource* DGXMLScanner::resolveSystemId(const XMLCh* const sysId
         ReaderMgr::LastExtEntityInfo lastInfo;
         fReaderMgr.getLastExtEntityInfo(lastInfo);
         XMLResourceIdentifier resourceIdentifier(XMLResourceIdentifier::ExternalEntity,
-                            expSysId.getRawBuffer(), 0, pubId, lastInfo.systemId);
+                            expSysId.getRawBuffer(), 0, pubId, lastInfo.systemId,
+                            &fReaderMgr);
         srcToFill = fEntityHandler->resolveEntity(&resourceIdentifier);       
     }
     else
diff --git a/src/xercesc/internal/IGXMLScanner2.cpp b/src/xercesc/internal/IGXMLScanner2.cpp
index b84d7b60a..2f53cb9c2 100644
--- a/src/xercesc/internal/IGXMLScanner2.cpp
+++ b/src/xercesc/internal/IGXMLScanner2.cpp
@@ -1698,7 +1698,8 @@ void IGXMLScanner::resolveSchemaGrammar(const XMLCh* const loc, const XMLCh* con
             ReaderMgr::LastExtEntityInfo lastInfo;
             fReaderMgr.getLastExtEntityInfo(lastInfo);
             XMLResourceIdentifier resourceIdentifier(XMLResourceIdentifier::SchemaGrammar,
-                            expSysId.getRawBuffer(), uri, XMLUni::fgZeroLenString, lastInfo.systemId);
+                            expSysId.getRawBuffer(), uri, XMLUni::fgZeroLenString, lastInfo.systemId,
+                            &fReaderMgr);
             srcToFill = fEntityHandler->resolveEntity(&resourceIdentifier);
         }
         else
@@ -1884,7 +1885,8 @@ InputSource* IGXMLScanner::resolveSystemId(const XMLCh* const sysId
         ReaderMgr::LastExtEntityInfo lastInfo;
         fReaderMgr.getLastExtEntityInfo(lastInfo);
         XMLResourceIdentifier resourceIdentifier(XMLResourceIdentifier::ExternalEntity,
-                              expSysId.getRawBuffer(), 0, pubId, lastInfo.systemId);
+                              expSysId.getRawBuffer(), 0, pubId, lastInfo.systemId,
+                              &fReaderMgr);
         srcToFill = fEntityHandler->resolveEntity(&resourceIdentifier);
     }
     else
diff --git a/src/xercesc/internal/ReaderMgr.cpp b/src/xercesc/internal/ReaderMgr.cpp
index 1eccfc6d5..a46c46b16 100644
--- a/src/xercesc/internal/ReaderMgr.cpp
+++ b/src/xercesc/internal/ReaderMgr.cpp
@@ -494,7 +494,8 @@ XMLReader* ReaderMgr::createReader( const   XMLCh* const        sysId
         LastExtEntityInfo lastInfo;
         getLastExtEntityInfo(lastInfo);
         XMLResourceIdentifier resourceIdentifier(XMLResourceIdentifier::ExternalEntity,
-                            expSysId.getRawBuffer(), XMLUni::fgZeroLenString, pubId, lastInfo.systemId);
+                            expSysId.getRawBuffer(), XMLUni::fgZeroLenString, pubId, lastInfo.systemId,
+                            this);
         srcToFill = fEntityHandler->resolveEntity(&resourceIdentifier);
     }
 
@@ -643,7 +644,8 @@ XMLReader* ReaderMgr::createReader( const   XMLCh* const        baseURI
     if (fEntityHandler)
     {
         XMLResourceIdentifier resourceIdentifier(XMLResourceIdentifier::ExternalEntity,
-                            expSysId.getRawBuffer(), XMLUni::fgZeroLenString, pubId, baseURI);
+                            expSysId.getRawBuffer(), XMLUni::fgZeroLenString, pubId, baseURI,
+                            this);
         srcToFill = fEntityHandler->resolveEntity(&resourceIdentifier);
     }
 
diff --git a/src/xercesc/internal/SGXMLScanner.cpp b/src/xercesc/internal/SGXMLScanner.cpp
index 96462b7e0..158e77a95 100644
--- a/src/xercesc/internal/SGXMLScanner.cpp
+++ b/src/xercesc/internal/SGXMLScanner.cpp
@@ -3540,7 +3540,8 @@ void SGXMLScanner::resolveSchemaGrammar(const XMLCh* const loc, const XMLCh* con
             ReaderMgr::LastExtEntityInfo lastInfo;
             fReaderMgr.getLastExtEntityInfo(lastInfo);
             XMLResourceIdentifier resourceIdentifier(XMLResourceIdentifier::SchemaGrammar,
-                            expSysId.getRawBuffer(), uri, XMLUni::fgZeroLenString, lastInfo.systemId);
+                            expSysId.getRawBuffer(), uri, XMLUni::fgZeroLenString, lastInfo.systemId,
+                            &fReaderMgr);
             srcToFill = fEntityHandler->resolveEntity(&resourceIdentifier);
         }
         else
@@ -3705,7 +3706,8 @@ InputSource* SGXMLScanner::resolveSystemId(const XMLCh* const sysId
         ReaderMgr::LastExtEntityInfo lastInfo;
         fReaderMgr.getLastExtEntityInfo(lastInfo);
         XMLResourceIdentifier resourceIdentifier(XMLResourceIdentifier::ExternalEntity,
-                            expSysId.getRawBuffer(), 0, pubId, lastInfo.systemId);
+                            expSysId.getRawBuffer(), 0, pubId, lastInfo.systemId,
+                            &fReaderMgr);
         srcToFill = fEntityHandler->resolveEntity(&resourceIdentifier);
     }
     else
diff --git a/src/xercesc/internal/XMLScanner.cpp b/src/xercesc/internal/XMLScanner.cpp
index 60f53afb8..d1baf8941 100644
--- a/src/xercesc/internal/XMLScanner.cpp
+++ b/src/xercesc/internal/XMLScanner.cpp
@@ -1658,7 +1658,8 @@ Grammar* XMLScanner::loadGrammar(const   XMLCh* const systemId
         ReaderMgr::LastExtEntityInfo lastInfo;
         fReaderMgr.getLastExtEntityInfo(lastInfo);
         XMLResourceIdentifier resourceIdentifier(XMLResourceIdentifier::ExternalEntity,
-                            systemId, 0, XMLUni::fgZeroLenString, lastInfo.systemId);
+                            systemId, 0, XMLUni::fgZeroLenString, lastInfo.systemId,
+                            &fReaderMgr);
         srcToUse = fEntityHandler->resolveEntity(&resourceIdentifier);
     }
 
diff --git a/src/xercesc/util/XMLResourceIdentifier.hpp b/src/xercesc/util/XMLResourceIdentifier.hpp
index 4184f6f68..734548220 100644
--- a/src/xercesc/util/XMLResourceIdentifier.hpp
+++ b/src/xercesc/util/XMLResourceIdentifier.hpp
@@ -23,6 +23,8 @@
 
 XERCES_CPP_NAMESPACE_BEGIN
 
+class Locator;
+
 /**
   * <p>This class is used along with XMLEntityResolver to resolve entities.
   * Instead of passing publicId and systemId on the resolveEntity call, 
@@ -93,7 +95,7 @@ class XMLUTIL_EXPORT XMLResourceIdentifier
 {
 public:
 
-    /** @name Public Contants */
+    /** @name Public Constants */
     //@{
     enum ResourceIdentifierType {
         SchemaGrammar = 0,
@@ -113,7 +115,8 @@ public:
                             , const XMLCh* const  systemId
                             , const XMLCh* const  nameSpace = 0
                             , const XMLCh* const  publicId = 0
-                            , const XMLCh* const  baseURI = 0);
+                            , const XMLCh* const  baseURI = 0
+                            , const Locator*      locator = 0);
 
     /** Destructor */
     ~XMLResourceIdentifier()
@@ -133,7 +136,7 @@ public:
     const XMLCh* getSchemaLocation()    const;
     const XMLCh* getBaseURI()           const;
     const XMLCh* getNameSpace()         const;
-
+    const Locator* getLocator()         const;
     //@}
 
 private :
@@ -143,7 +146,7 @@ private :
     const XMLCh*                    fSystemId;
     const XMLCh*                    fBaseURI;
     const XMLCh*                    fNameSpace;
-
+    const Locator*                  fLocator;
 
     /* Unimplemented constructors and operators */
 
@@ -185,16 +188,23 @@ inline const XMLCh* XMLResourceIdentifier::getNameSpace() const
     return fNameSpace;
 }
 
+inline const Locator* XMLResourceIdentifier::getLocator() const
+{
+    return fLocator;
+}
+
 inline XMLResourceIdentifier::XMLResourceIdentifier(const ResourceIdentifierType resourceIdentifierType
                             , const XMLCh* const  systemId
                             , const XMLCh* const  nameSpace
                             , const XMLCh* const  publicId
-                            , const XMLCh* const  baseURI )
+                            , const XMLCh* const  baseURI
+                            , const Locator*      locator )
     : fResourceIdentifierType(resourceIdentifierType)
     , fPublicId(publicId)
     , fSystemId(systemId)
     , fBaseURI(baseURI)     
     , fNameSpace(nameSpace)
+    , fLocator(locator)
 {
 }
 
diff --git a/src/xercesc/validators/schema/TraverseSchema.cpp b/src/xercesc/validators/schema/TraverseSchema.cpp
index a07596d0b..fbe23e9e9 100644
--- a/src/xercesc/validators/schema/TraverseSchema.cpp
+++ b/src/xercesc/validators/schema/TraverseSchema.cpp
@@ -586,6 +586,9 @@ void TraverseSchema::preprocessInclude(const DOMElement* const elem) {
     // ------------------------------------------------------------------
     // Resolve schema location
     // ------------------------------------------------------------------
+    fLocator->setValues(fSchemaInfo->getCurrentSchemaURL(), 0,
+                        ((XSDElementNSImpl*) elem)->getLineNo(),
+                        ((XSDElementNSImpl*) elem)->getColumnNo());
     InputSource* srcToFill = resolveSchemaLocation(schemaLocation,
             XMLResourceIdentifier::SchemaInclude);
     Janitor<InputSource> janSrc(srcToFill);
@@ -779,6 +782,9 @@ void TraverseSchema::preprocessImport(const DOMElement* const elem) {
     // ------------------------------------------------------------------
     // Resolve schema location
     // ------------------------------------------------------------------
+    fLocator->setValues(fSchemaInfo->getCurrentSchemaURL(), 0,
+                        ((XSDElementNSImpl*) elem)->getLineNo(),
+                        ((XSDElementNSImpl*) elem)->getColumnNo());
     InputSource* srcToFill = resolveSchemaLocation(schemaLocation,
             XMLResourceIdentifier::SchemaImport, nameSpace);
 
@@ -6628,7 +6634,7 @@ InputSource* TraverseSchema::resolveSchemaLocation(const XMLCh* const loc,
 
     if (fEntityHandler){
         XMLResourceIdentifier resourceIdentifier(resourceIdentitiferType,
-                            normalizedURI, nameSpace, 0, fSchemaInfo->getCurrentSchemaURL());
+                            normalizedURI, nameSpace, 0, fSchemaInfo->getCurrentSchemaURL(), fLocator);
         srcToFill = fEntityHandler->resolveEntity(&resourceIdentifier);
     }
 
@@ -7863,6 +7869,9 @@ bool TraverseSchema::openRedefinedSchema(const DOMElement* const redefineElem) {
     // ------------------------------------------------------------------
     // Resolve schema location
     // ------------------------------------------------------------------
+    fLocator->setValues(fSchemaInfo->getCurrentSchemaURL(), 0,
+                        ((XSDElementNSImpl*) redefineElem)->getLineNo(),
+                        ((XSDElementNSImpl*) redefineElem)->getColumnNo());
     InputSource*         srcToFill = resolveSchemaLocation(schemaLocation,
                                         XMLResourceIdentifier::SchemaRedefine);
     Janitor<InputSource> janSrc(srcToFill);
-- 
GitLab